Merge "Allow "." in filebackend container prefixes"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Sat, 11 Jul 2015 01:28:04 +0000 (01:28 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Sat, 11 Jul 2015 01:28:04 +0000 (01:28 +0000)
344 files changed:
.gitattributes
.rubocop.yml
Gruntfile.js
RELEASE-NOTES-1.26
autoload.php
composer.json
docs/hooks.txt
includes/CdbCompat.php [deleted file]
includes/DefaultSettings.php
includes/Defines.php
includes/EditPage.php
includes/GlobalFunctions.php
includes/Hooks.php
includes/MediaWiki.php
includes/MimeMagic.php
includes/OutputPage.php
includes/Preferences.php
includes/Revision.php
includes/Sanitizer.php
includes/Setup.php
includes/Title.php
includes/User.php
includes/WebRequest.php
includes/ZhConversion.php
includes/actions/InfoAction.php
includes/actions/RawAction.php
includes/api/ApiBase.php
includes/api/ApiDelete.php
includes/api/ApiEditPage.php
includes/api/ApiFeedWatchlist.php
includes/api/ApiFormatBase.php
includes/api/ApiFormatDump.php [deleted file]
includes/api/ApiFormatWddx.php [deleted file]
includes/api/ApiFormatXml.php
includes/api/ApiMain.php
includes/api/ApiParse.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryRevisionsBase.php
includes/api/ApiQueryWatchlist.php
includes/api/i18n/br.json [new file with mode: 0644]
includes/api/i18n/bs.json
includes/api/i18n/de.json
includes/api/i18n/en.json
includes/api/i18n/es.json
includes/api/i18n/fa.json
includes/api/i18n/fr.json
includes/api/i18n/gl.json
includes/api/i18n/he.json
includes/api/i18n/it.json
includes/api/i18n/ja.json
includes/api/i18n/ko.json
includes/api/i18n/ksh.json
includes/api/i18n/lb.json
includes/api/i18n/or.json [new file with mode: 0644]
includes/api/i18n/pl.json
includes/api/i18n/qqq.json
includes/api/i18n/sv.json
includes/api/i18n/vi.json
includes/api/i18n/wuu.json [new file with mode: 0644]
includes/api/i18n/yi.json
includes/api/i18n/zh-hans.json
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/compat/CdbCompat.php [new file with mode: 0644]
includes/compat/normal/.gitignore [new file with mode: 0644]
includes/compat/normal/UtfNormal.php [new file with mode: 0644]
includes/compat/normal/UtfNormalDefines.php [new file with mode: 0644]
includes/compat/normal/UtfNormalUtil.php [new file with mode: 0644]
includes/content/ContentHandler.php
includes/context/DerivativeContext.php
includes/context/RequestContext.php
includes/db/DBConnRef.php
includes/db/Database.php
includes/db/DatabaseMysql.php
includes/db/DatabaseMysqlBase.php
includes/db/DatabaseMysqli.php
includes/db/DatabasePostgres.php
includes/db/IDatabase.php [new file with mode: 0644]
includes/db/LoadBalancer.php
includes/db/LoadMonitor.php
includes/filerepo/FileRepo.php
includes/filerepo/ForeignAPIRepo.php
includes/filerepo/file/ArchivedFile.php
includes/htmlform/HTMLButtonField.php
includes/htmlform/HTMLCheckMatrix.php
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLMultiSelectField.php
includes/htmlform/HTMLRadioField.php
includes/htmlform/HTMLSubmitField.php
includes/htmlform/HTMLTextAreaField.php
includes/htmlform/HTMLTextField.php
includes/htmlform/OOUIHTMLForm.php
includes/htmlform/VFormHTMLForm.php
includes/installer/WebInstallerPage.php
includes/installer/i18n/bs.json
includes/installer/i18n/fa.json
includes/installer/i18n/hu.json
includes/installer/i18n/it.json
includes/installer/i18n/ja.json
includes/installer/i18n/kn.json
includes/installer/i18n/ksh.json
includes/installer/i18n/mr.json
includes/installer/i18n/nan.json
includes/installer/i18n/or.json
includes/installer/i18n/uk.json
includes/jobqueue/Job.php
includes/jobqueue/JobQueue.php
includes/jobqueue/JobRunner.php
includes/jobqueue/jobs/EnqueueJob.php [changed mode: 0755->0644]
includes/jobqueue/jobs/RecentChangesUpdateJob.php
includes/libs/RiffExtractor.php [new file with mode: 0644]
includes/libs/composer/ComposerLock.php
includes/libs/eventrelayer/EventRelayer.php [changed mode: 0755->0644]
includes/libs/eventrelayer/EventRelayerMCRD.php [changed mode: 0755->0644]
includes/libs/normal/.gitignore [deleted file]
includes/libs/normal/UtfNormal.php [deleted file]
includes/libs/normal/UtfNormalDefines.php [deleted file]
includes/libs/normal/UtfNormalUtil.php [deleted file]
includes/libs/objectcache/WANObjectCache.php [changed mode: 0755->0644]
includes/logging/ContentModelLogFormatter.php [new file with mode: 0644]
includes/mail/EmailNotification.php
includes/media/Bitmap.php
includes/media/WebP.php [new file with mode: 0644]
includes/objectcache/MemcachedClient.php
includes/objectcache/RedisBagOStuff.php
includes/objectcache/SqlBagOStuff.php
includes/page/Article.php
includes/parser/CoreParserFunctions.php
includes/parser/Parser.php
includes/password/UserPasswordPolicy.php
includes/profiler/output/ProfilerOutputText.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderModule.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/SpecialPage.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialChangeContentModel.php [new file with mode: 0644]
includes/specials/SpecialChangeEmail.php
includes/specials/SpecialDoubleRedirects.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialPageLanguage.php
includes/specials/SpecialPasswordReset.php
includes/specials/SpecialRandomInCategory.php
includes/specials/SpecialResetTokens.php
includes/specials/SpecialSearch.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialVersion.php
includes/widget/AUTHORS.txt [new file with mode: 0644]
includes/widget/LICENSE.txt [new file with mode: 0644]
includes/widget/TitleInputWidget.php [new file with mode: 0644]
languages/Language.php
languages/i18n/ar.json
languages/i18n/arn.json
languages/i18n/as.json
languages/i18n/ast.json
languages/i18n/awa.json
languages/i18n/be-tarask.json
languages/i18n/bn.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/cdo.json
languages/i18n/ce.json
languages/i18n/cs.json
languages/i18n/cv.json
languages/i18n/cy.json
languages/i18n/de.json
languages/i18n/dty.json
languages/i18n/el.json
languages/i18n/en.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/frr.json
languages/i18n/gl.json
languages/i18n/gom-deva.json
languages/i18n/gom-latn.json
languages/i18n/gu.json
languages/i18n/gv.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hil.json
languages/i18n/hr.json
languages/i18n/hrx.json
languages/i18n/hu.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ilo.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.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/kw.json
languages/i18n/lad.json
languages/i18n/lb.json
languages/i18n/lrc.json
languages/i18n/lt.json
languages/i18n/luz.json
languages/i18n/lv.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mr.json
languages/i18n/ms.json
languages/i18n/mzn.json
languages/i18n/nan.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/or.json
languages/i18n/pa.json
languages/i18n/pam.json
languages/i18n/pdc.json
languages/i18n/pl.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/scn.json
languages/i18n/sh.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/sv.json
languages/i18n/ta.json
languages/i18n/te.json
languages/i18n/th.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/uz.json
languages/i18n/vi.json
languages/i18n/wuu.json
languages/i18n/xmf.json
languages/i18n/yi.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesEn.php
maintenance/convertExtensionToRegistration.php
maintenance/createAndPromote.php
maintenance/language/generateNormalizerDataAr.php
maintenance/language/generateNormalizerDataMl.php
maintenance/language/zhtable/simpphrases.manual
maintenance/language/zhtable/toCN.manual
maintenance/language/zhtable/toTW.manual
maintenance/language/zhtable/tradphrases.manual
maintenance/language/zhtable/tradphrases_exclude.manual
maintenance/populateContentModel.php [new file with mode: 0644]
maintenance/sql.php
maintenance/update.php
phpcs.xml [new file with mode: 0644]
resources/Resources.php
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/hrx.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/ku-latn.json
resources/lib/oojs-ui/i18n/lt.json
resources/lib/oojs-ui/i18n/nb.json
resources/lib/oojs-ui/i18n/pa.json
resources/lib/oojs-ui/i18n/ps.json
resources/lib/oojs-ui/i18n/ru.json
resources/lib/oojs-ui/i18n/sv.json
resources/lib/oojs-ui/i18n/yi.json
resources/lib/oojs-ui/i18n/yue.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/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/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/mediawiki.action/mediawiki.action.edit.css
resources/src/mediawiki.legacy/commonPrint.css
resources/src/mediawiki.legacy/oldshared.css
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/content.css
resources/src/mediawiki.skinning/elements.css
resources/src/mediawiki.special/mediawiki.special.search.css
resources/src/mediawiki.special/mediawiki.special.search.js
resources/src/mediawiki.special/mediawiki.special.version.css
resources/src/mediawiki.ui/components/buttons.less
resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.infuse.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.Title.js
resources/src/mediawiki/mediawiki.htmlform.ooui.js [deleted file]
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.searchSuggest.js
resources/src/mediawiki/mediawiki.util.js
tests/TestsAutoLoader.php
tests/browser/environments.yml
tests/browser/features/step_definitions/create_account_steps.rb
tests/parser/parserTests.txt
tests/phpunit/data/media/2_webp_a.webp [new file with mode: 0644]
tests/phpunit/data/media/2_webp_ll.webp [new file with mode: 0644]
tests/phpunit/data/media/webp_animated.webp [new file with mode: 0644]
tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php
tests/phpunit/includes/MediaWikiTest.php
tests/phpunit/includes/api/ApiEditPageTest.php
tests/phpunit/includes/api/format/ApiFormatDumpTest.php [deleted file]
tests/phpunit/includes/api/format/ApiFormatWddxTest.php [deleted file]
tests/phpunit/includes/libs/composer/ComposerLockTest.php
tests/phpunit/includes/media/WebPTest.php [new file with mode: 0644]
tests/phpunit/includes/objectcache/WANObjectCacheTest.php
tests/phpunit/includes/specials/SpecialBlankPageTest.php [new file with mode: 0644]
tests/phpunit/includes/specials/SpecialPageTestBase.php [new file with mode: 0644]
tests/phpunit/languages/LanguageTest.php
tests/phpunit/maintenance/backupTextPassTest.php
tests/phpunit/phpunit.php
tests/qunit/QUnitTestResources.php
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
thumb.php

index 69d7b1b..09f86a3 100644 (file)
@@ -1,2 +1,3 @@
 *.sh eol=lf
 *.icc binary
+*.webp binary
index 61ffc1a..5b6c3f2 100644 (file)
@@ -1,6 +1,7 @@
 AllCops:
   Exclude:
     - 'extensions/**/*'
+    - 'node_modules/**/*'
     - 'skins/**/*'
     - 'tests/frontend/node_modules/**/*'
     - 'vendor/**/*'
index 573db69..868fa4a 100644 (file)
@@ -15,7 +15,6 @@ module.exports = function ( grunt ) {
        karmaProxy[wgScriptPath] = wgServer + wgScriptPath;
 
        grunt.initConfig( {
-               pkg: grunt.file.readJSON( 'package.json' ),
                jshint: {
                        options: {
                                jshintrc: true
index c2228ae..81269b8 100644 (file)
@@ -14,8 +14,12 @@ production.
 * New-style continuation is now the default for API action=continue. Clients may
   use the 'rawcontinue' parameter to receive raw query-continue data, but the
   new style is encouraged as it's harder to implement incorrectly.
+* Deprecated API formats dump and wddx have been completely removed.
 
 === New features in 1.26 ===
+* (T51506) Now action=info gives estimates of actual watchers for a page.
+  See $wgRCMaxAge, $wgWatchersMaxAge and $wgUnwatchedPageSecret
+  to learn how to configure if needed.
 * Change tags can now be hidden in the interface by disabling the associated
   "tag-<id>" interface message.
 * ':' (colon) is now invalid in usernames for new accounts. Existing accounts
@@ -30,22 +34,31 @@ production.
 * (T68699) The expiration of the UserID and Token login cookies
   ($wgExtendedLoginCookieExpiration) can be configured independently of the
   expiration of all other cookies ($wgCookieExpiration).
+* (T50519) Support for generating JPEG/PNG thumbnails from WebP images added
+  if ImageMagick is used as image scaler ($wgUseImageMagick = true). Uploading
+  of WebP images still disabled by default. Add $wgFileExtensions[] =
+  'webp'; to LocalSettings.php to enable uploading of WebP images.
+* Added new hooks 'EnhancedChangesListModifyLineData' &
+  'EnhancedChangesListModifyBlockLineData', to modify the data used to build
+  lines in enhanced recentchanges and watchlist.
 
 ==== 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 ===
-* (bug 51283) load.php sometimes sends 304 response without full headers
+* (T53283) load.php sometimes sends 304 response without full headers
 * (T65198) Talk page tabs now have a "rel=discussion" attribute
 
 === Action API changes in 1.26 ===
 * New-style continuation is now the default for action=continue. Clients may
   use the 'rawcontinue' parameter to receive raw query-continue data, but the
   new style is encouraged as it's harder to implement incorrectly.
+* Deprecated API formats dump and wddx have been completely removed.
 * API action=query&list=tags: The displayname can now be boolean false if the
   tag is meant to be hidden from user interfaces.
 * action=import no longer allows both the namespace= and rootpage= parameters
@@ -65,7 +78,7 @@ production.
 
 MediaWiki supports over 350 languages. Many localisations are updated
 regularly. Below only new and removed languages are listed, as well as
-changes to languages because of Bugzilla reports.
+changes to languages because of Phabricator reports.
 
 * Languages added:
 ** dty (डोटेली/Doteli), thanks to translators जनक राज भट्ट, बिप्लब आनन्द,
@@ -111,7 +124,9 @@ changes to languages because of Bugzilla reports.
   instead of many optional positional arguments. Calling the constructor the old
   way will issue a deprecation warning.
 * The jquery.mwExtension module was deprecated.
-
+* $wgSpecialPageGroups was removed (deprecated in 1.21).
+* SpecialPageFactory::setGroup was removed (deprecated in 1.21).
+* SpecialPageFactory::getGroup was removed (deprecated in 1.21).
 
 == Compatibility ==
 
@@ -178,4 +193,3 @@ going to run a public MediaWiki, so you can be notified of security fixes.
 == IRC help ==
 
 There's usually someone online in #mediawiki on irc.freenode.net.
-
index 504eaf2..6444e3e 100644 (file)
@@ -37,14 +37,12 @@ $wgAutoloadLocalClasses = array(
        'ApiFileRevert' => __DIR__ . '/includes/api/ApiFileRevert.php',
        'ApiFormatBase' => __DIR__ . '/includes/api/ApiFormatBase.php',
        'ApiFormatDbg' => __DIR__ . '/includes/api/ApiFormatDbg.php',
-       'ApiFormatDump' => __DIR__ . '/includes/api/ApiFormatDump.php',
        'ApiFormatFeedWrapper' => __DIR__ . '/includes/api/ApiFormatFeedWrapper.php',
        'ApiFormatJson' => __DIR__ . '/includes/api/ApiFormatJson.php',
        'ApiFormatNone' => __DIR__ . '/includes/api/ApiFormatNone.php',
        'ApiFormatPhp' => __DIR__ . '/includes/api/ApiFormatPhp.php',
        'ApiFormatRaw' => __DIR__ . '/includes/api/ApiFormatRaw.php',
        'ApiFormatTxt' => __DIR__ . '/includes/api/ApiFormatTxt.php',
-       'ApiFormatWddx' => __DIR__ . '/includes/api/ApiFormatWddx.php',
        'ApiFormatXml' => __DIR__ . '/includes/api/ApiFormatXml.php',
        'ApiFormatXmlRsd' => __DIR__ . '/includes/api/ApiRsd.php',
        'ApiFormatYaml' => __DIR__ . '/includes/api/ApiFormatYaml.php',
@@ -202,9 +200,9 @@ $wgAutoloadLocalClasses = array(
        'CategoryPage' => __DIR__ . '/includes/page/CategoryPage.php',
        'CategoryPager' => __DIR__ . '/includes/specials/SpecialCategories.php',
        'CategoryViewer' => __DIR__ . '/includes/CategoryViewer.php',
-       'CdbException' => __DIR__ . '/includes/CdbCompat.php',
-       'CdbReader' => __DIR__ . '/includes/CdbCompat.php',
-       'CdbWriter' => __DIR__ . '/includes/CdbCompat.php',
+       'CdbException' => __DIR__ . '/includes/compat/CdbCompat.php',
+       'CdbReader' => __DIR__ . '/includes/compat/CdbCompat.php',
+       'CdbWriter' => __DIR__ . '/includes/compat/CdbCompat.php',
        'CgzCopyTransaction' => __DIR__ . '/maintenance/storage/recompressTracked.php',
        'ChangePassword' => __DIR__ . '/maintenance/changePassword.php',
        'ChangeTags' => __DIR__ . '/includes/changetags/ChangeTags.php',
@@ -258,6 +256,7 @@ $wgAutoloadLocalClasses = array(
        'ConstantDependency' => __DIR__ . '/includes/cache/CacheDependency.php',
        'Content' => __DIR__ . '/includes/content/Content.php',
        'ContentHandler' => __DIR__ . '/includes/content/ContentHandler.php',
+       'ContentModelLogFormatter' => __DIR__ . '/includes/logging/ContentModelLogFormatter.php',
        'ContextSource' => __DIR__ . '/includes/context/ContextSource.php',
        'ContribsPager' => __DIR__ . '/includes/specials/SpecialContributions.php',
        'ConvertExtensionToRegistration' => __DIR__ . '/maintenance/convertExtensionToRegistration.php',
@@ -489,10 +488,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',
@@ -531,7 +530,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',
@@ -754,6 +753,7 @@ $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\\TitleInputWidget' => __DIR__ . '/includes/widget/TitleInputWidget.php',
        'MemCachedClientforWiki' => __DIR__ . '/includes/objectcache/MemcachedClient.php',
        'MemcLockManager' => __DIR__ . '/includes/filebackend/lockmanager/MemcLockManager.php',
        'MemcachedBagOStuff' => __DIR__ . '/includes/objectcache/MemcachedBagOStuff.php',
@@ -896,6 +896,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',
@@ -1040,6 +1041,7 @@ $wgAutoloadLocalClasses = array(
        'RevisionList' => __DIR__ . '/includes/RevisionList.php',
        'RevisionListBase' => __DIR__ . '/includes/RevisionList.php',
        'RevisiondeleteAction' => __DIR__ . '/includes/actions/RevisiondeleteAction.php',
+       'RiffExtractor' => __DIR__ . '/includes/libs/RiffExtractor.php',
        'RightsLogFormatter' => __DIR__ . '/includes/logging/RightsLogFormatter.php',
        'RollbackAction' => __DIR__ . '/includes/actions/RollbackAction.php',
        'RollbackEdits' => __DIR__ . '/maintenance/rollbackEdits.php',
@@ -1108,6 +1110,7 @@ $wgAutoloadLocalClasses = array(
        'SpecialBookSources' => __DIR__ . '/includes/specials/SpecialBooksources.php',
        'SpecialCachedPage' => __DIR__ . '/includes/specials/SpecialCachedPage.php',
        'SpecialCategories' => __DIR__ . '/includes/specials/SpecialCategories.php',
+       'SpecialChangeContentModel' => __DIR__ . '/includes/specials/SpecialChangeContentModel.php',
        'SpecialChangeEmail' => __DIR__ . '/includes/specials/SpecialChangeEmail.php',
        'SpecialChangePassword' => __DIR__ . '/includes/specials/SpecialChangePassword.php',
        'SpecialComparePages' => __DIR__ . '/includes/specials/SpecialComparePages.php',
@@ -1306,7 +1309,7 @@ $wgAutoloadLocalClasses = array(
        'UserloginTemplate' => __DIR__ . '/includes/templates/Userlogin.php',
        'UserrightsPage' => __DIR__ . '/includes/specials/SpecialUserrights.php',
        'UsersPager' => __DIR__ . '/includes/specials/SpecialListusers.php',
-       'UtfNormal' => __DIR__ . '/includes/libs/normal/UtfNormal.php',
+       'UtfNormal' => __DIR__ . '/includes/compat/normal/UtfNormal.php',
        'UzConverter' => __DIR__ . '/languages/classes/LanguageUz.php',
        'VFormHTMLForm' => __DIR__ . '/includes/htmlform/VFormHTMLForm.php',
        'ValidateRegistrationFile' => __DIR__ . '/maintenance/validateRegistrationFile.php',
@@ -1342,6 +1345,7 @@ $wgAutoloadLocalClasses = array(
        'WebInstallerUpgrade' => __DIR__ . '/includes/installer/WebInstallerPage.php',
        'WebInstallerUpgradeDoc' => __DIR__ . '/includes/installer/WebInstallerPage.php',
        'WebInstallerWelcome' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebPHandler' => __DIR__ . '/includes/media/WebP.php',
        'WebRequest' => __DIR__ . '/includes/WebRequest.php',
        'WebRequestUpload' => __DIR__ . '/includes/WebRequest.php',
        'WebResponse' => __DIR__ . '/includes/WebResponse.php',
index 7419eb5..fda64fd 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.6",
+               "oojs/oojs-ui": "0.11.8",
                "php": ">=5.3.3",
                "psr/log": "1.0.0",
                "wikimedia/cdb": "1.0.1",
                "wikimedia/assert": "0.2.2",
-               "wikimedia/composer-merge-plugin": "1.1.0",
+               "wikimedia/composer-merge-plugin": "1.2.1",
                "wikimedia/utfnormal": "1.0.2",
                "zordius/lightncandy": "0.21"
        },
        "require-dev": {
-               "jakub-onderka/php-parallel-lint": "~0.8",
+               "jakub-onderka/php-parallel-lint": "0.9",
                "justinrainbow/json-schema": "~1.3",
                "phpunit/phpunit": "3.7.37",
-               "mediawiki/mediawiki-codesniffer": "0.2.0"
+               "mediawiki/mediawiki-codesniffer": "0.3.0"
        },
        "suggest": {
                "ext-fileinfo": "*",
@@ -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 8cfdee9..23df983 100644 (file)
@@ -1300,10 +1300,25 @@ $editToken: The user's edit token.
 
 'EnhancedChangesList::getLogText': to alter, remove or add to the links of a
 group of changes in EnhancedChangesList.
+Hook subscribers can return false to omit this line from recentchanges.
 $changesList: EnhancedChangesList object
 &$links: The links that were generated by EnhancedChangesList
 $block: The RecentChanges objects in that block
 
+'EnhancedChangesListModifyLineData': to alter data used to build
+a grouped recent change inner line in EnhancedChangesList.
+Hook subscribers can return false to omit this line from recentchanges.
+$changesList: EnhancedChangesList object
+&$data: An array with all the components that will be joined in order to create the line
+$block: An array of RecentChange objects in that block
+$rc: The RecentChange object for this line
+
+'EnhancedChangesListModifyBlockLineData': to alter data used to build
+a non-grouped recent change line in EnhancedChangesList.
+$changesList: EnhancedChangesList object
+&$data: An array with all the components that will be joined in order to create the line
+$rc: The RecentChange object for this line
+
 'ExemptFromAccountCreationThrottle': Exemption from the account creation
 throttle.
 $ip: The ip address of the user
@@ -2403,7 +2418,9 @@ such as Special:MyPage and Special:MyTalk.
 &$redirectParams: An array of parameters preserved by redirecting special pages.
 
 'RejectParserCacheValue': Return false to reject an otherwise usable
-cached value from the Parser cache.
+cached value from the Parser cache. NOTE: CARELESS USE OF THIS HOOK CAN
+HAVE CATASTROPHIC CONSEQUENCES FOR HIGH-TRAFFIC INSTALLATIONS. USE WITH
+EXTREME CARE.
 $parserOutput: ParserOutput value.
 $wikiPage: WikiPage object.
 $parserOptions: ParserOptions object.
diff --git a/includes/CdbCompat.php b/includes/CdbCompat.php
deleted file mode 100644 (file)
index 0074cc9..0000000
+++ /dev/null
@@ -1,45 +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
- */
-
-/***
- * This file contains a set of backwards-compatability class names
- * after the cdb functions were moved out into a separate library
- * and put under a proper namespace
- *
- * @since 1.25
- */
-
-/**
- * @deprecated since 1.25
- */
-abstract class CdbReader extends \Cdb\Reader {
-}
-
-/**
- * @deprecated since 1.25
- */
-abstract class CdbWriter extends \Cdb\Writer {
-}
-
-/**
- * @deprecated since 1.25
- */
-class CdbException extends \Cdb\Exception {
-}
index 0e6ff16..6050ba7 100644 (file)
@@ -884,6 +884,7 @@ $wgMediaHandlers = array(
        'image/png' => 'PNGHandler',
        'image/gif' => 'GIFHandler',
        'image/tiff' => 'TiffHandler',
+       'image/webp' => 'WebPHandler',
        'image/x-ms-bmp' => 'BmpHandler',
        'image/x-bmp' => 'BmpHandler',
        'image/x-xcf' => 'XCFHandler',
@@ -1596,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;
 
@@ -2540,13 +2542,16 @@ $wgInternalServer = false;
 /**
  * Cache timeout for the squid, will be sent as s-maxage (without ESI) or
  * Surrogate-Control (with ESI). Without ESI, you should strip out s-maxage in
- * the Squid config. 18000 seconds = 5 hours, more cache hits with 2678400 = 31
- * days
+ * the Squid config.
+ *
+* 18000 seconds = 5 hours, more cache hits with 2678400 = 31 days.
  */
 $wgSquidMaxage = 18000;
 
 /**
  * Default maximum age for raw CSS/JS accesses
+ *
+ * 300 seconds = 5 minutes.
  */
 $wgForcedRawSMaxage = 300;
 
@@ -5692,6 +5697,29 @@ $wgAggregateStatsID = false;
  */
 $wgStatsFormatString = "stats/%s - %s 1 1 1 1 %s\n";
 
+/**
+ * Destination of statsd metrics.
+ *
+ * A host or host:port of a statsd server. Port defaults to 8125.
+ *
+ * If not set, statsd metrics will not be collected.
+ *
+ * @see wfLogProfilingData
+ * @since 1.25
+ */
+$wgStatsdServer = false;
+
+/**
+ * Prefix for metric names sent to wgStatsdServer.
+ *
+ * Defaults to "MediaWiki".
+ *
+ * @see RequestContext::getStats
+ * @see BufferingStatsdDataFactory
+ * @since 1.25
+ */
+$wgStatsdMetricPrefix = false;
+
 /**
  * InfoAction retrieves a list of transclusion links (both to and from).
  * This number puts a limit on that query in the case of highly transcluded
@@ -6024,6 +6052,21 @@ $wgGitRepositoryViewers = array(
  */
 $wgRCMaxAge = 90 * 24 * 3600;
 
+/**
+ * Page watchers inactive for more than this many seconds are considered inactive.
+ * Used mainly by action=info. Default: 180 days = about six months.
+ * @since 1.26
+ */
+$wgWatchersMaxAge = 180 * 24 * 3600;
+
+/**
+ * If active watchers (per above) are this number or less, do not disclose it.
+ * Left to 1, prevents unprivileged users from knowing for sure that there are 0.
+ * Set to -1 if you want to always complement watchers count with this info.
+ * @since 1.26
+ */
+$wgUnwatchedPageSecret = 1;
+
 /**
  * Filter $wgRCLinkDays by $wgRCMaxAge to avoid showing links for numbers
  * higher than what will be stored. Note that this is disabled by default
@@ -6693,7 +6736,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 ),
 );
 
 /**
@@ -6809,6 +6852,7 @@ $wgLogTypes = array(
        'suppress',
        'tag',
        'managetags',
+       'contentmodel',
 );
 
 /**
@@ -6884,15 +6928,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',
 );
 
 /**
@@ -6902,10 +6946,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',
 );
 
 /**
@@ -6915,34 +6959,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',
+       'suppress/revision' => 'DeleteLogFormatter',
+       'tag/update' => 'TagLogFormatter',
+       'upload/overwrite' => 'UploadLogFormatter',
+       'upload/revert' => 'UploadLogFormatter',
+       'upload/upload' => 'UploadLogFormatter',
 );
 
 /**
@@ -6968,14 +7013,6 @@ $wgAllowSpecialInclusion = true;
  */
 $wgDisableQueryPageUpdate = false;
 
-/**
- * List of special pages, followed by what subtitle they should go under
- * at Special:SpecialPages
- *
- * @deprecated since 1.21 Override SpecialPage::getGroupName instead
- */
-$wgSpecialPageGroups = array();
-
 /**
  * On Special:Unusedimages, consider images "used", if they are put
  * into a category. Default (false) is not to count those as used.
index 262471e..d55bbcf 100644 (file)
@@ -198,7 +198,7 @@ define( 'LIST_OR', 4 );
 /**
  * Unicode and normalisation related
  */
-require_once __DIR__ . '/libs/normal/UtfNormalDefines.php';
+require_once __DIR__ . '/compat/normal/UtfNormalDefines.php';
 
 /**@{
  * Hook support constants
index 3600fb2..bf322ae 100644 (file)
@@ -1671,6 +1671,7 @@ class EditPage {
                        }
                }
 
+               $changingContentModel = false;
                if ( $this->contentModel !== $this->mTitle->getContentModel() ) {
                        if ( !$wgContentHandlerUseDB ) {
                                $status->fatal( 'editpage-cannot-use-custom-model' );
@@ -1679,7 +1680,10 @@ class EditPage {
                        } elseif ( !$wgUser->isAllowed( 'editcontentmodel' ) ) {
                                $status->setResult( false, self::AS_NO_CHANGE_CONTENT_MODEL );
                                return $status;
+
                        }
+                       $changingContentModel = true;
+                       $oldContentModel = $this->mTitle->getContentModel();
                }
 
                if ( $this->changeTags ) {
@@ -1978,9 +1982,39 @@ class EditPage {
                        } );
                }
 
+               // If the content model changed, add a log entry
+               if ( $changingContentModel ) {
+                       $this->addContentModelChangeLogEntry(
+                               $wgUser,
+                               $oldContentModel,
+                               $this->contentModel,
+                               $this->summary
+                       );
+               }
+
                return $status;
        }
 
+       /**
+        * @param Title $title
+        * @param string $oldModel
+        * @param string $newModel
+        * @param string $reason
+        */
+       protected function addContentModelChangeLogEntry( User $user, $oldModel, $newModel, $reason ) {
+               $log = new ManualLogEntry( 'contentmodel', 'change' );
+               $log->setPerformer( $user );
+               $log->setTarget( $this->mTitle );
+               $log->setComment( $reason );
+               $log->setParameters( array(
+                       '4::oldmodel' => $oldModel,
+                       '5::newmodel' => $newModel
+               ) );
+               $logid = $log->insert();
+               $log->publish( $logid );
+       }
+
+
        /**
         * Register the change of watch status
         */
index c618426..00d3d3a 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
        );
 
@@ -1248,7 +1253,7 @@ function wfLogProfilingData() {
        $profiler->logData();
 
        $config = $context->getConfig();
-       if ( $config->has( 'StatsdServer' ) ) {
+       if ( $config->get( 'StatsdServer' ) ) {
                $statsdServer = explode( ':', $config->get( 'StatsdServer' ) );
                $statsdHost = $statsdServer[0];
                $statsdPort = isset( $statsdServer[1] ) ? $statsdServer[1] : 8125;
index 036d65c..28c54d2 100644 (file)
@@ -135,6 +135,7 @@ 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 932dea2..5510d35 100644 (file)
@@ -279,6 +279,8 @@ class MediaWiki {
         * - Normalise empty title:
         *   /wiki/ -> /wiki/Main
         *   /w/index.php?title= -> /wiki/Main
+        * - Normalise non-standard title urls:
+        *   /w/index.php?title=Foo_Bar -> /wiki/Foo_Bar
         * - Don't redirect anything with query parameters other than 'title' or 'action=view'.
         *
         * @return bool True if a redirect was set.
@@ -289,8 +291,6 @@ class MediaWiki {
 
                if ( $request->getVal( 'action', 'view' ) != 'view'
                        || $request->wasPosted()
-                       || ( $request->getVal( 'title' ) !== null
-                               && $title->getPrefixedDBkey() == $request->getVal( 'title' ) )
                        || count( $request->getValueNames( array( 'action', 'title' ) ) )
                        || !Hooks::run( 'TestCanonicalRedirect', array( $request, $title, $output ) )
                ) {
@@ -305,7 +305,19 @@ class MediaWiki {
                }
                // Redirect to canonical url, make it a 301 to allow caching
                $targetUrl = wfExpandUrl( $title->getFullURL(), PROTO_CURRENT );
-               if ( $targetUrl == $request->getFullRequestURL() ) {
+
+               if ( $targetUrl != $request->getFullRequestURL() ) {
+                       $output->setSquidMaxage( 1200 );
+                       $output->redirect( $targetUrl, '301' );
+                       return true;
+               }
+
+               // If there is no title, or the title is in a non-standard encoding, we demand
+               // a redirect. If cgi somehow changed the 'title' query to be non-standard while
+               // the url is standard, the server is misconfigured.
+               if ( $request->getVal( 'title' ) === null
+                       || $title->getPrefixedDBkey() != $request->getVal( 'title' )
+               ) {
                        $message = "Redirect loop detected!\n\n" .
                                "This means the wiki got confused about what page was " .
                                "requested; this sometimes happens when moving a wiki " .
@@ -327,9 +339,7 @@ class MediaWiki {
                        }
                        throw new HttpError( 500, $message );
                }
-               $output->setSquidMaxage( 1200 );
-               $output->redirect( $targetUrl, '301' );
-               return true;
+               return false;
        }
 
        /**
index 3b06525..2b240c3 100644 (file)
@@ -695,7 +695,7 @@ class MimeMagic {
                }
 
                /* Look for WebP */
-               if ( strncmp( $head, "RIFF", 4 ) == 0 && strncmp( substr( $head, 8, 8 ), "WEBPVP8 ", 8 ) == 0 ) {
+               if ( strncmp( $head, "RIFF", 4 ) == 0 && strncmp( substr( $head, 8, 7 ), "WEBPVP8", 7 ) == 0 ) {
                        wfDebug( __METHOD__ . ": recognized file as image/webp\n" );
                        return "image/webp";
                }
index 0ed847e..30ee19c 100644 (file)
@@ -3440,12 +3440,12 @@ class OutputPage extends ContextSource {
                                                'href' => $this->getTitle()->getLocalURL( array( 'variant' => $_v ) ) )
                                        );
                                }
+                               # 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
index ecb2294..9497ee7 100644 (file)
@@ -1294,12 +1294,19 @@ class Preferences {
                $opt = array();
 
                $localTZoffset = $context->getConfig()->get( 'LocalTZoffset' );
+               $timeZoneList = self::getTimeZoneList( $context->getLanguage() );
+
                $timestamp = MWTimestamp::getLocalInstance();
                // Check that the LocalTZoffset is the same as the local time zone offset
                if ( $localTZoffset == $timestamp->format( 'Z' ) / 60 ) {
+                       $timezoneName = $timestamp->getTimezone()->getName();
+                       // Localize timezone
+                       if ( isset( $timeZoneList[$timezoneName] ) ) {
+                               $timezoneName = $timeZoneList[$timezoneName]['name'];
+                       }
                        $server_tz_msg = $context->msg(
                                'timezoneuseserverdefault',
-                               $timestamp->getTimezone()->getName()
+                               $timezoneName
                        )->text();
                } else {
                        $tzstring = sprintf(
@@ -1313,49 +1320,12 @@ class Preferences {
                $opt[$context->msg( 'timezoneuseoffset' )->text()] = 'other';
                $opt[$context->msg( 'guesstimezone' )->text()] = 'guess';
 
-               if ( function_exists( 'timezone_identifiers_list' ) ) {
-                       # Read timezone list
-                       $tzs = timezone_identifiers_list();
-                       sort( $tzs );
-
-                       $tzRegions = array();
-                       $tzRegions['Africa'] = $context->msg( 'timezoneregion-africa' )->text();
-                       $tzRegions['America'] = $context->msg( 'timezoneregion-america' )->text();
-                       $tzRegions['Antarctica'] = $context->msg( 'timezoneregion-antarctica' )->text();
-                       $tzRegions['Arctic'] = $context->msg( 'timezoneregion-arctic' )->text();
-                       $tzRegions['Asia'] = $context->msg( 'timezoneregion-asia' )->text();
-                       $tzRegions['Atlantic'] = $context->msg( 'timezoneregion-atlantic' )->text();
-                       $tzRegions['Australia'] = $context->msg( 'timezoneregion-australia' )->text();
-                       $tzRegions['Europe'] = $context->msg( 'timezoneregion-europe' )->text();
-                       $tzRegions['Indian'] = $context->msg( 'timezoneregion-indian' )->text();
-                       $tzRegions['Pacific'] = $context->msg( 'timezoneregion-pacific' )->text();
-                       asort( $tzRegions );
-
-                       $prefill = array_fill_keys( array_values( $tzRegions ), array() );
-                       $opt = array_merge( $opt, $prefill );
-
-                       $now = date_create( 'now' );
-
-                       foreach ( $tzs as $tz ) {
-                               $z = explode( '/', $tz, 2 );
-
-                               # timezone_identifiers_list() returns a number of
-                               # backwards-compatibility entries. This filters them out of the
-                               # list presented to the user.
-                               if ( count( $z ) != 2 || !array_key_exists( $z[0], $tzRegions ) ) {
-                                       continue;
-                               }
-
-                               # Localize region
-                               $z[0] = $tzRegions[$z[0]];
-
-                               $minDiff = floor( timezone_offset_get( timezone_open( $tz ), $now ) / 60 );
-
-                               $display = str_replace( '_', ' ', $z[0] . '/' . $z[1] );
-                               $value = "ZoneInfo|$minDiff|$tz";
-
-                               $opt[$z[0]][$display] = $value;
+               foreach ( $timeZoneList as $timeZoneInfo ) {
+                       $region = $timeZoneInfo['region'];
+                       if ( !isset( $opt[$region] ) ) {
+                               $opt[$region] = array();
                        }
+                       $opt[$region][$timeZoneInfo['name']] = $timeZoneInfo['timecorrection'];
                }
                return $opt;
        }
@@ -1491,6 +1461,68 @@ class Preferences {
 
                return Status::newGood();
        }
+
+       /**
+        * Get a list of all time zones
+        * @param Language $language Language used for the localized names
+        * @return array A list of all time zones. The system name of the time zone is used as key and
+        *  the value is an array which contains localized name, the timecorrection value used for
+        *  preferences and the region
+        * @since 1.26
+        */
+       public static function getTimeZoneList( Language $language ) {
+               $identifiers = DateTimeZone::listIdentifiers();
+               if ( $identifiers === false ) {
+                       return array();
+               }
+               sort( $identifiers );
+
+               $tzRegions = array(
+                       'Africa' => wfMessage( 'timezoneregion-africa' )->inLanguage( $language )->text(),
+                       'America' => wfMessage( 'timezoneregion-america' )->inLanguage( $language )->text(),
+                       'Antarctica' => wfMessage( 'timezoneregion-antarctica' )->inLanguage( $language )->text(),
+                       'Arctic' => wfMessage( 'timezoneregion-arctic' )->inLanguage( $language )->text(),
+                       'Asia' => wfMessage( 'timezoneregion-asia' )->inLanguage( $language )->text(),
+                       'Atlantic' => wfMessage( 'timezoneregion-atlantic' )->inLanguage( $language )->text(),
+                       'Australia' => wfMessage( 'timezoneregion-australia' )->inLanguage( $language )->text(),
+                       'Europe' => wfMessage( 'timezoneregion-europe' )->inLanguage( $language )->text(),
+                       'Indian' => wfMessage( 'timezoneregion-indian' )->inLanguage( $language )->text(),
+                       'Pacific' => wfMessage( 'timezoneregion-pacific' )->inLanguage( $language )->text(),
+               );
+               asort( $tzRegions );
+
+               $timeZoneList = array();
+
+               $now = new DateTime();
+
+               foreach ( $identifiers as $identifier ) {
+                       $parts = explode( '/', $identifier, 2 );
+
+                       // DateTimeZone::listIdentifiers() returns a number of
+                       // backwards-compatibility entries. This filters them out of the
+                       // list presented to the user.
+                       if ( count( $parts ) !== 2 || !array_key_exists( $parts[0], $tzRegions ) ) {
+                               continue;
+                       }
+
+                       // Localize region
+                       $parts[0] = $tzRegions[$parts[0]];
+
+                       $dateTimeZone = new DateTimeZone( $identifier );
+                       $minDiff = floor( $dateTimeZone->getOffset( $now ) / 60 );
+
+                       $display = str_replace( '_', ' ', $parts[0] . '/' . $parts[1] );
+                       $value = "ZoneInfo|$minDiff|$identifier";
+
+                       $timeZoneList[$identifier] = array(
+                               'name' => $display,
+                               'timecorrection' => $value,
+                               'region' => $parts[0],
+                       );
+               }
+
+               return $timeZoneList;
+       }
 }
 
 /** Some tweaks to allow js prefs to work */
index 5939715..71bdf58 100644 (file)
@@ -1087,7 +1087,7 @@ class Revision implements IDBAccessObject {
        /**
         * Returns the content model for this revision.
         *
-        * If no content model was stored in the database, $this->getTitle()->getContentModel() is
+        * If no content model was stored in the database, the default content model for the title is
         * used to determine the content model to use. If no title is know, CONTENT_MODEL_WIKITEXT
         * is used as a last resort.
         *
@@ -1097,7 +1097,11 @@ class Revision implements IDBAccessObject {
        public function getContentModel() {
                if ( !$this->mContentModel ) {
                        $title = $this->getTitle();
-                       $this->mContentModel = ( $title ? $title->getContentModel() : CONTENT_MODEL_WIKITEXT );
+                       if ( $title ) {
+                               $this->mContentModel = ContentHandler::getDefaultModelFor( $title );
+                       } else {
+                               $this->mContentModel = CONTENT_MODEL_WIKITEXT;
+                       }
 
                        assert( !empty( $this->mContentModel ) );
                }
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 a97cfa6..0c1e99d 100644 (file)
@@ -492,7 +492,7 @@ if ( !class_exists( 'AutoLoader' ) ) {
 
 MWExceptionHandler::installHandler();
 
-require_once "$IP/includes/libs/normal/UtfNormalUtil.php";
+require_once "$IP/includes/compat/normal/UtfNormalUtil.php";
 
 $ps_default2 = Profiler::instance()->scopedProfileIn( $fname . '-defaults2' );
 
@@ -536,7 +536,9 @@ if ( $wgTmpDirectory === false ) {
 
 // We don't use counters anymore. Left here for extensions still
 // expecting this to exist. Should be removed sometime 1.26 or later.
-$wgDisableCounters = true;
+if ( !isset( $wgDisableCounters ) ) {
+       $wgDisableCounters = true;
+}
 
 if ( $wgMainWANCache === false ) {
        // Setup a WAN cache from $wgMainCacheType with no relayer.
index 7aa4113..9c8ed47 100644 (file)
@@ -3632,7 +3632,7 @@ class Title {
                        );
                }
 
-               return $errors ? : true;
+               return $errors ?: true;
        }
 
        /**
index 21c09cc..95ac0f1 100644 (file)
@@ -369,7 +369,8 @@ class User implements IDBAccessObject {
                                Hooks::run( 'UserLoadAfterLoadFromSession', array( $this ) );
                                break;
                        default:
-                               throw new MWException( "Unrecognised value for User->mFrom: \"{$this->mFrom}\"" );
+                               throw new UnexpectedValueException(
+                                       "Unrecognised value for User->mFrom: \"{$this->mFrom}\"" );
                }
        }
 
@@ -386,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() ) {
@@ -943,7 +945,7 @@ class User implements IDBAccessObject {
         *   - 'usable'     Valid for batch processes and login
         *   - 'creatable'  Valid for batch processes, login and account creation
         *
-        * @throws MWException
+        * @throws InvalidArgumentException
         * @return bool|string
         */
        public static function getCanonicalName( $name, $validate = 'valid' ) {
@@ -990,7 +992,8 @@ class User implements IDBAccessObject {
                                }
                                break;
                        default:
-                               throw new MWException( 'Invalid parameter value for $validate in ' . __METHOD__ );
+                               throw new InvalidArgumentException(
+                                       'Invalid parameter value for $validate in ' . __METHOD__ );
                }
                return $name;
        }
@@ -2324,6 +2327,10 @@ class User implements IDBAccessObject {
 
        /**
         * Get the user touched timestamp
+        *
+        * Use this value only to validate caches via inequalities
+        * such as in the case of HTTP If-Modified-Since response logic
+        *
         * @return string TS_MW Timestamp
         */
        public function getTouched() {
@@ -2332,14 +2339,9 @@ class User implements IDBAccessObject {
                if ( $this->mId ) {
                        if ( $this->mQuickTouched === null ) {
                                $key = wfMemcKey( 'user-quicktouched', 'id', $this->mId );
+                               $cache = ObjectCache::getMainWANInstance();
 
-                               $timestamp = ObjectCache::getMainWANInstance()->getCheckKeyTime( $key );
-                               if ( $timestamp ) {
-                                       $this->mQuickTouched = wfTimestamp( TS_MW, (int)$timestamp );
-                               } else {
-                                       # Set the timestamp to get HTTP 304 cache hits
-                                       $this->touch();
-                               }
+                               $this->mQuickTouched = wfTimestamp( TS_MW, $cache->getCheckKeyTime( $key ) );
                        }
 
                        return max( $this->mTouched, $this->mQuickTouched );
@@ -3704,19 +3706,29 @@ 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__ );
+               $db = ( ( $flags & self::READ_LATEST ) == self::READ_LATEST )
+                       ? wfGetDB( DB_MASTER )
+                       : wfGetDB( DB_SLAVE );
+
+               $options = ( ( $flags & self::READ_LOCKING ) == self::READ_LOCKING )
+                       ? array( 'FOR UPDATE' )
+                       : array();
+
+               $id = $db->selectField( 'user', 'user_id', array( 'user_name' => $s ), __METHOD__, $options );
                if ( $id === false ) {
                        $id = 0;
                }
+
                return $id;
        }
 
index c99e484..03410cc 100644 (file)
@@ -1297,6 +1297,7 @@ class FauxRequest extends WebRequest {
        private $wasPosted = false;
        private $session = array();
        private $requestUrl;
+       protected $cookies = array();
 
        /**
         * @param array $data Array of *non*-urlencoded key => value pairs, the
@@ -1371,7 +1372,38 @@ class FauxRequest extends WebRequest {
        }
 
        public function getCookie( $key, $prefix = null, $default = null ) {
-               return $default;
+               if ( $prefix === null ) {
+                       global $wgCookiePrefix;
+                       $prefix = $wgCookiePrefix;
+               }
+               $name = $prefix . $key;
+               return isset( $this->cookies[$name] ) ? $this->cookies[$name] : $default;
+       }
+
+       /**
+        * @since 1.26
+        * @param string $name Unprefixed name of the cookie to set
+        * @param string|null $value Value of the cookie to set
+        * @param string|null $prefix Cookie prefix. Defaults to $wgCookiePrefix
+        */
+       public function setCookie( $key, $value, $prefix = null ) {
+               $this->setCookies( array( $key => $value ), $prefix );
+       }
+
+       /**
+        * @since 1.26
+        * @param array $cookies
+        * @param string|null $prefix Cookie prefix. Defaults to $wgCookiePrefix
+        */
+       public function setCookies( $cookies, $prefix = null ) {
+               if ( $prefix === null ) {
+                       global $wgCookiePrefix;
+                       $prefix = $wgCookiePrefix;
+               }
+               foreach ( $cookies as $key => $value ) {
+                       $name = $prefix . $key;
+                       $this->cookies[$name] = $value;
+               }
        }
 
        public function checkSessionCookie() {
@@ -1402,8 +1434,18 @@ class FauxRequest extends WebRequest {
         * @param string $val
         */
        public function setHeader( $name, $val ) {
-               $name = strtoupper( $name );
-               $this->headers[$name] = $val;
+               $this->setHeaders( array( $name => $val ) );
+       }
+
+       /**
+        * @since 1.26
+        * @param array $headers
+        */
+       public function setHeaders( $headers ) {
+               foreach ( $headers as $name => $val ) {
+                       $name = strtoupper( $name );
+                       $this->headers[$name] = $val;
+               }
        }
 
        /**
index b59be8c..87cc48e 100644 (file)
@@ -3186,6 +3186,7 @@ $zh2Hant = array(
 '下签' => '下籤',
 '下课钟' => '下課鐘',
 '不干不净' => '不乾不淨',
+'不干胶' => '不乾膠',
 '不克自制' => '不克自制',
 '不加自制' => '不加自制',
 '不占凶吉' => '不占凶吉',
@@ -3372,7 +3373,6 @@ $zh2Hant = array(
 '干擦' => '乾擦',
 '干支剌' => '乾支剌',
 '干支支' => '乾支支',
-'干敲梆子不卖油' => '乾敲梆子不賣油',
 '干料' => '乾料',
 '干旱' => '乾旱',
 '干暖' => '乾暖',
@@ -3480,8 +3480,7 @@ $zh2Hant = array(
 '乱发生' => '亂發生',
 '乱发脾气' => '亂發脾氣',
 '乱发' => '亂髮',
-'乱哄' => '亂鬨',
-'乱哄不过来' => '亂鬨不過來',
+'乱哄哄' => '亂鬨鬨',
 '了然后' => '了然後',
 '事有斗巧' => '事有鬥巧',
 '事里' => '事裡',
@@ -3726,6 +3725,7 @@ $zh2Hant = array(
 '亮钟' => '亮鐘',
 '人云' => '人云',
 '人如风后入江云' => '人如風後入江雲',
+'人干的' => '人幹的',
 '人欲' => '人慾',
 '人数只' => '人數只',
 '人数里' => '人數裡',
@@ -3734,6 +3734,7 @@ $zh2Hant = array(
 '什锦面' => '什錦麵',
 '仇仇' => '仇讎',
 '介胄' => '介冑',
+'他干的' => '他幹的',
 '他钟' => '他鐘',
 '付托' => '付託',
 '仙后' => '仙后',
@@ -3846,6 +3847,7 @@ $zh2Hant = array(
 '个里' => '個裡',
 '个钟' => '個鐘',
 '个钟表' => '個鐘錶',
+'们干的' => '們幹的',
 '幸免' => '倖免',
 '幸存' => '倖存',
 '幸幸' => '倖幸',
@@ -4109,7 +4111,6 @@ $zh2Hant = array(
 '利于' => '利於',
 '刮来刮去' => '刮來刮去',
 '刮起来' => '刮起來',
-'刮风下雪倒便宜' => '刮風下雪倒便宜',
 '刮胡' => '刮鬍',
 '到山里' => '到山裡',
 '制冷机' => '制冷機',
@@ -4235,7 +4236,6 @@ $zh2Hant = array(
 '博尔术' => '博爾朮',
 '卜云吉' => '卜云吉',
 '占了卜' => '占了卜',
-'占便宜的是呆' => '占便宜的是獃',
 '印累绶若' => '印纍綬若',
 '印制' => '印製',
 '印鉴' => '印鑑',
@@ -4702,7 +4702,6 @@ $zh2Hant = array(
 '太后' => '太后',
 '太丑' => '太醜',
 '太阁' => '太閤',
-'夯干' => '夯幹',
 '夸克' => '夸克',
 '夸父' => '夸父',
 '夸特' => '夸特',
@@ -4839,6 +4838,7 @@ $zh2Hant = array(
 '对准表' => '對準錶',
 '对准钟' => '對準鐘',
 '对准钟表' => '對準鐘錶',
+'对着干' => '對着幹',
 '对华发' => '對華發',
 '对表中' => '對表中',
 '对表扬' => '對表揚',
@@ -4934,7 +4934,6 @@ $zh2Hant = array(
 '工作台' => '工作檯',
 '工致' => '工緻',
 '左冲右突' => '左衝右突',
-'巧妇做不得无面馎饦' => '巧婦做不得無麵餺飥',
 '巧干' => '巧幹',
 '巧历' => '巧曆',
 '巧历史' => '巧歷史',
@@ -4996,6 +4995,7 @@ $zh2Hant = array(
 '干吗' => '幹嗎',
 '干嘛' => '幹嘛',
 '干坏事' => '幹壞事',
+'干大事' => '幹大事',
 '干完' => '幹完',
 '干家' => '幹家',
 '干得' => '幹得',
@@ -5013,7 +5013,8 @@ $zh2Hant = array(
 '干甚么' => '幹甚麼',
 '干略' => '幹略',
 '干当' => '幹當',
-'干的停当' => '幹的停當',
+'干的事' => '幹的事',
+'干的好事' => '幹的好事',
 '干细胞' => '幹細胞',
 '干线' => '幹線',
 '干练' => '幹練',
@@ -5141,6 +5142,7 @@ $zh2Hant = array(
 '很凶' => '很兇',
 '很准' => '很準',
 '很丑' => '很醜',
+'很松' => '很鬆',
 '律历志' => '律曆志',
 '后印' => '後印',
 '后台老板' => '後台老板',
@@ -5356,7 +5358,9 @@ $zh2Hant = array(
 '怪里怪气' => '怪裡怪氣',
 '怫郁' => '怫鬱',
 '恂栗' => '恂慄',
+'恒基' => '恒基',
 '恒生' => '恒生',
+'恒隆' => '恒隆',
 '恕乏价催' => '恕乏价催',
 '息交绝游' => '息交絕遊',
 '息谷' => '息穀',
@@ -5503,7 +5507,6 @@ $zh2Hant = array(
 '批复' => '批覆',
 '批注' => '批註',
 '批斗' => '批鬥',
-'承制' => '承製',
 '抑制作用' => '抑制作用',
 '抑制剂' => '抑制劑',
 '抑郁' => '抑鬱',
@@ -6547,6 +6550,7 @@ $zh2Hant = array(
 '滃郁' => '滃鬱',
 '滑借' => '滑藉',
 '汇丰' => '滙豐',
+'渗漓' => '滲灕',
 '卤了' => '滷了',
 '卤五花' => '滷五花',
 '卤味' => '滷味',
@@ -6590,7 +6594,6 @@ $zh2Hant = array(
 '澄江县' => '澂江縣',
 '澄澹精致' => '澄澹精致',
 '澒蒙' => '澒濛',
-'泽渗漓而下降' => '澤滲灕而下降',
 '淀乃不耕之地' => '澱乃不耕之地',
 '淀北片' => '澱北片',
 '淀山' => '澱山',
@@ -6659,6 +6662,7 @@ $zh2Hant = array(
 '烘制' => '烘製',
 '烤干' => '烤乾',
 '烤卤' => '烤滷',
+'烹制' => '烹製',
 '焙干' => '焙乾',
 '无征不信' => '無徵不信',
 '无业游民' => '無業游民',
@@ -6730,7 +6734,6 @@ $zh2Hant = array(
 '犹如表' => '猶如錶',
 '犹如钟' => '猶如鐘',
 '犹如钟表' => '猶如鐘錶',
-'呆串了皮' => '獃串了皮',
 '狱里' => '獄裡',
 '奖杯' => '獎盃',
 '独裁制' => '獨裁制',
@@ -6743,6 +6746,7 @@ $zh2Hant = array(
 '玉米面' => '玉米面',
 '王侯后' => '王侯后',
 '王后' => '王后',
+'王添灯' => '王添灯',
 '王田里' => '王田里',
 '王鉴' => '王鑑',
 '王余鱼' => '王餘魚',
@@ -7336,7 +7340,6 @@ $zh2Hant = array(
 '系辞' => '繫辭',
 '系鞋带' => '繫鞋帶',
 '系风捕影' => '繫風捕影',
-'继承制' => '繼承制',
 '累囚' => '纍囚',
 '累堆' => '纍堆',
 '累瓦结绳' => '纍瓦結繩',
@@ -7462,6 +7465,7 @@ $zh2Hant = array(
 '卧游' => '臥遊',
 '臧谷亡羊' => '臧穀亡羊',
 '临潼斗宝' => '臨潼鬥寶',
+'自干五' => '自乾五',
 '自制一下' => '自制一下',
 '自制下来' => '自制下來',
 '自制不' => '自制不',
@@ -8396,7 +8400,6 @@ $zh2Hant = array(
 '鄭凱云' => '鄭凱云',
 '配制饲料' => '配制飼料',
 '配图里' => '配圖裡',
-'配水干管' => '配水幹管',
 '配制' => '配製',
 '酒帘' => '酒帘',
 '酒气冲天' => '酒氣衝天',
@@ -8893,6 +8896,7 @@ $zh2Hant = array(
 '飘荡' => '飄蕩',
 '飘游' => '飄遊',
 '飘飘荡荡' => '飄飄蕩蕩',
+'飘发自由女神' => '飄髮自由女神',
 '飞扎' => '飛紮',
 '飞刍挽粟' => '飛芻輓粟',
 '飞行钟' => '飛行鐘',
@@ -9181,6 +9185,7 @@ $zh2Hant = array(
 '斗合' => '鬥合',
 '斗嘴' => '鬥嘴',
 '斗地主' => '鬥地主',
+'斗垮' => '鬥垮',
 '斗士' => '鬥士',
 '斗富' => '鬥富',
 '斗巧' => '鬥巧',
@@ -9196,6 +9201,7 @@ $zh2Hant = array(
 '斗打' => '鬥打',
 '斗批改' => '鬥批改',
 '斗技' => '鬥技',
+'斗败' => '鬥敗',
 '斗文' => '鬥文',
 '斗智' => '鬥智',
 '斗暴' => '鬥暴',
@@ -9211,6 +9217,7 @@ $zh2Hant = array(
 '斗牛' => '鬥牛',
 '斗犀台' => '鬥犀臺',
 '斗犬' => '鬥犬',
+'斗狗' => '鬥狗',
 '斗狠' => '鬥狠',
 '斗兽' => '鬥獸',
 '斗叠' => '鬥疊',
@@ -9225,6 +9232,7 @@ $zh2Hant = array(
 '斗草' => '鬥草',
 '斗叶儿' => '鬥葉兒',
 '斗叶子' => '鬥葉子',
+'斗蛐' => '鬥蛐',
 '斗蟋蟀' => '鬥蟋蟀',
 '斗话' => '鬥話',
 '斗艳' => '鬥豔',
@@ -9358,7 +9366,6 @@ $zh2Hant = array(
 '曲霉' => '麴黴',
 '麹霉' => '麴黴',
 '面人儿' => '麵人兒',
-'面价' => '麵價',
 '面包' => '麵包',
 '面坊' => '麵坊',
 '面坯儿' => '麵坯兒',
@@ -9370,7 +9377,6 @@ $zh2Hant = array(
 '面条' => '麵條',
 '面汤' => '麵湯',
 '面浆' => '麵漿',
-'面灰' => '麵灰',
 '面疙瘩' => '麵疙瘩',
 '面皮' => '麵皮',
 '面码儿' => '麵碼兒',
@@ -9380,6 +9386,7 @@ $zh2Hant = array(
 '面团' => '麵糰',
 '面缸' => '麵缸',
 '面茶' => '麵茶',
+'面制品' => '麵製品',
 '面食' => '麵食',
 '面饺' => '麵餃',
 '面饼' => '麵餅',
@@ -13327,7 +13334,6 @@ $zh2Hans = array(
 '乾崗' => '乾岗',
 '乾巛' => '乾巛',
 '乾州' => '乾州',
-'乾式' => '乾式',
 '乾录' => '乾录',
 '乾錄' => '乾录',
 '乾律' => '乾律',
@@ -14090,6 +14096,7 @@ $zh2TW = array(
 '老挝语' => '寮語',
 '老撾語' => '寮語',
 '波里活' => '寶萊塢',
+'对着干' => '對著幹',
 '高峰时段' => '尖峰時段',
 '高峰时间' => '尖峰時間',
 '贊比亞' => '尚比亞',
@@ -17765,6 +17772,7 @@ $zh2CN = array(
 '東南亞國家協會' => '东南亚国家联盟',
 '亚细安' => '东盟',
 '東協' => '东盟',
+'仲介' => '中介',
 '臨著' => '临着',
 '臨著書' => '临著书',
 '臨著作' => '临著作',
@@ -19249,6 +19257,7 @@ $zh2CN = array(
 '涵著者' => '涵著者',
 '涵著述' => '涵著述',
 '混帳' => '混账',
+'清澈' => '清澈',
 '清帳' => '清账',
 '渴著' => '渴着',
 '渴著書' => '渴著书',
@@ -20438,8 +20447,8 @@ $zh2CN = array(
 '髭著稱' => '髭著称',
 '髭著者' => '髭著者',
 '髭著述' => '髭著述',
-'魚雷射' => '鱼雷射',
-'鱼雷射' => '鱼雷射',
+'魚雷' => '鱼雷',
+'鱼雷' => '鱼雷',
 '咪高峰' => '麦克风',
 '黏著' => '黏着',
 '黏著書' => '黏著书',
index bf86b51..0c1a344 100644 (file)
@@ -234,7 +234,7 @@ class InfoAction extends FormlessAction {
 
                // Display title
                $displayTitle = $title->getPrefixedText();
-               if ( !empty( $pageProperties['displaytitle'] ) ) {
+               if ( isset( $pageProperties['displaytitle'] ) ) {
                        $displayTitle = $pageProperties['displaytitle'];
                }
 
@@ -259,7 +259,7 @@ class InfoAction extends FormlessAction {
 
                // Default sort key
                $sortKey = $title->getCategorySortkey();
-               if ( !empty( $pageProperties['defaultsort'] ) ) {
+               if ( isset( $pageProperties['defaultsort'] ) ) {
                        $sortKey = $pageProperties['defaultsort'];
                }
 
@@ -325,8 +325,27 @@ class InfoAction extends FormlessAction {
                ) {
                        // Number of page watchers
                        $pageInfo['header-basic'][] = array(
-                               $this->msg( 'pageinfo-watchers' ), $lang->formatNum( $pageCounts['watchers'] )
+                               $this->msg( 'pageinfo-watchers' ),
+                               $lang->formatNum( $pageCounts['watchers'] )
                        );
+                       if (
+                               $config->get( 'ShowUpdatedMarker' ) &&
+                               isset( $pageCounts['visitingWatchers'] )
+                       ) {
+                               $minToDisclose = $config->get( 'UnwatchedPageSecret' );
+                               if ( $pageCounts['visitingWatchers'] > $minToDisclose ||
+                                       $user->isAllowed( 'unwatchedpages' ) ) {
+                                       $pageInfo['header-basic'][] = array(
+                                               $this->msg( 'pageinfo-visiting-watchers' ),
+                                               $lang->formatNum( $pageCounts['visitingWatchers'] )
+                                       );
+                               } else {
+                                       $pageInfo['header-basic'][] = array(
+                                               $this->msg( 'pageinfo-visiting-watchers' ),
+                                               $this->msg( 'pageinfo-few-visiting-watchers' )
+                                       );
+                               }
+                       }
                } elseif ( $unwatchedPageThreshold !== false ) {
                        $pageInfo['header-basic'][] = array(
                                $this->msg( 'pageinfo-watchers' ),
@@ -671,6 +690,26 @@ class InfoAction extends FormlessAction {
                );
                $result['watchers'] = $watchers;
 
+               if ( $config->get( 'ShowUpdatedMarker' ) ) {
+                       // 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 );
+                       // Number of page watchers who also visited a "recent" edit
+                       $visitingWatchers = (int)$dbr->selectField(
+                               'watchlist',
+                               'COUNT(*)',
+                               array(
+                                       'wl_namespace' => $title->getNamespace(),
+                                       'wl_title' => $title->getDBkey(),
+                                       'wl_notificationtimestamp >= ' . $dbr->addQuotes( $threshold ) .
+                                       ' OR wl_notificationtimestamp IS NULL'
+                               ),
+                               __METHOD__
+                       );
+                       $result['visitingWatchers'] = $visitingWatchers;
+               }
+
                // Total number of edits
                $edits = (int)$dbr->selectField(
                        'revision',
index b04ffbe..b71b0e9 100644 (file)
  */
 class RawAction extends FormlessAction {
        /**
-        * @var bool Does the request include a gen=css|javascript parameter
-        * @deprecated This used to be a string for "css" or "javascript" but
-        * it is no longer used. Setting this parameter results in empty content
-        * being served
+        * Whether the request includes a 'gen' parameter
+        * @var bool
+        * @deprecated since 1.17 This used to be a string for "css" or "javascript" but
+        * it is no longer used. Setting this parameter results in an empty response.
         */
        private $gen = false;
 
@@ -56,6 +56,7 @@ class RawAction extends FormlessAction {
        function onView() {
                $this->getOutput()->disable();
                $request = $this->getRequest();
+               $response = $request->response();
                $config = $this->context->getConfig();
 
                if ( !$request->checkUrlExtension() ) {
@@ -66,42 +67,35 @@ class RawAction extends FormlessAction {
                        return; // Client cache fresh and headers sent, nothing more to do.
                }
 
-               # special case for 'generated' raw things: user css/js
-               # This is deprecated and will only return empty content
                $gen = $request->getVal( 'gen' );
-               $smaxage = $request->getIntOrNull( 'smaxage' );
-
                if ( $gen == 'css' || $gen == 'js' ) {
                        $this->gen = true;
-                       if ( $smaxage === null ) {
-                               $smaxage = $config->get( 'SquidMaxage' );
-                       }
                }
 
                $contentType = $this->getContentType();
 
-               # Force caching for CSS and JS raw content, default: 5 minutes.
-               # Note: If using a canonical url for userpage css/js, we send an HTCP purge.
+               $maxage = $request->getInt( 'maxage', $config->get( 'SquidMaxage' ) );
+               $smaxage = $request->getIntOrNull( 'smaxage' );
                if ( $smaxage === null ) {
-                       if ( $contentType == 'text/css' || $contentType == 'text/javascript' ) {
+                       if ( $this->gen ) {
+                               $smaxage = $config->get( 'SquidMaxage' );
+                       } elseif ( $contentType == 'text/css' || $contentType == 'text/javascript' ) {
+                               // CSS/JS raw content has its own squid max age configuration.
+                               // Note: Title::getSquidURLs() includes action=raw for css/js pages,
+                               // so if using the canonical url, this will get HTCP purges.
                                $smaxage = intval( $config->get( 'ForcedRawSMaxage' ) );
                        } else {
+                               // No squid cache for anything else
                                $smaxage = 0;
                        }
                }
 
-               $maxage = $request->getInt( 'maxage', $config->get( 'SquidMaxage' ) );
-
-               $response = $request->response();
-
                $response->header( 'Content-type: ' . $contentType . '; charset=UTF-8' );
-               # Output may contain user-specific data;
-               # vary generated content for open sessions on private wikis
+               // Output may contain user-specific data;
+               // vary generated content for open sessions on private wikis
                $privateCache = !User::isEveryoneAllowed( 'read' ) && ( $smaxage == 0 || session_id() != '' );
-               // Bug 53032 - make this private if user is logged in,
-               // so we don't accidentally cache cookies
-               $privateCache = $privateCache ?: $this->getUser()->isLoggedIn();
-               # allow the client to cache this for 24 hours
+               // Don't accidentally cache cookies if user is logged in (T55032)
+               $privateCache = $privateCache || $this->getUser()->isLoggedIn();
                $mode = $privateCache ? 'private' : 'public';
                $response->header(
                        'Cache-Control: ' . $mode . ', s-maxage=' . $smaxage . ', max-age=' . $maxage
index 4b76e65..393ff49 100644 (file)
@@ -2481,7 +2481,7 @@ abstract class ApiBase extends ContextSource {
         * Returns the description string for this module
         *
         * Ignored if an i18n message exists for
-        * "apihelp-{$this->getModulePathString()}-description".
+        * "apihelp-{$this->getModulePath()}-description".
         *
         * @deprecated since 1.25
         * @return Message|string|array
@@ -2495,7 +2495,7 @@ abstract class ApiBase extends ContextSource {
         *
         * For each parameter, ignored if an i18n message exists for the parameter.
         * By default that message is
-        * "apihelp-{$this->getModulePathString()}-param-{$param}", but it may be
+        * "apihelp-{$this->getModulePath()}-param-{$param}", but it may be
         * overridden using ApiBase::PARAM_HELP_MSG in the data returned by
         * self::getFinalParams().
         *
index d8b5718..6279dfd 100644 (file)
@@ -131,7 +131,7 @@ class ApiDelete extends ApiBase {
                $error = '';
 
                // Luckily, Article.php provides a reusable delete function that does the hard work for us
-               return $page->doDeleteArticleReal( $reason, false, 0, true, $error );
+               return $page->doDeleteArticleReal( $reason, false, 0, true, $error, $user );
        }
 
        /**
index e70b8f0..b623849 100644 (file)
@@ -96,9 +96,11 @@ class ApiEditPage extends ApiBase {
                        $contentHandler = ContentHandler::getForModelID( $params['contentmodel'] );
                }
 
+               $name = $titleObj->getPrefixedDBkey();
+               $model = $contentHandler->getModelID();
                if ( $contentHandler->supportsDirectApiEditing() === false ) {
                        $this->dieUsage(
-                               'Direct editing via API is not supported for this content type.',
+                               "Direct editing via API is not supported for content model $model used by $name",
                                'no-direct-editing'
                        );
                }
@@ -110,8 +112,6 @@ class ApiEditPage extends ApiBase {
                $contentFormat = $params['contentformat'];
 
                if ( !$contentHandler->isSupportedFormat( $contentFormat ) ) {
-                       $name = $titleObj->getPrefixedDBkey();
-                       $model = $contentHandler->getModelID();
 
                        $this->dieUsage( "The requested format $contentFormat is not supported for content model " .
                                " $model used by $name", 'badformat' );
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 47c8128..4d80163 100644 (file)
@@ -246,7 +246,7 @@ abstract class ApiFormatBase extends ApiBase {
        }
 
        /**
-        * To avoid code duplication with the deprecation of dbg, dump, txt, wddx,
+        * To avoid code duplication with the deprecation of dbg, txt
         * and yaml, this method is added to do the necessary work. It should be
         * removed when those deprecated formats are removed.
         */
@@ -312,7 +312,7 @@ abstract class ApiFormatBase extends ApiBase {
                // Escape everything first for full coverage
                $text = htmlspecialchars( $text );
 
-               if ( $this->mFormat === 'XML' || $this->mFormat === 'WDDX' ) {
+               if ( $this->mFormat === 'XML' ) {
                        // encode all comments or tags as safe blue strings
                        $text = str_replace( '&lt;', '<span style="color:blue;">&lt;', $text );
                        $text = str_replace( '&gt;', '&gt;</span>', $text );
diff --git a/includes/api/ApiFormatDump.php b/includes/api/ApiFormatDump.php
deleted file mode 100644 (file)
index f34e1ae..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-/**
- *
- *
- * Created on August 8, 2010
- *
- * Copyright © 2010 Soxred93
- *
- * 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
- */
-
-/**
- * API PHP's var_dump() output formatter
- * @deprecated since 1.24
- * @ingroup API
- */
-class ApiFormatDump extends ApiFormatBase {
-
-       public function getMimeType() {
-               // This looks like it should be text/plain, but IE7 is so
-               // brain-damaged it tries to parse text/plain as HTML if it
-               // contains HTML tags. Using MIME text/text works around this bug
-               return 'text/text';
-       }
-
-       public function execute() {
-               $this->markDeprecated();
-               $data = $this->getResult()->getResultData( null, array(
-                       'BC' => array(),
-                       'Types' => array(),
-                       'Strip' => 'all',
-               ) );
-               ob_start();
-               var_dump( $data );
-               $result = ob_get_contents();
-               ob_end_clean();
-               $this->printText( $result );
-       }
-
-       public function isDeprecated() {
-               return true;
-       }
-}
diff --git a/includes/api/ApiFormatWddx.php b/includes/api/ApiFormatWddx.php
deleted file mode 100644 (file)
index c18353f..0000000
+++ /dev/null
@@ -1,162 +0,0 @@
-<?php
-/**
- *
- *
- * Created on Oct 22, 2006
- *
- * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * API WDDX output formatter
- * @deprecated since 1.24
- * @ingroup API
- */
-class ApiFormatWddx extends ApiFormatBase {
-
-       public function getMimeType() {
-               return 'text/xml';
-       }
-
-       public function execute() {
-               $this->markDeprecated();
-
-               $data = $this->getResult()->getResultData( null, array(
-                       'BC' => array(),
-                       'Types' => array( 'AssocAsObject' => true ),
-                       'Strip' => 'all',
-               ) );
-
-               if ( !$this->getIsHtml() && !static::useSlowPrinter() ) {
-                       $txt = wddx_serialize_value( $data );
-                       $txt = str_replace(
-                               '<struct><var name=\'php_class_name\'><string>stdClass</string></var>',
-                               '<struct>',
-                               $txt
-                       );
-                       $this->printText( $txt );
-               } else {
-                       // Don't do newlines and indentation if we weren't asked
-                       // for pretty output
-                       $nl = ( $this->getIsHtml() ? "\n" : '' );
-                       $indstr = ( $this->getIsHtml() ? ' ' : '' );
-                       $this->printText( "<?xml version=\"1.0\"?>$nl" );
-                       $this->printText( "<wddxPacket version=\"1.0\">$nl" );
-                       $this->printText( "$indstr<header />$nl" );
-                       $this->printText( "$indstr<data>$nl" );
-                       $this->slowWddxPrinter( $data, 4 );
-                       $this->printText( "$indstr</data>$nl" );
-                       $this->printText( "</wddxPacket>$nl" );
-               }
-       }
-
-       public static function useSlowPrinter() {
-               if ( !function_exists( 'wddx_serialize_value' ) ) {
-                       return true;
-               }
-
-               // Some versions of PHP have a broken wddx_serialize_value, see
-               // PHP bug 45314. Test encoding an affected character (U+00A0)
-               // to avoid this.
-               $expected =
-                       "<wddxPacket version='1.0'><header/><data><string>\xc2\xa0</string></data></wddxPacket>";
-               if ( wddx_serialize_value( "\xc2\xa0" ) !== $expected ) {
-                       return true;
-               }
-
-               // Some versions of HHVM don't correctly encode ampersands.
-               $expected =
-                       "<wddxPacket version='1.0'><header/><data><string>&amp;</string></data></wddxPacket>";
-               if ( wddx_serialize_value( '&' ) !== $expected ) {
-                       return true;
-               }
-
-               // Some versions of HHVM don't correctly encode empty arrays as subvalues.
-               $expected =
-                       "<wddxPacket version='1.0'><header/><data><array length='1'><array length='0'></array></array></data></wddxPacket>";
-               if ( wddx_serialize_value( array( array() ) ) !== $expected ) {
-                       return true;
-               }
-
-               // Some versions of HHVM don't correctly encode associative arrays with numeric keys.
-               $expected =
-                       "<wddxPacket version='1.0'><header/><data><struct><var name='2'><number>1</number></var></struct></data></wddxPacket>";
-               if ( wddx_serialize_value( array( 2 => 1 ) ) !== $expected ) {
-                       return true;
-               }
-
-               return false;
-       }
-
-       /**
-        * Recursively go through the object and output its data in WDDX format.
-        * @param mixed $elemValue
-        * @param int $indent
-        */
-       function slowWddxPrinter( $elemValue, $indent = 0 ) {
-               $indstr = ( $this->getIsHtml() ? str_repeat( ' ', $indent ) : '' );
-               $indstr2 = ( $this->getIsHtml() ? str_repeat( ' ', $indent + 2 ) : '' );
-               $nl = ( $this->getIsHtml() ? "\n" : '' );
-
-               if ( is_array( $elemValue ) ) {
-                       $cnt = count( $elemValue );
-                       if ( $cnt != 0 && array_keys( $elemValue ) !== range( 0, $cnt - 1 ) ) {
-                               $elemValue = (object)$elemValue;
-                       }
-               }
-
-               if ( is_array( $elemValue ) ) {
-                       // Regular array
-                       $this->printText( $indstr . Xml::element( 'array', array(
-                               'length' => count( $elemValue ) ), null ) . $nl );
-                       foreach ( $elemValue as $subElemValue ) {
-                               $this->slowWddxPrinter( $subElemValue, $indent + 2 );
-                       }
-                       $this->printText( "$indstr</array>$nl" );
-               } elseif ( is_object( $elemValue ) ) {
-                       // Associative array (<struct>)
-                       $this->printText( "$indstr<struct>$nl" );
-                       foreach ( $elemValue as $subElemName => $subElemValue ) {
-                               $this->printText( $indstr2 . Xml::element( 'var', array(
-                                       'name' => $subElemName
-                               ), null ) . $nl );
-                               $this->slowWddxPrinter( $subElemValue, $indent + 4 );
-                               $this->printText( "$indstr2</var>$nl" );
-                       }
-                       $this->printText( "$indstr</struct>$nl" );
-               } elseif ( is_int( $elemValue ) || is_float( $elemValue ) ) {
-                       $this->printText( $indstr . Xml::element( 'number', null, $elemValue ) . $nl );
-               } elseif ( is_string( $elemValue ) ) {
-                       $this->printText( $indstr . Xml::element( 'string', null, $elemValue, false ) . $nl );
-               } elseif ( is_bool( $elemValue ) ) {
-                       $this->printText( $indstr . Xml::element( 'boolean',
-                               array( 'value' => $elemValue ? 'true' : 'false' ) ) . $nl
-                       );
-               } elseif ( $elemValue === null ) {
-                       $this->printText( $indstr . Xml::element( 'null', array() ) . $nl );
-               } else {
-                       ApiBase::dieDebug( __METHOD__, 'Unknown type ' . gettype( $elemValue ) );
-               }
-       }
-
-       public function isDeprecated() {
-               return true;
-       }
-}
index 4c7d720..4be7d93 100644 (file)
@@ -267,7 +267,7 @@ class ApiFormatXml extends ApiFormatBase {
                return '_' . preg_replace_callback(
                        "/[^$nc]/uS",
                        function ( $m ) {
-                               return sprintf( '.%X.', utf8ToCodepoint( $m[0] ) );
+                               return sprintf( '.%X.', UtfNormal\Utils::utf8ToCodepoint( $m[0] ) );
                        },
                        str_replace( '.', '.2E.', $name )
                );
index a8db20c..46dc7df 100644 (file)
@@ -100,8 +100,6 @@ class ApiMain extends ApiBase {
                'jsonfm' => 'ApiFormatJson',
                'php' => 'ApiFormatPhp',
                'phpfm' => 'ApiFormatPhp',
-               'wddx' => 'ApiFormatWddx',
-               'wddxfm' => 'ApiFormatWddx',
                'xml' => 'ApiFormatXml',
                'xmlfm' => 'ApiFormatXml',
                'yaml' => 'ApiFormatYaml',
@@ -111,8 +109,6 @@ class ApiMain extends ApiBase {
                'txtfm' => 'ApiFormatTxt',
                'dbg' => 'ApiFormatDbg',
                'dbgfm' => 'ApiFormatDbg',
-               'dump' => 'ApiFormatDump',
-               'dumpfm' => 'ApiFormatDump',
                'none' => 'ApiFormatNone',
        );
 
@@ -1094,6 +1090,8 @@ class ApiMain extends ApiBase {
                $this->checkAsserts( $params );
 
                // Execute
+               $this->getContext()->getStats()->increment(
+                       'api.modules.' . strtr( $module->getModulePath(), '+', '.' ) );
                $module->execute();
                Hooks::run( 'APIAfterExecute', array( &$module ) );
 
index fa6f30e..577b525 100644 (file)
@@ -410,9 +410,12 @@ class ApiParse extends ApiBase {
                        $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'limitreporthtml';
                }
 
-               if ( $params['generatexml'] ) {
+               if ( isset( $prop['parsetree'] ) || $params['generatexml'] ) {
+                       if ( !isset( $prop['parsetree'] ) ) {
+                               $this->logFeatureUsage( 'action=parse&generatexml' );
+                       }
                        if ( $this->content->getModel() != CONTENT_MODEL_WIKITEXT ) {
-                               $this->dieUsage( "generatexml is only supported for wikitext content", "notwikitext" );
+                               $this->dieUsage( "parsetree is only supported for wikitext content", "notwikitext" );
                        }
 
                        $wgParser->startExternalParse( $titleObj, $popts, Parser::OT_PREPROCESS );
@@ -745,8 +748,11 @@ class ApiParse extends ApiBase {
                                        'properties',
                                        'limitreportdata',
                                        'limitreporthtml',
+                                       'parsetree',
+                               ),
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(
+                                       'parsetree' => array( 'apihelp-parse-paramvalue-prop-parsetree', CONTENT_MODEL_WIKITEXT ),
                                ),
-                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
                        ),
                        'pst' => false,
                        'onlypst' => false,
@@ -762,6 +768,7 @@ class ApiParse extends ApiBase {
                                ApiBase::PARAM_HELP_MSG => array(
                                        'apihelp-parse-param-generatexml', CONTENT_MODEL_WIKITEXT
                                ),
+                               ApiBase::PARAM_DEPRECATED => true,
                        ),
                        'preview' => false,
                        'sectionpreview' => false,
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 eee5dae..c45e0ef 100644 (file)
@@ -799,6 +799,7 @@ class ApiQueryInfo extends ApiQueryBase {
        }
 
        public function getCacheMode( $params ) {
+               // Other props depend on something about the current user
                $publicProps = array(
                        'protection',
                        'talkid',
@@ -807,13 +808,15 @@ class ApiQueryInfo extends ApiQueryBase {
                        'preload',
                        'displaytitle',
                );
-               if ( !is_null( $params['prop'] ) ) {
-                       foreach ( $params['prop'] as $prop ) {
-                               if ( !in_array( $prop, $publicProps ) ) {
-                                       return 'private';
-                               }
-                       }
+               if ( array_diff( (array)$params['prop'], $publicProps ) ) {
+                       return 'private';
                }
+
+               // testactions also depends on the current user
+               if ( $params['testactions'] ) {
+                       return 'private';
+               }
+
                if ( !is_null( $params['token'] ) ) {
                        return 'private';
                }
index 64f6120..d57dc3c 100644 (file)
@@ -37,7 +37,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
        protected $fld_ids = false, $fld_flags = false, $fld_timestamp = false,
                $fld_size = false, $fld_sha1 = false, $fld_comment = false,
                $fld_parsedcomment = false, $fld_user = false, $fld_userid = false,
-               $fld_content = false, $fld_tags = false, $fld_contentmodel = false;
+               $fld_content = false, $fld_tags = false, $fld_contentmodel = false, $fld_parsetree = false;
 
        public function execute() {
                $this->run();
@@ -104,6 +104,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                $this->fld_userid = isset( $prop['userid'] );
                $this->fld_user = isset( $prop['user'] );
                $this->fld_tags = isset( $prop['tags'] );
+               $this->fld_parsetree = isset( $prop['parsetree'] );
 
                if ( !empty( $params['contentformat'] ) ) {
                        $this->contentFormat = $params['contentformat'];
@@ -112,7 +113,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                $this->limit = $params['limit'];
 
                $this->fetchContent = $this->fld_content || !is_null( $this->diffto )
-                       || !is_null( $this->difftotext );
+                       || !is_null( $this->difftotext ) || $this->fld_parsetree;
 
                $smallLimit = false;
                if ( $this->fetchContent ) {
@@ -273,10 +274,11 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                $vals['textmissing'] = true;
                        }
                }
-               if ( $this->fld_content && $content ) {
-                       $text = null;
-
-                       if ( $this->generateXML ) {
+               if ( $this->fld_parsetree || ( $this->fld_content && $this->generateXML ) ) {
+                       if ( !$this->fld_parsetree ) {
+                               $this->logFeatureUsage( 'action=query&prop=revisions+base&generatexml' );
+                       }
+                       if ( $content ) {
                                if ( $content->getModel() === CONTENT_MODEL_WIKITEXT ) {
                                        $t = $content->getNativeData(); # note: don't set $text
 
@@ -299,6 +301,10 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                                " uses content model " . $content->getModel() );
                                }
                        }
+               }
+
+               if ( $this->fld_content && $content ) {
+                       $text = null;
 
                        if ( $this->expandTemplates && !$this->parseContent ) {
                                #XXX: implement template expansion for all content types in ContentHandler?
@@ -431,9 +437,26 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                        'comment',
                                        'parsedcomment',
                                        'content',
-                                       'tags'
+                                       'tags',
+                                       'parsetree',
                                ),
                                ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-prop',
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(
+                                       'ids' => 'apihelp-query+revisions+base-paramvalue-prop-ids',
+                                       'flags' => 'apihelp-query+revisions+base-paramvalue-prop-flags',
+                                       'timestamp' => 'apihelp-query+revisions+base-paramvalue-prop-timestamp',
+                                       'user' => 'apihelp-query+revisions+base-paramvalue-prop-user',
+                                       'userid' => 'apihelp-query+revisions+base-paramvalue-prop-userid',
+                                       'size' => 'apihelp-query+revisions+base-paramvalue-prop-size',
+                                       'sha1' => 'apihelp-query+revisions+base-paramvalue-prop-sha1',
+                                       'contentmodel' => 'apihelp-query+revisions+base-paramvalue-prop-contentmodel',
+                                       'comment' => 'apihelp-query+revisions+base-paramvalue-prop-comment',
+                                       'parsedcomment' => 'apihelp-query+revisions+base-paramvalue-prop-parsedcomment',
+                                       'content' => 'apihelp-query+revisions+base-paramvalue-prop-content',
+                                       'tags' => 'apihelp-query+revisions+base-paramvalue-prop-tags',
+                                       'parsetree' => array( 'apihelp-query+revisions+base-paramvalue-prop-parsetree',
+                                               CONTENT_MODEL_WIKITEXT ),
+                               ),
                        ),
                        'limit' => array(
                                ApiBase::PARAM_TYPE => 'limit',
@@ -448,6 +471,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                        ),
                        'generatexml' => array(
                                ApiBase::PARAM_DFLT => false,
+                               ApiBase::PARAM_DEPRECATED => true,
                                ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-generatexml',
                        ),
                        'parse' => array(
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',
diff --git a/includes/api/i18n/br.json b/includes/api/i18n/br.json
new file mode 100644 (file)
index 0000000..6810235
--- /dev/null
@@ -0,0 +1,13 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Y-M D"
+               ]
+       },
+       "apihelp-block-description": "Stankañ un implijer",
+       "apihelp-block-param-reason": "Abeg evit stankañ.",
+       "apihelp-delete-description": "Diverkañ ur bajenn.",
+       "apihelp-edit-param-minor": "Kemmig dister.",
+       "apihelp-edit-example-edit": "Kemmañ ur bajenn.",
+       "apihelp-expandtemplates-param-title": "Titl ar bajenn."
+}
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 228dc24..dd2e9ef 100644 (file)
        "apihelp-imagerotate-param-rotation": "Anzahl der Grad, um die das Bild im Uhrzeigersinn gedreht werden soll.",
        "apihelp-imagerotate-example-simple": "<kbd>Datei:Beispiel.png</kbd> um <kbd>90</kbd> Grad drehen.",
        "apihelp-imagerotate-example-generator": "Alle Bilder in der <kbd>Kategorie:Flip</kbd> um <kbd>180</kbd> Grad drehen.",
-       "apihelp-import-description": "Importiert eine Seite von einem anderen Wiki oder einer XML-Datei.\n\nBitte beachte, dass der HTTP-POST-Vorgang als Dateiupload ausgeführt werden muss (z.B. durch multipart/form-data), um eine Datei über den <var>xml</var>-Parameter zu senden.",
+       "apihelp-import-description": "Importiert eine Seite aus einem anderen Wiki oder von einer XML-Datei.\n\nBitte beachte, dass der HTTP-POST-Vorgang als Dateiupload ausgeführt werden muss (z.B. durch multipart/form-data), um eine Datei über den <var>xml</var>-Parameter zu senden.",
        "apihelp-import-param-summary": "Import-Zusammenfassung.",
        "apihelp-import-param-xml": "Hochgeladene XML-Datei.",
        "apihelp-import-param-interwikisource": "Für Interwiki-Importe: Wiki, von dem importiert werden soll.",
        "apihelp-paraminfo-description": "Ruft Informationen über API-Module ab.",
        "apihelp-paraminfo-param-helpformat": "Format der Hilfe-Zeichenfolgen.",
        "apihelp-parse-param-summary": "Zu parsende Zusammenfassung.",
+       "apihelp-parse-paramvalue-prop-langlinks": "Gibt die Sprachlinks im geparsten Wikitext zurück.",
+       "apihelp-parse-paramvalue-prop-categories": "Gibt die Kategorien im geparsten Wikitext zurück.",
+       "apihelp-parse-paramvalue-prop-categorieshtml": "Gibt die HTML-Version der Kategorien zurück.",
+       "apihelp-parse-paramvalue-prop-links": "Gibt die internen Links im geparsten Wikitext zurück.",
+       "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-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-query+categorymembers-param-endsortkey": "Stattdessen $1endhexsortkey verwenden.",
        "apihelp-query+contributors-param-limit": "Wie viele Spender zurückgegeben werden sollen.",
        "apihelp-query+deletedrevisions-param-user": "Nur Versionen von diesem Benutzer auflisten.",
-       "apihelp-query+deletedrevisions-param-limit": "Die Maximalmenge der aufzulistenden Versionen.",
        "apihelp-query+deletedrevs-param-from": "Auflistung bei diesem Titel beginnen.",
        "apihelp-query+deletedrevs-param-to": "Auflistung bei diesem Titel beenden.",
        "apihelp-query+duplicatefiles-param-localonly": "Sucht nur nach Dateien im lokalen Repositorium.",
        "apihelp-userrights-param-user": "Benutzername.",
        "apihelp-userrights-param-userid": "Benutzerkennung.",
        "apihelp-watch-example-watch": "Die Seite <kbd>Hauptseite</kbd> beobachten.",
-       "apihelp-format-example-generic": "Das Abfrageergebnis im $1-Format formatieren",
+       "apihelp-format-example-generic": "Das Abfrageergebnis im $1-Format ausgeben.",
        "apihelp-dbg-description": "Daten im PHP-<code>var_export()</code>-Format ausgeben.",
        "apihelp-dbgfm-description": "Daten im PHP-<code>var_export()</code>-Format ausgeben (schöngedruckt in HTML).",
-       "apihelp-dump-description": "Daten im PHP-<code>var_dump()</code>-Format ausgeben.",
-       "apihelp-dumpfm-description": "Daten im PHP-<code>var_dump()</code>-Format ausgeben (schöngedruckt in HTML).",
        "apihelp-json-description": "Daten im JSON-Format ausgeben.",
        "apihelp-json-param-callback": "Falls angegeben, wird die Ausgabe in einen angegebenen Funktionsaufruf eingeschlossen. Aus Sicherheitsgründen sind benutzerspezifische Daten beschränkt.",
        "apihelp-json-param-utf8": "Falls angegeben, kodiert die meisten (aber nicht alle) Nicht-ASCII-Zeichen als UTF-8 anstatt sie mit hexadezimalen Escape-Sequenzen zu ersetzen. Standard, wenn <var>formatversion</var> nicht <kbd>1</kbd> ist.",
        "apihelp-rawfm-description": "Daten mit den Fehlerbehebungselementen im JSON-Format ausgeben (schöngedruckt in HTML).",
        "apihelp-txt-description": "Daten im PHP-<code>print_r()</code>-Format ausgeben.",
        "apihelp-txtfm-description": "Daten im PHP-<code>print_r()</code>-Format ausgeben (schöngedruckt in HTML).",
-       "apihelp-wddx-description": "Daten im WDDX-Format ausgeben.",
-       "apihelp-wddxfm-description": "Daten im WDDX-Format ausgeben (schöngedruckt in HTML).",
        "apihelp-xml-description": "Daten im XML-Format ausgeben.",
        "apihelp-xml-param-xslt": "Falls angegeben, fügt die benannte Seite als XSL-Stylesheet hinzu. Der Wert muss ein Titel im Namensraum „{{ns:mediawiki}}“ sein und mit <code>.xsl</code> enden.",
        "apihelp-xml-param-includexmlnamespace": "Falls angegeben, ergänzt einen XML-Namensraum.",
index 6d1b1ec..f972a42 100644 (file)
        "apihelp-parse-paramvalue-prop-properties": "Gives various properties defined in the parsed wikitext.",
        "apihelp-parse-paramvalue-prop-limitreportdata": "Gives the limit report in a structured way. Gives no data, when <var>$1disablepp</var> is set.",
        "apihelp-parse-paramvalue-prop-limitreporthtml": "Gives the HTML version of the limit report. Gives no data, when <var>$1disablepp</var> is set.",
+       "apihelp-parse-paramvalue-prop-parsetree": "The XML parse tree of revision content (requires content model <code>$1</code>)",
        "apihelp-parse-param-pst": "Do a pre-save transform on the input before parsing it. Only valid when used with text.",
        "apihelp-parse-param-onlypst": "Do a pre-save transform (PST) on the input, but don't parse it. Returns the same wikitext, after a PST has been applied. Only valid when used with <var>$1text</var>.",
        "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-generatexml": "Generate XML parse tree (requires content model <code>$1</code>).",
+       "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-query+deletedrevisions-param-tag": "Only list revisions tagged with this tag.",
        "apihelp-query+deletedrevisions-param-user": "Only list revisions by this user.",
        "apihelp-query+deletedrevisions-param-excludeuser": "Don't list revisions by this user.",
-       "apihelp-query+deletedrevisions-param-limit": "The maximum amount of revisions to list.",
-       "apihelp-query+deletedrevisions-param-prop": "Which properties to get:\n;revid:Adds the revision ID of the deleted revision.\n;parentid:Adds the revision ID of the previous revision to the page.\n;user:Adds the user who made the revision.\n;userid:Adds the user ID who made the revision.\n;comment:Adds the comment of the revision.\n;parsedcomment:Adds the parsed comment of the revision.\n;minor:Tags if the revision is minor.\n;len:Adds the length (bytes) of the revision.\n;sha1:Adds the SHA-1 (base 16) of the revision.\n;content:Adds the content of the revision.\n;tags:Tags for the revision.",
        "apihelp-query+deletedrevisions-example-titles": "List the deleted revisions of the pages <kbd>Main Page</kbd> and <kbd>Talk:Main Page</kbd>, with content.",
        "apihelp-query+deletedrevisions-example-revids": "List the information for deleted revision <kbd>123456</kbd>.",
 
        "apihelp-query+revisions-example-first5-after": "Get first 5 revisions of the <kbd>Main Page</kbd> made after 2006-05-01.",
        "apihelp-query+revisions-example-first5-not-localhost": "Get first 5 revisions of the <kbd>Main Page</kbd> that were not made by anonymous user <kbd>127.0.0.1</kbd>.",
        "apihelp-query+revisions-example-first5-user": "Get first 5 revisions of the <kbd>Main Page</kbd> that were made by the user <kbd>MediaWiki default</kbd>.",
-       "apihelp-query+revisions+base-param-prop": "Which properties to get for each revision:\n;ids:The ID of the revision.\n;flags:Revision flags (minor).\n;timestamp:The timestamp of the revision.\n;user:User that made the revision.\n;userid:User ID of the revision creator.\n;size:Length (bytes) of the revision.\n;sha1:SHA-1 (base 16) of the revision.\n;contentmodel:Content model ID of the revision.\n;comment:Comment by the user for the revision.\n;parsedcomment:Parsed comment by the user for the revision.\n;content:Text of the revision.\n;tags:Tags for the revision.",
+       "apihelp-query+revisions+base-param-prop": "Which properties to get for each revision:",
+       "apihelp-query+revisions+base-paramvalue-prop-ids": "The ID of the revision.",
+       "apihelp-query+revisions+base-paramvalue-prop-flags": "Revision flags (minor).",
+       "apihelp-query+revisions+base-paramvalue-prop-timestamp": "The timestamp of the revision.",
+       "apihelp-query+revisions+base-paramvalue-prop-user": "User that made the revision.",
+       "apihelp-query+revisions+base-paramvalue-prop-userid": "User ID of the revision creator.",
+       "apihelp-query+revisions+base-paramvalue-prop-size": "Length (bytes) of the revision.",
+       "apihelp-query+revisions+base-paramvalue-prop-sha1": "SHA-1 (base 16) of the revision.",
+       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "Content model ID of the revision.",
+       "apihelp-query+revisions+base-paramvalue-prop-comment": "Comment by the user for the revision.",
+       "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "Parsed comment by the user for the revision.",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "Text of the revision.",
+       "apihelp-query+revisions+base-paramvalue-prop-tags": "Tags for the revision.",
+       "apihelp-query+revisions+base-paramvalue-prop-parsetree": "The XML parse tree of revision content (requires content model <code>$1</code>).",
        "apihelp-query+revisions+base-param-limit": "Limit how many revisions will be returned.",
        "apihelp-query+revisions+base-param-expandtemplates": "Expand templates in revision content (requires $1prop=content).",
-       "apihelp-query+revisions+base-param-generatexml": "Generate XML parse tree for revision content (requires $1prop=content).",
+       "apihelp-query+revisions+base-param-generatexml": "Generate XML parse tree for revision content (requires $1prop=content; replaced by <kbd>$1prop=parsetree</kbd>).",
        "apihelp-query+revisions+base-param-parse": "Parse revision content (requires $1prop=content). For performance reasons, if this option is used, $1limit is enforced to 1.",
        "apihelp-query+revisions+base-param-section": "Only retrieve the content of this section number.",
        "apihelp-query+revisions+base-param-diffto": "Revision ID to diff each revision to. Use <kbd>prev</kbd>, <kbd>next</kbd> and <kbd>cur</kbd> for the previous, next and current revision respectively.",
        "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.",
        "apihelp-watch-example-unwatch": "Unwatch the page <kbd>Main Page</kbd>.",
        "apihelp-watch-example-generator": "Watch the first few pages in the main namespace.",
 
-       "apihelp-format-example-generic": "Format the query result in the $1 format.",
+       "apihelp-format-example-generic": "Return the query result in the $1 format.",
        "apihelp-dbg-description": "Output data in PHP's <code>var_export()</code> format.",
        "apihelp-dbgfm-description": "Output data in PHP's <code>var_export()</code> format (pretty-print in HTML).",
-       "apihelp-dump-description": "Output data in PHP's <code>var_dump()</code> format.",
-       "apihelp-dumpfm-description": "Output data in PHP's <code>var_dump()</code> format (pretty-print in HTML).",
        "apihelp-json-description": "Output data in JSON format.",
        "apihelp-json-param-callback": "If specified, wraps the output into a given function call. For safety, all user-specific data will be restricted.",
        "apihelp-json-param-utf8": "If specified, encodes most (but not all) non-ASCII characters as UTF-8 instead of replacing them with hexadecimal escape sequences. Default when <var>formatversion</var> is not <kbd>1</kbd>.",
        "apihelp-rawfm-description": "Output data with the debugging elements in JSON format (pretty-print in HTML).",
        "apihelp-txt-description": "Output data in PHP's <code>print_r()</code> format.",
        "apihelp-txtfm-description": "Output data in PHP's <code>print_r()</code> format (pretty-print in HTML).",
-       "apihelp-wddx-description": "Output data in WDDX format.",
-       "apihelp-wddxfm-description": "Output data in WDDX format (pretty-print in HTML).",
        "apihelp-xml-description": "Output data in XML format.",
        "apihelp-xml-param-xslt": "If specified, adds the named page as an XSL stylesheet. The value must be a title in the {{ns:mediawiki}} namespace ending in <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "If specified, adds an XML namespace.",
index 97c38a6..a95fb2c 100644 (file)
@@ -9,7 +9,9 @@
                        "Edslov",
                        "Carlos Cristia",
                        "Ryo567",
-                       "Csbotero"
+                       "Csbotero",
+                       "Chris TR",
+                       "Ncontinanza"
                ]
        },
        "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]].",
@@ -17,6 +19,7 @@
        "apihelp-main-param-format": "El formato de la salida.",
        "apihelp-main-param-smaxage": "Establece el encabezado <code>s-maxage</code> durante estos segundos. Los errores nunca se almacenan en caché.",
        "apihelp-main-param-maxage": "Establece el encabezado <code>max-age</code> durante estos segundos. Los errores nunca se almacenan en caché.",
+       "apihelp-main-param-assert": "Comprobar que el usuario haya iniciado sesión si el valor es <kbd>user</kbd> o si tiene el permiso de bot si es <kbd>bot</kbd>.",
        "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-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-query+deletedrevisions-param-tag": "Listar solo las revisiones con esta etiqueta.",
        "apihelp-query+deletedrevisions-param-user": "Listar solo las revisiones de este usuario.",
        "apihelp-query+deletedrevisions-param-excludeuser": "No listar las revisiones de este usuario.",
-       "apihelp-query+deletedrevisions-param-limit": "La cantidad máxima de revisiones que listar.",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Modo|Modos}}: $2",
        "apihelp-query+deletedrevs-param-from": "Empezar a listar en este título.",
        "apihelp-query+deletedrevs-param-to": "Terminar de listar en este título.",
        "apihelp-query+redirects-param-limit": "Cuántas redirecciones se devolverán.",
        "apihelp-query+redirects-example-simple": "Mostrar una lista de las redirecciones a la [[Main Page|Portada]]",
        "apihelp-query+revisions-example-last5": "Mostrar las últimas 5 revisiones de la <kbd>Portada</kbd>.",
+       "apihelp-query+revisions+base-param-prop": "Las propiedades que se obtendrán para cada revisión:",
+       "apihelp-query+revisions+base-paramvalue-prop-ids": "El identificador de la revisión.",
+       "apihelp-query+revisions+base-paramvalue-prop-flags": "Marcas de revisión (menor).",
+       "apihelp-query+revisions+base-paramvalue-prop-timestamp": "La fecha y hora de la revisión.",
+       "apihelp-query+revisions+base-paramvalue-prop-user": "Usuario que realizó la revisión.",
+       "apihelp-query+revisions+base-paramvalue-prop-userid": "Identificador de usuario del creador de la revisión.",
+       "apihelp-query+revisions+base-paramvalue-prop-size": "Longitud (en bytes) de la revisión.",
+       "apihelp-query+revisions+base-paramvalue-prop-sha1": "SHA-1 (base 16) de la revisión.",
+       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "Identificador del modelo de contenido de la revisión.",
+       "apihelp-query+revisions+base-paramvalue-prop-comment": "Comentario del usuario para la revisión.",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "Texto de la revisión.",
+       "apihelp-query+revisions+base-paramvalue-prop-tags": "Etiquetas para la revisión.",
        "apihelp-query+search-param-info": "Qué metadatos devolver.",
        "apihelp-query+search-param-limit": "Cuántas páginas en total se devolverán.",
        "apihelp-query+search-param-interwiki": "Incluir resultados interwiki en la búsqueda, si es posible.",
        "apihelp-userrights-example-user": "Agregar al usuario <kbd>FooBot</kbd> al grupo <kbd>bot</kbd> y eliminarlo de los grupos <kbd>sysop</kbd> y <kbd>burócrata</kbd>.",
        "apihelp-watch-example-watch": "Vigilar la página <kbd>Portada</kbd>.",
        "apihelp-watch-example-unwatch": "Dejar de vigilar la <kbd>Portada</kbd>.",
+       "apihelp-format-example-generic": "Devolver el resultado de la consulta en formato $1.",
        "api-help-main-header": "Módulo principal",
        "api-help-flag-deprecated": "Este módulo está en desuso.",
        "api-help-flag-readrights": "Este módulo requiere permisos de lectura.",
index d792fd6..291ebdb 100644 (file)
@@ -8,7 +8,8 @@
                        "KhabarNegar",
                        "Sahehco",
                        "Signal89",
-                       "Mjbmr"
+                       "Mjbmr",
+                       "Ebraminio"
                ]
        },
        "apihelp-main-param-action": "کدام عملیات را انجام دهد.",
@@ -17,7 +18,7 @@
        "apihelp-block-description": "بستن کاربر",
        "apihelp-block-param-user": "نام کاربری، آدرس آی پی یا محدوده آی پی موردنظر شما برای بستن.",
        "apihelp-block-param-reason": "دلیل بسته‌شدن",
-       "apihelp-block-param-anononly": "فقط بستن کاربران ناشناس (مانند غیرفعالکردن ویرایش‌های ناشناس این آی‌پی).",
+       "apihelp-block-param-anononly": "فقط بستن کاربران ناشناس (مانند غیرفعال کردن ویرایش‌های ناشناس این آی‌پی).",
        "apihelp-block-param-nocreate": "جلوگیری از ایجاد حساب.",
        "apihelp-block-param-autoblock": "به طور خودکار آخرین نشانی آی‌پی استفاده‌شده، و هر نشانی پس از آن که سعی می‌کند از آن داخل شود را ببند.",
        "apihelp-block-param-noemail": "از کاربر در برابر ارسال ایمیل از طریق ویکی جلوگیری شود. (نیازمند دسترسی <code>blockemail</code> است).",
@@ -40,7 +41,7 @@
        "apihelp-createaccount-param-name": "نام کاربری.",
        "apihelp-createaccount-param-password": "رمز عبور (نادیده گرفته می‌شود اگر <var>$1mailpassword</var> تنظیم شده‌باشد).",
        "apihelp-createaccount-param-domain": "دامنه برای احراز هویت خارجی (اختیاری).",
-       "apihelp-createaccount-param-email": "آدرس ایمیل کاربر (اختیاری)",
+       "apihelp-createaccount-param-email": "نشانی ایمیل کاربر (اختیاری)",
        "apihelp-createaccount-param-realname": "نام واقعی کاربر (اختیاری).",
        "apihelp-createaccount-param-mailpassword": "اگر به هر مقداری تنظیم شود، یک رمز عبور تصادفی به کاربر ایمیل خواهد شد.",
        "apihelp-createaccount-param-reason": "دلیل اختیاری برای ایجاد حساب کاربری جهت قرارگرفتن در سیاهه‌ها.",
index 0b35330..48f0ba3 100644 (file)
        "apihelp-imagerotate-param-rotation": "Degrés de rotation de l’image dans le sens des aiguilles d’une montre.",
        "apihelp-imagerotate-example-simple": "Faire pivoter <kbd>File:Example.png</kbd> de <kbd>90</kbd> degrés.",
        "apihelp-imagerotate-example-generator": "Faire pivoter toutes les images de <kbd>Category:Flip</kbd> de <kbd>180</kbd> degrés.",
-       "apihelp-import-description": "Importer une page depuis un autre wiki, ou un fichier XML.\n\nNoter que le POST HTTP doit être effectué comme un import de fichier (c’est-à-dire en utilisant multipart/form-data) lors de l’envoi d’un fichier pour le paramètre <var>xml</var>.",
+       "apihelp-import-description": "Importer une page depuis un autre wiki, ou depuis un fichier XML.\n\nNoter que le POST HTTP doit être effectué comme un import de fichier (c’est-à-dire en utilisant multipart/form-data) lors de l’envoi d’un fichier pour le paramètre <var>xml</var>.",
        "apihelp-import-param-summary": "Importer le résumé.",
        "apihelp-import-param-xml": "Fichier XML téléchargé.",
        "apihelp-import-param-interwikisource": "Pour les importations interwiki : wiki depuis lequel importer.",
        "apihelp-parse-paramvalue-prop-properties": "Fournit les diverses propriétés définies dans le wikitexte analysé.",
        "apihelp-parse-paramvalue-prop-limitreportdata": "Fournit le rapport de limite d’une manière structurée. Ne fournit aucune donnée, si <var>$1disablepp</var> est positionné.",
        "apihelp-parse-paramvalue-prop-limitreporthtml": "Fournit la version HTML du rapport de limite. Ne fournit aucune donnée, si <var>$1disablepp</var> est positionné.",
+       "apihelp-parse-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-parse-param-pst": "Faire une transformation avant enregistrement de l’entrée avant de l’analyser. Valide uniquement quand utilisé avec du texte.",
        "apihelp-parse-param-onlypst": "Faire une transformation avant enregistrement (PST) de l’entrée, mais ne pas l’analyser. Renvoie le même wikitexte, après que la PST a été appliquée. Valide uniquement quand utilisé avec <var>$1text</var>.",
        "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-generatexml": "Générer un arbre d’analyse XML (nécessite le modèle de contenu <code>$1</code>).",
+       "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-query+deletedrevisions-param-tag": "Lister uniquement les révisions marquées par cette balise.",
        "apihelp-query+deletedrevisions-param-user": "Lister uniquement les révisions faites par cet utilisateur.",
        "apihelp-query+deletedrevisions-param-excludeuser": "Ne pas lister les révisions faites par cet utilisateur.",
-       "apihelp-query+deletedrevisions-param-limit": "Le nombre maximal de révisions à lister.",
-       "apihelp-query+deletedrevisions-param-prop": "Quelles propriétés obtenir :\n;revid:Ajoute l’ID de la révision supprimée.\n;parentid:Ajoute l’ID de la révision précédente de la page.\n;user:Ajoute l’utilisateur ayant fait la révision.\n;userid:Ajoute l’ID de l’utilisateur ayant fait la révision.\n;comment:Ajoute le commentaire de la révision.\n;parsedcomment:Ajoute le commentaire analysé de la révision.\n;minor:Marque si une révision est mineure.\n;len:Ajoute la taille (en octets) de la révision.\n;sha1:Ajoute le SHA-1 (base 16) de la révision.\n;content:Ajoute le contenu de la révision.\n;tags:Balises pour la révision.",
        "apihelp-query+deletedrevisions-example-titles": "Lister les révisions supprimées des pages <kbd>Main Page</kbd> et <kbd>Talk:Main Page</kbd>, avec leur contenu.",
        "apihelp-query+deletedrevisions-example-revids": "Lister les informations pour la révision supprimée <kbd>123456</kbd>.",
        "apihelp-query+deletedrevs-description": "Lister les révisions supprimées.\n\nOpère selon trois modes :\n# Lister les révisions supprimées pour les titres donnés, triées par horodatage.\n# Lister les contributions supprimées pour l’utilisateur donné, triées par horodatage (pas de titres spécifiés).\n# Lister toutes les révisions supprimées dans l’espace de noms donné, triées par titre et horodatage (aucun titre spécifié, $1user non positionné).\n\nCertains paramètres ne s’appliquent qu’à certains modes et sont ignorés dans les autres.",
        "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.",
+       "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).",
+       "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+revisions+base-param-parse": "Analyser le contenu de la révision (nécessite $1prop=content). Pour des raisons de performance, si cette option est utilisée, $1limit est forcé à 1.",
        "apihelp-query+revisions+base-param-section": "Récupérer uniquement le contenu de ce numéro de section.",
        "apihelp-query+revisions+base-param-diffto": "ID de révision à comparer à chaque révision. Utiliser <kbd>prev</kbd>, <kbd>next</kbd> et <kbd>cur</kbd> pour la version précédente, suivante et actuelle respectivement.",
        "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-watch-example-watch": "Suivre la page <kbd>Page principale</kbd>.",
        "apihelp-watch-example-unwatch": "Ne plus suivre la page <kbd>Page principale</kbd>.",
        "apihelp-watch-example-generator": "Suivre les quelques premières pages de l’espace de nom principal",
-       "apihelp-format-example-generic": "Mettre en forme le résultat de la requête dans le format $1",
+       "apihelp-format-example-generic": "Renvoyer le résultat de la requête dans le format $1.",
        "apihelp-dbg-description": "Extraire les données au format de <code>var_export()</code> de PHP.",
        "apihelp-dbgfm-description": "Extraire les données au format de <code>var_export()</code> de PHP (affiché proprement en HTML).",
-       "apihelp-dump-description": "Extraire les données au format de <code>var_dump()</code> de PHP.",
-       "apihelp-dumpfm-description": "Extraire les données au format de <code>var_dump()</code> de PHP (affiché proprement en HTML).",
        "apihelp-json-description": "Extraire les données au format JSON.",
        "apihelp-json-param-callback": "Si spécifié, inclut la sortie dans l’appel d’une fonction fournie. Pour plus de sûreté, toutes les données spécifiques à l’utilisateur seront restreintes.",
        "apihelp-json-param-utf8": "Si spécifié, encode la plupart (mais pas tous) des caractères non ASCII en URF-8 au lieu de les remplacer par leur séquence d’échappement hexadécimale. Valeur par défaut quand <var>formatversion</var> ne vaut pas <kbd>1</kbd>.",
        "apihelp-rawfm-description": "Extraire les données avec les éléments de débogage au format JSON (affiché proprement en HTML).",
        "apihelp-txt-description": "Extraire les données au format de <code>print_r()</code> de PHP.",
        "apihelp-txtfm-description": "Extraire les données au format de <code>print_r()</code> de PHP (affiché proprement en HTML).",
-       "apihelp-wddx-description": "Extraire les données au format WDDX.",
-       "apihelp-wddxfm-description": "Extraire les données au format WDDX (affiché proprement en HTML).",
        "apihelp-xml-description": "Extraire les données au format XML.",
        "apihelp-xml-param-xslt": "Si spécifié, ajoute la page nommée comme une feuille de style XSL. La valeur doit être un titre dans l’espace de noms {{ns:mediawiki}} se terminant par <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "Si spécifié, ajoute un espace de noms XML.",
index d87bc30..6698a19 100644 (file)
        "apihelp-imagerotate-param-rotation": "Graos a rotar a imaxe no sentido do reloxio.",
        "apihelp-imagerotate-example-simple": "Rotar <kbd>File:Example.png</kbd> <kbd>90</kbd> graos.",
        "apihelp-imagerotate-example-generator": "Rotar tódalas imaxes en <kbd>Category:Flip</kbd> <kbd>180</kbd> graos",
-       "apihelp-import-description": "Importar unha páxina doutra wiki, ou nun ficheiro XML.\n\nDecátese de que o POST HTTP debe facerse como unha carga de ficheiro (p. ex. usando multipart/form-data) cando se envíe un ficheiro para o parámetro <var>xml</var>.",
+       "apihelp-import-description": "Importar unha páxina doutra wiki, ou dun ficheiro XML.\n\nDecátese de que o POST HTTP debe facerse como unha carga de ficheiro (p. ex. usando multipart/form-data) cando se envíe un ficheiro para o parámetro <var>xml</var>.",
        "apihelp-import-param-summary": "Resume de importación.",
        "apihelp-import-param-xml": "Subido ficheiro XML.",
        "apihelp-import-param-interwikisource": "Para importacións interwiki: wiki da que importar.",
        "apihelp-parse-paramvalue-prop-properties": "Obter varias propiedades definidas no texto wiki analizado.",
        "apihelp-parse-paramvalue-prop-limitreportdata": "Devolve o informe de límite de forma estruturada. Non devolve datos cando <var>$1disablepp</var> está fixado.",
        "apihelp-parse-paramvalue-prop-limitreporthtml": "Devolve a versión HTML do informe de límite. Non devolve datos cando <var>$1disablepp</var> está fixado.",
+       "apihelp-parse-paramvalue-prop-parsetree": "Árbores de análise XML do contido da revisión (precisa o modelo de contido <code>$1</code>)",
        "apihelp-parse-param-pst": "Fai unha transformación antes de gardar a entrada antes de analizala. Válida unicamente para usar con texto.",
        "apihelp-parse-param-onlypst": "Facer unha transformación antes de gardar (PST) a entrada, pero sen analizala. Devolve o mesmo wikitexto, despois de que a PST foi aplicada. Só válida cando se usa con <var>$1text</var>.",
        "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-generatexml": "Xenerar unha árbore de análise XML (necesita o modelo de contido <code>$1</code>).",
+       "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-query+deletedrevisions-param-tag": "Só listar revisións marcadas con esta etiqueta.",
        "apihelp-query+deletedrevisions-param-user": "Só listar revisións deste usuario.",
        "apihelp-query+deletedrevisions-param-excludeuser": "Non listar revisións deste usuario.",
-       "apihelp-query+deletedrevisions-param-limit": "Máximo número de revisións a listar.",
-       "apihelp-query+deletedrevisions-param-prop": "Que propiedades obter:\n;revid:Engade o ID da modificación borrada.\n;parentid:Engade o ID da modificación da modificación anterior da páxina.\n;user:Engade o usuario que fixo a modificación.\n;userid:Engade o ID do usuario que fixo a modificación.\n;comment:Engade o comentario da modificación.\n;parsedcomment:Engade o comentario analizado da modificación.\n;minor:Engade unha marca se a modificación é menor.\n;len:Engade a lonxitude (bytes) da modificación.\n;sha1:Engade a función SHA-1 (base 16) da modificación.\n;content:Engade o contido da modificación.\n;tags:Marcas da modificación.",
        "apihelp-query+deletedrevisions-example-titles": "Listar as revisións borradas das páxinas <kbd>Main Page</kbd> e <kbd>Talk:Main Page</kbd>, con contido.",
        "apihelp-query+deletedrevisions-example-revids": "Listar a información para a revisión borrada <kbd>123456</kbd>.",
        "apihelp-query+deletedrevs-description": "Lista as modificación borradas.\n\nOpera según tres modos:\n#Lista as modificacións borradas dos títulos indicados, ordenados por selo de tempo.\n#Lista as contribucións borradas do usuario indicado, ordenadas por selo de tempo (sen indicar títulos).\n#Lista todas as modificacións borradas no espazo de nomes indicado, ordenadas por título e selo de tempo (sen indicar títulos, sen fixar $1user).\n\nCertos parámetros só se aplican a algúns modos e son ignorados noutros.",
        "apihelp-query+revisions-example-first5-after": "Mostrar as cinco primeiras revisións da <kbd>Páxina Principal</kbd> feitas despois de 2006-05-01.",
        "apihelp-query+revisions-example-first5-not-localhost": "Mostrar as cinco primeiras revisións da <kbd>Páxina Principal</kbd> que non foron feitas polo usuario anónimo <kbd>127.0.0.1</kbd>.",
        "apihelp-query+revisions-example-first5-user": "Mostrar as cinco primeiras revisión da <kbd>Páxina Principal</kbd> feitas polo usuario <kbd>MediaWiki default</kbd>.",
-       "apihelp-query+revisions+base-param-prop": "Que propiedades mostrar para cada modificación:\n;ids:O identificador da modificación.\n;flags:Etiquetas de modificación(menor).\n;timestamp:Selo de tempo da modificación.\n;user:Usuario que fixo a modificación.\n;userid:Identificador de usuario que fixo a modificación.\n;size:Lonxitude (bytes) da modificación.\n;sha1:SHA-1 (base 16) da modificación.\n;contentmodel:Identificador do modelo de contido da modificación.\n;comment:Comentario do usuario que fixo a modificación.\n;parsedcomment:Comentario analizado do usuario que fixo a modificación.\n;content:Texto da modificación.\n;tags:Etiquetas da modificación.",
+       "apihelp-query+revisions+base-param-prop": "Que propiedades mostrar para cada modificación:",
+       "apihelp-query+revisions+base-paramvalue-prop-ids": "O identificador da modificación.",
+       "apihelp-query+revisions+base-paramvalue-prop-flags": "Marcas de modificación (menor).",
+       "apihelp-query+revisions+base-paramvalue-prop-timestamp": "O selo de tempo da modificación.",
+       "apihelp-query+revisions+base-paramvalue-prop-user": "Usuario que fixo a revisión.",
+       "apihelp-query+revisions+base-paramvalue-prop-userid": "Identificador de usuario do creador da modificación.",
+       "apihelp-query+revisions+base-paramvalue-prop-size": "Lonxitude (en bytes) da revisión.",
+       "apihelp-query+revisions+base-paramvalue-prop-sha1": "SHA-1 (base 16) da modificación.",
+       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "Identificador do modelo de contido da modificación.",
+       "apihelp-query+revisions+base-paramvalue-prop-comment": "Comentario do usuario para a modificación.",
+       "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "Comentario analizado do usuario para a modificación.",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "Texto da revisión.",
+       "apihelp-query+revisions+base-paramvalue-prop-tags": "Etiquetas para a revisión.",
+       "apihelp-query+revisions+base-paramvalue-prop-parsetree": "Árbore de análise XML do contido da modificación (precisa o modelo de contido <code>$1</code>).",
        "apihelp-query+revisions+base-param-limit": "Limitar cantas revisións se van devolver.",
        "apihelp-query+revisions+base-param-expandtemplates": "Expandir os modelos no contido da revisión (require $1prop=content).",
-       "apihelp-query+revisions+base-param-generatexml": "Xenerar a árbore de análise XML para o contido da revisión (require $1prop=content).",
+       "apihelp-query+revisions+base-param-generatexml": "Xenerar a árbore de análise XML para o contido da revisión (require $1prop=content; substituído por <kbd>$1prop=parsetree</kbd>).",
        "apihelp-query+revisions+base-param-parse": "Analizar o contido da revisión (require $1prop=content). Por razóns de rendemento, se se usa esta opción, $1limit cámbiase a 1.",
        "apihelp-query+revisions+base-param-section": "Recuperar unicamente o contido deste número de sección.",
        "apihelp-query+revisions+base-param-diffto": "ID de revisión a comparar con cada revisión. Use <kbd>prev</kbd>, <kbd>next</kbd> e <kbd>cur</kbd> para a versión precedente, seguinte e actual respectivamente.",
        "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.",
        "apihelp-watch-example-watch": "Vixiar a páxina <kbd>Páxina Principal</kbd>.",
        "apihelp-watch-example-unwatch": "Deixar de vixiar a páxina <kbd>Páxina Principal</kbd>.",
        "apihelp-watch-example-generator": "Vixiar as primeiras páxinas no espazo de nomes principal",
-       "apihelp-format-example-generic": "Formatar o resultado da consulta no formato $1.",
+       "apihelp-format-example-generic": "Devolver o resultado da consulta no formato $1.",
        "apihelp-dbg-description": "Datos de saída en formato <code>var_export()</code> de PHP.",
        "apihelp-dbgfm-description": "Datos de saída en formato <code>var_export()</code> de PHP(impresión en HTML).",
-       "apihelp-dump-description": "Datos de saída en formato PHP <code>var_dump()</code>.",
-       "apihelp-dumpfm-description": "Datos de saída en formato <code>var_dump()</code> de PHP(impresión en HTML).",
        "apihelp-json-description": "Datos de saída en formato JSON.",
        "apihelp-json-param-callback": "Se está especificado, inclúe a saída na chamada da función indicada. Para maior seguridade, todos os datos específicos do usuario serán restrinxidos.",
        "apihelp-json-param-utf8": "Se está especificado, codifica a maioría (pero non todos) dos caracteres ASCII como UTF-8 no canto de reemprazalos con secuencias de escape hexadecimais. Por defecto cando <var>formatversion</var> non é <kbd>1</kbd>.",
        "apihelp-rawfm-description": "Datos de saída cos elementos de depuración en formato JSON(impresión en HTML).",
        "apihelp-txt-description": "Datos de saída en formato PHP <code>print_r()</code>.",
        "apihelp-txtfm-description": "Datos de saída en formato <code>print_r()</code> de PHP(impresión en HTML).",
-       "apihelp-wddx-description": "Datos de saída en formato WDDX.",
-       "apihelp-wddxfm-description": "Datos de saída en formato WDDX(impresión en HTML).",
        "apihelp-xml-description": "Datos de saída en formato XML.",
        "apihelp-xml-param-xslt": "Se está indicado, engade o nome da páxina como unha folla de estilo XSL. O valor debe ser un título no espazo de nomes {{ns:mediawiki}} rematando con <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "Se está indicado, engade un espazo de nomes XML.",
        "api-help-param-type-limit": "Tipo: enteiro ou <kbd>max</kbd>",
        "api-help-param-type-integer": "Tipo: {{PLURAL:$1|1=enteiro|2=lista de enteiros}}",
        "api-help-param-type-boolean": "Tipo: booleano ([[Special:ApiHelp/main#main/datatypes|detalles]])",
-       "api-help-param-type-password": "",
        "api-help-param-type-timestamp": "Tipo: {{PLURAL:$1|1=selo de tempo|2=lista de selos de tempo}} ([[Special:ApiHelp/main#main/datatypes|formatos permitidos]])",
        "api-help-param-type-user": "Tipo: {{PLURAL:$1|1=nome de usuario|2=lista de nomes de usuarios}}",
        "api-help-param-list": "{{PLURAL:$1|1=Un valor|2=Valores (separados con <kbd>{{!}}</kbd>)}}: $2",
index c1c96e7..c33805f 100644 (file)
        },
        "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: שגיאות ואזהרות]].",
        "apihelp-main-param-action": "איזו פעולה לבצע.",
-       "apihelp-main-param-format": "×\94ת×\91× ×\99ת ×©×\9c הפלט.",
+       "apihelp-main-param-format": "תס×\93×\99ר הפלט.",
        "apihelp-main-param-maxlag": "שיהוי מרבי יכול לשמש כשמדיה־ויקי מותקנת בצביר עם מסד נתונים משוכפל. כדי לחסוך בפעולות שגורמות יותר שיהוי בשכפול אתר, הפרמטר הזה יכול לגרום ללקוח להמתין עד ששיהוי השכפול יורד מתחת לערך שצוין. במקרה של שיהוי מוגזם, קוד השגיאה <samp>maxlag</samp> מוחזר עם הודעה כמו <samp>Waiting for $host: $lag seconds lagged</samp>.<br />ר' [[mw:Manual:Maxlag_parameter|מדריך למשתמש: פרמטר maxlag]] למידע נוסף.",
        "apihelp-main-param-smaxage": "הגדרת כותרת בקרת מטמון HTTP‏ <code>s-maxage</code> למספר כזה של שניות.",
        "apihelp-main-param-maxage": "הגדרת כותרת בקרת מטמון HTTP‏ <code>max-age</code> למספר כזה של שניות.",
        "apihelp-main-param-assert": "לוודא שהמשתמש נכנס אם זה מוגדר ל־<kbd>user</kbd>, או שיש לו הרשאת בוט אם זה <kbd>bot</kbd>.",
        "apihelp-main-param-requestid": "כל ערך שיינתן כאן ייכלל בתשובה. אפשר להשתמש בזה כדי להבדיל בין בקשות.",
        "apihelp-main-param-servedby": "לכלול את שם המארח ששירת את הבקשה בתוצאות.",
-       "apihelp-main-param-curtimestamp": "×\94×\9b×\9c×\9cת ×\97×\95ת×\9eת ×\94×\96×\9e×\9f ×\94× ×\95×\9b×\97×\99ת בתוצאה.",
+       "apihelp-main-param-curtimestamp": "×\94×\9b×\9c×\9cת ×\97×\95ת×\9dÖ¾×\94×\96×\9e×\9f ×\94× ×\95×\9b×\97×\99 בתוצאה.",
        "apihelp-main-param-origin": "בעת גישה ל־API עם בקשת AJAX חוצה מתחמים (CORS), יש להציב כאן את המתחם שממנו יוצאת הבקשה. זה היה להיות כלול בכל בקשה מקדימה, ולכן הוא חייב להיות חלק מה־URI של הבקשה (לא גוף ה־POST). זה חייב להיות תואם במדויק לאחד המקורות בכותרת <code>Origin</code>, כך שזה צריך להיות מוגדר למשהו כמו <kbd>https://en.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-anononly": "לחסום משתמשים אלמוניים בלבד (דהיינו, השבתת עריכות אלמוניות מכתובת ה־IP הזאת)",
        "apihelp-block-param-nocreate": "מניעת יצירת חשבונות",
        "apihelp-block-param-autoblock": "חסימה אוטומטית גם של כתובת ה־IP האחרונה שהשתמש בה ושל כל כתובת 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": "קבלת ההבדל בין 2 דפים.\n\nיש להעביר מספר גרסה, כותרת דף או מזהה דף גם ל־\"from\" וגם ל־\"to\".",
        "apihelp-compare-param-fromtitle": "כותרת ראשונה להשוואה.",
        "apihelp-compare-param-fromid": "מס׳ זיהוי של העמוד הראשון להשוואה.",
        "apihelp-compare-param-fromrev": "גרסה ראשונה להשוואה.",
        "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": "מזהה הדף לעריכה. לא לשימוש עם <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-recreate": "לעקוב את כל הטעויות על כך שהדף נמחק בינתיים.",
+       "apihelp-edit-param-createonly": "לא לערוך את הדף אם הוא כבר קיים.",
+       "apihelp-edit-param-nocreate": "לזרוק שגיאה אם הדף אינו קיים.",
        "apihelp-edit-param-watch": "הוספת העמוד לרשימת המעקב של המשתמש הנוכחי.",
        "apihelp-edit-param-unwatch": "הסרת הדף מרשימת המעקב של של המשתמש הנוכחי.",
+       "apihelp-edit-param-watchlist": "להוסיף את הדף לרשימת המעקב של המשתמש הנוכחי או להסיר אותו משם, להשתמש בהעדפות, או לא לשנות את מצב המעקב.",
+       "apihelp-edit-param-prependtext": "הוספת הטקסט הזה לתחילת הדף. דורס את $1text.",
+       "apihelp-edit-param-redirect": "לפתור הפניות אוטומטית.",
+       "apihelp-edit-param-contentformat": "תסדיר להסדרת תוכן שמשמש את טקסט הקלט.",
        "apihelp-edit-example-edit": "עריכת דף",
        "apihelp-emailuser-description": "שליחת דוא\"ל למשתמש.",
+       "apihelp-emailuser-param-target": "לאיזה משתמש לשלוח דוא\"ל.",
+       "apihelp-emailuser-param-subject": "כותרת נושא.",
+       "apihelp-emailuser-param-text": "גוף הדואר.",
+       "apihelp-emailuser-param-ccme": "שליחת עותק של הדואר הזה אליי.",
+       "apihelp-expandtemplates-description": "הרחבת כל התבניות בקוד הוויקי.",
        "apihelp-expandtemplates-param-title": "כותרת הדף.",
+       "apihelp-expandtemplates-param-text": "איזה קוד ויקי להמיר.",
+       "apihelp-expandtemplates-param-prop": "אילו חלקי מידע לקבל.\n\nיש לשים לכך שאם לא נבחרו ערכים, התוצאה תכיל את קוד הוויקי, אבל הפלט יהיה בתסדיר מיושן.",
+       "apihelp-expandtemplates-paramvalue-prop-wikitext": "קוד הוויקי המורחב.",
+       "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-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-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-feedwatchlist-example-all6hrs": "להציג את כל השינויים בדפים שבמעקב ב־6 השעות האחרונות.",
+       "apihelp-filerevert-description": "לשחזר את הקובץ לגרסה ישנה יותר.",
+       "apihelp-filerevert-param-filename": "שם קובץ היעד, ללא התחילית File:.",
+       "apihelp-filerevert-param-comment": "הערת העלאה.",
+       "apihelp-filerevert-param-archivename": "שם הארכיון של הגרסה שאליה ישוחזר הקובץ.",
        "apihelp-help-description": "הצגת עזרה עבור היחידות שצוינו.",
+       "apihelp-help-param-modules": "עזרה של אילו יחידות להציג (ערכים של הפרמטרים <var>action</var> ו־<var>format</var>, או <kbd>main</kbd>). אפשר להגדיר תת־יחידות עם <kbd>+</kbd>.",
+       "apihelp-help-param-submodules": "לכלול עזרה לתת־יחידות ליחידה שצוינה.",
+       "apihelp-help-param-recursivesubmodules": "לכלול עזרה לתת־יחידות באופן רקורסיבי.",
        "apihelp-help-param-helpformat": "תסדיר פלט העזרה.",
        "apihelp-help-param-toc": "לכלול תוכן עניינים בפלט HTML.",
-       "apihelp-help-example-main": "×¢×\96ר×\94 ×\9c×\9e×\95×\93×\95×\9c ×\94ר×\90ש×\99.",
+       "apihelp-help-example-main": "×¢×\96ר×\94 ×\9c×\99×\97×\99×\93×\94 ×\94ר×\90ש×\99ת.",
        "apihelp-help-example-recursive": "כל העזרה בדף אחד.",
        "apihelp-help-example-help": "עזרה ליחידת העזרה עצמה.",
        "apihelp-help-example-query": "עזרה לשתי תת־יחידות של שאילתה.",
        "apihelp-logout-example-logout": "הוצאת המשתמש הנוכחי.",
        "apihelp-managetags-description": "ביצוע פעולות ניהוליות הקשורות בשינוי תגיות.",
        "apihelp-move-description": "העברת עמוד.",
+       "apihelp-move-param-to": "לאיזו כותרת לשנות את שם הדף.",
+       "apihelp-move-param-reason": "הסיבה לשינוי השם.",
+       "apihelp-move-param-movetalk": "שינוי שם דף השיחה, אם הוא קיים.",
+       "apihelp-move-param-movesubpages": "שינוי השמות של דפי־המשנה, אם זה שייך.",
+       "apihelp-move-param-noredirect": "לא ליצור הפניה.",
+       "apihelp-move-param-watch": "הוספת הדף וההפניה לרשימת המעקב של המשתמש הנוכחי.",
+       "apihelp-move-param-unwatch": "הסרת הדף וההפניה מרשימת המעקב של המשתמש הנוכחי.",
        "apihelp-move-param-watchlist": "הוספה או הסרה של הדף ללא תנאי מרשימת המעקב של המשתמש הנוכחי, להשתמש בהעדפות או לא לשנות את המעקב.",
        "apihelp-move-param-ignorewarnings": "להתעלם מכל האזהרות.",
+       "apihelp-move-example-move": "העברת <kbd>Badtitle</kbd> ל־<kbd>Goodtitle</kbd> בלי להשאיר הפניה.",
+       "apihelp-opensearch-description": "חיפוש בוויקי בפרוטוקול OpenSearch.",
        "apihelp-opensearch-param-search": "מחרוזת לחיפוש.",
+       "apihelp-opensearch-param-limit": "המספר המרבי של התוצאות שתוחזרנה.",
        "apihelp-opensearch-param-namespace": "שמות מתחם לחיפוש.",
+       "apihelp-opensearch-param-suggest": "לא לעשות דבר אם <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> הוא false.",
+       "apihelp-opensearch-param-redirects": "איך לטפל בהפניות:\n;return:להחזיר את ההפניה עצמה.\n;resolve:להחזיר את דף היעד. יכול להחזיר פחות מ־$1limit תוצאות.\nמסיבות היסטוריות, בררת המחדל היא \"return\" עבור $1format=json ו־\"resolve\" עבור תסדירים אחרים.",
        "apihelp-opensearch-param-format": "תסדיר הפלט.",
+       "apihelp-opensearch-param-warningsaserror": "אם אזהרות מוּעלות עם <kbd>format=json</kbd>, להחזיר שגיאת API במקום להתעלם מהן.",
+       "apihelp-opensearch-example-te": "חיפוש דפים שמתחילים ב־<kbd>Te</kbd>.",
+       "apihelp-options-param-reset": "אתחול ההעדפות לבררות המחדל של האתר.",
+       "apihelp-options-param-change": "רשימת שינויים, בתסדיר name=value (למשל skin=vector). הערך אינו יכול להכיל תווי מקל (|). אם לא ניתן ערך, אפילו לא סימן שווה, למשל optionname|otheroption|...‎, האפשרות תאופס לערך בררת המחדל שלה.",
+       "apihelp-options-example-reset": "אתחול כל ההעדפות.",
+       "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": "רשימת שמות יחידות query (ערך של הפרמטר <var>prop</var>‏, <var>meta</var> או <var>list</var>). יש להשתמש ב־<kbd>$1modules=query+foo</kbd> במקום <kbd>$1querymodules=foo</kbd>.",
+       "apihelp-paraminfo-param-mainmodule": "קבלת מידע עם היחידה הראשית (העליונה). יש להשתמש ב־<kbd>$1modules=main</kbd> במקום זה.",
+       "apihelp-paraminfo-param-pagesetmodule": "קבלת מידע גם על יחידת pageset (שמספק את 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ר' את יחידת ה־prop השיונות של <kbd>[[Special:ApiHelp/query|action=query]]</kbd> כדי לקבל מידע על הגרסה הנוכחית של הדף.\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-param-summary": "התקציר שצריך לפענח.",
+       "apihelp-parse-param-prop": "אילו פריטי מידע לקבל:",
+       "apihelp-parse-paramvalue-prop-text": "נותן טקסט מפוענח של קוד הוויקי.",
+       "apihelp-parse-paramvalue-prop-langlinks": "נותן קישורי שפה בקוד הוויקי המפוענח.",
+       "apihelp-parse-paramvalue-prop-categories": "נותן קטגוריות בקוד ויקי מפוענח.",
+       "apihelp-parse-paramvalue-prop-categorieshtml": "נותן את גרסת ה־HTML של הקטגוריות.",
+       "apihelp-parse-paramvalue-prop-links": "נותן קישורים פנימיים בקוד הוויקי המפוענח.",
+       "apihelp-parse-paramvalue-prop-templates": "נותן תבניות בקוד הוויקי המפוענח.",
+       "apihelp-parse-paramvalue-prop-images": "נותן תמונות בקוד הוויקי המפוענח.",
+       "apihelp-parse-paramvalue-prop-externallinks": "מתן קישורים חיצוניים בקוד הוויקי המפוענח.",
+       "apihelp-parse-paramvalue-prop-sections": "מתן הפסקאות בקוד הוויקי המפוענח.",
+       "apihelp-parse-paramvalue-prop-revid": "הוספת מזהה הגרסה של הדף המפוענח.",
+       "apihelp-parse-paramvalue-prop-displaytitle": "הוספת הכותרת של קוד הוויקי המפוענח.",
+       "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": "מתן קישורי בינוויקי בקוד הוויקי המפוענח.",
+       "apihelp-parse-paramvalue-prop-wikitext": "מתן קוד הוויקי המקורי שפוענח.",
+       "apihelp-parse-param-disablepp": "לכבות את דו\"ח ה־PP מפלט המפענח.",
+       "apihelp-parse-param-disableeditsection": "לכבות את קישורי עריכת הפסקאות מפלט המפענח.",
+       "apihelp-parse-param-preview": "לפענח במצב תצוגה מקדימה.",
+       "apihelp-parse-param-sectionpreview": "לפענח במצב תצוגה מקדימה של פסקה (מדליק גם את מצב תצוגה מקדימה).",
+       "apihelp-parse-param-disabletoc": "לכבות תוכן עניינים בפלט.",
+       "apihelp-parse-param-contentformat": "תסדיר הסדרת תוכן שישמש לטקסט הקלט. תקף רק עם $1text.",
+       "apihelp-parse-example-page": "לפענח דף.",
+       "apihelp-parse-example-text": "לפענח קוד ויקי.",
+       "apihelp-parse-example-texttitle": "לפענח קוד, עם ציון כותרת דף.",
+       "apihelp-parse-example-summary": "לפענח תקציר.",
+       "apihelp-patrol-description": "לנטר דף או גרסה.",
+       "apihelp-patrol-param-rcid": "מזהה שינויים אחרונים לניטור.",
+       "apihelp-patrol-param-revid": "מזהה גרסה לניטור.",
+       "apihelp-patrol-example-rcid": "לנטר עיול משינויים אחרונים.",
+       "apihelp-patrol-example-revid": "לנטר גרסה.",
+       "apihelp-protect-description": "לשנות את רמת ההגנה של דף.",
+       "apihelp-protect-param-title": "כותרת הדף להגנה או הסרת הגנה. לא ניתן להשתמש בזה יחד עם $1pageid.",
+       "apihelp-protect-param-pageid": "מזהה הדף להגנה או הסרת הגנה. לא ניתן להשתמש בזה יחד עם $1title.",
+       "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": "הפעלת הגנה מדורגת (כלומר, להגן על דפים שכלולים בדף הזה). אין לזה השפעה אם כל רמות ההגנה שניתנו אינן תומכות בדירוג.",
+       "apihelp-protect-param-watch": "אם זה מוגדר, הוספת הדף שהגנה נוספת אליו או מוסרת ממנו לרשימת המעקב של המשתמש הנוכחי.",
        "apihelp-protect-param-watchlist": "הוספה או הסרה של הדף ללא תנאי מרשימת המעקב של המשתמש הנוכחי, להשתמש בהעדפות או לא לשנות את המעקב.",
        "apihelp-protect-example-protect": "הגנה על דף.",
+       "apihelp-protect-example-unprotect2": "הסרת הגנה מדף על־ידי הגדרה של אפס הגבלות.",
+       "apihelp-purge-description": "ניקוי המטמון לכותרות שניתנו.\n\nדורש בקשת POST אם המשתמש לא נכנס לחשבון.",
+       "apihelp-purge-param-forcelinkupdate": "עדכון טבלאות הקישורים.",
+       "apihelp-purge-example-simple": "ניקוי המטמון של הדפים <kbd>Main Page</kbd> ו־<kbd>API</kbd>.",
+       "apihelp-purge-example-generator": "ניקוי 10 הדפים הראשונים במרחב הראשי.",
+       "apihelp-query-param-prop": "אילו מאפיינים לקבל על הדפים בשאילתה.",
        "apihelp-query-param-list": "אילו רשימות לקבל.",
-       "apihelp-query+allcategories-description": "מניין של כל הקטגוריות.",
-       "apihelp-query+allcategories-param-from": "הקטגוריה ממנה להתחיל למנות.",
+       "apihelp-query-param-meta": "אילו מטא־נתונים לקבל.",
+       "apihelp-query-param-exportnowrap": "להחזיר את ה־XML של היצוא בלי לעטוף אותו בתוצאת XML (אותו תסדיר כמו [[Special:Export]]). אפשר להשתמש בזה רק עם $1export.",
+       "apihelp-query+allcategories-description": "למנות את כל הקטגוריות.",
+       "apihelp-query+allcategories-param-from": "מאיזו קטגוריה להתחיל למנות.",
+       "apihelp-query+allcategories-param-to": "באיזו קטגוריה להפסיק למנות.",
+       "apihelp-query+allcategories-param-prefix": "חיפוש כל כותרות הקטגוריות שמתחילות בערך הזה.",
        "apihelp-query+allcategories-param-dir": "באיזה כיוון למיין.",
+       "apihelp-query+allcategories-param-min": "להחזיר רק קטגוריות עם מספר כזה לפחות של חברים.",
+       "apihelp-query+allcategories-param-max": "להחזיר רק קטגוריות עם מספר כזה לכל היותר של חברים.",
        "apihelp-query+allcategories-param-limit": "כמה קטגוריות להחזיר.",
-       "apihelp-query+alldeletedrevisions-param-start": "באיזה חותם זמן להתחיל לרשום.",
-       "apihelp-query+alldeletedrevisions-param-end": "באיזה חותם זמן להפסיק לרשום.",
+       "apihelp-query+allcategories-param-prop": "אילו מאפיינים לקבל:\n;size:הוספת מספר הדפים בקטגוריה.\n;hidden:מתייג קטגוריות מוסתרות עם _&#95;HIDDENCAT_&#95;.",
+       "apihelp-query+allcategories-example-size": "רשימת קטגוריות עם מידע על מספר הדפים בכל אחת מהן.",
+       "apihelp-query+alldeletedrevisions-description": "רשימת כל הגרסאות המחוקות על־ידי משתמש או במרחב.",
+       "apihelp-query+alldeletedrevisions-paraminfo-useronly": "יכול לשמש רק <var>$3user</var>.",
+       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "לא יכול לשמש עם <var>$3user</var>.",
+       "apihelp-query+alldeletedrevisions-param-start": "מאיזה חותם־זמן להתחיל למנות.",
+       "apihelp-query+alldeletedrevisions-param-end": "באיזה חותם־זמן להפסיק למנות.",
        "apihelp-query+alldeletedrevisions-param-from": "להתחיל את הרשימה בשם הזה.",
        "apihelp-query+alldeletedrevisions-param-to": "להפסיק את הרשימה בכותרת הזאת.",
        "apihelp-query+alldeletedrevisions-param-prefix": "חיפוש כל שמות הדפים שמתחילים בערך הזה.",
        "apihelp-query+alldeletedrevisions-param-user": "לרשום רק גרסאות מאת המשתמש הזה.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "לא לרשום גרסאות מאת המשתמש הזה.",
        "apihelp-query+alldeletedrevisions-param-namespace": "לרשום רק דפים במרחב השם הזה.",
+       "apihelp-query+allfileusages-description": "לרשום את כל שימושי הקובץ, כולל בלתי־קיימים.",
+       "apihelp-query+allfileusages-param-from": "מאיזו כותרת קובץ להתחיל למנות.",
+       "apihelp-query+allfileusages-param-to": "שם הקובץ שבו תסתיים המנייה.",
+       "apihelp-query+allfileusages-param-prefix": "חיפוש כל שמות הקבצים שמתחילים עם הערך הזה.",
        "apihelp-query+allfileusages-param-limit": "כמה פריטים להחזיר בסך הכול.",
        "apihelp-query+allfileusages-param-dir": "באיזה כיוון לרשום.",
+       "apihelp-query+allfileusages-example-unique": "רשימת שמות קבצים ייחודיים.",
+       "apihelp-query+allfileusages-example-unique-generator": "קבלת כל שמות הקבצים, כולל חסרים.",
+       "apihelp-query+allfileusages-example-generator": "קבלת דפים שמכילים את הקבצים.",
+       "apihelp-query+allimages-description": "למנות את כל התמונות לפי הסדר.",
        "apihelp-query+allimages-param-sort": "לפי איזה מאפיין למיין.",
        "apihelp-query+allimages-param-dir": "באיזה כיוון לרשום.",
-       "apihelp-query+allimages-param-start": "באיזה חותם זמן להתחיל לרשום. אפשר להשתמש בזה רק עם $1sort=timestamp.",
+       "apihelp-query+allimages-param-from": "מאיזו כותרת תמונה להתחיל למנות. יכול לשמש רק עם $1sort=name.",
+       "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-minsize": "להגביל לתמונות עם מספר כזה של בתים לפחות.",
        "apihelp-query+allimages-param-maxsize": "להגביל לתמונות עם מספר כזה לכל היותר של בתים.",
        "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-limit": "כמה תמונות להחזיר בסך הכול.",
        "apihelp-query+allimages-example-B": "הצגת רשימה של קבצים שמתחילים באות <kbd>B</kbd>.",
        "apihelp-query+allimages-example-generator": "הצגת מידע על 4 קבצים המתחילים באות <kbd>T</kbd>.",
-       "apihelp-query+alllinks-param-namespace": "איזה מרחב שם לרשום.",
+       "apihelp-query+alllinks-description": "למנות את כל הקישורים שמצביעים למרחב שם נתון.",
+       "apihelp-query+alllinks-param-from": "מאיזו כותרת הקישור להתחיל את המנייה.",
+       "apihelp-query+alllinks-param-to": "כותרת הקישור שבו תסתיים המנייה.",
+       "apihelp-query+alllinks-param-prefix": "חיפוש כל הכותרות המקושרות שמתחילות בערך הזה.",
+       "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": "קבלת כל הכותרות המקושרות, וסימון החסרות.",
+       "apihelp-query+alllinks-example-generator": "קבלת דפים שמכילים את הקישורים.",
+       "apihelp-query+allmessages-description": "החזרת הודעות מהאתר הזה.",
        "apihelp-query+allmessages-param-prop": "אלו מאפיינים לקבל.",
+       "apihelp-query+allmessages-param-nocontent": "אם זה מוגדר, לא לכלול את תוכן ההודעות בפלט.",
+       "apihelp-query+allmessages-param-args": "ארגומנטים שיוחלפו לתוך ההודעה.",
+       "apihelp-query+allmessages-param-filter": "החזרה רק של הודעות עם שמות שמכילים את המחרוזת הזאת.",
+       "apihelp-query+allmessages-param-customised": "להחזיר רק הודעות במצב ההתאמה הזה.",
+       "apihelp-query+allmessages-param-lang": "החזרת הודעת בשפה הזאת.",
+       "apihelp-query+allmessages-param-from": "החזרת הודעת החל מההודעה הזאת.",
+       "apihelp-query+allmessages-param-to": "החזרת הודעות עד ההודעה הזאת.",
+       "apihelp-query+allmessages-param-prefix": "החזרת הודעת עם התחילית הזאת.",
+       "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-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-limit": "כמה דפים להחזיר בסך הכול.",
        "apihelp-query+allpages-param-dir": "באיזה כיוון לרשום.",
-       "apihelp-query+allredirects-param-namespace": "איזה מרחב שם לרשום.",
+       "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-namespace": "איזה מרחב שם למנות.",
        "apihelp-query+allredirects-param-limit": "כמה פריטים להחזיר בסך הכול.",
        "apihelp-query+allredirects-param-dir": "באיזה כיוון לרשום.",
-       "apihelp-query+alltransclusions-param-namespace": "איזה מרחב שם לרשום.",
+       "apihelp-query+allredirects-example-unique": "רשימת דפי יעד ייחודיים.",
+       "apihelp-query+allredirects-example-unique-generator": "קבלת על דפי היעד, תוך כדי סימון החסרים.",
+       "apihelp-query+allredirects-example-generator": "קבלת דפים שמכילים את ההפניות.",
+       "apihelp-query+alltransclusions-description": "רשימת כל ההכללות (דפים שמוטבעים באמצעות &#123;&#123;x&#125;&#125;), כולל כאלה שאינם קיימים.",
+       "apihelp-query+alltransclusions-param-from": "מאיזו כותרת ההכללה להתחיל את המנייה.",
+       "apihelp-query+alltransclusions-param-to": "כותרת ההכללה שהמנייה תיפסק בה.",
+       "apihelp-query+alltransclusions-param-namespace": "איזה מרחב שם למנות.",
        "apihelp-query+alltransclusions-param-limit": "כמה פריטים להחזיר בסך הכול.",
        "apihelp-query+alltransclusions-param-dir": "באיזה כיוון לרשום.",
+       "apihelp-query+alltransclusions-example-unique": "רשימת כותרת מוכללות ייחודיות.",
+       "apihelp-query+alltransclusions-example-unique-generator": "קבלת כל כל הכותרות המוכללות, תוך כדי סימון החסרות.",
+       "apihelp-query+alltransclusions-example-generator": "קבלת דפים שמכילים את ההכללות.",
+       "apihelp-query+allusers-description": "למנות את כל המשתמשים הרשומים.",
+       "apihelp-query+allusers-param-from": "מאיזה שם משתמש להתחיל למנות.",
+       "apihelp-query+allusers-param-to": "באיזה שם משתמש להפסיק למנות.",
        "apihelp-query+allusers-param-dir": "באיזה כיוון למיין.",
+       "apihelp-query+allusers-param-prop": "אילו פרטי מידע לכלול:\n;blockinfo:הוספת מידע עם החסימה הנוכחית של משתמש.\n;groups:הוספת קבוצות שמשתמש חבר בהן. זה משתמש ביותר משאבי דפדפן ויכול להחזיר פחות תוצאות מהמגבלה.\n;implicitgroups:לרשום את כל הקבוצות שהמשתמש חבר בהן אוטומטית.\n;rights:רשימת הההרשאות שיש למשתמש.\n;editcount:הוספת מניין העריכות של המשתמש .\n;registration:הוספת חותם־הזמן של זמן הרישום של המשתמש (יכול להיות ריק).",
        "apihelp-query+backlinks-description": "מציאת כל הדפים שמקשרים לדף הנתון.",
        "apihelp-query+backlinks-param-title": "איזו כותרת לחפש. לא ניתן להשתמש בזה יחד עם <var>$1pageid</var>.",
-       "apihelp-query+backlinks-param-namespace": "×\90×\99×\96×\94 ×\9eר×\97×\91 ×©×\9d ×\9cרש×\95×\9d.",
+       "apihelp-query+backlinks-param-namespace": "×\90×\99×\96×\94 ×\9eר×\97×\91 ×©×\9d ×\9c×\9e× ×\95ת.",
        "apihelp-query+backlinks-param-dir": "באיזה כיוון לרשום.",
-       "apihelp-query+blocks-param-start": "באיזה חותם זמן להתחיל לרשום.",
-       "apihelp-query+blocks-param-end": "באיזה חותם זמן להפסיק לרשום.",
+       "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+categories-param-prop": "אילו מאפיינים נוספים לקבל עבור כל קטגוריה:\n;sortkey:הוספת מפתח מיון (מחרוזת הקסדצימלית) ותחילית מפתח מיון (החלק הקריא) עבור קטגוריה.\n;timestamp:הוספת חותם־הזמן של יצירת הקטגוריה.\n;hidden:תיוג קטגוריות שהוסתרו באמצעות _&#95;HIDDENCAT_&#95;.",
        "apihelp-query+categories-param-limit": "כמה קטגוריות להחזיר.",
        "apihelp-query+categories-param-dir": "באיזה כיוון לרשום.",
+       "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-namespace": "לכלול רק דפים במרחבי השם האלה. יש לשים לב לכך ש־<kbd>$1type=subcat</kbd> או <kbd>$1type=file</kbd> יכולים לשמש במקום <kbd>$1namespace=14</kbd> או <kbd>6</kbd>.",
        "apihelp-query+categorymembers-param-limit": "מספר הדפים המרבי שיוחזר.",
        "apihelp-query+categorymembers-param-sort": "לפי איזה מאפיין למיין.",
        "apihelp-query+categorymembers-example-simple": "קבלת עשרת העמודים הראשונים שתחת <kbd>קטגוריה:פיזיקה</kbd>.",
        "apihelp-query+contributors-param-limit": "כמה תורמים להחזיר.",
        "apihelp-query+contributors-example-simple": "הצגת תורמים לדף <kbd>עמוד ראשי</kbd>.",
-       "apihelp-query+deletedrevisions-param-start": "באיזה חותם זמן להתחיל לרשום. לא תקף בעיבור רשימת מזהי גרסה.",
-       "apihelp-query+deletedrevisions-param-end": "באיזה חותם זמן להפסיק לרשום. לא תקף בעת עיבוד רשימת מזהי גרסה.",
+       "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-paraminfo-modes": "{{PLURAL:$1|מצב|מצבים}}: $2",
-       "apihelp-query+deletedrevs-param-start": "באיזה חותם זמן להתחיל לרשום.",
-       "apihelp-query+deletedrevs-param-end": "באיזה חותם זמן להפסיק לרשום.",
+       "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-limit": "המספר המרבי של הגרסאות שיירשם.",
+       "apihelp-query+disabled-description": "יחידת ה־query הזאת כובתה.",
        "apihelp-query+duplicatefiles-param-limit": "כמה קבצים כפולים להחזיר.",
        "apihelp-query+duplicatefiles-param-dir": "באיזה כיוון לרשום.",
        "apihelp-query+duplicatefiles-param-localonly": "חיפוש אחר קבצים במאגר המקומי בלבד.",
        "apihelp-query+duplicatefiles-example-simple": "חיפוש אחר כפילויות של [[:קובץ:Albert Einstein Head.jpg]].",
        "apihelp-query+duplicatefiles-example-generated": "חיפוש אחר כפילויות בין כל הקבצים.",
        "apihelp-query+embeddedin-param-title": "איזו כותרת לחפש. לא ניתן להשתמש בזה יחד עם $1pageid.",
-       "apihelp-query+embeddedin-param-namespace": "×\90×\99×\96×\94 ×\9eר×\97×\91 ×©×\9d ×\9cרש×\95×\9d.",
+       "apihelp-query+embeddedin-param-namespace": "×\90×\99×\96×\94 ×\9eר×\97×\91 ×©×\9d ×\9c×\9e× ×\95ת.",
        "apihelp-query+embeddedin-param-dir": "באיזה כיוון לרשום.",
        "apihelp-query+embeddedin-param-limit": "כמה דפים להחזיר בסך הכול.",
        "apihelp-query+extlinks-param-limit": "כמה קישורים להחזיר.",
+       "apihelp-query+exturlusage-description": "למנות דפים שמכילים URL נתון.",
+       "apihelp-query+exturlusage-param-namespace": "איזה מרחב שם למנות.",
+       "apihelp-query+filearchive-description": "למנות את כל הקבצים המחוקים לפי הסדר.",
+       "apihelp-query+filearchive-param-from": "מאיזו כותרת תמונה להתחיל למנות.",
+       "apihelp-query+filearchive-param-to": "באיזו כותרת תמונה להפסיק למנות.",
        "apihelp-query+filearchive-param-dir": "באיזה כיוון לרשום.",
        "apihelp-query+fileusage-param-namespace": "לכלול רק דפים במרחבי השם האלה.",
        "apihelp-query+fileusage-param-limit": "כמה להחזיר.",
        "apihelp-query+fileusage-param-show": "לחפש רק פריטים שמתאימים לאמות המידה הבאות:\n;redirect:להציג רק הפניות.\n;!redirect:לא להציג הפניות.",
+       "apihelp-query+imageinfo-description": "החזרת מידע על קובץ והיסטורייה העלאה.",
+       "apihelp-query+imageinfo-param-prop": "איזה מידע על הקובץ לקבל:",
+       "apihelp-query+imageinfo-paramvalue-prop-timestamp": "הוספת חותם־זמן לגרסה שהועלתה.",
+       "apihelp-query+imageinfo-paramvalue-prop-user": "הוספה המשתמש שהעלה כל גרסה של קובץ.",
+       "apihelp-query+imageinfo-paramvalue-prop-userid": "הוספת מזהה המשתמש שהעלה כל גרסה של קובץ.",
        "apihelp-query+imageinfo-paramvalue-prop-comment": "תגובה על הגרסה.",
+       "apihelp-query+imageinfo-paramvalue-prop-parsedcomment": "פענוח ההערה על גרסה.",
+       "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "הוספת שכותרת הקנונית של הקובץ.",
+       "apihelp-query+imageinfo-paramvalue-prop-url": "מתן URL לקובץ ולדף התיאור.",
+       "apihelp-query+imageinfo-paramvalue-prop-size": "הוספת הגודל של הקובץ בבתים והגובה, הרוחב ומניין הדפים (אם זה מתאים).",
+       "apihelp-query+imageinfo-paramvalue-prop-dimensions": "כיוני ל־size.",
+       "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+imageinfo-param-urlheight": "דומה ל־$1urlwidth.",
+       "apihelp-query+imageinfo-param-extmetadatalanguage": "באיזו שפה לאחזר את המטא־נתונים. זה משפיע על אילו תרגומים לאחזר, האם יש כמה, וגם איך דברים כמו מספרים וערכים שונים מעוצבים.",
        "apihelp-query+imageinfo-param-localonly": "חיפוש אחר קבצים במאגר המקומי בלבד.",
        "apihelp-query+imageinfo-example-simple": "קבלת פרטים על הגרסה הנוכחית של [[:קובץ:Albert Einstein Head.jpg]].",
        "apihelp-query+images-param-limit": "כמה קבצים להחזיר.",
        "apihelp-query+linkshere-param-limit": "כמה להחזיר.",
        "apihelp-query+linkshere-param-show": "הצגת פריטים שתואמים את הדרישות הללו בלבד:\n;redirect:הצגת הפניות בלבד.\n;!redirect:הצגת קישורים שאינם הפניות בלבד.",
        "apihelp-query+logevents-description": "קבלת אירועים מהרישומים.",
-       "apihelp-query+logevents-param-start": "באיזה חותם זמן להתחיל לרשום.",
+       "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+prefixsearch-param-limit": "מספר התוצאות המרבי להחזרה.",
        "apihelp-query+prefixsearch-param-offset": "מספר תוצאות לדילוג.",
        "apihelp-query+protectedtitles-param-limit": "כמה דפים להחזיר בסך הכול.",
+       "apihelp-query+protectedtitles-param-end": "באיזה חותם־זמן הגנה לסיים את הרשימה.",
        "apihelp-query+querypage-param-limit": "מספר תוצאות להחזרה.",
        "apihelp-query+recentchanges-description": "מניית השינויים האחרונים.",
-       "apihelp-query+recentchanges-param-start": "באיזה חותם זמן להתחיל לרשום.",
+       "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+redirects-param-namespace": "לכלול רק דפים במרחבי השם האלה.",
        "apihelp-query+redirects-param-limit": "כמה הפניות להחזיר.",
        "apihelp-query+redirects-param-show": "לחפש רק פריטים שמתאימים לאמות המידה הבאות:\n;fragment:להציג רק הפניות עם מקטע.\n;!fragment:להציג רק הפניות ללא מקטע.",
+       "apihelp-query+revisions-param-startid": "מאיזה מזהה גרסה להתחיל למנות.",
+       "apihelp-query+revisions-param-endid": "באיזה מזהה גרסה להפסיק את מניית הגרסאות.",
+       "apihelp-query+revisions-param-start": "מאיזה חותם־זמן של גרסה להתחיל למנות.",
        "apihelp-query+revisions-param-tag": "לרשום רק גרסאות עם התג הזה.",
        "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-limit": "כמה דפים להחזיר בסך הכול.",
        "apihelp-query+siteinfo-param-inlanguagecode": "קוד שפה ששמות שפות מתורגמות (מאמץ טוב ביותר) ושמות עיצובים.",
+       "apihelp-query+siteinfo-example-simple": "איזור מידע על האתר.",
        "apihelp-query+stashimageinfo-param-filekey": "מפתח שמזהה העלאה קודמת שהונחה בצד באופן זמני.",
+       "apihelp-query+tags-description": "רשימת תגי שינוי.",
+       "apihelp-query+tags-example-simple": "רשימת תגים זמינים.",
+       "apihelp-query+templates-param-limit": "כמה תבניות להחזיר.",
        "apihelp-query+templates-param-dir": "באיזה כיוון לרשום.",
+       "apihelp-query+tokens-param-type": "סוגי האסימונים לבקש.",
+       "apihelp-query+tokens-example-simple": "אחזור אסימון csrf (בררת המחדל).",
        "apihelp-query+tokens-example-types": "אחזור אסימון של רשימת המעקב ואסימון של ניטור",
        "apihelp-query+transcludedin-param-namespace": "לכלול רק דפים במרחבי השם האלה.",
        "apihelp-query+transcludedin-param-limit": "כמה להחזיר.",
        "apihelp-query+transcludedin-param-show": "לחפש רק פריטים שמתאימים לאמות המידה הבאות:\n;redirect:להציג רק הפניות.\n;!redirect:לא להציג הפניות.",
+       "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-tag": "לרשום רק גרסאות עם התג הזה.",
        "apihelp-query+usercontribs-param-toponly": "לרשום רק שינויים שהם הגרסה האחרונה.",
-       "apihelp-query+watchlist-param-start": "באיזה חותם זמן להתחיל לרשום.",
+       "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+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+watchlistraw-param-limit": "כמה תוצאות סך הכול להחזיר בכל בקשה.",
+       "apihelp-query+watchlistraw-param-fromtitle": "מאיזו כותרת (עם תחילית מרחב שם) להתחיל את המנייה.",
+       "apihelp-query+watchlistraw-param-totitle": "באיזו כותרת (עם תחילית מרחב שם) להפסיק למנות.",
        "apihelp-rollback-param-watchlist": "הוספה או הסרה של הדף ללא תנאי מרשימת המעקב של המשתמש הנוכחי, להשתמש בהעדפות או לא לשנות את המעקב.",
        "apihelp-tag-param-reason": "סיבה לשינוי.",
+       "apihelp-tokens-description": "קבלת אסימונים לפעולות שמשנות נתונים.\n\nהיחידה הזאת הוכרזה בתור מיושנת לטובת [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
+       "apihelp-undelete-param-reason": "סיבה לשחזור.",
        "apihelp-undelete-param-watchlist": "הוספה או הסרה של הדף ללא תנאי מרשימת המעקב של המשתמש הנוכחי, להשתמש בהעדפות או לא לשנות את המעקב.",
+       "apihelp-upload-param-filename": "שם קובץ היעד.",
        "apihelp-upload-param-watchlist": "הוספה או הסרה של הדף ללא תנאי מרשימת המעקב של המשתמש הנוכחי, להשתמש בהעדפות או לא לשנות את המעקב.",
        "apihelp-upload-param-ignorewarnings": "להתעלם מכל האזהרות.",
        "apihelp-upload-param-filekey": "מפתח שמזהה העלאה קודמת שהונחה בצד באופן זמני.",
        "apihelp-userrights-param-user": "שם משתמש.",
        "apihelp-userrights-param-reason": "סיבה לשינוי.",
+       "apihelp-format-example-generic": "להחזיר את תוצאות השאילתה בתסדיר $1.",
        "apihelp-dbg-description": "לפלוט נתונים בתסדיר <code dir=\"ltr\">var_export()</code> של PHP.",
-       "apihelp-dump-description": "לפלוט נתונים בתסדיר <code dir=\"ltr\">var_dump()</code> של PHP.",
+       "apihelp-dbgfm-description": "לפלוט את הנתונים בתסדיר <code dir=\"ltr\">var_export()</code> של PHP (עם הדפסה יפה ב־HTML).",
        "apihelp-json-description": "לפלוט נתונים בתסדיר JSON.",
+       "apihelp-json-param-utf8": "אם זה צוין, רוב התווים שאינם ASCII (אבל לא כולם) יקודדו בתור UTF-8 במקום להתחלף בסדרות חילוף הקסדצימליות. זאת בררת המחדל אם הערך של <var>formatversion</var> הוא לא <kbd>1</kbd>.",
+       "apihelp-json-param-ascii": "אם זה צוין, לקודד את כל מה שאינו ASCII בסדרות חילוף הקסדצימליות. זאת בררת המחדל כש־<var>formatversion</var> היא <kbd>1</kbd>.",
+       "apihelp-json-param-formatversion": "תסדיר הפלט:\n;1:תסדיר עם תאימות אחורה (ערכים בוליאניים בסגנון XML, מפתחות <samp>*</samp> לצומתי תוכן, וכו').\n;2:תסדיר מודרני ניסיוני. הפרטים יכולים להשתנות!\n;latest:להשתמש בתסדיר החדש ביותר (כרגע <kbd>2</kbd>), יכול להשתנות ללא התראה.",
        "apihelp-jsonfm-description": "לפלוט נתונים בתסדיר JSON (עם הדפסה יפה ב־HTML).",
+       "apihelp-none-description": "לא לפלוט שום דבר.",
        "apihelp-php-description": "לפלוט נתונים בתסדיר PHP מוסדר.",
+       "apihelp-php-param-formatversion": "תסדיר הפלט:\n;1:תסדיר עם תאימות אחורה (ערכים בוליאניים בסגנון XML, מפתחות <samp>*</samp> לצומתי תוכן, וכו').\n;2:תסדיר מודרני ניסיוני. הפרטים יכולים להשתנות!\n;latest:להשתמש בתסדיר החדש ביותר (כרגע <kbd>2</kbd>), יכול להשתנות ללא התראה.",
        "apihelp-phpfm-description": "לפלוט נתונים בתסדיר PHP מוסדר (עם הדפסה יפה ב־HTML).",
+       "apihelp-rawfm-description": "לפלוט את הנתונים עם אלמנטים לניפוי שגיאות בתסדיר JSON (עם הדפסה יפה ב־HTML).",
        "apihelp-txt-description": "לפלוט נתונים בתסדיר <code dir=\"ltr\">print_r()</code> של PHP.",
-       "apihelp-wddx-description": "לפלוט נתונים בתסדיר WDDX.",
+       "apihelp-txtfm-description": "לפלוט את הנתונים בתסדיר <code dir=\"ltr\">print_r()</code> של PHP (עם הדפסה יפה ב־HTML).",
        "apihelp-xml-description": "לפלוט נתונים בתסדיר XML.",
        "apihelp-xml-param-xslt": "אם צוין, יש להוסיף את שם הדף כגיליון עיצוב XSL. על הערך להיות כותרת ב {{ns:mediawiki}} במרחב שם המשתמש, המסתיים ב-  <code>.xsl</code>.",
        "apihelp-xmlfm-description": "לפלוט נתונים בתסדיר XML (עם הדפסה יפה ב־HTML).",
+       "apihelp-yaml-description": "לפלוט את הנתונים בתסדיר YAML.",
        "apihelp-yamlfm-description": "לפלוט נתונים בתסדיר YAML (עם הדפסה יפה ב־HTML).",
        "api-format-title": "תוצאה של API של מדיה־ויקי",
        "api-format-prettyprint-header": "זהו ייצוג ב־HTML של תסדיר $1. תסדיר HTML טוב לתיקון שגיאות, אבל אינו מתאים ליישומים.\n\nיש לציין את הפרמטר <var>format</var> כדי לשנות את תסדיר הפלט. כדי לראות ייצוג של תסדיר $1 לא ב־HTML יש לרשום <kbd>format=$2</kbd>.\n\nר' את [[mw:API|התיעוד המלא]], או את [[Special:ApiHelp/main|העזרה של API]] למידע נוסף.",
        "api-pageset-param-titles": "רשימת כותרות.",
        "api-pageset-param-pageids": "רשימת מזהי דף לעובד עליהם.",
        "api-pageset-param-revids": "רשימת מזהי גרסה לעבוד עליהם.",
-       "api-pageset-param-generator": "ק×\91×\9cת ×¨×©×\99×\9eת ×\93פ×\99×\9d ×\9c×¢×\91×\95×\93 ×¢×\9c×\99×\94×\9d ×¢×\9cÖ¾×\99×\93×\99 ×\94רצת ×\99×\97×\99×\93ת ×©×\90×\99×\9cת×\94 שצוינה.\n\n<strong>לתשומת לבך:</strong> לשמות בפרמטר generator צריכה להיות התחילית \"g\", ר' דוגמאות.",
+       "api-pageset-param-generator": "ק×\91×\9cת ×¨×©×\99×\9eת ×\93פ×\99×\9d ×\9c×¢×\91×\95×\93 ×¢×\9c×\99×\94×\9d ×¢×\9cÖ¾×\99×\93×\99 ×\94רצת ×\99×\97×\99×\93ת ×\94Ö¾query שצוינה.\n\n<strong>לתשומת לבך:</strong> לשמות בפרמטר generator צריכה להיות התחילית \"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>$1pageids</var>.",
        "api-pageset-param-converttitles": "המרת כותרות לסוגי כתב אחרים אם זה נחוץ. זה עובד רק אם שפת הכותרת של הוויקי תומכת בהמרת סוגי כתב. השפות שתמכות בהמרת סוגי כתב הן $1.",
        "api-help-lead": "זהו דף תיעוד של API שנוצר באופן אוטומטי.\n\nתיעוד ודוגמאות: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "יחידה ראשית",
        "api-help-flag-deprecated": "יחידה זו אינה מומלצת לשימוש.",
-       "api-help-flag-internal": "<strong>×\99×\97×\99×\93×\94 ×\96×\95 ×\94×\99×\90 ×¤× ×\99×\9e×\99ת ×\90×\95 ×\9c×\90 ×\99צ×\99×\91×\94.</strong>\n×\94פע×\95×\9c×\94 ×©×\9c×\94 ×¢×©×\95×\99ה להשתנות ללא הודעה מוקדמת.",
+       "api-help-flag-internal": "<strong>×\94×\99×\97×\99×\93×\94 ×\94×\96×\90ת ×\94×\99×\90 ×¤× ×\99×\9e×\99ת ×\90×\95 ×\91×\9cת×\99Ö¾×\99צ×\99×\91×\94.</strong> ×\94פע×\95×\9c×\94 ×©×\9c×\94 ×\99×\9b×\95×\9cה להשתנות ללא הודעה מוקדמת.",
        "api-help-flag-readrights": "יחידה זו דורשת הרשאות קריאה.",
-       "api-help-flag-writerights": "×\99×\97×\99×\93×\94 ×\96×\95 דורשת הרשאות כתיבה.",
+       "api-help-flag-writerights": "×\94×\99×\97×\99×\93×\94 ×\94×\96×\90ת דורשת הרשאות כתיבה.",
        "api-help-flag-mustbeposted": "יחידה זו מקבלת רק בקשות POST.",
-       "api-help-flag-generator": "×\94×\99×\97×\99×\93×\94 ×\94×\96×\90ת ×\99×\9b×\95×\9c×\94 ×\9c×\94×\99×\95ת מחולל.",
+       "api-help-flag-generator": "×\90פשר ×\9c×\94שת×\9eש ×\91×\99×\97×\99×\93×\94 ×\94×\96×\90ת ×\91ת×\95ר מחולל.",
        "api-help-source": "מקור: $1",
        "api-help-source-unknown": "מקור: <span class=\"apihelp-unknown\">לא ידוע</span>",
        "api-help-license": "רישיון: <span dir=\"auto\">[[$1|$2]]</span>",
        "api-help-param-deprecated": "מיושן.",
        "api-help-param-required": "פרמטר זה נדרש.",
        "api-help-datatypes-header": "סוגי נתונים",
+       "api-help-datatypes": "חלק מסוגי הפרמטרים בבקשות API דורשים הסבר נוסף:\n;בוליאני (boolean)\n:פרמטרים בוליאניים עובדים כמו תיבות סימון של HTML: אם הפרמטר צוין, בלי קשר לערך שלו, הוא אמת (true). בשביל ערך שקר (false), יש להשמיט את הפרמטר לגמרי.\n;חותם־זמן (timestamp)\n:אפשר לכתוב חותמי־זמן במספר תסדירים. תאריך ושעה לפי ISO 8601 הוא הדבר המומלת. כל הזמנים מצוינים ב־ UTC, לא תהיה השפעה לשום אזור זמן שיצוין.\n:* תאריך ושעה לפי ISO 8601‏, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (לא חובה לכתוב פיסוק ו־<kbd>Z</kbd>)\n:* תאריך ושעה לפי ISO 8601 עם חלקי שנייה (שלא תהיה להם שום השפעה), <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd> (לא חובה לכתוב קווים מפרידים, נקודתיים ו־<kbd>Z</kbd>)\n:* תסדיר MediaWiki‏, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* תסדיר מספרי כללי, <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (לאזור זמן אופציונלי של <kbd>GMT</kbd>‏, <kbd dir=\"ltr\">+<var>##</var></kbd>, או <kbd dir=\"ltr\">-<var>##</var></kbd> אין השפעה)\n:* תסדיר EXIF‏, <kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* תסדיר RFC 2822 (אפשר להשמיט את אזור הזמן), <kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* תסדיר RFC 850 (אפשר להשמיט את אזור הזמן), <kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* תסדיר C ctime‏, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* שניות מאז 1970-01-01T00:00:00Z בתור מספר שלך בין 1 ל־13 (לא כולל <kbd>0</kbd>)\n:* המחרוזת <kbd>now</kbd>",
        "api-help-param-type-integer": "סוג: {{PLURAL:$1|1=מספר שלם|2=רשימת מספרים שלמים}}",
        "api-help-param-type-boolean": "סוג: בוליאני ([[Special:ApiHelp/main#main/datatypes|פרטים]])",
+       "api-help-param-type-timestamp": "סוג: {{PLURAL:$1|חותם־זמן|רשימת חותמי־זמן}} ([[Special:ApiHelp/main#main/datatypes|תסדירים מורשים]])",
        "api-help-param-list": "{{PLURAL:$1|1=ערך אחד|2=ערכים (מופרדים באמצעות \"<kbd>{{!}}</kbd>\")}}: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=חייב להיות ריק|יכול להיות ריק או $2}}",
        "api-help-param-limit": "מספר הפרמטרים לא יכול להיות גדול מ־$1.",
        "api-help-param-token-webui": "לשם תאימות, גם האסימון שמשמש בממשק דפדפן מתקבל.",
        "api-help-param-disabled-in-miser-mode": "כבוי בשל [[mw:Manual:$wgMiserMode|מצב חיסכון]].",
        "api-help-param-limited-in-miser-mode": "<strong>לתשומת לבך:</strong> בשל [[mw:Manual:$wgMiserMode|מצב חיסכון]], שימוש בזה יכול להוביל לפחות מ־<var>$1limit</var> תוצאות לפני המשך; במצבים קיצוניים ייתכן שיחזרו אפס תוצאות.",
-       "api-help-param-direction": "×\91×\90×\99×\96×\94 ×\9b×\99×\95×\95×\9f ×\9c×\9eספר:\n;newer:לרשום את הישנים ביותר בהתחלה. לתשומת לבך: $1start חייב להיות לפני $1end.\n;older:לרשום את החדשים ביותר בהתחלה (בררת מחדל). לתשומת לבך: $1start חייב להיות אחרי $1end.",
+       "api-help-param-direction": "×\91×\90×\99×\96×\94 ×\9b×\99×\95×\95×\9f ×\9c×\9e× ×\95ת:\n;newer:לרשום את הישנים ביותר בהתחלה. לתשומת לבך: $1start חייב להיות לפני $1end.\n;older:לרשום את החדשים ביותר בהתחלה (בררת מחדל). לתשומת לבך: $1start חייב להיות אחרי $1end.",
        "api-help-param-continue": "כשיש עוד תוצאות, להשתמש בזה בשביל להמשיך.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(ללא תיאור)</span>",
        "api-help-examples": "{{PLURAL:$1|דוגמה|דוגמאות}}:",
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 22538cd..a286056 100644 (file)
@@ -6,13 +6,14 @@
                        "Los688",
                        "Whym",
                        "Mfuji",
-                       "Otokoume"
+                       "Otokoume",
+                       "Sujiniku"
                ]
        },
        "apihelp-main-param-action": "実行する操作です。",
        "apihelp-main-param-format": "出力する形式です。",
-       "apihelp-main-param-smaxage": "<code>s-maxage</code> ヘッダーにこの秒数を設定します。エラーがキャッシュされることはありません。",
-       "apihelp-main-param-maxage": "<code>max-age</code> ヘッダーにこの秒数を設定します。エラーがキャッシュされることはありません。",
+       "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-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": "利用者の本名 (省略可能)。",
@@ -52,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": "このモジュールは無効化されています。",
@@ -72,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 パラメーターより後に送信されるべきです。",
@@ -87,6 +98,7 @@
        "apihelp-expandtemplates-description": "ウィキテキストに含まれるすべてのテンプレートを展開します。",
        "apihelp-expandtemplates-param-title": "ページの名前です。",
        "apihelp-expandtemplates-param-text": "変換するウィキテキストです。",
+       "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-token": "最初のリクエストで取得したログイントークンです。",
        "apihelp-login-example-gettoken": "ログイントークンを取得する。",
        "apihelp-login-example-login": "ログイン",
        "apihelp-paraminfo-description": "API モジュールに関する情報を取得します。",
        "apihelp-paraminfo-param-modules": "モジュールの名前のリスト (<var>action</var> および <var>format</var> パラメーターの値, または <kbd>main</kbd>). <kbd>+</kbd> を使用して下位モジュールを指定できます。",
        "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>, and <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> に関する情報を表示する。",
+       "apihelp-parse-param-preview": "プレビューモードでのパース",
+       "apihelp-parse-example-page": "ページをパース",
+       "apihelp-parse-example-text": "ウィキテキストをパース",
        "apihelp-patrol-description": "ページまたは版を巡回済みにします。",
        "apihelp-patrol-param-revid": "巡回済みにする版ID。",
        "apihelp-patrol-example-rcid": "最近の更新を巡回",
        "apihelp-query+deletedrevisions-param-tag": "このタグが付与された版のみ表示します。",
        "apihelp-query+deletedrevisions-param-user": "この利用者による版のみを一覧表示。",
        "apihelp-query+deletedrevisions-param-excludeuser": "この利用者による版を一覧表示しない。",
-       "apihelp-query+deletedrevisions-param-limit": "一覧表示する版の最大数。",
        "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-param-from": "列挙の始点となるページ名。",
        "apihelp-query+revisions-example-first5-not-localhost": "<kbd>Main Page</kbd> の匿名利用者 <kbd>127.0.0.1</kbd> 以外による最初の5版を取得する。",
        "apihelp-query+revisions-example-first5-user": "<kbd>Main Page</kbd> の <kbd>MediaWiki default</kbd> による最初の5版を取得する。",
        "apihelp-query+search-description": "全文検索を行います。",
-       "apihelp-query+search-param-search": "ã\81\93ã\81®å\80¤ã\82\92å\90«ã\82\80ã\81\99ã\81¹ã\81¦ã\81®ã\83\9aã\83¼ã\82¸å\90\8d (ã\81¾ã\81\9fã\81¯æ\9c¬æ\96\87) ã\82\92æ¤\9cç´¢ã\81\97ます。",
+       "apihelp-query+search-param-search": "ã\81\93ã\81®å\80¤ã\82\92å\90«ã\82\80ã\83\9aã\83¼ã\82¸å\90\8dã\81¾ã\81\9fã\81¯æ\9c¬æ\96\87ã\82\92æ¤\9cç´¢ã\81\97ã\81¾ã\81\99ã\80\82Wikiã\81®æ¤\9cç´¢ã\83\90ã\83\83ã\82¯ã\82¨ã\83³ã\83\89å®\9fè£\85ã\81«å¿\9cã\81\98ã\81¦ã\80\81ã\81\82ã\81ªã\81\9fã\81¯ç\89¹å\88¥ã\81ªæ¤\9cç´¢æ©\9fè\83½ã\82\92å\91¼ã\81³å\87ºã\81\99ã\81\9fã\82\81ã\81®æ\96\87å­\97å\88\97ã\82\92æ¤\9cç´¢ã\81\99ã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dます。",
        "apihelp-query+search-param-namespace": "この名前空間内のみを検索します。",
        "apihelp-query+search-param-what": "実行する検索の種類です。",
        "apihelp-query+search-param-limit": "返すページの総数です。",
        "apihelp-userrights-param-reason": "変更の理由。",
        "apihelp-watch-example-watch": "<kbd>Main Page</kbd> をウォッチする。",
        "apihelp-watch-example-unwatch": "<kbd>Main Page</kbd> のウォッチを解除する。",
-       "apihelp-format-example-generic": "クエリの結果を $1 形式に整形します",
+       "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-json-param-callback": "指定すると、指定した関数呼び出しで出力をラップします。安全のため、利用者固有のデータはすべて制限されます。",
        "apihelp-json-param-utf8": "指定すると、大部分の非 ASCII 文字 (すべてではありません) を、16 進のエスケープ シーケンスに置換する代わりに UTF-8 として符号化します。<var>formatversion</var> が <kbd>1</kbd> でない場合は既定です。",
        "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-xml-param-xslt": "指定すると、スタイルシートとして &lt;xslt&gt; を追加します。MediaWiki 名前空間の、ページ名の末尾が \".xsl\" のウィキページに対して使用すべきです。",
+       "apihelp-xml-param-xslt": "指定すると、XSLスタイルシートとして名付けられたページを追加します。値は、必ず、{{ns:mediawiki}} 名前空間の、ページ名の末尾が <code>.xsl</code> でのタイトルである必要があります。",
        "apihelp-xml-param-includexmlnamespace": "指定すると、XML 名前空間を追加します。",
        "apihelp-xmlfm-description": "データを XML 形式 (HTML に埋め込んだ形式) で出力します。",
        "apihelp-yaml-description": "データを YAML 形式で出力します。",
index 3f841ac..fa85bbf 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 351bac7..e4b16b0 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-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 vottlohze.",
        "apihelp-parse-example-page": "Donn en Sigg pahse.",
        "apihelp-parse-example-text": "Donn Wikkitäx pahse.",
        "apihelp-protect-param-reason": "Der Jrond för et Schöze udder Freijävve.",
        "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+deletedrevisions-param-tag": "Donn blohß Väsjohne met heh dä Makkehrong opleßte.",
        "apihelp-query+deletedrevisions-param-user": "Donn blohß Väsjohne vun heh däm Metmaacher opleßte.",
        "apihelp-query+deletedrevisions-param-excludeuser": "Donn kein Väsjohne vun heh däm Metmaacher opleßte.",
-       "apihelp-query+deletedrevisions-param-limit": "De hühßde Aanzahl Väsjohne för opzeleßte.",
-       "apihelp-query+deletedrevisions-param-prop": "Wat för en Eijeschaffte holle:\n;revid:Deiht de Kännong vun de fottjeschmeße Väsjohn derbei.\n;parentid:Deiht de Kännong vun de vörrejje Väsjohn vun dä Sigg derbei.\n;user:Deiht dä Metmaacher derbei, dä di Väsjohn jemaat hät.\n;userid:Deiht de Kännong vun däm Metmaacher derbei, dä di Väsjohn jemaat hät.\n;comment:Deiht et Väld „{{int:summary}}“ vun dä Väsjohn derbei.\n;parsedcomment:Deiht et jepaaste Väld „{{int:summary}}“ vun dä Väsjohn derbei.\n;minor:Makehronge, wann di Väsjohn en klein Mini_Änderong es.\n;len:Deiht de Läng (Aanzahl <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Bytes</i>) vun dä Väsjohn derbei.\n;sha1:Deiht dä <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"secure hash algorithm\">SHA-1 (base 16)</i> vun dä Väsjohn derbei.\n;content:Deiht der Ennhalld vun dä Väsjohn derbei.\n;tags:Makehronge för di Väsjohn.",
        "apihelp-query+deletedrevisions-example-revids": "Donn de Aanjahbe för de fottjeschmeße Väsjohn <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">123456</kbd> holle.",
        "apihelp-query+deletedrevs-param-start": "Et Dattom un de Zigg vun woh aff opjezallt wähde sull.",
        "apihelp-query+deletedrevs-param-end": "Et Dattom un de Zigg bes woh hen opjezallt wähde sull.",
        "apihelp-query+revisions-example-first5-after": "Holl de eezde fönnef Väsjohne vun de „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Main Page</kbd>“, di noh em eezde Mai em Johr 2006 änschtannde sin.",
        "apihelp-query+revisions-example-first5-not-localhost": "Holl de ehzde Väsjohne vun de „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Main Page</kbd>“ di nit vun dämm nahmelohse Metmaacher „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">127.0.0.1</kbd>“ jemaht wohde.",
        "apihelp-query+revisions-example-first5-user": "Holl de eezde fönnef Väsjohne vun de „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Main Page</kbd>“, di vum Metmaacher „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">MediaWiki default</kbd>“ aanjelahd wohde.",
+       "apihelp-query+revisions+base-param-prop": "Wat för en Eijeschaffte vun dä Väsjohn holle.",
+       "apihelp-query+revisions+base-paramvalue-prop-ids": "Dw Kännong vu dä Väsjohn.",
+       "apihelp-query+revisions+base-paramvalue-prop-timestamp": "Dattom un Zigg vun dä Väsjohn.",
+       "apihelp-query+revisions+base-paramvalue-prop-user": "Dä Metmaacher, dä di Väsjohn jemaat hät.",
+       "apihelp-query+revisions+base-paramvalue-prop-userid": "Däm Metmaacher sing Kännong, dä di Väsjohn aanjelaat hät.",
+       "apihelp-query+revisions+base-paramvalue-prop-size": "Der Ömvang en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Bytes</i> vun dä Väsjohn.",
+       "apihelp-query+revisions+base-paramvalue-prop-sha1": "De <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"secure hash algorithm\">SHA-1 (base 16)</i> Prööfsomm vun dä Väsjohn.",
+       "apihelp-query+revisions+base-paramvalue-prop-comment": "De Aanmärkong vum Metmaacher för di äsjohn.",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "Der Täx vun dä Väsjohn.",
+       "apihelp-query+revisions+base-paramvalue-prop-tags": "Makkehronge vun dä Väsjohn.",
        "apihelp-query+revisions+base-param-limit": "Wi vill Väsjohne sulle ußjejovve wähde?",
        "apihelp-query+revisions+base-param-section": "Holl blohß der Ennhald vun däm Affschnett met heh dä Nommer.",
        "apihelp-query+search-description": "Söhk em jannze Täx.",
        "apihelp-watch-description": "Donn di Sigg en däm aktoälle Metmaacher singe Oppaßless eren udder schmihß se erus.",
        "apihelp-watch-example-watch": "Don di Sigg „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Main Page</kbd>“ en de Oppaßleß.",
        "apihelp-watch-example-unwatch": "Schmiiß di Sigg „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Main Page</kbd>“ uß dä Oppaßleß erus.",
+       "apihelp-format-example-generic": "Jiff wadd_erus kohm em Fommaht $1 us.",
        "apihelp-json-param-ascii": "Wann aanjejovve, deiht alle nit-<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"American Standard Code for Information Interchange\">ASCII</i>-Zeijsche met hexadezimahle !escape-Sequänze koddehre. Dadd es der Schtandatt, wann „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">formatversion</var>“ <kbd>1</kbd> es.",
        "apihelp-jsonfm-description": "Dahte em <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"JavaScript Object Notation\">JSON</i>-Fommaht ußjävve un för schöhn en et <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language\">HTML</i> wandele.",
        "apihelp-none-description": "Donn nix ußjävve.",
index e0b3932..1c79b58 100644 (file)
        "apihelp-query+recentchanges-param-user": "Nëmmen Ännerunge vun dësem Benotzer opzielen.",
        "apihelp-query+recentchanges-example-simple": "Rezent Ännerunge weisen",
        "apihelp-query+revisions-example-last5": "Déi lescht 5 Versioune vun der <kbd>Haaptsäit</kbd> kréien.",
+       "apihelp-query+revisions+base-paramvalue-prop-ids": "D'Nummer vun der Versioun.",
+       "apihelp-query+revisions+base-paramvalue-prop-timestamp": "Den Zäitstempel vun der Versioun.",
+       "apihelp-query+revisions+base-paramvalue-prop-user": "Benotzer deen d'Versioun gemaach huet.",
+       "apihelp-query+revisions+base-paramvalue-prop-size": "Längt (Bytes) vun der Versioun.",
+       "apihelp-query+revisions+base-paramvalue-prop-sha1": "SHA-1 (base 16) vun der Versioun.",
+       "apihelp-query+revisions+base-paramvalue-prop-comment": "Bemierkung vum Benotzer fir dës Versioun.",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "Text vun der Versioun.",
        "apihelp-query+search-param-namespace": "Nëmmen an dësen Nummräim sichen.",
        "apihelp-query+usercontribs-description": "All Ännerunge vun engem Benotzer kréien.",
        "apihelp-query+watchlist-param-user": "Nëmmen Ännerunge vun dësem Benotzer opzielen.",
diff --git a/includes/api/i18n/or.json b/includes/api/i18n/or.json
new file mode 100644 (file)
index 0000000..d7d0295
--- /dev/null
@@ -0,0 +1,14 @@
+{
+       "@metadata": {
+               "authors": [
+                       "ଶିତିକଣ୍ଠ ଦାଶ"
+               ]
+       },
+       "apihelp-main-param-action": "କେଉଁ କାମ କରାଯିବ ।",
+       "apihelp-main-param-format": "ଆଉଟପୁଟ୍‌ର ଫର୍ମାଟ ।",
+       "apihelp-block-description": "ଜଣେ ବ୍ୟବହାରକାରୀଙ୍କୁ ବ୍ଲକ କରନ୍ତୁ ।",
+       "apihelp-block-param-reason": "ବ୍ଲକ କରିବାର କାରଣ ।",
+       "apihelp-block-param-nocreate": "ଆକାଉଣ୍ଟ ତିଆରି ହେବାକୁ ପ୍ରତିରୋଧ କରନ୍ତୁ ।",
+       "apihelp-createaccount-param-name": "ବ୍ୟବହାରକାରୀଙ୍କ ନାମ",
+       "apihelp-delete-description": "ପୃଷ୍ଠାଟି ଲିଭାଇଦେବେ"
+}
index 54e0a3a..bf04b57 100644 (file)
        "apihelp-query+deletedrevisions-param-tag": "Pokazuj tylko zmiany oznaczone tym tagiem.",
        "apihelp-query+deletedrevisions-param-user": "Pokazuj tylko zmiany dokonane przez tego użytkownika.",
        "apihelp-query+deletedrevisions-param-excludeuser": "Nie pokazuj zmian dokonanych przez tego użytkownika.",
-       "apihelp-query+deletedrevisions-param-limit": "Maksymalna ilość zmian do wylistowania.",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Tryb|Tryby}}: $2",
        "apihelp-query+deletedrevs-param-unique": "Liatuj tylko jedną edycję dla każdej strony.",
        "apihelp-query+deletedrevs-param-tag": "Pokazuj tylko zmiany oznaczone tym tagiem.",
        "apihelp-query+recentchanges-param-tag": "Pokazuj tylko zmiany oznaczone tym tagiem.",
        "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-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-userrights-param-reason": "Powód zmiany.",
        "apihelp-dbg-description": "Dane wyjściowe w formacie <code>var_export()</code> (funkcji PHP).",
        "apihelp-dbgfm-description": "Dane wyjściowe w formacie <code>var_export()</code> (funkcji PHP) (prawidłowo wyświetlane w HTML).",
-       "apihelp-dump-description": "Dane wyjściowe w formacie <code>var_dump()</code> (funkcji PHP).",
-       "apihelp-dumpfm-description": "Dane wyjściowe w formacie <code>var_dump()</code> (funkcji PHP) (prawidłowo wyświetlane w HTML).",
        "apihelp-json-description": "Dane wyjściowe w formacie JSON.",
        "apihelp-jsonfm-description": "Dane wyjściowe w formacie JSON (prawidłowo wyświetlane w HTML).",
        "apihelp-php-description": "Dane wyjściowe w serializowany formacie PHP.",
        "apihelp-phpfm-description": "Dane wyjściowe w serializowanym formacie PHP (prawidłowo wyświetlane w HTML).",
        "apihelp-txt-description": "Dane wyjściowe w formacie <code>print_r()</code> (funkcji PHP).",
        "apihelp-txtfm-description": "Dane wyjściowe w formacie <code>print_r()</code> (funkcji PHP) (prawidłowo wyświetlane w HTML).",
-       "apihelp-wddx-description": "Dane wyjściowe w formacie WDDX.",
-       "apihelp-wddxfm-description": "Dane wyjściowe w formacie WDDX (prawidłowo wyświetlane w HTML).",
        "apihelp-xml-description": "Dane wyjściowe w formacie XML.",
        "apihelp-xml-param-xslt": "Jeśli określony, dodaje &lt;xslt&gt; jako arkusz styli. Powinna to być strona wiki w przestrzeni nazw MediaWiki, której nazwy stron kończą się na \".xsl\".",
        "apihelp-xmlfm-description": "Dane wyjściowe w formacie XML (prawidłowo wyświetlane w HTML).",
index 051ef07..70d54a6 100644 (file)
@@ -8,7 +8,9 @@
                        "McDutchie",
                        "Raymond",
                        "Anomie",
-                       "Nemo bis"
+                       "Nemo bis",
+                       "Amire80",
+                       "Siebrand"
                ]
        },
        "apihelp-main-description": "{{doc-apihelp-description|main}}",
        "apihelp-feedwatchlist-example-all6hrs": "{{doc-apihelp-example|feedwatchlist}}",
        "apihelp-filerevert-description": "{{doc-apihelp-description|filerevert}}",
        "apihelp-filerevert-param-filename": "{{doc-apihelp-param|filerevert|filename}}",
-       "apihelp-filerevert-param-comment": "{{doc-apihelp-param|filerevert|comment}}",
+       "apihelp-filerevert-param-comment": "Translate as \"a comment about the upload\".\n\n{{doc-apihelp-param|filerevert|comment}}",
        "apihelp-filerevert-param-archivename": "{{doc-apihelp-param|filerevert|archivename}}",
        "apihelp-filerevert-example-revert": "{{doc-apihelp-example|filerevert}}",
        "apihelp-help-description": "{{doc-apihelp-description|help}}",
        "apihelp-parse-paramvalue-prop-properties": "{{doc-apihelp-paramvalue|parse|prop|properties}}",
        "apihelp-parse-paramvalue-prop-limitreportdata": "{{doc-apihelp-paramvalue|parse|prop|limitreportdata}}",
        "apihelp-parse-paramvalue-prop-limitreporthtml": "{{doc-apihelp-paramvalue|parse|prop|limitreporthtml}}",
+       "apihelp-parse-paramvalue-prop-parsetree": "{{doc-apihelp-paramvalue|parse|prop|parsetree|params=* $1 - Value of the constant CONTENT_MODEL_WIKITEXT|paramstart=2}}",
        "apihelp-parse-param-pst": "{{doc-apihelp-param|parse|pst}}",
        "apihelp-parse-param-onlypst": "{{doc-apihelp-param|parse|onlypst}}",
        "apihelp-parse-param-effectivelanglinks": "{{doc-apihelp-param|parse|effectivelanglinks}}",
        "apihelp-query+deletedrevisions-param-tag": "{{doc-apihelp-param|query+deletedrevisions|tag}}",
        "apihelp-query+deletedrevisions-param-user": "{{doc-apihelp-param|query+deletedrevisions|user}}",
        "apihelp-query+deletedrevisions-param-excludeuser": "{{doc-apihelp-param|query+deletedrevisions|excludeuser}}",
-       "apihelp-query+deletedrevisions-param-limit": "{{doc-apihelp-param|query+deletedrevisions|limit}}",
-       "apihelp-query+deletedrevisions-param-prop": "{{doc-apihelp-param|query+deletedrevisions|prop}}",
        "apihelp-query+deletedrevisions-example-titles": "{{doc-apihelp-example|query+deletedrevisions}}",
        "apihelp-query+deletedrevisions-example-revids": "{{doc-apihelp-example|query+deletedrevisions}}",
        "apihelp-query+deletedrevs-description": "{{doc-apihelp-description|query+deletedrevs}}",
        "apihelp-query+revisions-example-first5-after": "{{doc-apihelp-example|query+revisions}}",
        "apihelp-query+revisions-example-first5-not-localhost": "{{doc-apihelp-example|query+revisions}}",
        "apihelp-query+revisions-example-first5-user": "{{doc-apihelp-example|query+revisions}}",
-       "apihelp-query+revisions+base-param-prop": "{{doc-apihelp-param|query+revisions+base|prop|description=the \"prop\" parameter to revision querying modules|noseealso=1}}",
+       "apihelp-query+revisions+base-param-prop": "{{doc-apihelp-param|query+revisions+base|prop|description=the \"prop\" parameter to revision querying modules|noseealso=1|paramvalues=1}}",
+       "apihelp-query+revisions+base-paramvalue-prop-ids": "{{doc-apihelp-paramvalue|query+revisions+base|prop|ids}}",
+       "apihelp-query+revisions+base-paramvalue-prop-flags": "{{doc-apihelp-paramvalue|query+revisions+base|prop|flags}}",
+       "apihelp-query+revisions+base-paramvalue-prop-timestamp": "{{doc-apihelp-paramvalue|query+revisions+base|prop|timestamp}}",
+       "apihelp-query+revisions+base-paramvalue-prop-user": "{{doc-apihelp-paramvalue|query+revisions+base|prop|user}}",
+       "apihelp-query+revisions+base-paramvalue-prop-userid": "{{doc-apihelp-paramvalue|query+revisions+base|prop|userid}}",
+       "apihelp-query+revisions+base-paramvalue-prop-size": "{{doc-apihelp-paramvalue|query+revisions+base|prop|size}}",
+       "apihelp-query+revisions+base-paramvalue-prop-sha1": "{{doc-apihelp-paramvalue|query+revisions+base|prop|sha1}}",
+       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "{{doc-apihelp-paramvalue|query+revisions+base|prop|contentmodel}}",
+       "apihelp-query+revisions+base-paramvalue-prop-comment": "{{doc-apihelp-paramvalue|query+revisions+base|prop|comment}}",
+       "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "{{doc-apihelp-paramvalue|query+revisions+base|prop|parsedcomment}}",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "{{doc-apihelp-paramvalue|query+revisions+base|prop|content}}",
+       "apihelp-query+revisions+base-paramvalue-prop-tags": "{{doc-apihelp-paramvalue|query+revisions+base|prop|tags}}",
+       "apihelp-query+revisions+base-paramvalue-prop-parsetree": "{{doc-apihelp-paramvalue|query+revisions+base|prop|parsetree|params=* $1 - Value of the constant CONTENT_MODEL_WIKITEXT|paramstart=2}}",
        "apihelp-query+revisions+base-param-limit": "{{doc-apihelp-param|query+revisions+base|limit|description=the \"limit\" parameter to revision querying modules|noseealso=1}}",
        "apihelp-query+revisions+base-param-expandtemplates": "{{doc-apihelp-param|query+revisions+base|expandtemplates|description=the \"expandtemplates\" parameter to revision querying modules|noseealso=1}}",
        "apihelp-query+revisions+base-param-generatexml": "{{doc-apihelp-param|query+revisions+base|generatexml|description=the \"generatexml\" parameter to revision querying modules|noseealso=1}}",
        "apihelp-query+usercontribs-example-user": "{{doc-apihelp-example|query+usercontribs}}",
        "apihelp-query+usercontribs-example-ipprefix": "{{doc-apihelp-example|query+usercontribs}}",
        "apihelp-query+userinfo-description": "{{doc-apihelp-description|query+userinfo}}",
-       "apihelp-query+userinfo-param-prop": "{{doc-apihelp-param|query+userinfo|prop|params=* $1 - Maximum value for the \"unreadcount\" property.\n$2 - Return value when there are more unread pages.|paramstart=3}}",
+       "apihelp-query+userinfo-param-prop": "{{doc-apihelp-param|query+userinfo|prop|params=* $1 - Maximum value for the \"unreadcount\" property.\n$2 - Return value when there are more unread pages.|paramstart=3}}",
        "apihelp-query+userinfo-example-simple": "{{doc-apihelp-example|query+userinfo}}",
        "apihelp-query+userinfo-example-data": "{{doc-apihelp-example|query+userinfo}}",
        "apihelp-query+users-description": "{{doc-apihelp-description|query+users}}",
        "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}}",
        "apihelp-format-example-generic": "{{doc-apihelp-example|format|params=* $1 - Format name|paramstart=2|noseealso=1}}",
        "apihelp-dbg-description": "{{doc-apihelp-description|dbg|seealso=* {{msg-mw|apihelp-dbgfm-description}}}}",
        "apihelp-dbgfm-description": "{{doc-apihelp-description|dbgfm|seealso=* {{msg-mw|apihelp-dbg-description}}}}",
-       "apihelp-dump-description": "{{doc-apihelp-description|dump|seealso=* {{msg-mw|apihelp-dumpfm-description}}}}",
-       "apihelp-dumpfm-description": "{{doc-apihelp-description|dumpfm|seealso=* {{msg-mw|apihelp-dump-description}}}}",
        "apihelp-json-description": "{{doc-apihelp-description|json|seealso=* {{msg-mw|apihelp-jsonfm-description}}}}",
        "apihelp-json-param-callback": "{{doc-apihelp-param|json|callback}}",
        "apihelp-json-param-utf8": "{{doc-apihelp-param|json|utf8}}",
        "apihelp-rawfm-description": "{{doc-apihelp-description|rawfm|seealso=* {{msg-mw|apihelp-raw-description}}}}",
        "apihelp-txt-description": "{{doc-apihelp-description|txt|seealso=* {{msg-mw|apihelp-txtfm-description}}}}",
        "apihelp-txtfm-description": "{{doc-apihelp-description|txtfm|seealso=* {{msg-mw|apihelp-txt-description}}}}",
-       "apihelp-wddx-description": "{{doc-apihelp-description|wddx|seealso=* {{msg-mw|apihelp-wddxfm-description}}}}",
-       "apihelp-wddxfm-description": "{{doc-apihelp-description|wddxfm|seealso=* {{msg-mw|apihelp-wddx-description}}}}",
        "apihelp-xml-description": "{{doc-apihelp-description|xml|seealso=* {{msg-mw|apihelp-xmlfm-description}}}}",
        "apihelp-xml-param-xslt": "{{doc-apihelp-param|xml|xslt}}",
        "apihelp-xml-param-includexmlnamespace": "{{doc-apihelp-param|xml|includexmlnamespace}}",
        "api-help-fallback-description": "{{notranslate}}",
        "api-help-fallback-parameter": "{{notranslate}}",
        "api-help-fallback-example": "{{notranslate}}",
-       "api-help-flags": "{{optional}} Label for the API help flags box\n\nParameters:\n* $1 - Number of flags to be displayed",
+       "api-help-flags": "{{ignored}} Label for the API help flags box\n\nParameters:\n* $1 - Number of flags to be displayed",
        "api-help-flag-deprecated": "Flag displayed for an API module that is deprecated",
        "api-help-flag-internal": "Flag displayed for an API module that is considered internal or unstable",
        "api-help-flag-readrights": "Flag displayed for an API module that requires read rights",
        "api-help-license": "Displayed in the flags box to indicate the license of an API module.\n\nParameters:\n* $1 - Page to link to display the full license text\n* $2 - Display text for the link\n\nSee also:\n* {{msg-mw|api-help-license-noname}}\n* {{msg-mw|api-help-license-unknown}}",
        "api-help-license-noname": "Displayed in the flags box to indicate the license of an API module, when the tag for the license is not known.\n\nParameters:\n* $1 - Page to link to display the full license text\n\nSee also:\n* {{msg-mw|api-help-license}}\n* {{msg-mw|api-help-license-unknown}}",
        "api-help-license-unknown": "Displayed in the flags box to indicate that the license of the API module is not known.\n\nSee also:\n* {{msg-mw|api-help-license}}\n* {{msg-mw|api-help-license-noname}}",
-       "api-help-help-urls": "{{optional}} Label for the API help urls section\n\nParameters:\n* $1 - Number of urls to be displayed",
+       "api-help-help-urls": "{{ignored}} Label for the API help urls section\n\nParameters:\n* $1 - Number of urls to be displayed",
        "api-help-parameters": "Label for the API help parameters section\n\nParameters:\n* $1 - Number of parameters to be displayed\n{{Identical|Parameter}}",
        "api-help-param-deprecated": "Displayed in the API help for any deprecated parameter\n{{Identical|Deprecated}}",
        "api-help-param-required": "Displayed in the API help for any required parameter",
        "api-help-param-type-limit": "{{technical}} {{doc-important|Do not translate text inside &lt;kbd%gt; tags}} Used to indicate that a parameter is a \"limit\" type. Parameters:\n* $1 - Always 1.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-type-integer": "{{technical}} Used to indicate that a parameter is an integer or list of integers. Parameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes a list of values.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-type-boolean": "{{technical}} {{doc-important|Do not translate <code>Special:ApiHelp</code> in this message.}} Used to indicate that a parameter is a boolean. Parameters:\n* $1 - Always 1.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
-       "api-help-param-type-password": "{{optional}}{{technical}} Used to indicate that a parameter is a password or list of passwords. Parameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes a list of values.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
+       "api-help-param-type-password": "{{ignored}}{{technical}} Used to indicate that a parameter is a password or list of passwords. Parameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes a list of values.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-type-timestamp": "{{technical}} {{doc-important|Do not translate <code>Special:ApiHelp</code> in this message.}} Used to indicate that a parameter is a timestamp or list of timestamps. Parameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes a list of values.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-type-user": "{{technical}} Used to indicate that a parameter is a username or list of usernames. Parameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes a list of values.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-list": "Used to display the possible values for a parameter taking a list of values\n\nParameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes any number of values\n* $2 - Comma-separated list of values, possibly formatted using {{msg-mw|api-help-param-list-can-be-empty}}\n{{Identical|Value}}",
index 86e49de..7ae00b3 100644 (file)
@@ -12,7 +12,8 @@
                        "Jenniesarina",
                        "Marfuas",
                        "VickyC",
-                       "Josve05a"
+                       "Josve05a",
+                       "Rockyfelle"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Dokumentation]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-postlista]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-aviseringar]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R|Buggar & förslag]\n</div>\n<strong>Status:</strong> Alla funktioner som visas på denna sida borde fungera. API:et är dock fortfarande under aktiv utveckling och kan ändras när som helst. Prenumerera på [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/mediawiki-api-announce e-postlistan] för att få aviseringar om uppdateringar.\n\n<strong>Felaktiga förfrågningar:</strong> När felaktiga förfrågningar skickas till API:et skickas en HTTP-header med nyckeln \"MediaWiki-API-Error\" och sedan sätts både värdet på headern och den felkoden som returneras till samma värde. För mer information läs [[mw:API:Errors_and_warnings|API: Fel och varningar]].",
@@ -20,7 +21,7 @@
        "apihelp-main-param-format": "Formatet för utdata.",
        "apihelp-main-param-smaxage": "Ange headervärdet <code>s-maxage</code> till så här många sekunder. Fel cachelagras aldrig.",
        "apihelp-main-param-maxage": "Ange headervärdet <code>max-age</code> till så här många sekunder. Fel cachelagras aldrig.",
-       "apihelp-main-param-assert": "Bekräftar att användaren är inloggad om satt till <kbd>user</kbd>, eller har bot-användarrättigheter om satt till <kbd>bot</kbd>.",
+       "apihelp-main-param-assert": "Bekräfta att användaren är inloggad om satt till <kbd>user</kbd>, eller har bot-användarrättigheter om satt till <kbd>bot</kbd>.",
        "apihelp-main-param-requestid": "Alla värde som anges här kommer att inkluderas i svaret. Kan användas för att särskilja förfrågningar.",
        "apihelp-main-param-servedby": "Inkludera det värdnamn som besvarade förfrågan i resultatet.",
        "apihelp-main-param-curtimestamp": "Inkludera den aktuella tidsstämpeln i resultatet.",
        "apihelp-query+contributors-param-limit": "Hur många bidragsgivare att returnera.",
        "apihelp-query+deletedrevisions-param-user": "Lista endast sidversioner av denna användare.",
        "apihelp-query+deletedrevisions-param-excludeuser": "Lista inte sidversioner av denna användare.",
-       "apihelp-query+deletedrevisions-param-limit": "Maximala antalet sidversioner att lista.",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Läge|Lägen}}: $2",
        "apihelp-query+deletedrevs-param-from": "Börja lista vid denna titel.",
        "apihelp-query+deletedrevs-param-to": "Sluta lista vid denna titel.",
        "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 a027d9d..8c9f8c8 100644 (file)
@@ -8,10 +8,12 @@
        },
        "apihelp-main-param-action": "Tác vụ để thực hiện.",
        "apihelp-main-param-format": "Định dạng của dữ liệu được cho ra.",
+       "apihelp-main-param-uselang": "Ngôn ngữ để sử dụng cho các phiên dịch thông điệp. Một danh sách các mã có thể được lấy từ <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> với <kbd>siprop=languages</kbd>, hoặc <kbd>user</kbd> cụ thể sử dụng ngôn ngữ tham khảo của người dùng hiện tại, hoặc <kbd>content</kbd> cụ thể để sử dụng ngôn ngữ nội dung của wiki này.",
        "apihelp-block-description": "Cấm người dùng.",
        "apihelp-block-param-user": "Tên truy nhập, địa chỉ IP hoặc dãi IP mà bạn muốn chặn.",
        "apihelp-block-param-reason": "Lý do cấm.",
        "apihelp-block-param-nocreate": "Cấm tạo tài khoản.",
+       "apihelp-block-param-reblock": "Nếu người dùng này đã bị khóa, ghi đè lên người này.",
        "apihelp-clearhasmsg-description": "Xóa cờ <code>hasmsg</code> cho người dùng hiện tại.",
        "apihelp-clearhasmsg-example-1": "Xóa cờ <code>hasmsg</code> cho người dùng hiện tại",
        "apihelp-compare-param-fromtitle": "So sánh tiêu đề đầu tiên.",
        "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-dump-description": "Cho ra dữ liệu dưới dạng var_dump() của PHP.",
-       "apihelp-dumpfm-description": "Cho ra dữ liệu dưới dạng var_dump() 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-wddx-description": "Cho ra dữ liệu dưới dạng WDDX.",
-       "apihelp-wddxfm-description": "Cho ra dữ liệu dưới dạng WDDX (đị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.",
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 c24d4ce..c2acd42 100644 (file)
@@ -4,5 +4,7 @@
                        "פוילישער"
                ]
        },
+       "apihelp-main-param-action": "וועלכע אקציע אויסצופירן.",
+       "apihelp-main-param-format": "פארמאט פונעם אויסגאב.",
        "api-help-source": "מקור: $1"
 }
index 15eba5b..551a3e1 100644 (file)
        "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-imagerotate-param-rotation": "顺时针旋转图像的度数。",
        "apihelp-imagerotate-example-simple": "<kbd>90</kbd>度旋转<kbd>File:Example.png</kbd>。",
        "apihelp-imagerotate-example-generator": "将<kbd>Category:Flip</kbd>之中的所有图像旋转<kbd>180</kbd>度。",
-       "apihelp-import-description": "从另一个wiki导入一个页面,或一个XML文件。\n\n注意当发送一个用于<var>xml</var>参数的文件时,HTTP POST必须作为一次文件上传完成(也就是使用multipart/form-data)。",
+       "apihelp-import-description": "从另一个wiki或从一个XML文件导入页面。\n\n注意当发送一个用于<var>xml</var>参数的文件时,HTTP POST必须作为一次文件上传完成(也就是使用multipart/form-data)。",
        "apihelp-import-param-summary": "导入摘要。",
        "apihelp-import-param-xml": "上传的XML文件。",
        "apihelp-import-param-interwikisource": "用于跨wiki导入:导入的来源wiki。",
        "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-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": "从解析器输出中禁用PP报告。",
        "apihelp-parse-param-disableeditsection": "从解析器输出中禁用编辑段落链接。",
-       "apihelp-parse-param-generatexml": "生成XML解析树(需要内容模型<code>$1</code>)。",
+       "apihelp-parse-param-generatexml": "ç\94\9fæ\88\90XML解æ\9e\90æ \91ï¼\88é\9c\80è¦\81å\86\85容模å\9e\8b<code>$1</code>ï¼\9b被<kbd>$2prop=parsetree</kbd>æ\89\80å\8f\96代ï¼\89ã\80\82",
        "apihelp-parse-param-preview": "在预览模式下解析。",
        "apihelp-parse-param-sectionpreview": "在小节预览模式下解析 (同时要启用预览模式)。",
        "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-purge-param-forcelinkupdate": "更新链接表。",
        "apihelp-purge-param-forcerecursivelinkupdate": "更新链接表中,并更新任何使用此页作为模板的页面的链接表。",
        "apihelp-purge-example-simple": "刷新<kbd>Main Page</kbd>和<kbd>API</kbd>页面。",
-       "apihelp-purge-example-generator": "刷新主名字空间的前10个页面",
+       "apihelp-purge-example-generator": "刷新主名字空间的前10个页面",
        "apihelp-query-description": "获取来自和有关MediaWiki的数据。\n\n所有数据修改将首先要使用查询以获得令牌以阻止来自恶意网站的滥用破坏。",
        "apihelp-query-param-prop": "要为已查询页面获取的属性。",
        "apihelp-query-param-list": "要获取的列表。",
        "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-to": "要列举的最终文件标题。",
        "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-description": "按顺序枚举所有图像。",
        "apihelp-query+allimages-param-sort": "要作为排序方式的属性。",
        "apihelp-query+allimages-param-dir": "罗列所采用的方向。",
+       "apihelp-query+allimages-param-from": "要列举的起始图片标题。只能与$1sort=name一起使用。",
+       "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-minsize": "限于至少这么多字节的图像。",
        "apihelp-query+allimages-param-maxsize": "限于顶多这么多字节的图像。",
        "apihelp-query+allimages-param-sha1": "图像的 SHA1 哈希。覆盖$1sha1base36。",
        "apihelp-query+backlinks-param-dir": "罗列所采用的方向。",
        "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": "è\8e·å¾\97关于链接至<kbd>Main page<kbd>的页面的信息。",
+       "apihelp-query+backlinks-example-generator": "è\8e·å\8f\96关于链接至<kbd>Main page<kbd>的页面的信息。",
        "apihelp-query+blocks-description": "列出所有被封禁的用户和IP地址。",
        "apihelp-query+blocks-param-start": "枚举的起始时间戳。",
        "apihelp-query+blocks-param-end": "枚举的结束时间戳。",
        "apihelp-query+deletedrevisions-param-tag": "只列出被此标签标记的修订。",
        "apihelp-query+deletedrevisions-param-user": "只列出此用户做出的修订。",
        "apihelp-query+deletedrevisions-param-excludeuser": "不要列出此用户做出的修订。",
-       "apihelp-query+deletedrevisions-param-limit": "要列出的修订的最高数额。",
-       "apihelp-query+deletedrevisions-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;tags:用于修订的标签。",
        "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# List deleted revisions for the given titles, sorted by timestamp.\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-from": "从此标题开始列出。",
        "apihelp-query+deletedrevs-param-to": "列出至此标题为止。",
        "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+extlinks-param-protocol": "URL协议。如果为空并且<var>$1query</var>被设置,协议为<kbd>http</kbd>。将此和<var>$1query</var>都留空以列举所有外部链接。",
        "apihelp-query+extlinks-param-query": "不使用协议搜索字符串。对于检查某一页面是否包含某一外部URL很有用。",
        "apihelp-query+extlinks-param-expandurl": "扩展协议相对URL与规范协议。",
-       "apihelp-query+extlinks-example-simple": "获取<kbd>首页</kbd>的外部链接列表。",
+       "apihelp-query+extlinks-example-simple": "获取<kbd>Main Page<kbd>的外部链接列表。",
        "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+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+images-description": "返回指定页面上包含的所有文件。",
        "apihelp-query+images-param-limit": "返回多少文件。",
        "apihelp-query+images-param-dir": "罗列所采用的方向。",
-       "apihelp-query+images-example-simple": "获取[[首页]]使用的文件列表",
-       "apihelp-query+images-example-generator": "获取有关[[首页]]使用的文件的信息",
+       "apihelp-query+images-example-simple": "获取[[Main Page]]使用的文件列表。",
+       "apihelp-query+images-example-generator": "获取有关[[Main Page]]使用的文件的信息。",
        "apihelp-query+imageusage-description": "查找所有使用指定图片标题的页面。",
        "apihelp-query+imageusage-param-title": "要搜索的标题。不能与$1pageid一起使用。",
        "apihelp-query+imageusage-param-pageid": "要搜索的页面ID。不能与$1title一起使用。",
        "apihelp-query+info-paramvalue-prop-preload": "提供由EditFormPreloadText返回的文本。",
        "apihelp-query+info-param-testactions": "测试当前用户是否可以在页面上执行某种操作。",
        "apihelp-query+info-param-token": "请改用[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]。",
-       "apihelp-query+info-example-simple": "è\8e·å¾\97有关页面<kbd>Main Page</kbd>的信息。",
-       "apihelp-query+info-example-protection": "获取<kbd>首页</kbd>相关的常规和保护信息。",
+       "apihelp-query+info-example-simple": "è\8e·å\8f\96有关页面<kbd>Main Page</kbd>的信息。",
+       "apihelp-query+info-example-protection": "获取<kbd>Main Page</kbd>相关的常规和保护信息。",
        "apihelp-query+iwbacklinks-param-prefix": "跨维基前缀。",
        "apihelp-query+iwbacklinks-param-title": "要搜索的跨wiki链接。必须与<var>$1blprefix</var>一起使用。",
        "apihelp-query+iwbacklinks-param-limit": "返回的总计页面数。",
        "apihelp-query+langlinks-param-title": "要搜索的链接。必须与<var>$1lang</var>一起使用。",
        "apihelp-query+langlinks-param-dir": "罗列所采用的方向。",
        "apihelp-query+langlinks-param-inlanguagecode": "本地化语言名称的语言代码。",
-       "apihelp-query+langlinks-example-simple": "ä»\8e页é\9d¢<kbd>Main Page</kbd>è\8e·å¾\97跨语言链接。",
+       "apihelp-query+langlinks-example-simple": "ä»\8e页é\9d¢<kbd>Main Page</kbd>è\8e·å\8f\96跨语言链接。",
        "apihelp-query+links-description": "从指定页面返回所有链接。",
        "apihelp-query+links-param-namespace": "只显示这些名字空间的链接。",
        "apihelp-query+links-param-limit": "返回多少链接。",
        "apihelp-query+links-param-dir": "罗列所采用的方向。",
-       "apihelp-query+links-example-simple": "ä»\8e页é\9d¢<kbd>Main Page</kbd>è\8e·å¾\97链接",
-       "apihelp-query+links-example-generator": "è\8e·å¾\97有关在页面<kbd>Main Page</kbd>中连接的页面的信息。",
-       "apihelp-query+links-example-namespaces": "è\8e·å¾\97在{{ns:user}}和{{ns:template}}名字空间中来自页面<kbd>Main Page</kbd>的链接。",
+       "apihelp-query+links-example-simple": "ä»\8e页é\9d¢<kbd>Main Page</kbd>è\8e·å\8f\96链接",
+       "apihelp-query+links-example-generator": "è\8e·å\8f\96有关在页面<kbd>Main Page</kbd>中连接的页面的信息。",
+       "apihelp-query+links-example-namespaces": "è\8e·å\8f\96在{{ns:user}}和{{ns:template}}名字空间中来自页面<kbd>Main Page</kbd>的链接。",
        "apihelp-query+linkshere-description": "查找所有链接至指定页面的页面。",
        "apihelp-query+linkshere-param-prop": "要获得的属性:\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+linkshere-example-simple": "获取链接至[[首页]]的页面列表",
-       "apihelp-query+linkshere-example-generator": "获取有关链接至[[首页]]的页面的信息",
+       "apihelp-query+linkshere-example-simple": "获取链接至[[Main Page]]的页面列表。",
+       "apihelp-query+linkshere-example-generator": "获取有关链接至[[Main Page]]的页面的信息。",
        "apihelp-query+logevents-description": "从日志获取事件。",
        "apihelp-query+logevents-param-start": "枚举的起始时间戳。",
        "apihelp-query+logevents-param-end": "枚举的结束时间戳。",
        "apihelp-query+protectedtitles-example-generator": "找到主命名空间中已保护的标题的链接。",
        "apihelp-query+querypage-param-limit": "返回的结果数。",
        "apihelp-query+querypage-example-ancientpages": "返回[[Special:Ancientpages]]的结果。",
+       "apihelp-query+random-description": "获取一组随机页面。\n\n页面列举在一个固定序列中,只有起始点是随机的。这意味着如果<samp>Main Page</samp>是列表中第一个随机页面的话,<samp>List of fictional monkeys</samp>将<em>总是</em>第二个,<samp>List of people on stamps of Vanuatu</samp>是第三个等。\n\n如果名字空间中的页面数低于<var>$1limit</var>,将只会返回少量的页面。同一页面不会返回两次。",
        "apihelp-query+random-param-namespace": "只返回这些名字空间的页面。",
        "apihelp-query+random-param-limit": "限制返回多少随机页面。",
        "apihelp-query+random-param-redirect": "加载一个随机重定向而不是一个随机页面。",
        "apihelp-query+random-example-simple": "从主名字空间返回两个随机页面。",
+       "apihelp-query+random-example-generator": "返回有关来自主名字空间的两个随机页面的页面信息",
        "apihelp-query+recentchanges-description": "枚举最近更改。",
        "apihelp-query+recentchanges-param-start": "枚举的起始时间戳。",
        "apihelp-query+recentchanges-param-end": "枚举的结束时间戳。",
        "apihelp-query+redirects-description": "返回至指定页面的所有重定向。",
        "apihelp-query+redirects-param-namespace": "只包含这些名字空间的页面。",
        "apihelp-query+redirects-param-limit": "返回多少重定向。",
-       "apihelp-query+redirects-example-simple": "获取至[[Project:首页]]的重定向列表",
-       "apihelp-query+redirects-example-generator": "获取所有重定向至[[首页]]的信息",
+       "apihelp-query+redirects-example-simple": "获取至[[Main Page]]的重定向列表。",
+       "apihelp-query+redirects-example-generator": "获取所有重定向至[[Main Page]]的信息。",
        "apihelp-query+revisions-paraminfo-singlepageonly": "可能只能与单一页面使用(模式#2)。",
-       "apihelp-query+revisions-example-content": "è\8e·å¾\97带内容的数据,用于标题<kbd>API</kbd>和<kbd>Main Page</kbd>的最近修订。",
+       "apihelp-query+revisions-example-content": "è\8e·å\8f\96带内容的数据,用于标题<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": "è\8e·å¾\97<kbd>Main Page</kbd>于2006年05月01日之后做出的前5次修订版本。",
+       "apihelp-query+revisions-example-first5-after": "è\8e·å\8f\96<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-sha1": "修订的SHA-1(base 16)。",
+       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "修订的内容模型ID。",
+       "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-text": "搜索文本<kbd>meaning</kbd>。",
        "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:Returns database server with the highest replication lag.\n;usergroups:Returns user groups and the associated permissions.\n;libraries:Returns libraries installed on the wiki.\n;extensions:Returns extensions installed on the wiki.\n;fileextensions:Returns list of file extensions allowed to be uploaded.\n;rightsinfo:Returns wiki rights (license) information if available.\n;restrictions:Returns information on available restriction (protection) types.\n;languages:Returns a list of languages MediaWiki supports (optionally localised by using <var>$1inlanguagecode</var>).\n;skins:Returns a list of all enabled skins (optionally localised by using <var>$1inlanguagecode</var>, otherwise in the content language).\n;extensiontags:Returns a list of parser extension tags.\n;functionhooks:Returns a list of parser function hooks.\n;showhooks:Returns a list of all subscribed hooks (contents of <var>[[mw:Manual:$wgHooks|$wgHooks]]</var>).\n;variables:Returns a list of variable IDs.\n;protocols:Returns a list of protocols that are allowed in external links.\n;defaultoptions:Returns the default values for user preferences.",
+       "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-showalldb": "列出所有数据库服务器,不只是最落后的那个。",
        "apihelp-query+siteinfo-param-numberingroup": "列出用户组中的用户数。",
        "apihelp-query+siteinfo-param-inlanguagecode": "用于本地化语言名称(尽可能)和皮肤名称的语言代码。",
        "apihelp-query+templates-example-simple": "获取在页面<kbd>Main Page</kbd>使用的模板。",
        "apihelp-query+templates-example-generator": "获取有关<kbd>Main Page</kbd>中使用的模板页面的信息。",
        "apihelp-query+templates-example-namespaces": "获取在{{ns:user}}和{{ns:template}}名字空间中,嵌入在<kbd>Main Page</kbd>页面的页面。",
+       "apihelp-query+tokens-description": "获取可修改数据的操作的令牌。",
        "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-example-simple": "获得嵌入<kbd>Main Page</kbd>的页面列表。",
-       "apihelp-query+transcludedin-example-generator": "获得有关嵌入<kbd>Main Page</kbd>的页面的信息。",
+       "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-example-user": "显示用户<kbd>Example</kbd>的贡献。",
        "apihelp-query+usercontribs-example-ipprefix": "显示来自<kbd>192.0.2.</kbd>前缀所有 IP 地址的贡献。",
        "apihelp-query+watchlist-param-user": "只列出此用户的更改。",
        "apihelp-query+watchlist-param-excludeuser": "不要列出此用户的更改。",
        "apihelp-query+watchlist-param-limit": "根据结果返回的结果总数。",
+       "apihelp-query+watchlist-paramvalue-prop-title": "添加页面标题。",
+       "apihelp-query+watchlist-paramvalue-prop-comment": "添加编辑摘要。",
+       "apihelp-query+watchlist-paramvalue-prop-parsedcomment": "添加解析过的编辑摘要。",
+       "apihelp-query+watchlist-paramvalue-prop-timestamp": "添加编辑时间戳。",
        "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-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-setnotificationtimestamp-description": "更新用于监视页面的通知时间戳。\n\n这会影响监视列表和历史中已更改页面的高亮度,并且如果“当我的监视列表中的页面被更改时发送电子邮件通知我”的设置被启用的话,也会影响电子邮件的发送。",
        "apihelp-setnotificationtimestamp-param-entirewatchlist": "工作于所有已监视页面。",
+       "apihelp-setnotificationtimestamp-param-timestamp": "要设置通知时间戳的时间戳。",
+       "apihelp-setnotificationtimestamp-param-torevid": "要设置通知时间戳的修订(只限一个页面)。",
+       "apihelp-setnotificationtimestamp-param-newerthanrevid": "要设置通知时间戳的较新修订(只限一个页面)。",
        "apihelp-setnotificationtimestamp-example-all": "重置整个监视列表的通知状态。",
        "apihelp-setnotificationtimestamp-example-page": "重置用于<kbd>Main page</kbd>的通知状态。",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "设置<kbd>Main page</kbd>的通知时间戳,这样所有从2012年1月1日起的编辑都会是未复核的。",
        "apihelp-tag-param-reason": "更改原因。",
        "apihelp-tag-example-rev": "从修订ID 123添加<kbd>vandalism</kbd>标签,而不指定原因",
        "apihelp-tag-example-log": "从日志记录ID 123移除<kbd>spam</kbd>标签,原因为<kbd>Wrongly applied</kbd>",
+       "apihelp-tokens-description": "获取可修改数据的操作的令牌。\n\n此模块被弃用以有利于[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]。",
        "apihelp-tokens-param-type": "要请求的令牌类型。",
+       "apihelp-tokens-example-edit": "检索一个编辑令牌(默认)。",
+       "apihelp-tokens-example-emailmove": "检索一个电子邮件令牌和一个移动令牌。",
        "apihelp-unblock-description": "解封一位用户。",
        "apihelp-unblock-param-id": "解封时需要的封禁ID(通过<kbd>list=blocks</kbd>获得)。不能与<var>$1user</var>一起使用。",
        "apihelp-unblock-param-user": "要解封的用户名、IP地址或IP段。不能与<var>$1id</var>一起使用。",
        "apihelp-undelete-param-reason": "恢复的原因。",
        "apihelp-undelete-param-fileids": "要恢复的文件修订ID。如果<var>$1timestamps</var>和<var>$1fileids</var>都为空,所有将被恢复。",
        "apihelp-undelete-example-page": "恢复页面<kbd>Main Page</kbd>。",
-       "apihelp-undelete-example-revisions": "恢复<kbd>首页</kbd>的两个修订。",
+       "apihelp-undelete-example-revisions": "恢复<kbd>Main Page</kbd>的两个修订。",
        "apihelp-upload-param-filename": "目标文件名。",
        "apihelp-upload-param-comment": "上传注释。如果没有指定<var>$1text</var>,那么它也被用于新文件的初始页面文本。",
        "apihelp-upload-param-watch": "监视页面。",
        "apihelp-upload-param-ignorewarnings": "忽略任何警告。",
        "apihelp-upload-param-file": "文件内容。",
        "apihelp-upload-param-stash": "如果设置,服务器将临时藏匿文件而不是加入存储库。",
+       "apihelp-upload-param-filesize": "全部上传的文件大小。",
        "apihelp-upload-param-offset": "块的偏移量(字节)。",
        "apihelp-upload-param-chunk": "大块内容。",
        "apihelp-upload-example-url": "从URL上传",
        "apihelp-userrights-example-userid": "将ID为<kbd>123</kbd>的用户加入至<kbd>机器人</kbd>组,并将其从<kbd>管理员</kbd>和<kbd>行政员</kbd>组移除。",
        "apihelp-watch-param-title": "要(取消)监视的页面。也可使用<var>$1titles</var>。",
        "apihelp-watch-example-watch": "监视页面<kbd>Main Page</kbd>。",
-       "apihelp-watch-example-unwatch": "取消监视页面<kbd>首页</kbd>。",
-       "apihelp-format-example-generic": "格式化查询结果为$1格式。",
+       "apihelp-watch-example-unwatch": "取消监视页面<kbd>Main Page</kbd>。",
+       "apihelp-watch-example-generator": "监视主名字空间中的最少几个页面。",
+       "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-json-param-callback": "如果指定,将输出内容包裹在一个指定的函数调用中。出于安全考虑,所有用户相关的数据将被限制。",
        "apihelp-json-param-utf8": "如果指定,使用十六进制转义序列将大多数(但不是全部)非ASCII的字符编码为UTF-8,而不是替换它们。默认当<var>formatversion</var>不是<kbd>1</kbd>时。",
        "apihelp-json-param-ascii": "如果指定,使用十六进制转义序列将所有非ASCII编码。默认当<var>formatversion</var>为<kbd>1</kbd>时。",
        "apihelp-json-param-formatversion": "输出格式:\n;1:向后兼容格式(XML样式布尔值、用于内容节点的<samp>*</samp>键等)。\n;2:实验现代格式。细节可以更改!\n;latest:使用最新格式(当前为<kbd>2</kbd>),可以在没有警告的情况下更改。",
        "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-xml-param-xslt": "如果指定,加入已命名的页面作为一个XSL样式表。值必须是在{{ns:mediawiki}}名字空间以<code>.xsl</code>为结尾的标题。",
        "apihelp-xmlfm-description": "输出数据为XML格式(HTML优质打印效果)。",
        "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-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-default": "默认:$1",
        "api-help-param-default-empty": "默认:<span class=\"apihelp-empty\">(空)</span>",
        "api-help-param-token": "从[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]取回的“$1”令牌",
+       "api-help-param-token-webui": "出于兼容性考虑,web UI中使用的令牌也被接受。",
        "api-help-param-disabled-in-miser-mode": "由于[[mw:Manual:$wgMiserMode|miser模式]]而禁用。",
        "api-help-param-limited-in-miser-mode": "<strong>注意:</strong>由于[[mw:Manual:$wgMiserMode|miser模式]],使用这个可能导致继续前返回少于<var>$1limit</var>个结果;极端情况下可能不会返回任何结果。",
        "api-help-param-direction": "列举的方向:\n;newer:最早的优先。注意:$1start应早于$1end。\n;older:最新的优先(默认)。注意:$1start应晚于$1end。",
        "api-help-examples": "{{PLURAL:$1|例子}}:",
        "api-help-permissions": "{{PLURAL:$1|权限}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|授予}}:$2",
+       "api-help-right-apihighlimits": "在API查询中使用更高的上限(慢查询:$1;快查询:$2)。慢查询的限制也适用于多值参数。",
        "api-credits-header": "制作人员",
        "api-credits": "API 开发人员:\n* Roan Kattouw(2007年9月~2009年的开发组领导)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan(创建者,2006年9月~2007年9月的开发组领导)\n* Brad Jorsch(2013年至今的开发组领导)\n\n请将您的评论、建议和问题发送至mediawiki-api@lists.wikimedia.org,或提交错误请求在https://phabricator.wikimedia.org/。"
 }
index 932006d..fdc9944 100644 (file)
@@ -204,7 +204,8 @@ class ChangesList extends ContextSource {
                $code = $lang->getCode();
                static $fastCharDiff = array();
                if ( !isset( $fastCharDiff[$code] ) ) {
-                       $fastCharDiff[$code] = $config->get( 'MiserMode' ) || $context->msg( 'rc-change-size' )->plain() === '$1';
+                       $fastCharDiff[$code] = $config->get( 'MiserMode' )
+                               || $context->msg( 'rc-change-size' )->plain() === '$1';
                }
 
                $formattedSize = $lang->formatNum( $szdiff );
@@ -370,6 +371,19 @@ class ChangesList extends ContextSource {
                $s .= " $articlelink";
        }
 
+       /**
+        * @param RecentChange $rc
+        * @param bool $unpatrolled
+        * @param bool $watched
+        * @return string
+        * @since 1.26
+        */
+       public function getArticleLink( RecentChange $rc, $unpatrolled, $watched ) {
+               $s = '';
+               $this->insertArticleLink( $s, $rc, $unpatrolled, $watched );
+               return $s;
+       }
+
        /**
         * Get the timestamp from $rc formatted with current user's settings
         * and a separator
@@ -542,6 +556,17 @@ class ChangesList extends ContextSource {
                }
        }
 
+       /**
+        * @param RecentChange $rc
+        * @return string
+        * @since 1.26
+        */
+       public function getRollback( RecentChange $rc ) {
+               $s = '';
+               $this->insertRollback( $s, $rc );
+               return $s;
+       }
+
        /**
         * @param string $s
         * @param RecentChange $rc
@@ -560,6 +585,18 @@ class ChangesList extends ContextSource {
                $s .= ' ' . $tagSummary;
        }
 
+       /**
+        * @param RecentChange $rc
+        * @param array $classes
+        * @return string
+        * @since 1.26
+        */
+       public function getTags( RecentChange $rc, array &$classes ) {
+               $s = '';
+               $this->insertTags( $s, $rc, $classes );
+               return $s;
+       }
+
        public function insertExtra( &$s, &$rc, &$classes ) {
                // Empty, used for subclasses to add anything special.
        }
index 54cde0d..e5916bd 100644 (file)
@@ -304,18 +304,18 @@ class EnhancedChangesList extends ChangesList {
                        # Classes to apply -- TODO implement
                        $classes = array();
                        $type = $rcObj->mAttribs['rc_type'];
+                       $data = array();
 
                        $trClass = $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
                                ? ' class="mw-enhanced-watched"' : '';
+                       $separator = ' <span class="mw-changeslist-separator">. .</span> ';
 
-                       $r .= '<tr' . $trClass . '><td></td><td class="mw-enhanced-rc">';
-                       $r .= $this->recentChangesFlags( array(
+                       $data['recentChangesFlags'] = array(
                                'newpage' => $type == RC_NEW,
                                'minor' => $rcObj->mAttribs['rc_minor'],
                                'unpatrolled' => $rcObj->unpatrolled,
                                'bot' => $rcObj->mAttribs['rc_bot'],
-                       ) );
-                       $r .= '&#160;</td><td class="mw-enhanced-rc-nested"><span class="mw-enhanced-rc-time">';
+                       );
 
                        $params = $queryParams;
 
@@ -340,40 +340,69 @@ class EnhancedChangesList extends ChangesList {
                                        $link = '<span class="history-deleted">' . $link . '</span> ';
                                }
                        }
-                       $r .= $link . '</span>';
+                       $data['timestampLink'] = $link;
 
+                       $currentAndLastLinks = '';
                        if ( !$type == RC_LOG || $type == RC_NEW ) {
-                               $r .= ' ' . $this->msg( 'parentheses' )->rawParams(
+                               $currentAndLastLinks .= ' ' . $this->msg( 'parentheses' )->rawParams(
                                        $rcObj->curlink .
                                                $this->message['pipe-separator'] .
                                                $rcObj->lastlink
                                )->escaped();
                        }
-                       $r .= ' <span class="mw-changeslist-separator">. .</span> ';
+                       $data['currentAndLastLinks'] = $currentAndLastLinks;
+                       $data['separatorAfterCurrentAndLastLinks'] = $separator;
 
                        # Character diff
                        if ( $RCShowChangedSize ) {
                                $cd = $this->formatCharacterDifference( $rcObj );
                                if ( $cd !== '' ) {
-                                       $r .= $cd . ' <span class="mw-changeslist-separator">. .</span> ';
+                                       $data['characterDiff'] = $cd;
+                                       $data['separatorAfterCharacterDiff'] = $separator;
                                }
                        }
 
                        if ( $rcObj->mAttribs['rc_type'] == RC_LOG ) {
-                               $r .= $this->insertLogEntry( $rcObj );
+                               $data['logEntry'] = $this->insertLogEntry( $rcObj );
                        } else {
                                # User links
-                               $r .= $rcObj->userlink;
-                               $r .= $rcObj->usertalklink;
-                               $r .= $this->insertComment( $rcObj );
+                               $data['userLink'] = $rcObj->userlink;
+                               $data['userTalkLink'] = $rcObj->usertalklink;
+                               $data['comment'] = $this->insertComment( $rcObj );
                        }
 
                        # Rollback
-                       $this->insertRollback( $r, $rcObj );
+                       $data['rollback'] = $this->getRollback( $rcObj );
+
                        # Tags
-                       $this->insertTags( $r, $rcObj, $classes );
+                       $data['tags'] = $this->getTags( $rcObj, $classes );
+
+                       // give the hook a chance to modify the data
+                       $success = Hooks::run( 'EnhancedChangesListModifyLineData',
+                               array( $this, &$data, $block, $rcObj ) );
+                       if ( !$success ) {
+                               // skip entry if hook aborted it
+                               continue;
+                       }
+
+                       $line = '<tr' . $trClass . '><td></td><td class="mw-enhanced-rc">';
+                       if ( isset( $data['recentChangesFlags'] ) ) {
+                               $line .= $this->recentChangesFlags( $data['recentChangesFlags'] );
+                               unset( $data['recentChangesFlags'] );
+                       }
+                       $line .= '&#160;</td><td class="mw-enhanced-rc-nested">';
+
+                       if ( isset( $data['timestampLink'] ) ) {
+                               $line .= '<span class="mw-enhanced-rc-time">' . $data['timestampLink'] . '</span>';
+                               unset( $data['timestampLink'] );
+                       }
+
+                       // everything else: makes it easier for extensions to add or remove data
+                       $line .= implode( '', $data );
+
+                       $line .= "</td></tr>\n";
 
-                       $r .= "</td></tr>\n";
+                       $r .= $line;
                }
                $r .= "</table>\n";
 
@@ -497,6 +526,8 @@ class EnhancedChangesList extends ChangesList {
         * @return string A HTML formatted line (generated using $r)
         */
        protected function recentChangesBlockLine( $rcObj ) {
+               $data = array();
+
                $query['curid'] = $rcObj->mAttribs['rc_cur_id'];
 
                $type = $rcObj->mAttribs['rc_type'];
@@ -511,32 +542,33 @@ class EnhancedChangesList extends ChangesList {
                }
                $classes[] = $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
                        ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
-               $r = Html::openElement( 'table', array( 'class' => $classes ) ) .
-                       Html::openElement( 'tr' );
 
-               $r .= '<td class="mw-enhanced-rc"><span class="mw-enhancedchanges-arrow-space"></span>';
                # Flag and Timestamp
-               $r .= $this->recentChangesFlags( array(
+               $data['recentChangesFlags'] = array(
                        'newpage' => $type == RC_NEW,
                        'minor' => $rcObj->mAttribs['rc_minor'],
                        'unpatrolled' => $rcObj->unpatrolled,
                        'bot' => $rcObj->mAttribs['rc_bot'],
-               ) );
-               $r .= '&#160;' . $rcObj->timestamp . '&#160;</td><td>';
+               );
+               // timestamp is not really a link here, but is called timestampLink
+               // for consistency with EnhancedChangesListModifyLineData
+               $data['timestampLink'] = $rcObj->timestamp;
+
                # Article or log link
                if ( $logType ) {
                        $logPage = new LogPage( $logType );
                        $logTitle = SpecialPage::getTitleFor( 'Log', $logType );
                        $logName = $logPage->getName()->escaped();
-                       $r .= $this->msg( 'parentheses' )
+                       $data['logLink'] = $this->msg( 'parentheses' )
                                ->rawParams( Linker::linkKnown( $logTitle, $logName ) )->escaped();
                } else {
-                       $this->insertArticleLink( $r, $rcObj, $rcObj->unpatrolled, $rcObj->watched );
+                       $data['articleLink'] = $this->getArticleLink( $rcObj, $rcObj->unpatrolled, $rcObj->watched );
                }
+
                # Diff and hist links
                if ( $type != RC_LOG ) {
                        $query['action'] = 'history';
-                       $r .= ' ' . $this->msg( 'parentheses' )
+                       $data['historyLink'] = ' ' . $this->msg( 'parentheses' )
                                ->rawParams( $rcObj->difflink . $this->message['pipe-separator'] . Linker::linkKnown(
                                        $rcObj->getTitle(),
                                        $this->message['hist'],
@@ -544,31 +576,61 @@ class EnhancedChangesList extends ChangesList {
                                        $query
                                ) )->escaped();
                }
-               $r .= ' <span class="mw-changeslist-separator">. .</span> ';
+               $data['separatorAfterLinks'] = ' <span class="mw-changeslist-separator">. .</span> ';
+
                # Character diff
                if ( $this->getConfig()->get( 'RCShowChangedSize' ) ) {
                        $cd = $this->formatCharacterDifference( $rcObj );
                        if ( $cd !== '' ) {
-                               $r .= $cd . ' <span class="mw-changeslist-separator">. .</span> ';
+                               $data['characterDiff'] = $cd;
+                               $data['separatorAftercharacterDiff'] = ' <span class="mw-changeslist-separator">. .</span> ';
                        }
                }
 
                if ( $type == RC_LOG ) {
-                       $r .= $this->insertLogEntry( $rcObj );
+                       $data['logEntry'] = $this->insertLogEntry( $rcObj );
                } else {
-                       $r .= ' ' . $rcObj->userlink . $rcObj->usertalklink;
-                       $r .= $this->insertComment( $rcObj );
-                       $this->insertRollback( $r, $rcObj );
+                       $data['userLink'] = $rcObj->userlink;
+                       $data['userTalkLink'] = $rcObj->usertalklink;
+                       $data['comment'] = $this->insertComment( $rcObj );
+                       $data['rollback'] = $this->getRollback( $rcObj );
                }
 
                # Tags
-               $this->insertTags( $r, $rcObj, $classes );
+               $data['tags'] = $this->getTags( $rcObj, $classes );
+
                # Show how many people are watching this if enabled
-               $r .= $this->numberofWatchingusers( $rcObj->numberofWatchingusers );
+               $data['watchingUsers'] = $this->numberofWatchingusers( $rcObj->numberofWatchingusers );
 
-               $r .= "</td></tr></table>\n";
+               // give the hook a chance to modify the data
+               $success = Hooks::run( 'EnhancedChangesListModifyBlockLineData',
+                       array( $this, &$data, $rcObj ) );
+               if ( !$success ) {
+                       // skip entry if hook aborted it
+                       return '';
+               }
 
-               return $r;
+               $line = Html::openElement( 'table', array( 'class' => $classes ) ) .
+                       Html::openElement( 'tr' );
+               $line .= '<td class="mw-enhanced-rc"><span class="mw-enhancedchanges-arrow-space"></span>';
+
+               if ( isset( $data['recentChangesFlags'] ) ) {
+                       $line .= $this->recentChangesFlags( $data['recentChangesFlags'] );
+                       unset( $data['recentChangesFlags'] );
+               }
+
+               if ( isset( $data['timestampLink'] ) ) {
+                       $line .= '&#160;' . $data['timestampLink'];
+                       unset( $data['timestampLink'] );
+               }
+               $line .= '&#160;</td><td>';
+
+               // everything else: makes it easier for extensions to add or remove data
+               $line .= implode( '', $data );
+
+               $line .= "</td></tr></table>\n";
+
+               return $line;
        }
 
        /**
diff --git a/includes/compat/CdbCompat.php b/includes/compat/CdbCompat.php
new file mode 100644 (file)
index 0000000..0074cc9
--- /dev/null
@@ -0,0 +1,45 @@
+<?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
+ */
+
+/***
+ * This file contains a set of backwards-compatability class names
+ * after the cdb functions were moved out into a separate library
+ * and put under a proper namespace
+ *
+ * @since 1.25
+ */
+
+/**
+ * @deprecated since 1.25
+ */
+abstract class CdbReader extends \Cdb\Reader {
+}
+
+/**
+ * @deprecated since 1.25
+ */
+abstract class CdbWriter extends \Cdb\Writer {
+}
+
+/**
+ * @deprecated since 1.25
+ */
+class CdbException extends \Cdb\Exception {
+}
diff --git a/includes/compat/normal/.gitignore b/includes/compat/normal/.gitignore
new file mode 100644 (file)
index 0000000..5af0afa
--- /dev/null
@@ -0,0 +1,6 @@
+/CompositionExclusions.txt
+/DerivedNormalizationProps.txt
+/NormalizationCorrections.txt
+/NormalizationTest.txt
+/UnicodeData.txt
+/testdata
diff --git a/includes/compat/normal/UtfNormal.php b/includes/compat/normal/UtfNormal.php
new file mode 100644 (file)
index 0000000..c9c05a0
--- /dev/null
@@ -0,0 +1,129 @@
+<?php
+/**
+ * Unicode normalization routines
+ *
+ * Copyright © 2004 Brion Vibber <brion@pobox.com>
+ * https://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup UtfNormal
+ */
+
+/**
+ * @defgroup UtfNormal UtfNormal
+ */
+
+use UtfNormal\Validator;
+
+/**
+ * Unicode normalization routines for working with UTF-8 strings.
+ * Currently assumes that input strings are valid UTF-8!
+ *
+ * Not as fast as I'd like, but should be usable for most purposes.
+ * UtfNormal::toNFC() will bail early if given ASCII text or text
+ * it can quickly determine is already normalized.
+ *
+ * All functions can be called static.
+ *
+ * See description of forms at http://www.unicode.org/reports/tr15/
+ *
+ * @deprecated since 1.25, use UtfNormal\Validator directly
+ * @ingroup UtfNormal
+ */
+class UtfNormal {
+       /**
+        * The ultimate convenience function! Clean up invalid UTF-8 sequences,
+        * and convert to normal form C, canonical composition.
+        *
+        * Fast return for pure ASCII strings; some lesser optimizations for
+        * strings containing only known-good characters. Not as fast as toNFC().
+        *
+        * @param string $string a UTF-8 string
+        * @return string a clean, shiny, normalized UTF-8 string
+        */
+       static function cleanUp( $string ) {
+               return Validator::cleanUp( $string );
+       }
+
+       /**
+        * Convert a UTF-8 string to normal form C, canonical composition.
+        * Fast return for pure ASCII strings; some lesser optimizations for
+        * strings containing only known-good characters.
+        *
+        * @param string $string a valid UTF-8 string. Input is not validated.
+        * @return string a UTF-8 string in normal form C
+        */
+       static function toNFC( $string ) {
+               return Validator::toNFC( $string );
+       }
+
+       /**
+        * Convert a UTF-8 string to normal form D, canonical decomposition.
+        * Fast return for pure ASCII strings.
+        *
+        * @param string $string a valid UTF-8 string. Input is not validated.
+        * @return string a UTF-8 string in normal form D
+        */
+       static function toNFD( $string ) {
+               return Validator::toNFD( $string );
+       }
+
+       /**
+        * Convert a UTF-8 string to normal form KC, compatibility composition.
+        * This may cause irreversible information loss, use judiciously.
+        * Fast return for pure ASCII strings.
+        *
+        * @param string $string a valid UTF-8 string. Input is not validated.
+        * @return string a UTF-8 string in normal form KC
+        */
+       static function toNFKC( $string ) {
+               return Validator::toNFKC( $string );
+       }
+
+       /**
+        * Convert a UTF-8 string to normal form KD, compatibility decomposition.
+        * This may cause irreversible information loss, use judiciously.
+        * Fast return for pure ASCII strings.
+        *
+        * @param string $string a valid UTF-8 string. Input is not validated.
+        * @return string a UTF-8 string in normal form KD
+        */
+       static function toNFKD( $string ) {
+               return Validator::toNFKD( $string );
+       }
+
+       /**
+        * Returns true if the string is _definitely_ in NFC.
+        * Returns false if not or uncertain.
+        * @param string $string a valid UTF-8 string. Input is not validated.
+        * @return bool
+        */
+       static function quickIsNFC( $string ) {
+               return Validator::quickIsNFC( $string );
+       }
+
+       /**
+        * Returns true if the string is _definitely_ in NFC.
+        * Returns false if not or uncertain.
+        * @param string $string a UTF-8 string, altered on output to be valid UTF-8 safe for XML.
+        * @return bool
+        */
+       static function quickIsNFCVerify( &$string ) {
+               return Validator::quickIsNFCVerify( $string );
+       }
+}
diff --git a/includes/compat/normal/UtfNormalDefines.php b/includes/compat/normal/UtfNormalDefines.php
new file mode 100644 (file)
index 0000000..b8e44c7
--- /dev/null
@@ -0,0 +1,186 @@
+<?php
+/**
+ * Backwards-compatability constants which are now provided by the
+ * UtfNormal library. They are hardcoded here since they are needed
+ * before the composer autoloader is initialized.
+ *
+ * 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 UtfNormal
+ */
+
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UNICODE_HANGUL_FIRST', 0xac00 );
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UNICODE_HANGUL_LAST', 0xd7a3 );
+
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UNICODE_HANGUL_LBASE', 0x1100 );
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UNICODE_HANGUL_VBASE', 0x1161 );
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UNICODE_HANGUL_TBASE', 0x11a7 );
+
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UNICODE_HANGUL_LCOUNT', 19 );
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UNICODE_HANGUL_VCOUNT', 21 );
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UNICODE_HANGUL_TCOUNT', 28 );
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UNICODE_HANGUL_NCOUNT', UNICODE_HANGUL_VCOUNT * UNICODE_HANGUL_TCOUNT );
+
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UNICODE_HANGUL_LEND', UNICODE_HANGUL_LBASE + UNICODE_HANGUL_LCOUNT - 1 );
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UNICODE_HANGUL_VEND', UNICODE_HANGUL_VBASE + UNICODE_HANGUL_VCOUNT - 1 );
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UNICODE_HANGUL_TEND', UNICODE_HANGUL_TBASE + UNICODE_HANGUL_TCOUNT - 1 );
+
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UNICODE_SURROGATE_FIRST', 0xd800 );
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UNICODE_SURROGATE_LAST', 0xdfff );
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UNICODE_MAX', 0x10ffff );
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UNICODE_REPLACEMENT', 0xfffd );
+
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UTF8_HANGUL_FIRST', "\xea\xb0\x80" /*codepointToUtf8( UNICODE_HANGUL_FIRST )*/ );
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UTF8_HANGUL_LAST', "\xed\x9e\xa3" /*codepointToUtf8( UNICODE_HANGUL_LAST )*/ );
+
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UTF8_HANGUL_LBASE', "\xe1\x84\x80" /*codepointToUtf8( UNICODE_HANGUL_LBASE )*/ );
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UTF8_HANGUL_VBASE', "\xe1\x85\xa1" /*codepointToUtf8( UNICODE_HANGUL_VBASE )*/ );
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UTF8_HANGUL_TBASE', "\xe1\x86\xa7" /*codepointToUtf8( UNICODE_HANGUL_TBASE )*/ );
+
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UTF8_HANGUL_LEND', "\xe1\x84\x92" /*codepointToUtf8( UNICODE_HANGUL_LEND )*/ );
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UTF8_HANGUL_VEND', "\xe1\x85\xb5" /*codepointToUtf8( UNICODE_HANGUL_VEND )*/ );
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UTF8_HANGUL_TEND', "\xe1\x87\x82" /*codepointToUtf8( UNICODE_HANGUL_TEND )*/ );
+
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UTF8_SURROGATE_FIRST', "\xed\xa0\x80" /*codepointToUtf8( UNICODE_SURROGATE_FIRST )*/ );
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UTF8_SURROGATE_LAST', "\xed\xbf\xbf" /*codepointToUtf8( UNICODE_SURROGATE_LAST )*/ );
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UTF8_MAX', "\xf4\x8f\xbf\xbf" /*codepointToUtf8( UNICODE_MAX )*/ );
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UTF8_REPLACEMENT', "\xef\xbf\xbd" /*codepointToUtf8( UNICODE_REPLACEMENT )*/ );
+#define( 'UTF8_REPLACEMENT', '!' );
+
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UTF8_OVERLONG_A', "\xc1\xbf" );
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UTF8_OVERLONG_B', "\xe0\x9f\xbf" );
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UTF8_OVERLONG_C', "\xf0\x8f\xbf\xbf" );
+
+# These two ranges are illegal
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UTF8_FDD0', "\xef\xb7\x90" /*codepointToUtf8( 0xfdd0 )*/ );
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UTF8_FDEF', "\xef\xb7\xaf" /*codepointToUtf8( 0xfdef )*/ );
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UTF8_FFFE', "\xef\xbf\xbe" /*codepointToUtf8( 0xfffe )*/ );
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UTF8_FFFF', "\xef\xbf\xbf" /*codepointToUtf8( 0xffff )*/ );
+
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UTF8_HEAD', false );
+/**
+ * @deprecated since 1.25, use UtfNormal\Constants instead
+ */
+define( 'UTF8_TAIL', true );
diff --git a/includes/compat/normal/UtfNormalUtil.php b/includes/compat/normal/UtfNormalUtil.php
new file mode 100644 (file)
index 0000000..9ed9bc2
--- /dev/null
@@ -0,0 +1,100 @@
+<?php
+/**
+ * Some of these functions are adapted from places in MediaWiki.
+ * Should probably merge them for consistency.
+ *
+ * Copyright © 2004 Brion Vibber <brion@pobox.com>
+ * https://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup UtfNormal
+ */
+
+
+use UtfNormal\Utils;
+
+/**
+ * Return UTF-8 sequence for a given Unicode code point.
+ *
+ * @param $codepoint Integer:
+ * @return String
+ * @throws InvalidArgumentException if fed out of range data.
+ * @public
+ * @deprecated since 1.25, use UtfNormal\Utils directly
+ */
+function codepointToUtf8( $codepoint ) {
+       return Utils::codepointToUtf8( $codepoint );
+}
+
+/**
+ * Take a series of space-separated hexadecimal numbers representing
+ * Unicode code points and return a UTF-8 string composed of those
+ * characters. Used by UTF-8 data generation and testing routines.
+ *
+ * @param $sequence String
+ * @return String
+ * @throws InvalidArgumentException if fed out of range data.
+ * @private
+ * @deprecated since 1.25, use UtfNormal\Utils directly
+ */
+function hexSequenceToUtf8( $sequence ) {
+       return Utils::hexSequenceToUtf8( $sequence );
+}
+
+/**
+ * Take a UTF-8 string and return a space-separated series of hex
+ * numbers representing Unicode code points. For debugging.
+ *
+ * @fixme this is private but extensions + maint scripts are using it
+ * @param string $str UTF-8 string.
+ * @return string
+ * @private
+ */
+function utf8ToHexSequence( $str ) {
+       $buf = '';
+       foreach ( preg_split( '//u', $str, -1, PREG_SPLIT_NO_EMPTY ) as $cp ) {
+               $buf .= sprintf( '%04x ', UtfNormal\Utils::utf8ToCodepoint( $cp ) );
+       }
+
+       return rtrim( $buf );
+}
+
+/**
+ * Determine the Unicode codepoint of a single-character UTF-8 sequence.
+ * Does not check for invalid input data.
+ *
+ * @param $char String
+ * @return Integer
+ * @public
+ * @deprecated since 1.25, use UtfNormal\Utils directly
+ */
+function utf8ToCodepoint( $char ) {
+       return Utils::utf8ToCodepoint( $char );
+}
+
+/**
+ * Escape a string for inclusion in a PHP single-quoted string literal.
+ *
+ * @param string $string string to be escaped.
+ * @return String: escaped string.
+ * @public
+ * @deprecated since 1.25, use UtfNormal\Utils directly
+ */
+function escapeSingleString( $string ) {
+       return Utils::escapeSingleString( $string );
+}
index 468c7e9..bf91a4f 100644 (file)
@@ -355,16 +355,20 @@ abstract class ContentHandler {
         *
         * @param string $name The content model ID, as given by a CONTENT_MODEL_XXX
         *    constant or returned by Revision::getContentModel().
+        * @param Language|null $lang The language to parse the message in (since 1.26)
         *
         * @throws MWException If the model ID isn't known.
         * @return string The content model's localized name.
         */
-       public static function getLocalizedName( $name ) {
+       public static function getLocalizedName( $name, Language $lang = null ) {
                // Messages: content-model-wikitext, content-model-text,
                // content-model-javascript, content-model-css
                $key = "content-model-$name";
 
                $msg = wfMessage( $key );
+               if ( $lang ) {
+                       $msg->inLanguage( $lang );
+               }
 
                return $msg->exists() ? $msg->plain() : $name;
        }
index 00323ca..aaa1fa7 100644 (file)
@@ -67,6 +67,11 @@ class DerivativeContext extends ContextSource {
         */
        private $config;
 
+       /**
+        * @var Stats
+        */
+       private $stats;
+
        /**
         * Constructor
         * @param IContextSource $context Context to inherit from
index d1bc597..99c1a06 100644 (file)
@@ -131,7 +131,7 @@ class RequestContext implements IContextSource {
        public function getStats() {
                if ( $this->stats === null ) {
                        $config = $this->getConfig();
-                       $prefix = $config->has( 'StatsdMetricPrefix' )
+                       $prefix = $config->get( 'StatsdMetricPrefix' )
                                ? rtrim( $config->get( 'StatsdMetricPrefix' ), '.' )
                                : 'MediaWiki';
                        $this->stats = new BufferingStatsdDataFactory( $prefix );
@@ -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 94cf1f2..2f1155d 100644 (file)
  * @ingroup Database
  */
 
-/**
- * Interface for classes that implement or wrap DatabaseBase
- * @ingroup Database
- */
-interface IDatabase {
-}
-
 /**
  * Database abstraction object
  * @ingroup Database
@@ -1019,6 +1012,17 @@ abstract class DatabaseBase implements IDatabase {
                return $closed;
        }
 
+       /**
+        * Make sure isOpen() returns true as a sanity check
+        *
+        * @throws DBUnexpectedError
+        */
+       protected function assertOpen() {
+               if ( !$this->isOpen() ) {
+                       throw new DBUnexpectedError( $this, "DB connection was already closed." );
+               }
+       }
+
        /**
         * Closes underlying database connection
         * @since 1.20
@@ -1056,7 +1060,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 );
        }
 
@@ -1069,7 +1073,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' ) );
        }
@@ -1175,9 +1179,7 @@ abstract class DatabaseBase implements IDatabase {
                $queryId = MWDebug::query( $sql, $fname, $isMaster );
 
                # Avoid fatals if close() was called
-               if ( !$this->isOpen() ) {
-                       throw new DBUnexpectedError( $this, "DB connection was already closed." );
-               }
+               $this->assertOpen();
 
                # Do the query and handle errors
                $startTime = microtime( true );
@@ -1449,6 +1451,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(
@@ -1909,7 +1912,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 );
@@ -3648,9 +3651,7 @@ abstract class DatabaseBase implements IDatabase {
                }
 
                # Avoid fatals if close() was called
-               if ( !$this->isOpen() ) {
-                       throw new DBUnexpectedError( $this, "DB connection was already closed." );
-               }
+               $this->assertOpen();
 
                $this->doBegin( $fname );
                $this->mTrxTimestamp = microtime( true );
@@ -3715,9 +3716,7 @@ abstract class DatabaseBase implements IDatabase {
                }
 
                # Avoid fatals if close() was called
-               if ( !$this->isOpen() ) {
-                       throw new DBUnexpectedError( $this, "DB connection was already closed." );
-               }
+               $this->assertOpen();
 
                $this->runOnTransactionPreCommitCallbacks();
                $writeTime = $this->pendingWriteQueryDuration();
@@ -3774,9 +3773,7 @@ abstract class DatabaseBase implements IDatabase {
                }
 
                # Avoid fatals if close() was called
-               if ( !$this->isOpen() ) {
-                       throw new DBUnexpectedError( $this, "DB connection was already closed." );
-               }
+               $this->assertOpen();
 
                $this->doRollback( $fname );
                $this->mTrxIdleCallbacks = array(); // cancel
@@ -3829,6 +3826,7 @@ abstract class DatabaseBase implements IDatabase {
         * @param string $prefix Only show tables with this prefix, e.g. mw_
         * @param string $fname Calling function name
         * @throws MWException
+        * @return array
         */
        function listTables( $prefix = null, $fname = __METHOD__ ) {
                throw new MWException( 'DatabaseBase::listTables is not implemented in descendant class' );
@@ -3851,6 +3849,7 @@ abstract class DatabaseBase implements IDatabase {
         * @param string $prefix Only show VIEWs with this prefix, eg. unit_test_
         * @param string $fname Name of calling function
         * @throws MWException
+        * @return array
         * @since 1.22
         */
        public function listViews( $prefix = null, $fname = __METHOD__ ) {
@@ -3862,6 +3861,7 @@ abstract class DatabaseBase implements IDatabase {
         *
         * @param string $name Name of the database-structure to test.
         * @throws MWException
+        * @return bool
         * @since 1.22
         */
        public function isView( $name ) {
index 823d9b6..5b15147 100644 (file)
@@ -33,10 +33,12 @@ class DatabaseMysql extends DatabaseMysqlBase {
         * @return resource False on error
         */
        protected function doQuery( $sql ) {
+               $conn = $this->getBindingHandle();
+
                if ( $this->bufferResults() ) {
-                       $ret = mysql_query( $sql, $this->mConn );
+                       $ret = mysql_query( $sql, $conn );
                } else {
-                       $ret = mysql_unbuffered_query( $sql, $this->mConn );
+                       $ret = mysql_unbuffered_query( $sql, $conn );
                }
 
                return $ret;
@@ -48,8 +50,7 @@ class DatabaseMysql extends DatabaseMysqlBase {
         * @throws DBConnectionError
         */
        protected function mysqlConnect( $realServer ) {
-               # Fail now
-               # Otherwise we get a suppressed fatal error, which is very hard to track down
+               # Avoid a suppressed fatal error, which is very hard to track down
                if ( !extension_loaded( 'mysql' ) ) {
                        throw new DBConnectionError(
                                $this,
@@ -73,6 +74,9 @@ class DatabaseMysql extends DatabaseMysqlBase {
 
                $conn = false;
 
+               # The kernel's default SYN retransmission period is far too slow for us,
+               # so we use a short timeout plus a manual retry. Retrying means that a small
+               # but finite rate of SYN packet loss won't cause user-visible errors.
                for ( $i = 0; $i < $numAttempts && !$conn; $i++ ) {
                        if ( $i > 1 ) {
                                usleep( 1000 );
@@ -93,8 +97,10 @@ class DatabaseMysql extends DatabaseMysqlBase {
         * @return bool
         */
        protected function mysqlSetCharset( $charset ) {
+               $conn = $this->getBindingHandle();
+
                if ( function_exists( 'mysql_set_charset' ) ) {
-                       return mysql_set_charset( $charset, $this->mConn );
+                       return mysql_set_charset( $charset, $conn );
                } else {
                        return $this->query( 'SET NAMES ' . $charset, __METHOD__ );
                }
@@ -104,14 +110,18 @@ class DatabaseMysql extends DatabaseMysqlBase {
         * @return bool
         */
        protected function closeConnection() {
-               return mysql_close( $this->mConn );
+               $conn = $this->getBindingHandle();
+
+               return mysql_close( $conn );
        }
 
        /**
         * @return int
         */
        function insertId() {
-               return mysql_insert_id( $this->mConn );
+               $conn = $this->getBindingHandle();
+
+               return mysql_insert_id( $conn );
        }
 
        /**
@@ -129,7 +139,9 @@ class DatabaseMysql extends DatabaseMysqlBase {
         * @return int
         */
        function affectedRows() {
-               return mysql_affected_rows( $this->mConn );
+               $conn = $this->getBindingHandle();
+
+               return mysql_affected_rows( $conn );
        }
 
        /**
@@ -137,9 +149,11 @@ class DatabaseMysql extends DatabaseMysqlBase {
         * @return bool
         */
        function selectDB( $db ) {
+               $conn = $this->getBindingHandle();
+
                $this->mDBname = $db;
 
-               return mysql_select_db( $db, $this->mConn );
+               return mysql_select_db( $db, $conn );
        }
 
        protected function mysqlFreeResult( $res ) {
@@ -183,10 +197,14 @@ class DatabaseMysql extends DatabaseMysqlBase {
        }
 
        protected function mysqlRealEscapeString( $s ) {
-               return mysql_real_escape_string( $s, $this->mConn );
+               $conn = $this->getBindingHandle();
+
+               return mysql_real_escape_string( $s, $conn );
        }
 
        protected function mysqlPing() {
-               return mysql_ping( $this->mConn );
+               $conn = $this->getBindingHandle();
+
+               return mysql_ping( $conn );
        }
 }
index a189648..846da1c 100644 (file)
@@ -59,22 +59,16 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        function open( $server, $user, $password, $dbName ) {
                global $wgAllDBsAreLocalhost, $wgSQLMode;
 
-               # Debugging hack -- fake cluster
-               if ( $wgAllDBsAreLocalhost ) {
-                       $realServer = 'localhost';
-               } else {
-                       $realServer = $server;
-               }
+               # Close/unset connection handle
                $this->close();
+
+               # Debugging hack -- fake cluster
+               $realServer = $wgAllDBsAreLocalhost ? 'localhost' : $server;
                $this->mServer = $server;
                $this->mUser = $user;
                $this->mPassword = $password;
                $this->mDBname = $dbName;
 
-               # The kernel's default SYN retransmission period is far too slow for us,
-               # so we use a short timeout plus a manual retry. Retrying means that a small
-               # but finite rate of SYN packet loss won't cause user-visible errors.
-               $this->mConn = false;
                $this->installErrorHandler();
                try {
                        $this->mConn = $this->mysqlConnect( $realServer );
@@ -586,9 +580,12 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        function ping() {
                $ping = $this->mysqlPing();
                if ( $ping ) {
+                       // Connection was good or lost but reconnected...
+                       // @note: mysqlnd (php 5.6+) does not support this (PHP bug 52561)
                        return true;
                }
 
+               // Try a full disconnect/reconnect cycle if ping() failed
                $this->closeConnection();
                $this->mOpened = false;
                $this->mConn = false;
@@ -943,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__ );
@@ -1058,6 +1055,28 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                        ( $this->lastErrno() == 1290 && strpos( $this->lastError(), '--read-only' ) !== false );
        }
 
+       /**
+        * Get the underlying binding handle, mConn
+        *
+        * Makes sure that mConn is set (disconnects and ping() failure can unset it).
+        * This catches broken callers than catch and ignore disconnection exceptions.
+        * Unlike checking isOpen(), this is safe to call inside of open().
+        *
+        * @return resource|object
+        * @throws DBUnexpectedError
+        * @since 1.26
+        */
+       protected function getBindingHandle() {
+               if ( !$this->mConn ) {
+                       throw new DBUnexpectedError(
+                               $this,
+                               'DB connection was already closed or the connection dropped.'
+                       );
+               }
+
+               return $this->mConn;
+       }
+
        /**
         * @param string $oldName
         * @param string $newName
index d2b5ecb..8ca2362 100644 (file)
  * @see Database
  */
 class DatabaseMysqli extends DatabaseMysqlBase {
+       /** @var mysqli */
+       protected $mConn;
+
        /**
         * @param string $sql
         * @return resource
         */
        protected function doQuery( $sql ) {
+               $conn = $this->getBindingHandle();
+
                if ( $this->bufferResults() ) {
-                       $ret = $this->mConn->query( $sql );
+                       $ret = $conn->query( $sql );
                } else {
-                       $ret = $this->mConn->query( $sql, MYSQLI_USE_RESULT );
+                       $ret = $conn->query( $sql, MYSQLI_USE_RESULT );
                }
 
                return $ret;
@@ -50,8 +55,8 @@ class DatabaseMysqli extends DatabaseMysqlBase {
         */
        protected function mysqlConnect( $realServer ) {
                global $wgDBmysql5;
-               # Fail now
-               # Otherwise we get a suppressed fatal error, which is very hard to track down
+
+               # Avoid suppressed fatal error, which is very hard to track down
                if ( !function_exists( 'mysqli_init' ) ) {
                        throw new DBConnectionError( $this, "MySQLi functions missing,"
                                . " have you compiled PHP with the --with-mysqli option?\n" );
@@ -116,8 +121,10 @@ class DatabaseMysqli extends DatabaseMysqlBase {
         * @return bool
         */
        protected function mysqlSetCharset( $charset ) {
-               if ( method_exists( $this->mConn, 'set_charset' ) ) {
-                       return $this->mConn->set_charset( $charset );
+               $conn = $this->getBindingHandle();
+
+               if ( method_exists( $conn, 'set_charset' ) ) {
+                       return $conn->set_charset( $charset );
                } else {
                        return $this->query( 'SET NAMES ' . $charset, __METHOD__ );
                }
@@ -127,14 +134,18 @@ class DatabaseMysqli extends DatabaseMysqlBase {
         * @return bool
         */
        protected function closeConnection() {
-               return $this->mConn->close();
+               $conn = $this->getBindingHandle();
+
+               return $conn->close();
        }
 
        /**
         * @return int
         */
        function insertId() {
-               return (int)$this->mConn->insert_id;
+               $conn = $this->getBindingHandle();
+
+               return (int)$conn->insert_id;
        }
 
        /**
@@ -152,7 +163,9 @@ class DatabaseMysqli extends DatabaseMysqlBase {
         * @return int
         */
        function affectedRows() {
-               return $this->mConn->affected_rows;
+               $conn = $this->getBindingHandle();
+
+               return $conn->affected_rows;
        }
 
        /**
@@ -160,9 +173,11 @@ class DatabaseMysqli extends DatabaseMysqlBase {
         * @return bool
         */
        function selectDB( $db ) {
+               $conn = $this->getBindingHandle();
+
                $this->mDBname = $db;
 
-               return $this->mConn->select_db( $db );
+               return $conn->select_db( $db );
        }
 
        /**
@@ -289,11 +304,15 @@ class DatabaseMysqli extends DatabaseMysqlBase {
         * @return string
         */
        protected function mysqlRealEscapeString( $s ) {
-               return $this->mConn->real_escape_string( $s );
+               $conn = $this->getBindingHandle();
+
+               return $conn->real_escape_string( $s );
        }
 
        protected function mysqlPing() {
-               return $this->mConn->ping();
+               $conn = $this->getBindingHandle();
+
+               return $conn->ping();
        }
 
        /**
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 069185b..52dca08 100644 (file)
@@ -60,8 +60,6 @@ class LoadBalancer {
        private $mLastError = 'Unknown error';
        /** @var integer Total connections opened */
        private $connsOpened = 0;
-       /** @var ProcessCacheLRU */
-       private $mProcCache;
 
        /** @var integer Warn when this many connection are held */
        const CONN_HELD_WARN_THRESHOLD = 10;
@@ -113,8 +111,6 @@ class LoadBalancer {
                                }
                        }
                }
-
-               $this->mProcCache = new ProcessCacheLRU( 30 );
        }
 
        /**
@@ -650,10 +646,7 @@ class LoadBalancer {
        public function openConnection( $i, $wiki = false ) {
                if ( $wiki !== false ) {
                        $conn = $this->openForeignConnection( $i, $wiki );
-
-                       return $conn;
-               }
-               if ( isset( $this->mConns['local'][$i][0] ) ) {
+               } elseif ( isset( $this->mConns['local'][$i][0] ) ) {
                        $conn = $this->mConns['local'][$i][0];
                } else {
                        $server = $this->mServers[$i];
@@ -670,6 +663,15 @@ class LoadBalancer {
                        }
                }
 
+               if ( $conn && !$conn->isOpen() ) {
+                       // Connection was made but later unrecoverably lost for some reason.
+                       // Do not return a handle that will just throw exceptions on use,
+                       // but let the calling code (e.g. getReaderIndex) try another server.
+                       // See DatabaseMyslBase::ping() for how this can happen.
+                       $this->mErrorConnection = $conn;
+                       $conn = false;
+               }
+
                return $conn;
        }
 
@@ -1234,16 +1236,8 @@ class LoadBalancer {
                        return array( 0 => 0 ); // no replication = no lag
                }
 
-               if ( $this->mProcCache->has( 'slave_lag', 'times', 1 ) ) {
-                       return $this->mProcCache->get( 'slave_lag', 'times' );
-               }
-
                # Send the request to the load monitor
-               $times = $this->getLoadMonitor()->getLagTimes( array_keys( $this->mServers ), $wiki );
-
-               $this->mProcCache->set( 'slave_lag', 'times', $times );
-
-               return $times;
+               return $this->getLoadMonitor()->getLagTimes( array_keys( $this->mServers ), $wiki );
        }
 
        /**
@@ -1270,8 +1264,10 @@ class LoadBalancer {
 
        /**
         * Clear the cache for slag lag delay times
+        *
+        * This is only used for testing
         */
        public function clearLagTimeCache() {
-               $this->mProcCache->clear( 'slave_lag' );
+               $this->getLoadMonitor()->clearCaches();
        }
 }
index 8c4d0ed..01d2f95 100644 (file)
@@ -75,13 +75,17 @@ class LoadMonitorMySQL implements LoadMonitor {
        /** @var LoadBalancer */
        public $parent;
        /** @var BagOStuff */
-       protected $cache;
+       protected $srvCache;
+       /** @var BagOStuff */
+       protected $mainCache;
 
        public function __construct( $parent ) {
                global $wgMemc;
 
                $this->parent = $parent;
-               $this->cache = $wgMemc ?: wfGetMainCache();
+
+               $this->srvCache = ObjectCache::newAccelerator( array(), 'hash' );
+               $this->mainCache = $wgMemc ?: wfGetMainCache();
        }
 
        public function scaleLoads( &$loads, $group = false, $wiki = false ) {
@@ -89,65 +93,79 @@ class LoadMonitorMySQL implements LoadMonitor {
 
        public function getLagTimes( $serverIndexes, $wiki ) {
                if ( count( $serverIndexes ) == 1 && reset( $serverIndexes ) == 0 ) {
-                       // Single server only, just return zero without caching
+                       # Single server only, just return zero without caching
                        return array( 0 => 0 );
                }
 
-               $expiry = 5;
-               $requestRate = 10;
-
-               $cache = $this->cache;
-               $masterName = $this->parent->getServerName( 0 );
-               $memcKey = wfMemcKey( 'lag_times', $masterName );
-               $times = $cache->get( $memcKey );
-               if ( is_array( $times ) ) {
-                       # Randomly recache with probability rising over $expiry
-                       $elapsed = time() - $times['timestamp'];
-                       $chance = max( 0, ( $expiry - $elapsed ) * $requestRate );
-                       if ( mt_rand( 0, $chance ) != 0 ) {
-                               unset( $times['timestamp'] ); // hide from caller
-
-                               return $times;
-                       }
-                       wfIncrStats( 'lag_cache.miss.expired' );
-               } else {
-                       wfIncrStats( 'lag_cache.miss.absent' );
+               $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;
 
-               # Cache key missing or expired
-               if ( $cache->lock( $memcKey, 0, 10 ) ) {
+               # (c) Cache key missing or expired; regenerate and backfill
+               if ( $this->mainCache->lock( $key, 0, 10 ) ) {
                        # Let this process alone update the cache value
-                       $unlocker = new ScopedCallback( function () use ( $cache, $memcKey ) {
-                               $cache->unlock( $memcKey );
+                       $cache = $this->mainCache;
+                       $unlocker = new ScopedCallback( function () use ( $cache, $key ) {
+                               $cache->unlock( $key );
                        } );
-               } elseif ( is_array( $times ) ) {
+               } elseif ( $staleValue ) {
                        # Could not acquire lock but an old cache exists, so use it
-                       unset( $times['timestamp'] ); // hide from caller
-
-                       return $times;
+                       return $value['lagTimes'];
                }
 
-               $times = array();
+               $lagTimes = array();
                foreach ( $serverIndexes as $i ) {
                        if ( $i == 0 ) { # Master
-                               $times[$i] = 0;
+                               $lagTimes[$i] = 0;
                        } elseif ( false !== ( $conn = $this->parent->getAnyOpenConnection( $i ) ) ) {
-                               $times[$i] = $conn->getLag();
+                               $lagTimes[$i] = $conn->getLag();
                        } elseif ( false !== ( $conn = $this->parent->openConnection( $i, $wiki ) ) ) {
-                               $times[$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.
+                               $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
-               $times['timestamp'] = time();
-               $cache->set( $memcKey, $times, $expiry + 10 );
-               unset( $times['timestamp'] ); // hide from caller
+               $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 );
+       }
 
-               return $times;
+       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 e66fdaf..82bbd76 100644 (file)
@@ -431,16 +431,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 +454,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() );
 
index c6941e6..ec84762 100644 (file)
@@ -521,6 +521,7 @@ class ForeignAPIRepo extends FileRepo {
                if ( $status->isOK() ) {
                        return $req->getContent();
                } else {
+                       wfDebug( "ForeignAPIRepo: ERROR on GET: " . $status->getWikiText() );
                        return false;
                }
        }
index 0713a92..1aec446 100644 (file)
@@ -587,6 +587,6 @@ class ArchivedFile {
                $this->load();
 
                $title = $this->getTitle();
-               return Revision::userCanBitfield( $this->deleted, $field, $user, $title ? : null );
+               return Revision::userCanBitfield( $this->deleted, $field, $user, $title ?: null );
        }
 }
index 9f30ee3..afd7cf6 100644 (file)
 class HTMLButtonField extends HTMLFormField {
        protected $buttonType = 'button';
 
+       /** @var array $mFlags Flags to add to OOUI Button widget */
+       protected $mFlags = array();
+
        public function __construct( $info ) {
                $info['nodata'] = true;
+               if ( isset( $info['flags'] ) )
+                       $this->mFlags = $info['flags'];
                parent::__construct( $info );
        }
 
@@ -33,9 +38,11 @@ class HTMLButtonField extends HTMLFormField {
                return new OOUI\ButtonInputWidget( array(
                        'name' => $this->mName,
                        'value' => $value,
+                       'label' => $value,
                        'type' => $this->buttonType,
                        'classes' => array( 'mw-htmlform-submit', $this->mClass ),
                        'id' => $this->mID,
+                       'flags' => $this->mFlags,
                ) + $this->getAttributes( array( 'disabled', 'tabindex' ), array( 'tabindex' => 'tabIndex' ) ) );
        }
 
index 7ccb60e..a0566a0 100644 (file)
@@ -119,9 +119,8 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
                        foreach ( $columns as $columnTag ) {
                                $thisTag = "$columnTag-$rowTag";
                                // Construct the checkbox
-                               $thisId = "{$this->mID}-$thisTag";
                                $thisAttribs = array(
-                                       'id' => $thisId,
+                                       'id' => "{$this->mID}-$thisTag",
                                        'value' => $thisTag,
                                );
                                $checked = in_array( $thisTag, (array)$value, true );
@@ -132,18 +131,13 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
                                        $checked = true;
                                        $thisAttribs['disabled'] = 1;
                                }
-                               $chkBox = $this->getOneCheckbox( $checked, $attribs + $thisAttribs );
 
-                               if ( $this->mParent->getConfig()->get( 'UseMediaWikiUIEverywhere' ) ) {
-                                       $chkBox = Html::openElement( 'div', array( 'class' => 'mw-ui-checkbox' ) ) .
-                                               $chkBox .
-                                               Html::element( 'label', array( 'for' => $thisId ) ) .
-                                               Html::closeElement( 'div' );
-                               }
+                               $checkbox = $this->getOneCheckbox( $checked, $attribs + $thisAttribs );
+
                                $rowContents .= Html::rawElement(
                                        'td',
                                        array(),
-                                       $chkBox
+                                       $checkbox
                                );
                        }
                        $tableContents .= Html::rawElement( 'tr', array(), "\n$rowContents\n" );
@@ -162,11 +156,18 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
                        return new OOUI\CheckboxInputWidget( array(
                                'name' => "{$this->mName}[]",
                                'selected' => $checked,
-                               'value' => '1',
+                               'value' => $attribs['value'],
                        ) + $attribs );
+               } else {
+                       $checkbox = Xml::check( "{$this->mName}[]", $checked, $attribs );
+                       if ( $this->mParent->getConfig()->get( 'UseMediaWikiUIEverywhere' ) ) {
+                               $checkbox = Html::openElement( 'div', array( 'class' => 'mw-ui-checkbox' ) ) .
+                                       $checkbox .
+                                       Html::element( 'label', array( 'for' => $attribs['id'] ) ) .
+                                       Html::closeElement( 'div' );
+                       }
+                       return $checkbox;
                }
-
-               return Xml::check( "{$this->mName}[]", $checked, $attribs );
        }
 
        protected function isTagForcedOff( $tag ) {
index 65fc0e8..702651e 100644 (file)
@@ -165,7 +165,7 @@ class HTMLForm extends ContextSource {
        protected $mFieldTree;
        protected $mShowReset = false;
        protected $mShowSubmit = true;
-       protected $mSubmitModifierClass = 'mw-ui-constructive';
+       protected $mSubmitFlag = 'constructive';
 
        protected $mSubmitCallback;
        protected $mValidationErrorMessage;
@@ -972,7 +972,7 @@ class HTMLForm extends ContextSource {
                        $attribs['class'] = array( 'mw-htmlform-submit' );
 
                        if ( $useMediaWikiUIEverywhere ) {
-                               array_push( $attribs['class'], 'mw-ui-button', $this->mSubmitModifierClass );
+                               array_push( $attribs['class'], 'mw-ui-button', 'mw-ui-' . $this->mSubmitFlag );
                        }
 
                        $buttons .= Xml::submitButton( $this->getSubmitText(), $attribs ) . "\n";
@@ -1099,7 +1099,7 @@ class HTMLForm extends ContextSource {
         * @since 1.24
         */
        public function setSubmitDestructive() {
-               $this->mSubmitModifierClass = 'mw-ui-destructive';
+               $this->mSubmitFlag = 'destructive';
        }
 
        /**
@@ -1107,7 +1107,7 @@ class HTMLForm extends ContextSource {
         * @since 1.25
         */
        public function setSubmitProgressive() {
-               $this->mSubmitModifierClass = 'mw-ui-progressive';
+               $this->mSubmitFlag = 'progressive';
        }
 
        /**
index 8d28b59..523f045 100644 (file)
@@ -38,34 +38,19 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
                $html = '';
 
                $attribs = $this->getAttributes( array( 'disabled', 'tabindex' ) );
-               $elementFunc = array( 'Html', $this->mOptionsLabelsNotFromMessage ? 'rawElement' : 'element' );
 
                foreach ( $options as $label => $info ) {
                        if ( is_array( $info ) ) {
                                $html .= Html::rawElement( 'h1', array(), $label ) . "\n";
                                $html .= $this->formatOptions( $info, $value );
                        } else {
-                               $thisAttribs = array( 'id' => "{$this->mID}-$info", 'value' => $info );
-
-                               // @todo: Make this use checkLabel for consistency purposes
-                               $checkbox = Xml::check(
-                                       $this->mName . '[]',
-                                       in_array( $info, $value, true ),
-                                       $attribs + $thisAttribs
-                               );
-                               $checkbox .= '&#160;' . call_user_func( $elementFunc,
-                                       'label',
-                                       array( 'for' => "{$this->mID}-$info" ),
-                                       $label
+                               $thisAttribs = array(
+                                       'id' => "{$this->mID}-$info",
+                                       'value' => $info,
                                );
+                               $checked = in_array( $info, $value, true );
 
-                               if ( $this->mParent->getConfig()->get( 'UseMediaWikiUIEverywhere' ) ) {
-                                       $checkbox = Html::rawElement(
-                                               'div',
-                                               array( 'class' => 'mw-ui-checkbox' ),
-                                               $checkbox
-                                       );
-                               }
+                               $checkbox = $this->getOneCheckbox( $checked, $attribs + $thisAttribs, $label );
 
                                $html .= ' ' . Html::rawElement(
                                        'div',
@@ -78,6 +63,41 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
                return $html;
        }
 
+       protected function getOneCheckbox( $checked, $attribs, $label ) {
+               if ( $this->mParent instanceof OOUIHTMLForm ) {
+                       if ( $this->mOptionsLabelsNotFromMessage ) {
+                               $label = new OOUI\HtmlSnippet( $label );
+                       }
+                       return new OOUI\FieldLayout(
+                               new OOUI\CheckboxInputWidget( array(
+                                       'name' => "{$this->mName}[]",
+                                       'selected' => $checked,
+                                       'value' => $attribs['value'],
+                               ) + $attribs ),
+                               array(
+                                       'label' => $label,
+                                       'align' => 'inline',
+                               )
+                       );
+               } else {
+                       $elementFunc = array( 'Html', $this->mOptionsLabelsNotFromMessage ? 'rawElement' : 'element' );
+                       $checkbox =
+                               Xml::check( "{$this->mName}[]", $checked, $attribs ) .
+                               '&#160;' .
+                               call_user_func( $elementFunc,
+                                       'label',
+                                       array( 'for' => $attribs['id'] ),
+                                       $label
+                               );
+                       if ( $this->mParent->getConfig()->get( 'UseMediaWikiUIEverywhere' ) ) {
+                               $checkbox = Html::openElement( 'div', array( 'class' => 'mw-ui-checkbox' ) ) .
+                                       $checkbox .
+                                       Html::closeElement( 'div' );
+                       }
+                       return $checkbox;
+               }
+       }
+
        /**
         * @param WebRequest $request
         *
index 0f00540..19b45be 100644 (file)
@@ -38,6 +38,23 @@ class HTMLRadioField extends HTMLFormField {
                return $html;
        }
 
+       function getInputOOUI( $value ) {
+               $options = array();
+               foreach ( $this->getOptions() as $label => $value ) {
+                       $options[] = array(
+                               'data' => $value,
+                               'label' => $this->mOptionsLabelsNotFromMessage ? new OOUI\HtmlSnippet( $label ) : $label,
+                       );
+               }
+
+               return new OOUI\RadioSelectInputWidget( array(
+                       'name' => $this->mName,
+                       'value' => $value,
+                       'options' => $options,
+                       'classes' => 'mw-htmlform-flatlist-item',
+               ) + $this->getAttributes( array( 'disabled', 'tabindex' ), array( 'tabindex' => 'tabIndex' ) ) );
+       }
+
        function formatOptions( $options, $value ) {
                $html = '';
 
index 653c08c..938e428 100644 (file)
@@ -6,4 +6,6 @@
  */
 class HTMLSubmitField extends HTMLButtonField {
        protected $buttonType = 'submit';
+
+       protected $mFlags = array( 'primary', 'constructive' );
 }
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 9c5b868..5c04ee2 100644 (file)
@@ -113,6 +113,11 @@ class HTMLTextField extends HTMLFormField {
                        'tabindex' => 'tabIndex',
                ) );
 
+               if ( isset( $attribs['readOnly'] ) ) {
+                       // This needs to be set to a boolean value
+                       $attribs['readOnly'] = true;
+               }
+
                $type = $this->getType( $attribs );
 
                return new OOUI\TextInputWidget( array(
index 6c9952a..80e91f7 100644 (file)
@@ -34,7 +34,6 @@ class OOUIHTMLForm extends HTMLForm {
        public function __construct( $descriptor, $context = null, $messagePrefix = '' ) {
                parent::__construct( $descriptor, $context, $messagePrefix );
                $this->getOutput()->enableOOUI();
-               $this->getOutput()->addModules( 'mediawiki.htmlform.ooui' );
                $this->getOutput()->addModuleStyles( 'mediawiki.htmlform.ooui.styles' );
        }
 
@@ -54,7 +53,7 @@ class OOUIHTMLForm extends HTMLForm {
                $buttons = '';
 
                if ( $this->mShowSubmit ) {
-                       $attribs = array();
+                       $attribs = array( 'infusable' => true );
 
                        if ( isset( $this->mSubmitID ) ) {
                                $attribs['id'] = $this->mSubmitID;
@@ -68,15 +67,11 @@ class OOUIHTMLForm extends HTMLForm {
                                $attribs += Linker::tooltipAndAccesskeyAttribs( $this->mSubmitTooltip );
                        }
 
-                       $attribs['classes'] = array(
-                               'mw-htmlform-submit',
-                               $this->mSubmitModifierClass,
-                       );
-
+                       $attribs['classes'] = array( 'mw-htmlform-submit' );
                        $attribs['type'] = 'submit';
                        $attribs['label'] = $this->getSubmitText();
                        $attribs['value'] = $this->getSubmitText();
-                       $attribs['flags'] = array( 'primary', 'constructive' );
+                       $attribs['flags'] = array( $this->mSubmitFlag );
 
                        $buttons .= new OOUI\ButtonInputWidget( $attribs );
                }
index 0c0e425..f1fd05d 100644 (file)
@@ -95,7 +95,7 @@ class VFormHTMLForm extends HTMLForm {
                        $attribs['class'] = array(
                                'mw-htmlform-submit',
                                'mw-ui-button mw-ui-big mw-ui-block',
-                               $this->mSubmitModifierClass,
+                               'mw-ui-' . $this->mSubmitFlag,
                        );
 
                        $buttons .= Xml::submitButton( $this->getSubmitText(), $attribs ) . "\n";
index f40de71..9aa6960 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,16 @@ class WebInstallerName extends WebInstallerPage {
                $pwd = $this->getVar( '_AdminPassword' );
                $user = User::newFromName( $cname );
                if ( $user ) {
-                       $valid = $user->getPasswordValidity( $pwd );
+                       $upp = new UserPasswordPolicy(
+                               $wgPasswordPolicy['policies'],
+                               $wgPasswordPolicy['checks']
+                       );
+                       $status = $upp->checkUserPasswordForGroups(
+                               $user,
+                               $pwd,
+                               array( 'sysop', 'bureaucrat' )
+                       );
+                       $valid = $status->isGood();
                } else {
                        $valid = 'config-admin-name-invalid';
                }
index 4d4522c..92a1440 100644 (file)
@@ -3,15 +3,19 @@
                "authors": [
                        "CERminator",
                        "Palapa",
-                       "Emir Mujadzic"
+                       "Emir Mujadzic",
+                       "Semso98"
                ]
        },
        "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:",
index 2d06d42..de26499 100644 (file)
@@ -8,7 +8,8 @@
                        "Pouyana",
                        "Reza1615",
                        "Alirezaaa",
-                       "Danialbehzadi"
+                       "Danialbehzadi",
+                       "Leyth"
                ]
        },
        "config-desc": "نصب کنندهٔ ویکی‌مدیا",
@@ -66,7 +67,7 @@
        "config-magic-quotes-sybase": "'''مخرب: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] فعال است.\nاین گزینه اطلاعات داده شده به رایانه را به طور غیر‌قابل پیش‌بینی از بین می‌برد.\nشما نمی‌توانید مدیاویکی را نصب یا استفاده کنید مگر اینکه این گزینه غیر‌فعال باشد.",
        "config-mbstring": "''' مخرب:[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] فعال است.\nاین گزینه باعث ایجاد خطا می‌شود و ممکن است اطلاعات را به طور غیر‌قابل پیش‌بینی از بین ببرد.\nشما نمی‌توانید مدیاویکی را نصب یا استفاده کنید مگر اینکه این گزینه غیر‌فعال باشد.",
        "config-safe-mode": "'''هشدار:'''  PHP's [http://www.php.net/features.safe-mode safe mode] فعال است.\nممکن است باعث ایجاد مشکلاتی شود، مخصوصاً اگر از ارسال پرونده استفاده شود و <code>math</code> پشتیبانی شود.",
-       "config-xml-bad": "Ù\85اÚ\98Ù\88Ù\84 Ø§Ú©Ø³â\80\8cاÙ\85â\80\8cاÙ\84 Ù¾Û\8câ\80\8cاÚ\86â\80\8cÙ¾Û\8c Ú©Ø§Ø± Ù\86Ù\85Û\8câ\80\8cÚ©Ù\86د.\nÙ\85دÛ\8cاÙ\88Û\8cÚ©Û\8c Ù\86Û\8cازÙ\85Ù\86د Ø¹Ù\85Ù\84Û\8cاتÛ\8c Ø¯Ø± Ø§Û\8cÙ\86 Ù\85اÚ\98Ù\88Ù\84 Ø§Ø³Øª Ù\88 Ø¯Ø± Ø§Û\8cÙ\86 Ù¾Û\8cکربÙ\86دÛ\8c Ú©Ø§Ø± Ù\86Ø®Ù\88اÙ\87دâ\80\8cکرد.\nاگر Ù\85اÙ\86â\80\8cدرÛ\8cÚ© Ø±Ø§ Ø§Ø¬Ø±Ø§ Ù\85Û\8câ\80\8cÚ©Ù\86Û\8cد, Ø¨Ø³ØªÙ\87Ù\94 Ù\86رÙ\85 Ø§Ù\81زارÛ\8c پی‌اچ‌پی-ایکس‌ام‌ال را نصب کنید.",
+       "config-xml-bad": "Ù\85اÚ\98Ù\88Ù\84 Ø§Ú©Ø³â\80\8cاÙ\85â\80\8cاÙ\84 Ù¾Û\8câ\80\8cاÚ\86â\80\8cÙ¾Û\8c Ú©Ø§Ø± Ù\86Ù\85Û\8câ\80\8cÚ©Ù\86د.\nÙ\85دÛ\8cاÙ\88Û\8cÚ©Û\8c Ù\86Û\8cازÙ\85Ù\86د Ø¹Ù\85Ù\84Û\8cاتÛ\8c Ø¯Ø± Ø§Û\8cÙ\86 Ù\85اÚ\98Ù\88Ù\84 Ø§Ø³Øª Ù\88 Ø¯Ø± Ø§Û\8cÙ\86 Ù¾Û\8cکربÙ\86دÛ\8c Ú©Ø§Ø± Ù\86Ø®Ù\88اÙ\87دâ\80\8cکرد.\nشاÛ\8cد Ù\86Û\8cاز Ø¨Ø§Ø´Ø¯ Ú©Ù\87 Ø¨Ø³ØªÙ\87Ù\94 Ù\86رÙ\85 Ø§Ù\81زارÛ\8cÙ\90 Ø¢Ø±Ù¾Û\8câ\80\8cاÙ\85 پی‌اچ‌پی-ایکس‌ام‌ال را نصب کنید.",
        "config-pcre-old": "''' خطای اساسی:'' ' PCRE  $1  یا بعدا مورد نیاز است.\nکد باینری پی‌اچ‌پی‌تان با PCRE  $2 پیوند دارد.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE اطلاعات بیشتر].",
        "config-pcre-no-utf8": "'''مخرب:''' به‌ نظر می‌رسد ماژول پی‌سی‌آرایی پی‌اچ‌پی بدون پشتیبانی پی‌سی‌آرایی_یو‌تی‌اف۸ تهیه شده‌است.\nمدیاویکی برای درست عمل کردن نیازمند پشتیبانی یوتی‌اف-۸ است.",
        "config-memory-raised": "PHP's <code>memory_limit</code>, نسخهٔ $1 است، به نسخهٔ $2 ارتقاء داده شده‌است.",
        "config-admin-name-invalid": "نام کاربری تعیین شدهٔ \"<nowiki>$1</nowiki>\" نامعتبر است.\nیک نام کاربری دیگر تعیین کنید.",
        "config-admin-password-blank": "برای حساب سرپرست یک رمز عبور وارد کنید.",
        "config-admin-password-mismatch": "دو رمز عبوری که وارد کرده‌اید با هم مطابقت ندارند.",
-       "config-admin-email": "آدرس ایمیل:",
+       "config-admin-email": "نشانی ایمیل:",
        "config-admin-email-help": "یک آدرس ایمیل برای اجازهٔ دریافت ایمیل از دیگر کاربران ویکی، اینجا وارد کنید، رمز عبور خود را دوباره تنظیم کنید، و از تغییرات صفحه در فهرست پیگیری‌ها مطلع باشید. می‌توانید این بخش را خالی بگذارید.",
        "config-admin-error-user": "خطای داخلی هنگام ایجاد یک مدیر با نام \"<nowiki>$1</nowiki>\".",
        "config-admin-error-password": "خطای داخلی هنگام تنظیم یک رمز عبور برای مدیر \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
index d011fa9..b460f60 100644 (file)
        "config-optional-continue": "További információk megadása.",
        "config-optional-skip": "Épp elég volt, települjön a wiki!",
        "config-profile": "Felhasználói jogosultságok profilja:",
-       "config-profile-wiki": "Wiki megnyitása",
+       "config-profile-wiki": "Nyílt wiki",
        "config-profile-no-anon": "Felhasználói fiók létrehozása szükséges",
        "config-profile-fishbowl": "Csak engedélyezett szerkesztők",
        "config-profile-private": "Privát wiki",
index b9aab3a..da632ac 100644 (file)
@@ -11,7 +11,8 @@
                        "Ontsed",
                        "Seb35",
                        "Nemo bis",
-                       "Ricordisamoa"
+                       "Ricordisamoa",
+                       "Fpugliajno"
                ]
        },
        "config-desc": "Il programma di installazione per MediaWiki",
@@ -57,7 +58,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 +70,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.",
index a1ca9d2..79e6a0a 100644 (file)
@@ -13,7 +13,8 @@
                        "青子守歌",
                        "아라",
                        "Shield-9",
-                       "Takot"
+                       "Takot",
+                       "Sujiniku"
                ]
        },
        "config-desc": "MediaWiki のインストーラー",
@@ -62,7 +63,7 @@
        "config-unicode-using-intl": "Unicode正規化に[http://pecl.php.net/intl intl PECL 拡張機能]を使用。",
        "config-unicode-pure-php-warning": "<strong>警告:</strong> Unicode 正規化の処理に [http://pecl.php.net/intl intl PECL 拡張機能]を利用できないため、処理が遅いピュア PHP の実装を代わりに使用しています。\n高トラフィックのサイトを運営する場合は、[//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode 正規化]をお読みください。",
        "config-unicode-update-warning": "<strong>警告:</strong> インストールされているバージョンの Unicode 正規化ラッパーは、[http://site.icu-project.org/ ICU プロジェクト]のライブラリの古いバージョンを使用しています。\nUnicode を少しでも利用する可能性がある場合は、[//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations アップグレード]してください。",
-       "config-no-db": "適切なデータベース ドライバーが見つかりませんでした! PHP にデータベース ドライバーをインストールする必要があります。\n以下の種類のデータベースに対応しています: $1\n\nPHP を自分でコンパイルした場合は、例えば <code>./configure --with-mysqli</code> を実行して、データベース クライアントを使用できるように再設定してください。\nDebian または Ubuntu のパッケージから PHP をインストールした場合は、モジュール (例: <code>php5-mysql</code>) もインストールする必要があります。",
+       "config-no-db": "適切なデータベース ドライバーが見つかりませんでした! PHP にデータベース ドライバーをインストールする必要があります。\n以下の種類のデータベース{{PLURAL:$2|のタイプ}}に対応しています: $1\n\nPHP を自分でコンパイルした場合は、例えば <code>./configure --with-mysqli</code> を実行して、データベース クライアントを使用できるように再設定してください。\nDebian または Ubuntu のパッケージから PHP をインストールした場合は、モジュール (例: <code>php5-mysql</code>) もインストールする必要があります。",
        "config-outdated-sqlite": "<strong>警告:</strong> あなたは SQLite $1 を使用していますが、最低限必要なバージョン $2 より古いバージョンです。SQLite は利用できません。",
        "config-no-fts3": "<strong>警告:</strong> SQLite は [//sqlite.org/fts3.html FTS3] モジュールなしでコンパイルされており、このバックエンドでは検索機能は利用できなくなります。",
        "config-register-globals-error": "<strong>エラー: PHPの <code>[http://php.net/register_globals register_globals]</code> オプションが有効になっています。\nインストールを進めるには無効にしなければなりません。</strong>\nやり方については[https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] をご覧ください。",
@@ -71,7 +72,7 @@
        "config-magic-quotes-sybase": "<strong>致命的エラー: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] が動作しています!</strong>\nこのオプションは、予期せずデータ入力を破壊します。\nこのオプションを無効化しない限り、MediaWiki のインストールや使用はできません。",
        "config-mbstring": "<strong>致命的エラー: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] が動作しています!</strong>\nこのオプションは、エラーを引き起こし、予期せずデータを破壊するおそれがあります。\nこのオプションを無効化しない限り、MediaWiki のインストールや使用はできません。",
        "config-safe-mode": "<strong>警告:</strong> PHPの[http://www.php.net/features.safe-mode セーフモード]が有効になっています。\n特に、ファイルのアップロードや<code>math</code>機能で、問題が発生するおそれがあります。",
-       "config-xml-bad": "PHPのXMLモジュールが不足しています。\nMediaWikiは、このモジュールの関数を必要としているため、この構成では動作しません。\nMandrakeを実行している場合、php-xmlパッケージをインストールしてください。",
+       "config-xml-bad": "PHPのXMLモジュールが不足しています。\nMediaWikiは、このモジュールの関数を必要としているため、この構成では動作しません。\nphp-xml RPM パッケージをインストールする必要があります。",
        "config-pcre-old": "<strong>致命的エラー:</strong> PCRE $1 以降が必要です。\nご使用中の PHP のバイナリは PCRE $2 とリンクされています。\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE 詳細情報]",
        "config-pcre-no-utf8": "<strong>致命的エラー:</strong> PHP の PCRE が PCRE_UTF8 対応なしでコンパイルされているようです。\nMediaWiki を正しく動作させるには、UTF-8 対応が必要です。",
        "config-memory-raised": "PHPの<code>memory_limit</code>は$1で、$2に引き上げられました。",
index 2c84dc3..b7f71b1 100644 (file)
@@ -1,9 +1,11 @@
 {
        "@metadata": {
                "authors": [
-                       "VASANTH S.N."
+                       "VASANTH S.N.",
+                       "Pavanaja"
                ]
        },
+       "config-title": "ಮೀಡಿಯಾವಿಕಿ ಆವೃತ್ತಿ $1 ರ ಅನುಸ್ಥಾಪನೆ",
        "config-information": "ಮಾಹಿತಿ",
        "config-localsettings-key": "ಉನ್ನತೀಕರಣ ಕೀಲಿ",
        "config-localsettings-badkey": "ನೀವು ನೀಡಿದ ಕೀಲಿ ಸರಿಯಾಗಿಲ್ಲ",
index 8990b8a..75246dc 100644 (file)
        "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 632951b..78683ad 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "V.narsikar"
+                       "V.narsikar",
+                       "Suyog"
                ]
        },
        "config-information": "माहिती",
@@ -11,6 +12,7 @@
        "config-your-language": "आपली भाषा:",
        "config-your-language-help": "उभारणी प्रक्रियेत वापरावयाची भाषा निवडा.",
        "config-wiki-language": "विकी भाषा:",
+       "config-wiki-language-help": "तुमची लेखन भाषा निवडा",
        "config-back": "← परत",
        "config-continue": "चालू ठेवा →",
        "config-page-language": "भाषा",
@@ -23,6 +25,7 @@
        "config-page-readme": "हे वाचा",
        "config-page-releasenotes": "विमोचन टिप्पण्या",
        "config-page-existingwiki": "साध्याचा विकि",
+       "config-restart": "हो, परत चालू करा",
        "config-pg-test-error": "विदागाराशी अनुबंधन करता येत नाही <strong>$1</strong>: $2",
        "config-type-mssql": "मायक्रोसॉफ्ट एसक्युएल सर्व्हर",
        "config-header-mssql": "मायक्रोसॉफ्ट एसक्युएल सर्व्हर मांडणावळ",
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 83fb3d8..fecf474 100644 (file)
@@ -5,6 +5,7 @@
                        "Psubhashish"
                ]
        },
+       "config-information": "ସୂଚନା",
        "config-session-error": "ଅଧିବେଶନ ଆରମ୍ଭରେ ଅସୁବିଧା: $1",
        "config-your-language": "ଆପଣଙ୍କ ଭାଷା:",
        "config-your-language-help": "ଇନଷ୍ଟଲ କରିବା ବେଳେ ବ୍ୟବହାର ପାଇଁ ଏକ ଭାଷା ବାଛନ୍ତୁ ।",
        "config-page-existingwiki": "ଏବେକାର ଉଇକି",
        "config-restart": "ହଁ, ଏହାକୁ ପୁନରାରମ୍ଭ କରନ୍ତୁ",
        "config-env-php": "PHP $1 ଇନଷ୍ଟଲ ହେଲା ।",
+       "config-db-type": "ଡାଟାବେସ ପ୍ରକାର:",
+       "config-db-host": "ଡାଟାବେସ ହୋଷ୍ଟ:",
+       "config-db-name": "ଡାଟାବେସ ନାମ:",
+       "config-site-name": "ଉଇକିର ନାମ:",
+       "config-site-name-blank": "ସାଇଟ ନାମ ଦିଅନ୍ତୁ ।",
+       "config-project-namespace": "ପ୍ରକଳ୍ପ ନେମସ୍ପେସ:",
+       "config-ns-generic": "ପ୍ରକଳ୍ପ",
+       "config-ns-other": "ଅନ୍ୟ (ଦର୍ଶାଇବେ)",
+       "config-ns-other-default": "ମୋଉଇକି",
+       "config-admin-box": "ପରିଚାଳକ ଆକାଉଣ୍ଟ",
+       "config-admin-name": "ଆପଣଙ୍କର ବ୍ୟବହାରକାରୀ ନାମ:",
+       "config-admin-password": "ପାସୱାର୍ଡ",
+       "config-admin-password-confirm": "ଆଉଥରେ ପାସୱାର୍ଡ",
        "config-license-cc-by-sa": "କ୍ରିଏଟିଭ କମନ୍ସ ଆଟ୍ରିବ୍ୟୁସନ-ସେଆର ଏଲାଇକ",
-       "config-license-cc-by-nc-sa": "କ୍ରିଏଟିଭ କମନ୍ସ ଆଟ୍ରିବ୍ୟୁସନ-ନନକମର୍ସିଆଲ ସେଆର ଏଲାଇକ"
+       "config-license-cc-by-nc-sa": "କ୍ରିଏଟିଭ କମନ୍ସ ଆଟ୍ରିବ୍ୟୁସନ-ନନକମର୍ସିଆଲ ସେଆର ଏଲାଇକ",
+       "config-install-step-done": "ହୋଇଗଲା"
 }
index 345b475..73e1764 100644 (file)
@@ -68,7 +68,7 @@
        "config-magic-quotes-sybase": "'''Проблема: Опція PHP [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] увімкнена!'''\nЦя опція призводить до непередбачуваного пошкодження даних.\nВи не можете встановити і використовувати MediaWiki, поки не буде вимкнено цю опцію.",
        "config-mbstring": "'''Проблема: Опція PHP [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] увімкнена!'''\nЦя опція призводить до непередбачуваного пошкодження даних.\nВи не можете встановити і використовувати MediaWiki, поки не буде вимкнено цю опцію.",
        "config-safe-mode": "'''Увага:''' Опція PHP [http://www.php.net/features.safe-mode «безпечний режим»] увімкнена.\nЦе може спричинити проблеми, зокрема із завантаженням файлів та вставкою математичних формул.",
-       "config-xml-bad": "XML-модÑ\83Ñ\82Ñ\8c PHP Ð²Ñ\96дÑ\81Ñ\83Ñ\82нÑ\96й.\nMediaWiki Ð½ÐµÐ¾Ð±Ñ\85Ñ\96днÑ\96 Ð¹Ð¾Ð³Ð¾ Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97, Ð±ÐµÐ· Ñ\86Ñ\8cого Ð¼Ð¾Ð´Ñ\83лÑ\8f Ð²Ð¾Ð½Ð° Ð¿Ñ\80аÑ\86Ñ\8eваÑ\82и Ð½Ðµ Ð±Ñ\83де.\nЯкÑ\89о Ð\92и Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94Ñ\82е Mandrake, Ð²Ñ\81Ñ\82ановÑ\96Ñ\82Ñ\8c php-xml пакет.",
+       "config-xml-bad": "XML-модÑ\83Ñ\82Ñ\8c PHP Ð²Ñ\96дÑ\81Ñ\83Ñ\82нÑ\96й.\nMediaWiki Ð½ÐµÐ¾Ð±Ñ\85Ñ\96днÑ\96 Ð¹Ð¾Ð³Ð¾ Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97, Ð±ÐµÐ· Ñ\86Ñ\8cого Ð¼Ð¾Ð´Ñ\83лÑ\8f Ð²Ð¾Ð½Ð° Ð¿Ñ\80аÑ\86Ñ\8eваÑ\82и Ð½Ðµ Ð±Ñ\83де.\nÐ\92ам Ð¼Ð¾Ð¶Ðµ Ð·Ð½Ð°Ð´Ð¾Ð±Ð¸Ñ\82иÑ\81Ñ\8f Ð²Ñ\81Ñ\82ановиÑ\82и php-xml RPM пакет.",
        "config-pcre-old": "'''Фатальна помилка:''' потрібно PCRE версії $1 або пізнішої.\nВаш виконуваний файл PHP пов'язаний з PCRE версії $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Подробиці].",
        "config-pcre-no-utf8": "'''Помилка''': PCRE-модуть PHP, вочевидь, було зібрано без підтримки PCRE_UTF8.\nMediaWiki вимагає підтримку UTF-8 для коректної роботи.",
        "config-memory-raised": "Обмеження пам'яті PHP (<code>memory_limit</code>) $1, піднято до $2.",
index f7ef8a9..3e23391 100644 (file)
@@ -144,6 +144,14 @@ abstract class Job implements IJobSpecification {
                        : null;
        }
 
+       /**
+        * @return int|null UNIX timestamp of when the job was runnable, or null
+        * @since 1.26
+        */
+       public function getReadyTimestamp() {
+               return $this->getReleaseTimestamp() ?: $this->getQueuedTimestamp();
+       }
+
        /**
         * Whether the queue should reject insertion of this job if a duplicate exists
         *
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 3dfffae..3982134 100644 (file)
@@ -199,10 +199,10 @@ class JobRunner implements LoggerAwareInterface {
                                $timeMsTotal += $timeMs;
                                $profiler->scopedProfileOut( $psection );
 
-                               $queuedTs = $job->getQueuedTimestamp();
-                               if ( $queuedTs ) {
+                               $readyTs = $job->getReadyTimestamp();
+                               if ( $readyTs ) {
                                        // Record time to run for the job type
-                                       $pickupDelay = $popTime - $queuedTs;
+                                       $pickupDelay = $popTime - $readyTs;
                                        $stats->timing( 'jobqueue.pickup_delay.all', $pickupDelay );
                                        $stats->timing( "jobqueue.pickup_delay.$jType", $pickupDelay );
                                }
old mode 100755 (executable)
new mode 100644 (file)
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',
diff --git a/includes/libs/RiffExtractor.php b/includes/libs/RiffExtractor.php
new file mode 100644 (file)
index 0000000..f987c59
--- /dev/null
@@ -0,0 +1,100 @@
+<?php
+/**
+ * Extractor for the Resource Interchange File Format
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Bryan Tong Minh
+ * @ingroup Media
+ */
+
+class RiffExtractor {
+       public static function findChunksFromFile( $filename, $maxChunks = -1 ) {
+               $file = fopen( $filename, 'rb' );
+               $info = self::findChunks( $file, $maxChunks );
+               fclose( $file );
+               return $info;
+       }
+
+       public static function findChunks( $file, $maxChunks = -1 ) {
+               $riff = fread( $file, 4 );
+               if ( $riff !== 'RIFF' ) {
+                       return false;
+               }
+
+               // Next four bytes are fileSize
+               $fileSize = fread( $file, 4 );
+               if ( !$fileSize || strlen( $fileSize ) != 4 ) {
+                       return false;
+               }
+
+               // Next four bytes are the FourCC
+               $fourCC = fread( $file, 4 );
+               if ( !$fourCC || strlen( $fourCC ) != 4 ) {
+                       return false;
+               }
+
+               // Create basic info structure
+               $info = array(
+                       'fileSize' => self::extractUInt32( $fileSize ),
+                       'fourCC' => $fourCC,
+                       'chunks' => array(),
+               );
+               $numberOfChunks = 0;
+
+               // Find out the chunks
+               while ( !feof( $file ) && !( $numberOfChunks >= $maxChunks && $maxChunks >= 0 ) ) {
+                       $chunkStart = ftell( $file );
+
+                       $chunkFourCC = fread( $file, 4 );
+                       if ( !$chunkFourCC || strlen( $chunkFourCC ) != 4 ) {
+                               return $info;
+                       }
+
+                       $chunkSize = fread( $file, 4 );
+                       if ( !$chunkSize || strlen( $chunkSize ) != 4 ) {
+                               return $info;
+                       }
+                       $intChunkSize = self::extractUInt32( $chunkSize );
+
+                       // Add chunk info to the info structure
+                       $info['chunks'][] = array(
+                               'fourCC' => $chunkFourCC,
+                               'start' => $chunkStart,
+                               'size' => $intChunkSize
+                       );
+
+                       // Uneven chunks have padding bytes
+                       $padding = $intChunkSize % 2;
+                       // Seek to the next chunk
+                       fseek( $file, $intChunkSize + $padding, SEEK_CUR );
+
+               }
+
+               return $info;
+       }
+
+       /**
+        * Extract a little-endian uint32 from a 4 byte string
+        * @param string $string 4-byte string
+        * @return int
+        */
+       public static function extractUInt32( $string ) {
+               $unpacked = unpack( 'V', $string );
+               return $unpacked[1];
+       }
+};
index 9c7bf2f..22c3319 100644 (file)
@@ -30,6 +30,9 @@ class ComposerLock {
                        $deps[$installed['name']] = array(
                                'version' => ComposerJson::normalizeVersion( $installed['version'] ),
                                'type' => $installed['type'],
+                               'licenses' => isset( $installed['license'] ) ? $installed['license'] : array(),
+                               'authors' => isset( $installed['authors'] ) ? $installed['authors'] : array(),
+                               'description' => isset( $installed['description'] ) ? $installed['description']: '',
                        );
                }
 
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
diff --git a/includes/libs/normal/.gitignore b/includes/libs/normal/.gitignore
deleted file mode 100644 (file)
index 5af0afa..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-/CompositionExclusions.txt
-/DerivedNormalizationProps.txt
-/NormalizationCorrections.txt
-/NormalizationTest.txt
-/UnicodeData.txt
-/testdata
diff --git a/includes/libs/normal/UtfNormal.php b/includes/libs/normal/UtfNormal.php
deleted file mode 100644 (file)
index c9c05a0..0000000
+++ /dev/null
@@ -1,129 +0,0 @@
-<?php
-/**
- * Unicode normalization routines
- *
- * Copyright © 2004 Brion Vibber <brion@pobox.com>
- * https://www.mediawiki.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup UtfNormal
- */
-
-/**
- * @defgroup UtfNormal UtfNormal
- */
-
-use UtfNormal\Validator;
-
-/**
- * Unicode normalization routines for working with UTF-8 strings.
- * Currently assumes that input strings are valid UTF-8!
- *
- * Not as fast as I'd like, but should be usable for most purposes.
- * UtfNormal::toNFC() will bail early if given ASCII text or text
- * it can quickly determine is already normalized.
- *
- * All functions can be called static.
- *
- * See description of forms at http://www.unicode.org/reports/tr15/
- *
- * @deprecated since 1.25, use UtfNormal\Validator directly
- * @ingroup UtfNormal
- */
-class UtfNormal {
-       /**
-        * The ultimate convenience function! Clean up invalid UTF-8 sequences,
-        * and convert to normal form C, canonical composition.
-        *
-        * Fast return for pure ASCII strings; some lesser optimizations for
-        * strings containing only known-good characters. Not as fast as toNFC().
-        *
-        * @param string $string a UTF-8 string
-        * @return string a clean, shiny, normalized UTF-8 string
-        */
-       static function cleanUp( $string ) {
-               return Validator::cleanUp( $string );
-       }
-
-       /**
-        * Convert a UTF-8 string to normal form C, canonical composition.
-        * Fast return for pure ASCII strings; some lesser optimizations for
-        * strings containing only known-good characters.
-        *
-        * @param string $string a valid UTF-8 string. Input is not validated.
-        * @return string a UTF-8 string in normal form C
-        */
-       static function toNFC( $string ) {
-               return Validator::toNFC( $string );
-       }
-
-       /**
-        * Convert a UTF-8 string to normal form D, canonical decomposition.
-        * Fast return for pure ASCII strings.
-        *
-        * @param string $string a valid UTF-8 string. Input is not validated.
-        * @return string a UTF-8 string in normal form D
-        */
-       static function toNFD( $string ) {
-               return Validator::toNFD( $string );
-       }
-
-       /**
-        * Convert a UTF-8 string to normal form KC, compatibility composition.
-        * This may cause irreversible information loss, use judiciously.
-        * Fast return for pure ASCII strings.
-        *
-        * @param string $string a valid UTF-8 string. Input is not validated.
-        * @return string a UTF-8 string in normal form KC
-        */
-       static function toNFKC( $string ) {
-               return Validator::toNFKC( $string );
-       }
-
-       /**
-        * Convert a UTF-8 string to normal form KD, compatibility decomposition.
-        * This may cause irreversible information loss, use judiciously.
-        * Fast return for pure ASCII strings.
-        *
-        * @param string $string a valid UTF-8 string. Input is not validated.
-        * @return string a UTF-8 string in normal form KD
-        */
-       static function toNFKD( $string ) {
-               return Validator::toNFKD( $string );
-       }
-
-       /**
-        * Returns true if the string is _definitely_ in NFC.
-        * Returns false if not or uncertain.
-        * @param string $string a valid UTF-8 string. Input is not validated.
-        * @return bool
-        */
-       static function quickIsNFC( $string ) {
-               return Validator::quickIsNFC( $string );
-       }
-
-       /**
-        * Returns true if the string is _definitely_ in NFC.
-        * Returns false if not or uncertain.
-        * @param string $string a UTF-8 string, altered on output to be valid UTF-8 safe for XML.
-        * @return bool
-        */
-       static function quickIsNFCVerify( &$string ) {
-               return Validator::quickIsNFCVerify( $string );
-       }
-}
diff --git a/includes/libs/normal/UtfNormalDefines.php b/includes/libs/normal/UtfNormalDefines.php
deleted file mode 100644 (file)
index b8e44c7..0000000
+++ /dev/null
@@ -1,186 +0,0 @@
-<?php
-/**
- * Backwards-compatability constants which are now provided by the
- * UtfNormal library. They are hardcoded here since they are needed
- * before the composer autoloader is initialized.
- *
- * 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 UtfNormal
- */
-
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UNICODE_HANGUL_FIRST', 0xac00 );
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UNICODE_HANGUL_LAST', 0xd7a3 );
-
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UNICODE_HANGUL_LBASE', 0x1100 );
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UNICODE_HANGUL_VBASE', 0x1161 );
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UNICODE_HANGUL_TBASE', 0x11a7 );
-
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UNICODE_HANGUL_LCOUNT', 19 );
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UNICODE_HANGUL_VCOUNT', 21 );
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UNICODE_HANGUL_TCOUNT', 28 );
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UNICODE_HANGUL_NCOUNT', UNICODE_HANGUL_VCOUNT * UNICODE_HANGUL_TCOUNT );
-
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UNICODE_HANGUL_LEND', UNICODE_HANGUL_LBASE + UNICODE_HANGUL_LCOUNT - 1 );
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UNICODE_HANGUL_VEND', UNICODE_HANGUL_VBASE + UNICODE_HANGUL_VCOUNT - 1 );
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UNICODE_HANGUL_TEND', UNICODE_HANGUL_TBASE + UNICODE_HANGUL_TCOUNT - 1 );
-
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UNICODE_SURROGATE_FIRST', 0xd800 );
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UNICODE_SURROGATE_LAST', 0xdfff );
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UNICODE_MAX', 0x10ffff );
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UNICODE_REPLACEMENT', 0xfffd );
-
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UTF8_HANGUL_FIRST', "\xea\xb0\x80" /*codepointToUtf8( UNICODE_HANGUL_FIRST )*/ );
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UTF8_HANGUL_LAST', "\xed\x9e\xa3" /*codepointToUtf8( UNICODE_HANGUL_LAST )*/ );
-
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UTF8_HANGUL_LBASE', "\xe1\x84\x80" /*codepointToUtf8( UNICODE_HANGUL_LBASE )*/ );
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UTF8_HANGUL_VBASE', "\xe1\x85\xa1" /*codepointToUtf8( UNICODE_HANGUL_VBASE )*/ );
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UTF8_HANGUL_TBASE', "\xe1\x86\xa7" /*codepointToUtf8( UNICODE_HANGUL_TBASE )*/ );
-
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UTF8_HANGUL_LEND', "\xe1\x84\x92" /*codepointToUtf8( UNICODE_HANGUL_LEND )*/ );
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UTF8_HANGUL_VEND', "\xe1\x85\xb5" /*codepointToUtf8( UNICODE_HANGUL_VEND )*/ );
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UTF8_HANGUL_TEND', "\xe1\x87\x82" /*codepointToUtf8( UNICODE_HANGUL_TEND )*/ );
-
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UTF8_SURROGATE_FIRST', "\xed\xa0\x80" /*codepointToUtf8( UNICODE_SURROGATE_FIRST )*/ );
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UTF8_SURROGATE_LAST', "\xed\xbf\xbf" /*codepointToUtf8( UNICODE_SURROGATE_LAST )*/ );
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UTF8_MAX', "\xf4\x8f\xbf\xbf" /*codepointToUtf8( UNICODE_MAX )*/ );
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UTF8_REPLACEMENT', "\xef\xbf\xbd" /*codepointToUtf8( UNICODE_REPLACEMENT )*/ );
-#define( 'UTF8_REPLACEMENT', '!' );
-
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UTF8_OVERLONG_A', "\xc1\xbf" );
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UTF8_OVERLONG_B', "\xe0\x9f\xbf" );
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UTF8_OVERLONG_C', "\xf0\x8f\xbf\xbf" );
-
-# These two ranges are illegal
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UTF8_FDD0', "\xef\xb7\x90" /*codepointToUtf8( 0xfdd0 )*/ );
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UTF8_FDEF', "\xef\xb7\xaf" /*codepointToUtf8( 0xfdef )*/ );
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UTF8_FFFE', "\xef\xbf\xbe" /*codepointToUtf8( 0xfffe )*/ );
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UTF8_FFFF', "\xef\xbf\xbf" /*codepointToUtf8( 0xffff )*/ );
-
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UTF8_HEAD', false );
-/**
- * @deprecated since 1.25, use UtfNormal\Constants instead
- */
-define( 'UTF8_TAIL', true );
diff --git a/includes/libs/normal/UtfNormalUtil.php b/includes/libs/normal/UtfNormalUtil.php
deleted file mode 100644 (file)
index 9ed9bc2..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-<?php
-/**
- * Some of these functions are adapted from places in MediaWiki.
- * Should probably merge them for consistency.
- *
- * Copyright © 2004 Brion Vibber <brion@pobox.com>
- * https://www.mediawiki.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup UtfNormal
- */
-
-
-use UtfNormal\Utils;
-
-/**
- * Return UTF-8 sequence for a given Unicode code point.
- *
- * @param $codepoint Integer:
- * @return String
- * @throws InvalidArgumentException if fed out of range data.
- * @public
- * @deprecated since 1.25, use UtfNormal\Utils directly
- */
-function codepointToUtf8( $codepoint ) {
-       return Utils::codepointToUtf8( $codepoint );
-}
-
-/**
- * Take a series of space-separated hexadecimal numbers representing
- * Unicode code points and return a UTF-8 string composed of those
- * characters. Used by UTF-8 data generation and testing routines.
- *
- * @param $sequence String
- * @return String
- * @throws InvalidArgumentException if fed out of range data.
- * @private
- * @deprecated since 1.25, use UtfNormal\Utils directly
- */
-function hexSequenceToUtf8( $sequence ) {
-       return Utils::hexSequenceToUtf8( $sequence );
-}
-
-/**
- * Take a UTF-8 string and return a space-separated series of hex
- * numbers representing Unicode code points. For debugging.
- *
- * @fixme this is private but extensions + maint scripts are using it
- * @param string $str UTF-8 string.
- * @return string
- * @private
- */
-function utf8ToHexSequence( $str ) {
-       $buf = '';
-       foreach ( preg_split( '//u', $str, -1, PREG_SPLIT_NO_EMPTY ) as $cp ) {
-               $buf .= sprintf( '%04x ', UtfNormal\Utils::utf8ToCodepoint( $cp ) );
-       }
-
-       return rtrim( $buf );
-}
-
-/**
- * Determine the Unicode codepoint of a single-character UTF-8 sequence.
- * Does not check for invalid input data.
- *
- * @param $char String
- * @return Integer
- * @public
- * @deprecated since 1.25, use UtfNormal\Utils directly
- */
-function utf8ToCodepoint( $char ) {
-       return Utils::utf8ToCodepoint( $char );
-}
-
-/**
- * Escape a string for inclusion in a PHP single-quoted string literal.
- *
- * @param string $string string to be escaped.
- * @return String: escaped string.
- * @public
- * @deprecated since 1.25, use UtfNormal\Utils directly
- */
-function escapeSingleString( $string ) {
-       return Utils::escapeSingleString( $string );
-}
old mode 100755 (executable)
new mode 100644 (file)
index 5d9557a..c32efb9
@@ -279,13 +279,32 @@ class WANObjectCache {
        /**
         * Fetch the value of a timestamp "check" key
         *
+        * The key will be *initialized* to the current time if not set,
+        * so only call this method if this behavior is actually desired
+        *
+        * The timestamp can be used to check whether a cached value is valid.
+        * Callers should not assume that this returns the same timestamp in
+        * all datacenters due to relay delays.
+        *
+        * The level of staleness can roughly be estimated from this key, but
+        * if the key was evicted from cache, such calculations may show the
+        * time since expiry as ~0 seconds.
+        *
         * Note that "check" keys won't collide with other regular keys
         *
         * @param string $key
-        * @return float|bool TS_UNIX timestamp of the key; false if not present
+        * @return float UNIX timestamp of the key
         */
        final public function getCheckKeyTime( $key ) {
-               return self::parsePurgeValue( $this->cache->get( self::TIME_KEY_PREFIX . $key ) );
+               $key = self::TIME_KEY_PREFIX . $key;
+
+               $time = self::parsePurgeValue( $this->cache->get( $key ) );
+               if ( $time === false ) {
+                       $time = microtime( true );
+                       $this->cache->add( $key, self::PURGE_VAL_PREFIX . $time, self::CHECK_KEY_TTL );
+               }
+
+               return $time;
        }
 
        /**
diff --git a/includes/logging/ContentModelLogFormatter.php b/includes/logging/ContentModelLogFormatter.php
new file mode 100644 (file)
index 0000000..982fcc3
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+
+class ContentModelLogFormatter extends LogFormatter {
+       protected function getMessageParameters() {
+               $lang = $this->context->getLanguage();
+               $params = parent::getMessageParameters();
+               $params[3] = ContentHandler::getLocalizedName( $params[3], $lang );
+               $params[4] = ContentHandler::getLocalizedName( $params[4], $lang );
+               return $params;
+       }
+
+       public function getActionLinks() {
+               if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) // Action is hidden
+                       || $this->entry->getSubtype() !== 'change'
+                       || !$this->context->getUser()->isAllowed( 'editcontentmodel' )
+               ) {
+                       return '';
+               }
+
+               $params = $this->extractParameters();
+               $revert = Linker::linkKnown(
+                       SpecialPage::getTitleFor( 'ChangeContentModel' ),
+                       $this->msg( 'logentry-contentmodel-change-revertlink' )->escaped(),
+                       array(),
+                       array(
+                               'pagetitle' => $this->entry->getTarget()->getPrefixedText(),
+                               'model' => $params[3],
+                               'reason' => $this->msg( 'logentry-contentmodel-change-revert' )->inContentLanguage()->text(),
+                       )
+               );
+
+               return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
+       }
+}
index c359659..1027732 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;
index 5af7fbe..4be20b2 100644 (file)
@@ -93,9 +93,8 @@ class BitmapHandler extends TransformationalImageHandler {
                                // JPEG decoder hint to reduce memory, available since IM 6.5.6-2
                                $decoderHint = array( '-define', "jpeg:size={$params['physicalDimensions']}" );
                        }
-               } elseif ( $params['mimeType'] == 'image/png' ) {
+               } elseif ( $params['mimeType'] == 'image/png' || $params['mimeType'] == 'image/webp' ) {
                        $quality = array( '-quality', '95' ); // zlib 9, adaptive filtering
-
                } elseif ( $params['mimeType'] == 'image/gif' ) {
                        if ( $this->getImageArea( $image ) > $wgMaxAnimatedGifArea ) {
                                // Extract initial frame only; we're so big it'll
diff --git a/includes/media/WebP.php b/includes/media/WebP.php
new file mode 100644 (file)
index 0000000..05d12c4
--- /dev/null
@@ -0,0 +1,306 @@
+<?php
+/**
+ * Handler for Google's WebP format <https://developers.google.com/speed/webp/>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Media
+ */
+
+/**
+ * Handler for Google's WebP format <https://developers.google.com/speed/webp/>
+ *
+ * @ingroup Media
+ */
+class WebPHandler extends BitmapHandler {
+       const BROKEN_FILE = '0'; // value to store in img_metadata if error extracting metadata.
+       /**
+        * @var int Minimum chunk header size to be able to read all header types
+        */
+       const MINIMUM_CHUNK_HEADER_LENGTH = 18;
+       /**
+        * @var int version of the metadata stored in db records
+        */
+       const _MW_WEBP_VERSION = 1;
+
+       const VP8X_ICC = 32;
+       const VP8X_ALPHA = 16;
+       const VP8X_EXIF = 8;
+       const VP8X_XMP = 4;
+       const VP8X_ANIM = 2;
+
+       public function getMetadata( $image, $filename ) {
+               $parsedWebPData = self::extractMetadata( $filename );
+               if ( !$parsedWebPData ) {
+                       return self::BROKEN_FILE;
+               }
+
+               $parsedWebPData['metadata']['_MW_WEBP_VERSION'] = self::_MW_WEBP_VERSION;
+               return serialize( $parsedWebPData );
+       }
+
+       public function getMetadataType( $image ) {
+               return 'parsed-webp';
+       }
+
+       public function isMetadataValid( $image, $metadata ) {
+               if ( $metadata === self::BROKEN_FILE ) {
+                               // Do not repetitivly regenerate metadata on broken file.
+                               return self::METADATA_GOOD;
+               }
+
+               wfSuppressWarnings();
+               $data = unserialize( $metadata );
+               wfRestoreWarnings();
+
+               if ( !$data || !is_array( $data ) ) {
+                               wfDebug( __METHOD__ . " invalid WebP metadata\n" );
+
+                               return self::METADATA_BAD;
+               }
+
+               if ( !isset( $data['metadata']['_MW_WEBP_VERSION'] )
+                               || $data['metadata']['_MW_WEBP_VERSION'] != self::_MW_WEBP_VERSION
+               ) {
+                               wfDebug( __METHOD__ . " old but compatible WebP metadata\n" );
+
+                               return self::METADATA_COMPATIBLE;
+               }
+               return self::METADATA_GOOD;
+       }
+
+       /**
+        * Extracts the image size and WebP type from a file
+        *
+        * @param string $chunks Chunks as extracted by RiffExtractor
+        * @return array|bool Header data array with entries 'compression', 'width' and 'height',
+        * where 'compression' can be 'lossy', 'lossless', 'animated' or 'unknown'. False if
+        * file is not a valid WebP file.
+        */
+       public static function extractMetadata( $filename ) {
+               wfDebugLog( 'WebP', __METHOD__ . ": Extracting metadata from $filename\n" );
+
+               $info = RiffExtractor::findChunksFromFile( $filename, 100 );
+               if ( $info === false ) {
+                       wfDebugLog( 'WebP', __METHOD__ . ": Not a valid RIFF file\n" );
+                       return false;
+               }
+
+               if ( $info['fourCC'] != 'WEBP' ) {
+                       wfDebugLog( 'WebP', __METHOD__ . ': FourCC was not WEBP: ' .
+                               bin2hex( $info['fourCC'] ) .  " \n" );
+                       return false;
+               }
+
+               $metadata = self::extractMetadataFromChunks( $info['chunks'], $filename );
+               if ( !$metadata ) {
+                       wfDebugLog( 'WebP', __METHOD__ . ": No VP8 chunks found\n" );
+                       return false;
+               }
+
+               return $metadata;
+       }
+
+       /**
+        * Extracts the image size and WebP type from a file based on the chunk list
+        * @param array $chunks Chunks as extracted by RiffExtractor
+        * @return array Header data array with entries 'compression', 'width' and 'height', where
+        * 'compression' can be 'lossy', 'lossless', 'animated' or 'unknown'
+        */
+       public static function extractMetadataFromChunks( $chunks, $filename ) {
+               $vp8Info = array();
+
+               foreach ( $chunks as $chunk ) {
+                       if ( !in_array( $chunk['fourCC'], array( 'VP8 ', 'VP8L', 'VP8X' ) ) ) {
+                               // Not a chunk containing interesting metadata
+                               continue;
+                       }
+
+                       $chunkHeader = file_get_contents( $filename, false, null,
+                               $chunk['start'], self::MINIMUM_CHUNK_HEADER_LENGTH );
+                       wfDebugLog( 'WebP', __METHOD__ . ": {$chunk['fourCC']}\n" );
+
+                       switch ( $chunk['fourCC'] ) {
+                               case 'VP8 ':
+                                       return array_merge( $vp8Info,
+                                               self::decodeLossyChunkHeader( $chunkHeader ) );
+                               case 'VP8L':
+                                       return array_merge( $vp8Info,
+                                               self::decodeLosslessChunkHeader( $chunkHeader ) );
+                               case 'VP8X':
+                                       $vp8Info = array_merge( $vp8Info,
+                                               self::decodeExtendedChunkHeader( $chunkHeader ) );
+                                       // Continue looking for other chunks to improve the metadata
+                                       break;
+                       }
+               }
+               return $vp8Info;
+       }
+
+       /**
+        * Decodes a lossy chunk header
+        * @param string $header Header string
+        * @return boolean|array See WebPHandler::decodeHeader
+        */
+       protected static function decodeLossyChunkHeader( $header ) {
+               // Bytes 0-3 are 'VP8 '
+               // Bytes 4-7 are the VP8 stream size
+               // Bytes 8-10 are the frame tag
+               // Bytes 11-13 are 0x9D 0x01 0x2A called the sync code
+               $syncCode = substr( $header, 11, 3 );
+               if ( $syncCode != "\x9D\x01\x2A" ) {
+                       wfDebugLog( 'WebP', __METHOD__ . ': Invalid sync code: ' .
+                               bin2hex( $syncCode ) . "\n" );
+                       return array();
+               }
+               // Bytes 14-17 are image size
+               $imageSize = unpack( 'v2', substr( $header, 14, 4 ) );
+               // Image sizes are 14 bit, 2 MSB are scaling parameters which are ignored here
+               return array(
+                       'compression' => 'lossy',
+                       'width' => $imageSize[1] & 0x3FFF,
+                       'height' => $imageSize[2] & 0x3FFF
+               );
+       }
+
+       /**
+        * Decodes a lossless chunk header
+        * @param string $header Header string
+        * @return boolean|array See WebPHandler::decodeHeader
+        */
+       public static function decodeLosslessChunkHeader( $header ) {
+               // Bytes 0-3 are 'VP8L'
+               // Bytes 4-7 are chunk stream size
+               // Byte 8 is 0x2F called the signature
+               if ( $header{8} != "\x2F" ) {
+                       wfDebugLog( 'WebP',  __METHOD__ . ': Invalid signature: ' .
+                               bin2hex( $header{8} ) . "\n" );
+                       return array();
+               }
+               // Bytes 9-12 contain the image size
+               // Bits 0-13 are width-1; bits 15-27 are height-1
+               $imageSize = unpack( 'C4', substr( $header, 9, 4 ) );
+               return array(
+                               'compression' => 'lossless',
+                               'width' => ( $imageSize[1] | ( ( $imageSize[2] & 0x3F ) << 8 ) ) + 1,
+                               'height' => ( ( ( $imageSize[2] & 0xC0 ) >> 6 ) |
+                                               ( $imageSize[3] << 2 ) | ( ( $imageSize[4] & 0x03 ) << 10 ) ) + 1
+               );
+       }
+
+       /**
+        * Decodes an extended chunk header
+        * @param string $header Header string
+        * @return boolean|array See WebPHandler::decodeHeader
+        */
+       public static function decodeExtendedChunkHeader( $header ) {
+               // Bytes 0-3 are 'VP8X'
+               // Byte 4-7 are chunk length
+               // Byte 8-11 are a flag bytes
+               $flags = unpack( 'c', substr( $header, 8, 1 ) );
+
+               // Byte 12-17 are image size (24 bits)
+               $width = unpack( 'V', substr( $header, 12, 3 ) . "\x00" );
+               $height = unpack( 'V', substr( $header, 15, 3 ) . "\x00" );
+
+               return array(
+                       'compression' => 'unknown',
+                       'animated' => ($flags[1] & self::VP8X_ANIM) == self::VP8X_ANIM,
+                       'transparency' => ($flags[1] & self::VP8X_ALPHA) == self::VP8X_ALPHA,
+                       'width' => ( $width[1] & 0xFFFFFF ) + 1,
+                       'height' => ( $height[1] & 0xFFFFFF ) + 1
+               );
+       }
+
+       public function getImageSize( $file, $path, $metadata = false ) {
+               if ( $file === null ) {
+                       $metadata = self::getMetadata( $file, $path );
+               }
+               if ( $metadata === false ) {
+                       $metadata = $file->getMetadata();
+               }
+
+               wfSuppressWarnings();
+               $metadata = unserialize( $metadata );
+               wfRestoreWarnings();
+
+               if ( $metadata == false ) {
+                       return false;
+               }
+               return array( $metadata['width'], $metadata['height'] );
+       }
+
+       /**
+        * @param $file
+        * @return bool True, not all browsers support WebP
+        */
+       public function mustRender( $file ) {
+               return true;
+       }
+
+       /**
+        * @param $file
+        * @return bool False if we are unable to render this image
+        */
+       public function canRender( $file ) {
+               if ( self::isAnimatedImage( $file ) ) {
+                       return false;
+               }
+               return true;
+       }
+
+       /**
+        * @param File $image
+        * @return bool
+        */
+       public function isAnimatedImage( $image ) {
+               $ser = $image->getMetadata();
+               if ( $ser ) {
+                       $metadata = unserialize( $ser );
+                       if ( isset($metadata['animated']) && $metadata['animated'] === true ) {
+                               return true;
+                       }
+               }
+
+               return false;
+       }
+
+       public function canAnimateThumbnail( $file ) {
+               return false;
+       }
+
+       /**
+        * Render files as PNG
+        *
+        * @param $ext
+        * @param $mime
+        * @param $params
+        * @return array
+        */
+       public function getThumbType( $ext, $mime, $params = null ) {
+               return array( 'png', 'image/png' );
+       }
+
+       /**
+        * Must use "im" for XCF
+        *
+        * @return string
+        */
+       protected function getScalerType( $dstPath, $checkDstPath = true ) {
+               return 'im';
+       }
+}
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 c57c9fb..3b46249 100644 (file)
@@ -370,37 +370,7 @@ class SqlBagOStuff extends BagOStuff {
         * @return bool
         */
        public function set( $key, $value, $exptime = 0 ) {
-               list( $serverIndex, $tableName ) = $this->getTableByKey( $key );
-               try {
-                       $db = $this->getDB( $serverIndex );
-                       $exptime = intval( $exptime );
-
-                       if ( $exptime < 0 ) {
-                               $exptime = 0;
-                       }
-
-                       if ( $exptime == 0 ) {
-                               $encExpiry = $this->getMaxDateTime( $db );
-                       } else {
-                               $exptime = $this->convertExpiry( $exptime );
-                               $encExpiry = $db->timestamp( $exptime );
-                       }
-                       // (bug 24425) use a replace if the db supports it instead of
-                       // delete/insert to avoid clashes with conflicting keynames
-                       $db->replace(
-                               $tableName,
-                               array( 'keyname' ),
-                               array(
-                                       'keyname' => $key,
-                                       'value' => $db->encodeBlob( $this->serialize( $value ) ),
-                                       'exptime' => $encExpiry
-                               ), __METHOD__ );
-               } catch ( DBError $e ) {
-                       $this->handleWriteError( $e, $serverIndex );
-                       return false;
-               }
-
-               return true;
+               return $this->setMulti( array( $key => $value ), $exptime );
        }
 
        /**
@@ -761,6 +731,8 @@ class SqlBagOStuff extends BagOStuff {
         * @param int $serverIndex
         */
        protected function markServerDown( $exception, $serverIndex ) {
+               unset( $this->conns[$serverIndex] ); // bug T103435
+
                if ( isset( $this->connFailureTimes[$serverIndex] ) ) {
                        if ( time() - $this->connFailureTimes[$serverIndex] >= 60 ) {
                                unset( $this->connFailureTimes[$serverIndex] );
index a6b6b51..f213f6a 100644 (file)
@@ -1795,8 +1795,10 @@ class Article implements Page {
         */
        public function doDelete( $reason, $suppress = false ) {
                $error = '';
-               $outputPage = $this->getContext()->getOutput();
-               $status = $this->mPage->doDeleteArticleReal( $reason, $suppress, 0, true, $error );
+               $context = $this->getContext();
+               $outputPage = $context->getOutput();
+               $user = $context->getUser();
+               $status = $this->mPage->doDeleteArticleReal( $reason, $suppress, 0, true, $error, $user );
 
                if ( $status->isGood() ) {
                        $deleted = $this->getTitle()->getPrefixedText();
index 830a68f..8a30ad1 100644 (file)
@@ -41,7 +41,7 @@ class CoreParserFunctions {
                $noHashFunctions = array(
                        'ns', 'nse', 'urlencode', 'lcfirst', 'ucfirst', 'lc', 'uc',
                        'localurl', 'localurle', 'fullurl', 'fullurle', 'canonicalurl',
-                       'canonicalurle', 'formatnum', 'grammar', 'gender', 'plural',
+                       'canonicalurle', 'formatnum', 'grammar', 'gender', 'plural', 'bidi',
                        'numberofpages', 'numberofusers', 'numberofactiveusers',
                        'numberofarticles', 'numberoffiles', 'numberofadmins',
                        'numberingroup', 'numberofedits', 'language',
@@ -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 = '' ) {
@@ -353,6 +355,15 @@ class CoreParserFunctions {
                return $parser->getFunctionLang()->convertPlural( $text, $forms );
        }
 
+       /**
+        * @param Parser $parser
+        * @param string $text
+        * @return string
+        */
+       public static function bidi( $parser, $text = '' ) {
+               return $parser->getFunctionLang()->embedBidi( $text );
+       }
+
        /**
         * Override the title of the page when viewed, provided we've been given a
         * title which will normalise to the canonical title
index 3183689..83c2b0c 100644 (file)
@@ -1023,6 +1023,7 @@ class Parser {
                        }
 
                        $first_character = $line[0];
+                       $first_two = substr( $line, 0, 2 );
                        $matches = array();
 
                        if ( preg_match( '/^(:*)\{\|(.*)$/', $line, $matches ) ) {
@@ -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
@@ -5075,7 +5083,7 @@ class Parser {
         * in the Parser class.
         *
         * This interface (introduced r61913) appears to be undocumented, but
-        * 'markerName' is used by some core tag hooks to override which strip
+        * 'markerType' is used by some core tag hooks to override which strip
         * array their results are placed in. **Use great caution if attempting
         * this interface, as it is not documented and injudicious use could smash
         * private variables.**
index cdad9ba..70757ac 100644 (file)
@@ -72,22 +72,53 @@ class UserPasswordPolicy {
         */
        public function checkUserPassword( User $user, $password ) {
                $effectivePolicy = $this->getPoliciesForUser( $user );
-               $status = Status::newGood();
+               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;
        }
 
index 6752779..dc24f18 100644 (file)
@@ -35,7 +35,7 @@ class ProfilerOutputText extends ProfilerOutput {
                parent::__construct( $collector, $params );
                $this->thresholdMs = isset( $params['thresholdMs'] )
                        ? $params['thresholdMs']
-                       : .25;
+                       : 1.0;
        }
        public function log( array $stats ) {
                if ( $this->collector->getTemplated() ) {
index 92b0156..e6cb5eb 100644 (file)
@@ -206,7 +206,7 @@ class ResourceLoader implements LoggerAwareInterface {
                if ( !$options['cache'] ) {
                        $result = $this->applyFilter( $filter, $data );
                } else {
-                       $key = wfMemcKey( 'resourceloader', 'filter', $filter, self::$filterCacheVersion, md5( $data ) );
+                       $key = wfGlobalCacheKey( 'resourceloader', 'filter', $filter, self::$filterCacheVersion, md5( $data ) );
                        $cache = wfGetCache( wfIsHHVM() ? CACHE_ACCEL : CACHE_ANYTHING );
                        $cacheEntry = $cache->get( $key );
                        if ( is_string( $cacheEntry ) ) {
@@ -215,12 +215,17 @@ class ResourceLoader implements LoggerAwareInterface {
                        }
                        $result = '';
                        try {
-                               wfIncrStats( "resourceloader_cache.$filter.miss" );
+                               $stats = RequestContext::getMain()->getStats();
+                               $statStart = microtime( true );
+
                                $result = $this->applyFilter( $filter, $data );
+
+                               $stats->timing( "resourceloader_cache.$filter.miss", microtime( true ) - $statStart );
                                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(
@@ -234,16 +239,17 @@ class ResourceLoader implements LoggerAwareInterface {
        }
 
        private function applyFilter( $filter, $data ) {
-                       switch ( $filter ) {
-                               case 'minify-js':
-                                       return JavaScriptMinifier::minify( $data,
-                                               $this->config->get( 'ResourceLoaderMinifierStatementsOnOwnLine' ),
-                                               $this->config->get( 'ResourceLoaderMinifierMaxLineLength' )
-                                       );
-                               case 'minify-css':
-                                       return CSSMin::minify( $data );
-                       }
-                       return $data;
+               switch ( $filter ) {
+                       case 'minify-js':
+                               return JavaScriptMinifier::minify( $data,
+                                       $this->config->get( 'ResourceLoaderMinifierStatementsOnOwnLine' ),
+                                       $this->config->get( 'ResourceLoaderMinifierMaxLineLength' )
+                               );
+                       case 'minify-css':
+                               return CSSMin::minify( $data );
+               }
+
+               return $data;
        }
 
        /* Methods */
index 5e7067f..94edb36 100644 (file)
@@ -480,6 +480,8 @@ abstract class ResourceLoaderModule {
         */
        final protected function buildContent( ResourceLoaderContext $context ) {
                $rl = $context->getResourceLoader();
+               $stats = RequestContext::getMain()->getStats();
+               $statStart = microtime( true );
 
                // Only include properties that are relevant to this context (e.g. only=scripts)
                // and that are non-empty (e.g. don't include "templates" for modules without
@@ -568,6 +570,11 @@ abstract class ResourceLoaderModule {
                        $content['templates'] = $templates;
                }
 
+               $statTiming = microtime( true ) - $statStart;
+               $statName = str_replace( '.', '_', $this->getName() );
+               $stats->timing( "resourceloader_build.all", $statTiming );
+               $stats->timing( "resourceloader_build.$statName", $statTiming );
+
                return $content;
        }
 
index b913235..23bd394 100644 (file)
@@ -434,7 +434,8 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                        $legend .= Html::element( 'dt',
                                array( 'class' => $cssClass ), $context->msg( $letter )->text()
                        ) . "\n" .
-                       Html::rawElement( 'dd', array(),
+                       Html::rawElement( 'dd',
+                               array( 'class' => Sanitizer::escapeClass( 'mw-changeslist-legend-' . $key ) ),
                                $context->msg( $label )->parse()
                        ) . "\n";
                }
index a7a43b0..eb18b8f 100644 (file)
@@ -662,7 +662,6 @@ class SpecialPage {
         */
        public function getFinalGroupName() {
                $name = $this->getName();
-               $specialPageGroups = $this->getConfig()->get( 'SpecialPageGroups' );
 
                // Allow overbidding the group from the wiki side
                $msg = $this->msg( 'specialpages-specialpagegroup-' . strtolower( $name ) )->inContentLanguage();
@@ -671,18 +670,6 @@ class SpecialPage {
                } else {
                        // Than use the group from this object
                        $group = $this->getGroupName();
-
-                       // Group '-' is used as default to have the chance to determine,
-                       // if the special pages overrides this method,
-                       // if not overridden, $wgSpecialPageGroups is checked for b/c
-                       if ( $group === '-' && isset( $specialPageGroups[$name] ) ) {
-                               $group = $specialPageGroups[$name];
-                       }
-               }
-
-               // never give '-' back, change to 'other'
-               if ( $group === '-' ) {
-                       $group = 'other';
                }
 
                return $group;
@@ -697,8 +684,6 @@ class SpecialPage {
         * @since 1.21
         */
        protected function getGroupName() {
-               // '-' used here to determine, if this group is overridden or has a hardcoded 'other'
-               // Needed for b/c in getFinalGroupName
-               return '-';
+               return 'other';
        }
 }
index 3786b36..e794a5d 100644 (file)
@@ -218,7 +218,7 @@ class SpecialPageFactory {
                global $wgSpecialPages;
                global $wgDisableInternalSearch, $wgEmailAuthentication;
                global $wgEnableEmail, $wgEnableJavaScriptTest;
-               global $wgPageLanguageUseDB;
+               global $wgPageLanguageUseDB, $wgContentHandlerUseDB;
 
                if ( !is_array( self::$list ) ) {
 
@@ -244,6 +244,9 @@ class SpecialPageFactory {
                        if ( $wgPageLanguageUseDB ) {
                                self::$list['PageLanguage'] = 'SpecialPageLanguage';
                        }
+                       if ( $wgContentHandlerUseDB ) {
+                               self::$list['ChangeContentModel'] = 'SpecialChangeContentModel';
+                       }
 
                        self::$list['Activeusers'] = 'SpecialActiveUsers';
 
@@ -260,14 +263,13 @@ class SpecialPageFactory {
        }
 
        /**
-        * Initialise and return the list of special page aliases.  Returns an object with
-        * properties which can be accessed $obj->pagename - each property name is an
-        * alias, with the value being the canonical name of the special page. All
-        * registered special pages are guaranteed to map to themselves.
-        * @return object
+        * Initialise and return the list of special page aliases. Returns an array where
+        * the key is an alias, and the value is the canonical name of the special page.
+        * All registered special pages are guaranteed to map to themselves.
+        * @return array
         */
-       private static function getAliasListObject() {
-               if ( !is_object( self::$aliases ) ) {
+       private static function getAliasList() {
+               if ( is_null( self::$aliases ) ) {
                        global $wgContLang;
                        $aliases = $wgContLang->getSpecialPageAliases();
                        $pageList = self::getPageList();
@@ -310,9 +312,6 @@ class SpecialPageFactory {
                                        }
                                }
                        }
-
-                       // Cast to object: func()[$key] doesn't work, but func()->$key does
-                       self::$aliases = (object)self::$aliases;
                }
 
                return self::$aliases;
@@ -332,8 +331,9 @@ class SpecialPageFactory {
 
                $caseFoldedAlias = $wgContLang->caseFold( $bits[0] );
                $caseFoldedAlias = str_replace( ' ', '_', $caseFoldedAlias );
-               if ( isset( self::getAliasListObject()->$caseFoldedAlias ) ) {
-                       $name = self::getAliasListObject()->$caseFoldedAlias;
+               $aliases = self::getAliasList();
+               if ( isset( $aliases[$caseFoldedAlias] ) ) {
+                       $name = $aliases[$caseFoldedAlias];
                } else {
                        return array( null, null );
                }
@@ -347,34 +347,6 @@ class SpecialPageFactory {
                return array( $name, $par );
        }
 
-       /**
-        * Add a page to a certain display group for Special:SpecialPages
-        *
-        * @param SpecialPage|string $page
-        * @param string $group
-        * @deprecated since 1.21 Override SpecialPage::getGroupName
-        */
-       public static function setGroup( $page, $group ) {
-               wfDeprecated( __METHOD__, '1.21' );
-
-               global $wgSpecialPageGroups;
-               $name = is_object( $page ) ? $page->getName() : $page;
-               $wgSpecialPageGroups[$name] = $group;
-       }
-
-       /**
-        * Get the group that the special page belongs in on Special:SpecialPage
-        *
-        * @param SpecialPage $page
-        * @return string
-        * @deprecated since 1.21 Use SpecialPage::getFinalGroupName
-        */
-       public static function getGroup( &$page ) {
-               wfDeprecated( __METHOD__, '1.21' );
-
-               return $page->getFinalGroupName();
-       }
-
        /**
         * Check if a given name exist as a special page or as a special page alias
         *
@@ -637,7 +609,7 @@ class SpecialPageFactory {
        public static function getLocalNameFor( $name, $subpage = false ) {
                global $wgContLang;
                $aliases = $wgContLang->getSpecialPageAliases();
-               $aliasList = self::getAliasListObject();
+               $aliasList = self::getAliasList();
 
                // Find the first alias that maps back to $name
                if ( isset( $aliases[$name] ) ) {
@@ -645,8 +617,8 @@ class SpecialPageFactory {
                        foreach ( $aliases[$name] as $alias ) {
                                $caseFoldedAlias = $wgContLang->caseFold( $alias );
                                $caseFoldedAlias = str_replace( ' ', '_', $caseFoldedAlias );
-                               if ( isset( $aliasList->$caseFoldedAlias ) &&
-                                       $aliasList->$caseFoldedAlias === $name
+                               if ( isset( $aliasList[$caseFoldedAlias] ) &&
+                                       $aliasList[$caseFoldedAlias] === $name
                                ) {
                                        $name = $alias;
                                        $found = true;
diff --git a/includes/specials/SpecialChangeContentModel.php b/includes/specials/SpecialChangeContentModel.php
new file mode 100644 (file)
index 0000000..7647999
--- /dev/null
@@ -0,0 +1,234 @@
+<?php
+
+class SpecialChangeContentModel extends FormSpecialPage {
+
+       public function __construct() {
+               parent::__construct( 'ChangeContentModel', 'editcontentmodel' );
+       }
+
+       /**
+        * @var Title|null
+        */
+       private $title;
+
+       /**
+        * @var Revision|bool|null
+        *
+        * A Revision object, false if no revision exists, null if not loaded yet
+        */
+       private $oldRevision;
+
+       protected function setParameter( $par ) {
+               $par = $this->getRequest()->getVal( 'pagetitle', $par );
+               $title = Title::newFromText( $par );
+               if ( $title ) {
+                       $this->title = $title;
+                       $this->par = $title->getPrefixedText();
+               } else {
+                       $this->par = '';
+               }
+       }
+
+       protected function getDisplayFormat() {
+               return 'ooui';
+       }
+
+       protected function alterForm( HTMLForm $form ) {
+               if ( !$this->title ) {
+                       $form->setMethod( 'GET' );
+               }
+       }
+
+       public function validateTitle( $title ) {
+               if ( !$title ) {
+                       // No form input yet
+                       return true;
+               }
+               try {
+                       $titleObj = Title::newFromTextThrow( $title );
+               } catch ( MalformedTitleException $e ) {
+                       $msg = $this->msg( $e->getErrorMessage() );
+                       $params = $e->getErrorMessageParameters();
+                       if ( $params ) {
+                               $msg->params( $params );
+                       }
+                       return $msg->parse();
+               }
+               if ( !$titleObj->canExist() ) {
+                       return $this->msg(
+                               'changecontentmodel-title-cantexist',
+                               $titleObj->getPrefixedText()
+                       )->escaped();
+               }
+
+               $this->oldRevision = Revision::newFromTitle( $titleObj ) ?: false;
+
+               if ( $this->oldRevision ) {
+                       $oldContent = $this->oldRevision->getContent();
+                       if ( !$oldContent->getContentHandler()->supportsDirectEditing() ) {
+                               return $this->msg( 'changecontentmodel-nodirectediting' )
+                                       ->params( ContentHandler::getLocalizedName( $oldContent->getModel() ) )
+                                       ->escaped();
+                       }
+               }
+
+               return true;
+       }
+
+       protected function getFormFields() {
+               $that = $this;
+               $fields = array(
+                       'pagetitle' => array(
+                               'type' => 'text',
+                               'name' => 'pagetitle',
+                               'default' => $this->par,
+                               'label-message' => 'changecontentmodel-title-label',
+                               'validation-callback' => array( $this, 'validateTitle' ),
+                       ),
+               );
+               if ( $this->title ) {
+                       $fields['pagetitle']['readonly'] = true;
+                       $fields += array(
+                               'model' => array(
+                                       'type' => 'select',
+                                       'name' => 'model',
+                                       'options' => $this->getOptionsForTitle( $this->title ),
+                                       'label-message' => 'changecontentmodel-model-label'
+                               ),
+                               'reason' => array(
+                                       'type' => 'text',
+                                       'name' => 'reason',
+                                       'validation-callback' => function( $reason ) use ( $that ) {
+                                               $match = EditPage::matchSummarySpamRegex( $reason );
+                                               if ( $match ) {
+                                                       return $that->msg( 'spamprotectionmatch', $match )->parse();
+                                               }
+
+                                               return true;
+                                       },
+                                       'label-message' => 'changecontentmodel-reason-label',
+                               ),
+                       );
+               }
+
+               return $fields;
+       }
+
+       private function getOptionsForTitle( Title $title = null ) {
+               $models = ContentHandler::getContentModels();
+               $options = array();
+               foreach ( $models as $model ) {
+                       $handler = ContentHandler::getForModelID( $model );
+                       if ( !$handler->supportsDirectEditing() ) {
+                               continue;
+                       }
+                       if ( $title ) {
+                               if ( $title->getContentModel() === $model ) {
+                                       continue;
+                               }
+                               if ( !$handler->canBeUsedOn( $title ) ) {
+                                       continue;
+                               }
+                       }
+                       $options[ContentHandler::getLocalizedName( $model )] = $model;
+               }
+
+               return $options;
+       }
+
+       public function onSubmit( array $data ) {
+               global $wgContLang;
+
+               if ( $data['pagetitle'] === '' ) {
+                       // Initial form view of special page, pass
+                       return false;
+               }
+
+               // At this point, it has to be a POST request. This is enforced by HTMLForm,
+               // but lets be safe verify that.
+               if ( !$this->getRequest()->wasPosted() ) {
+                       throw new RuntimeException( "Form submission was not POSTed" );
+               }
+
+               $this->title = Title::newFromText( $data['pagetitle' ] );
+               $user = $this->getUser();
+               // Check permissions and make sure the user has permission to edit the specific page
+               $errors = $this->title->getUserPermissionsErrors( 'editcontentmodel', $user );
+               $errors = wfMergeErrorArrays( $errors, $this->title->getUserPermissionsErrors( 'edit', $user ) );
+               if ( $errors ) {
+                       $out = $this->getOutput();
+                       $wikitext = $out->formatPermissionsErrorMessage( $errors );
+                       // Hack to get our wikitext parsed
+                       return Status::newFatal( new RawMessage( '$1', array( $wikitext ) ) );
+               }
+
+               $page = WikiPage::factory( $this->title );
+               if ( $this->oldRevision === null ) {
+                       $this->oldRevision = $page->getRevision() ?: false;
+               }
+               $oldModel = $this->title->getContentModel();
+               if ( $this->oldRevision ) {
+                       $oldContent = $this->oldRevision->getContent();
+                       try {
+                               $newContent = ContentHandler::makeContent(
+                                       $oldContent->getNativeData(), $this->title, $data['model']
+                               );
+                       } catch ( MWException $e ) {
+                               return Status::newFatal(
+                                       $this->msg( 'changecontentmodel-cannot-convert' )
+                                               ->params(
+                                                       $this->title->getPrefixedText(),
+                                                       ContentHandler::getLocalizedName( $data['model'] )
+                                               )
+                               );
+                       }
+               } else {
+                       // Page doesn't exist, create an empty content object
+                       $newContent = ContentHandler::getForModelID( $data['model'] )->makeEmptyContent();
+               }
+               $flags = $this->oldRevision ? EDIT_UPDATE : EDIT_NEW;
+               if ( $user->isAllowed( 'bot' ) ) {
+                       $flags |= EDIT_FORCE_BOT;
+               }
+
+               $log = new ManualLogEntry( 'contentmodel', 'change' );
+               $log->setPerformer( $user );
+               $log->setTarget( $this->title );
+               $log->setComment( $data['reason'] );
+               $log->setParameters( array(
+                       '4::oldmodel' => $oldModel,
+                       '5::newmodel' => $data['model']
+               ) );
+
+               $formatter = LogFormatter::newFromEntry( $log );
+               $formatter->setContext( RequestContext::newExtraneousContext( $this->title ) );
+               $reason = $formatter->getPlainActionText();
+               if ( $data['reason'] !== '' ) {
+                       $reason .= $this->msg( 'colon-separator' )->inContentLanguage()->text() . $data['reason'];
+               }
+               # Truncate for whole multibyte characters.
+               $reason = $wgContLang->truncate( $reason, 255 );
+
+               $status = $page->doEditContent(
+                       $newContent,
+                       $reason,
+                       $flags,
+                       $this->oldRevision ? $this->oldRevision->getId() : false,
+                       $user
+               );
+               if ( !$status->isOK() ) {
+                       return $status;
+               }
+
+               $logid = $log->insert();
+               $log->publish( $logid );
+
+               return $status;
+       }
+
+       public function onSuccess() {
+               $out = $this->getOutput();
+               $out->setPageTitle( $this->msg( 'changecontentmodel-success-title' ) );
+               $out->addWikiMsg( 'changecontentmodel-success-text', $this->title );
+       }
+}
index babb315..c2aa704 100644 (file)
@@ -107,7 +107,7 @@ class SpecialChangeEmail extends FormSpecialPage {
        }
 
        protected function getDisplayFormat() {
-               return 'vform';
+               return 'ooui';
        }
 
        protected function alterForm( HTMLForm $form ) {
index c364f70..47b426d 100644 (file)
@@ -156,7 +156,6 @@ class DoubleRedirectsPage extends QueryPage {
                        $this->msg( 'parentheses', $this->msg( 'editlink' )->text() )->escaped(),
                        array(),
                        array(
-                               'redirect' => 'no',
                                'action' => 'edit'
                        )
                );
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 9476819..6756f27 100644 (file)
@@ -94,7 +94,7 @@ class SpecialPageLanguage extends FormSpecialPage {
        }
 
        protected function getDisplayFormat() {
-               return 'vform';
+               return 'ooui';
        }
 
        public function alterForm( HTMLForm $form ) {
index a2dc2ad..8cad616 100644 (file)
@@ -104,7 +104,7 @@ class SpecialPasswordReset extends FormSpecialPage {
        }
 
        protected function getDisplayFormat() {
-               return 'vform';
+               return 'ooui';
        }
 
        public function alterForm( HTMLForm $form ) {
index b5c9e19..e21eaeb 100644 (file)
@@ -89,6 +89,10 @@ class SpecialRandomInCategory extends FormSpecialPage {
                return false;
        }
 
+       protected function alterForm( HTMLForm $form ) {
+               $form->setSubmitTextMsg( 'randomincategory-submit' );
+       }
+
        protected function setParameter( $par ) {
                // if subpage present, fake form submission
                $this->onSubmit( array( 'category' => $par ) );
index ba2b9a5..27a3a69 100644 (file)
@@ -123,6 +123,10 @@ class SpecialResetTokens extends FormSpecialPage {
                }
        }
 
+       protected function getDisplayFormat() {
+               return 'ooui';
+       }
+
        public function onSubmit( array $formData ) {
                if ( $formData['tokens'] ) {
                        $user = $this->getUser();
index bc1bb3d..a8fab92 100644 (file)
@@ -328,6 +328,7 @@ class SpecialSearch extends SpecialPage {
                $num = $titleMatchesNum + $textMatchesNum;
                $totalRes = $numTitleMatches + $numTextMatches;
 
+               $out->enableOOUI();
                $out->addHtml(
                        # This is an awful awful ID name. It's not a table, but we
                        # named it poorly from when this was a table so now we're
@@ -1078,21 +1079,23 @@ class SpecialSearch extends SpecialPage {
         * @return string
         */
        protected function shortDialog( $term, $resultsShown, $totalNum ) {
-               $out = Html::hidden( 'title', $this->getPageTitle()->getPrefixedText() );
-               $out .= Html::hidden( 'profile', $this->profile ) . "\n";
-               // Term box
-               $out .= Html::input( 'search', $term, 'search', array(
-                       'id' => $this->isPowerSearch() ? 'powerSearchText' : 'searchText',
-                       'size' => '50',
-                       'autofocus' => trim( $term ) === '',
-                       'class' => 'mw-ui-input mw-ui-input-inline',
-               ) ) . "\n";
-               $out .= Html::hidden( 'fulltext', 'Search' ) . "\n";
-               $out .= Html::submitButton(
-                       $this->msg( 'searchbutton' )->text(),
-                       array( 'class' => 'mw-ui-button mw-ui-progressive' ),
-                       array( 'mw-ui-progressive' )
-               ) . "\n";
+               $out =
+                       Html::hidden( 'title', $this->getPageTitle()->getPrefixedText() ) .
+                       Html::hidden( 'profile', $this->profile ) .
+                       Html::hidden( 'fulltext', 'Search' ) .
+                       new MediaWiki\Widget\TitleInputWidget( array(
+                               'type' => 'search',
+                               'icon' => 'search',
+                               'id' => 'searchText',
+                               'name' => 'search',
+                               'autofocus' => trim( $term ) === '',
+                               'value' => $term,
+                       ) ) .
+                       new OOUI\ButtonInputWidget( array(
+                               'type' => 'submit',
+                               'label' => $this->msg( 'searchbutton' )->text(),
+                               'flags' => array( 'progressive', 'primary' ),
+                       ) );
 
                // Results-info
                if ( $totalNum > 0 && $this->offset < $totalNum ) {
index 8a66273..d7e75bc 100644 (file)
@@ -149,7 +149,8 @@ class PageArchive {
                        $fields,
                        $conds,
                        $join_conds,
-                       $options
+                       $options,
+                       ''
                );
 
                return $dbr->select( $tables,
@@ -757,7 +758,7 @@ class SpecialUndelete extends SpecialPage {
         * @return bool
         */
        protected function isAllowed( $permission, User $user = null ) {
-               $user = $user ? : $this->getUser();
+               $user = $user ?: $this->getUser();
                if ( $this->mTargetObj !== null ) {
                        return $this->mTargetObj->userCan( $permission, $user );
                } else {
index 472fdb7..aa51415 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' );
                }
 
index ab53951..0158fdb 100644 (file)
@@ -106,7 +106,7 @@ class UserrightsPage extends SpecialPage {
                        }
                }
 
-               if ( User::getCanonicalName( $this->mTarget ) === $user->getName() ) {
+               if ( $this->mTarget !== null && User::getCanonicalName( $this->mTarget ) === $user->getName() ) {
                        $this->isself = true;
                }
 
@@ -145,6 +145,7 @@ class UserrightsPage extends SpecialPage {
                if (
                        $request->wasPosted() &&
                        $request->getCheck( 'saveusergroups' ) &&
+                       $this->mTarget !== null &&
                        $user->matchEditToken( $request->getVal( 'wpEditToken' ), $this->mTarget )
                ) {
                        // save settings
index 4442d81..0a91957 100644 (file)
@@ -522,6 +522,9 @@ class SpecialVersion extends SpecialPage {
                $out .= Html::openElement( 'tr' )
                        . Html::element( 'th', array(), $this->msg( 'version-libraries-library' )->text() )
                        . Html::element( 'th', array(), $this->msg( 'version-libraries-version' )->text() )
+                       . Html::element( 'th', array(), $this->msg( 'version-libraries-license' )->text() )
+                       . Html::element( 'th', array(), $this->msg( 'version-libraries-description' )->text() )
+                       . Html::element( 'th', array(), $this->msg( 'version-libraries-authors' )->text() )
                        . Html::closeElement( 'tr' );
 
                foreach ( $lock->getInstalledDependencies() as $name => $info ) {
@@ -530,13 +533,28 @@ class SpecialVersion extends SpecialPage {
                                // in their proper section
                                continue;
                        }
+                       $authors = array_map( function( $arr ) {
+                               // If a homepage is set, link to it
+                               if ( isset( $arr['homepage'] ) ) {
+                                       return "[{$arr['homepage']} {$arr['name']}]";
+                               }
+                               return $arr['name'];
+                       }, $info['authors'] );
+                       $authors = $this->listAuthors( $authors, false, "$IP/vendor/$name" );
                        $out .= Html::openElement( 'tr' )
                                . Html::rawElement(
                                        'td',
                                        array(),
-                                       Linker::makeExternalLink( "https://packagist.org/packages/$name", $name )
+                                       Linker::makeExternalLink(
+                                               "https://packagist.org/packages/$name", $name,
+                                               true, '',
+                                               array( 'class' => 'mw-version-library-name' )
+                                       )
                                )
                                . Html::element( 'td', array(), $info['version'] )
+                               . Html::element( 'td', array(), $this->listToText( $info['licenses'] ) )
+                               . Html::element( 'td', array(), $info['description'] )
+                               . Html::rawElement( 'td', array(), $authors )
                                . Html::closeElement( 'tr' );
                }
                $out .= Html::closeElement( 'table' );
@@ -959,7 +977,8 @@ class SpecialVersion extends SpecialPage {
         *   'and others' will be added to the end of the credits.
         *
         * @param string|array $authors
-        * @param string $extName Name of the extension for link creation
+        * @param string|bool $extName Name of the extension for link creation,
+        *   false if no links should be created
         * @param string $extDir Path to the extension root directory
         *
         * @return string HTML fragment
@@ -972,7 +991,7 @@ class SpecialVersion extends SpecialPage {
                        if ( $item == '...' ) {
                                $hasOthers = true;
 
-                               if ( $this->getExtAuthorsFileName( $extDir ) ) {
+                               if ( $extName && $this->getExtAuthorsFileName( $extDir ) ) {
                                        $text = Linker::link(
                                                $this->getPageTitle( "Credits/$extName" ),
                                                $this->msg( 'version-poweredby-others' )->escaped()
@@ -991,7 +1010,7 @@ class SpecialVersion extends SpecialPage {
                        }
                }
 
-               if ( !$hasOthers && $this->getExtAuthorsFileName( $extDir ) ) {
+               if ( $extName && !$hasOthers && $this->getExtAuthorsFileName( $extDir ) ) {
                        $list[] = $text = Linker::link(
                                $this->getPageTitle( "Credits/$extName" ),
                                $this->msg( 'version-poweredby-others' )->escaped()
diff --git a/includes/widget/AUTHORS.txt b/includes/widget/AUTHORS.txt
new file mode 100644 (file)
index 0000000..10064b2
--- /dev/null
@@ -0,0 +1,10 @@
+Authors (alphabetically)
+
+Alex Monk <krenair@wikimedia.org>
+Bartosz Dziewoński <bdziewonski@wikimedia.org>
+Ed Sanders <esanders@wikimedia.org>
+James D. Forrester <jforrester@wikimedia.org>
+Roan Kattouw <roan@wikimedia.org>
+Sucheta Ghoshal <sghoshal@wikimedia.org>
+Timo Tijhof <timo@wikimedia.org>
+Trevor Parscal <trevor@wikimedia.org>
diff --git a/includes/widget/LICENSE.txt b/includes/widget/LICENSE.txt
new file mode 100644 (file)
index 0000000..b03ca80
--- /dev/null
@@ -0,0 +1,25 @@
+Copyright (c) 2011-2015 MediaWiki Widgets Team and others under the
+terms of The MIT License (MIT), as follows:
+
+This software consists of voluntary contributions made by many
+individuals (AUTHORS.txt) For exact contribution history, see the
+revision history and logs, available at https://gerrit.wikimedia.org
+
+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/includes/widget/TitleInputWidget.php b/includes/widget/TitleInputWidget.php
new file mode 100644 (file)
index 0000000..7ddc67a
--- /dev/null
@@ -0,0 +1,51 @@
+<?php
+/**
+ * MediaWiki Widgets – TitleInputWidget class.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+namespace MediaWiki\Widget;
+
+use OOUI\TextInputWidget;
+
+/**
+ * Title input widget.
+ */
+class TitleInputWidget extends TextInputWidget {
+
+       protected $namespace = null;
+       protected $relative = null;
+
+       /**
+        * @param array $config Configuration options
+        * @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, which are ignored in PHP and just shipped back to JS
+               if ( isset( $config['namespace'] ) ) {
+                       $this->namespace = $config['namespace'];
+               }
+
+               if ( isset( $config['relative'] ) ) {
+                       $this->relative = $config['relative'];
+               }
+
+               // Initialization
+               $this->addClasses( array( 'mw-widget-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 );
+       }
+}
index b1d88bc..fe0bd7e 100644 (file)
@@ -149,6 +149,28 @@ class Language {
         */
        static private $languageNameCache;
 
+       /**
+        * Unicode directional formatting characters, for embedBidi()
+        */
+       static private $lre = "\xE2\x80\xAA"; // U+202A LEFT-TO-RIGHT EMBEDDING
+       static private $rle = "\xE2\x80\xAB"; // U+202B RIGHT-TO-LEFT EMBEDDING
+       static private $pdf = "\xE2\x80\xAC"; // U+202C POP DIRECTIONAL FORMATTING
+
+       /**
+        * Directionality test regex for embedBidi(). 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.
+        *
+        * The form is '/(?:([strong ltr codepoint])|([strong rtl codepoint]))/u' .
+        *
+        * Generated by UnicodeJS (see tools/strongDir) from the UCD; see
+        * https://git.wikimedia.org/summary/unicodejs.git .
+        */
+       // @codeCoverageIgnoreStart
+       static private $strongDirRegex = '/(?:([\x{41}-\x{5a}\x{61}-\x{7a}\x{aa}\x{b5}\x{ba}\x{c0}-\x{d6}\x{d8}-\x{f6}\x{f8}-\x{2b8}\x{2bb}-\x{2c1}\x{2d0}\x{2d1}\x{2e0}-\x{2e4}\x{2ee}\x{370}-\x{373}\x{376}\x{377}\x{37a}-\x{37d}\x{37f}\x{386}\x{388}-\x{38a}\x{38c}\x{38e}-\x{3a1}\x{3a3}-\x{3f5}\x{3f7}-\x{482}\x{48a}-\x{52f}\x{531}-\x{556}\x{559}-\x{55f}\x{561}-\x{587}\x{589}\x{903}-\x{939}\x{93b}\x{93d}-\x{940}\x{949}-\x{94c}\x{94e}-\x{950}\x{958}-\x{961}\x{964}-\x{980}\x{982}\x{983}\x{985}-\x{98c}\x{98f}\x{990}\x{993}-\x{9a8}\x{9aa}-\x{9b0}\x{9b2}\x{9b6}-\x{9b9}\x{9bd}-\x{9c0}\x{9c7}\x{9c8}\x{9cb}\x{9cc}\x{9ce}\x{9d7}\x{9dc}\x{9dd}\x{9df}-\x{9e1}\x{9e6}-\x{9f1}\x{9f4}-\x{9fa}\x{a03}\x{a05}-\x{a0a}\x{a0f}\x{a10}\x{a13}-\x{a28}\x{a2a}-\x{a30}\x{a32}\x{a33}\x{a35}\x{a36}\x{a38}\x{a39}\x{a3e}-\x{a40}\x{a59}-\x{a5c}\x{a5e}\x{a66}-\x{a6f}\x{a72}-\x{a74}\x{a83}\x{a85}-\x{a8d}\x{a8f}-\x{a91}\x{a93}-\x{aa8}\x{aaa}-\x{ab0}\x{ab2}\x{ab3}\x{ab5}-\x{ab9}\x{abd}-\x{ac0}\x{ac9}\x{acb}\x{acc}\x{ad0}\x{ae0}\x{ae1}\x{ae6}-\x{af0}\x{af9}\x{b02}\x{b03}\x{b05}-\x{b0c}\x{b0f}\x{b10}\x{b13}-\x{b28}\x{b2a}-\x{b30}\x{b32}\x{b33}\x{b35}-\x{b39}\x{b3d}\x{b3e}\x{b40}\x{b47}\x{b48}\x{b4b}\x{b4c}\x{b57}\x{b5c}\x{b5d}\x{b5f}-\x{b61}\x{b66}-\x{b77}\x{b83}\x{b85}-\x{b8a}\x{b8e}-\x{b90}\x{b92}-\x{b95}\x{b99}\x{b9a}\x{b9c}\x{b9e}\x{b9f}\x{ba3}\x{ba4}\x{ba8}-\x{baa}\x{bae}-\x{bb9}\x{bbe}\x{bbf}\x{bc1}\x{bc2}\x{bc6}-\x{bc8}\x{bca}-\x{bcc}\x{bd0}\x{bd7}\x{be6}-\x{bf2}\x{c01}-\x{c03}\x{c05}-\x{c0c}\x{c0e}-\x{c10}\x{c12}-\x{c28}\x{c2a}-\x{c39}\x{c3d}\x{c41}-\x{c44}\x{c58}-\x{c5a}\x{c60}\x{c61}\x{c66}-\x{c6f}\x{c7f}\x{c82}\x{c83}\x{c85}-\x{c8c}\x{c8e}-\x{c90}\x{c92}-\x{ca8}\x{caa}-\x{cb3}\x{cb5}-\x{cb9}\x{cbd}-\x{cc4}\x{cc6}-\x{cc8}\x{cca}\x{ccb}\x{cd5}\x{cd6}\x{cde}\x{ce0}\x{ce1}\x{ce6}-\x{cef}\x{cf1}\x{cf2}\x{d02}\x{d03}\x{d05}-\x{d0c}\x{d0e}-\x{d10}\x{d12}-\x{d3a}\x{d3d}-\x{d40}\x{d46}-\x{d48}\x{d4a}-\x{d4c}\x{d4e}\x{d57}\x{d5f}-\x{d61}\x{d66}-\x{d75}\x{d79}-\x{d7f}\x{d82}\x{d83}\x{d85}-\x{d96}\x{d9a}-\x{db1}\x{db3}-\x{dbb}\x{dbd}\x{dc0}-\x{dc6}\x{dcf}-\x{dd1}\x{dd8}-\x{ddf}\x{de6}-\x{def}\x{df2}-\x{df4}\x{e01}-\x{e30}\x{e32}\x{e33}\x{e40}-\x{e46}\x{e4f}-\x{e5b}\x{e81}\x{e82}\x{e84}\x{e87}\x{e88}\x{e8a}\x{e8d}\x{e94}-\x{e97}\x{e99}-\x{e9f}\x{ea1}-\x{ea3}\x{ea5}\x{ea7}\x{eaa}\x{eab}\x{ead}-\x{eb0}\x{eb2}\x{eb3}\x{ebd}\x{ec0}-\x{ec4}\x{ec6}\x{ed0}-\x{ed9}\x{edc}-\x{edf}\x{f00}-\x{f17}\x{f1a}-\x{f34}\x{f36}\x{f38}\x{f3e}-\x{f47}\x{f49}-\x{f6c}\x{f7f}\x{f85}\x{f88}-\x{f8c}\x{fbe}-\x{fc5}\x{fc7}-\x{fcc}\x{fce}-\x{fda}\x{1000}-\x{102c}\x{1031}\x{1038}\x{103b}\x{103c}\x{103f}-\x{1057}\x{105a}-\x{105d}\x{1061}-\x{1070}\x{1075}-\x{1081}\x{1083}\x{1084}\x{1087}-\x{108c}\x{108e}-\x{109c}\x{109e}-\x{10c5}\x{10c7}\x{10cd}\x{10d0}-\x{1248}\x{124a}-\x{124d}\x{1250}-\x{1256}\x{1258}\x{125a}-\x{125d}\x{1260}-\x{1288}\x{128a}-\x{128d}\x{1290}-\x{12b0}\x{12b2}-\x{12b5}\x{12b8}-\x{12be}\x{12c0}\x{12c2}-\x{12c5}\x{12c8}-\x{12d6}\x{12d8}-\x{1310}\x{1312}-\x{1315}\x{1318}-\x{135a}\x{1360}-\x{137c}\x{1380}-\x{138f}\x{13a0}-\x{13f5}\x{13f8}-\x{13fd}\x{1401}-\x{167f}\x{1681}-\x{169a}\x{16a0}-\x{16f8}\x{1700}-\x{170c}\x{170e}-\x{1711}\x{1720}-\x{1731}\x{1735}\x{1736}\x{1740}-\x{1751}\x{1760}-\x{176c}\x{176e}-\x{1770}\x{1780}-\x{17b3}\x{17b6}\x{17be}-\x{17c5}\x{17c7}\x{17c8}\x{17d4}-\x{17da}\x{17dc}\x{17e0}-\x{17e9}\x{1810}-\x{1819}\x{1820}-\x{1877}\x{1880}-\x{18a8}\x{18aa}\x{18b0}-\x{18f5}\x{1900}-\x{191e}\x{1923}-\x{1926}\x{1929}-\x{192b}\x{1930}\x{1931}\x{1933}-\x{1938}\x{1946}-\x{196d}\x{1970}-\x{1974}\x{1980}-\x{19ab}\x{19b0}-\x{19c9}\x{19d0}-\x{19da}\x{1a00}-\x{1a16}\x{1a19}\x{1a1a}\x{1a1e}-\x{1a55}\x{1a57}\x{1a61}\x{1a63}\x{1a64}\x{1a6d}-\x{1a72}\x{1a80}-\x{1a89}\x{1a90}-\x{1a99}\x{1aa0}-\x{1aad}\x{1b04}-\x{1b33}\x{1b35}\x{1b3b}\x{1b3d}-\x{1b41}\x{1b43}-\x{1b4b}\x{1b50}-\x{1b6a}\x{1b74}-\x{1b7c}\x{1b82}-\x{1ba1}\x{1ba6}\x{1ba7}\x{1baa}\x{1bae}-\x{1be5}\x{1be7}\x{1bea}-\x{1bec}\x{1bee}\x{1bf2}\x{1bf3}\x{1bfc}-\x{1c2b}\x{1c34}\x{1c35}\x{1c3b}-\x{1c49}\x{1c4d}-\x{1c7f}\x{1cc0}-\x{1cc7}\x{1cd3}\x{1ce1}\x{1ce9}-\x{1cec}\x{1cee}-\x{1cf3}\x{1cf5}\x{1cf6}\x{1d00}-\x{1dbf}\x{1e00}-\x{1f15}\x{1f18}-\x{1f1d}\x{1f20}-\x{1f45}\x{1f48}-\x{1f4d}\x{1f50}-\x{1f57}\x{1f59}\x{1f5b}\x{1f5d}\x{1f5f}-\x{1f7d}\x{1f80}-\x{1fb4}\x{1fb6}-\x{1fbc}\x{1fbe}\x{1fc2}-\x{1fc4}\x{1fc6}-\x{1fcc}\x{1fd0}-\x{1fd3}\x{1fd6}-\x{1fdb}\x{1fe0}-\x{1fec}\x{1ff2}-\x{1ff4}\x{1ff6}-\x{1ffc}\x{200e}\x{2071}\x{207f}\x{2090}-\x{209c}\x{2102}\x{2107}\x{210a}-\x{2113}\x{2115}\x{2119}-\x{211d}\x{2124}\x{2126}\x{2128}\x{212a}-\x{212d}\x{212f}-\x{2139}\x{213c}-\x{213f}\x{2145}-\x{2149}\x{214e}\x{214f}\x{2160}-\x{2188}\x{2336}-\x{237a}\x{2395}\x{249c}-\x{24e9}\x{26ac}\x{2800}-\x{28ff}\x{2c00}-\x{2c2e}\x{2c30}-\x{2c5e}\x{2c60}-\x{2ce4}\x{2ceb}-\x{2cee}\x{2cf2}\x{2cf3}\x{2d00}-\x{2d25}\x{2d27}\x{2d2d}\x{2d30}-\x{2d67}\x{2d6f}\x{2d70}\x{2d80}-\x{2d96}\x{2da0}-\x{2da6}\x{2da8}-\x{2dae}\x{2db0}-\x{2db6}\x{2db8}-\x{2dbe}\x{2dc0}-\x{2dc6}\x{2dc8}-\x{2dce}\x{2dd0}-\x{2dd6}\x{2dd8}-\x{2dde}\x{3005}-\x{3007}\x{3021}-\x{3029}\x{302e}\x{302f}\x{3031}-\x{3035}\x{3038}-\x{303c}\x{3041}-\x{3096}\x{309d}-\x{309f}\x{30a1}-\x{30fa}\x{30fc}-\x{30ff}\x{3105}-\x{312d}\x{3131}-\x{318e}\x{3190}-\x{31ba}\x{31f0}-\x{321c}\x{3220}-\x{324f}\x{3260}-\x{327b}\x{327f}-\x{32b0}\x{32c0}-\x{32cb}\x{32d0}-\x{32fe}\x{3300}-\x{3376}\x{337b}-\x{33dd}\x{33e0}-\x{33fe}\x{3400}-\x{4db5}\x{4e00}-\x{9fd5}\x{a000}-\x{a48c}\x{a4d0}-\x{a60c}\x{a610}-\x{a62b}\x{a640}-\x{a66e}\x{a680}-\x{a69d}\x{a6a0}-\x{a6ef}\x{a6f2}-\x{a6f7}\x{a722}-\x{a787}\x{a789}-\x{a7ad}\x{a7b0}-\x{a7b7}\x{a7f7}-\x{a801}\x{a803}-\x{a805}\x{a807}-\x{a80a}\x{a80c}-\x{a824}\x{a827}\x{a830}-\x{a837}\x{a840}-\x{a873}\x{a880}-\x{a8c3}\x{a8ce}-\x{a8d9}\x{a8f2}-\x{a8fd}\x{a900}-\x{a925}\x{a92e}-\x{a946}\x{a952}\x{a953}\x{a95f}-\x{a97c}\x{a983}-\x{a9b2}\x{a9b4}\x{a9b5}\x{a9ba}\x{a9bb}\x{a9bd}-\x{a9cd}\x{a9cf}-\x{a9d9}\x{a9de}-\x{a9e4}\x{a9e6}-\x{a9fe}\x{aa00}-\x{aa28}\x{aa2f}\x{aa30}\x{aa33}\x{aa34}\x{aa40}-\x{aa42}\x{aa44}-\x{aa4b}\x{aa4d}\x{aa50}-\x{aa59}\x{aa5c}-\x{aa7b}\x{aa7d}-\x{aaaf}\x{aab1}\x{aab5}\x{aab6}\x{aab9}-\x{aabd}\x{aac0}\x{aac2}\x{aadb}-\x{aaeb}\x{aaee}-\x{aaf5}\x{ab01}-\x{ab06}\x{ab09}-\x{ab0e}\x{ab11}-\x{ab16}\x{ab20}-\x{ab26}\x{ab28}-\x{ab2e}\x{ab30}-\x{ab65}\x{ab70}-\x{abe4}\x{abe6}\x{abe7}\x{abe9}-\x{abec}\x{abf0}-\x{abf9}\x{ac00}-\x{d7a3}\x{d7b0}-\x{d7c6}\x{d7cb}-\x{d7fb}\x{e000}-\x{fa6d}\x{fa70}-\x{fad9}\x{fb00}-\x{fb06}\x{fb13}-\x{fb17}\x{ff21}-\x{ff3a}\x{ff41}-\x{ff5a}\x{ff66}-\x{ffbe}\x{ffc2}-\x{ffc7}\x{ffca}-\x{ffcf}\x{ffd2}-\x{ffd7}\x{ffda}-\x{ffdc}\x{10000}-\x{1000b}\x{1000d}-\x{10026}\x{10028}-\x{1003a}\x{1003c}\x{1003d}\x{1003f}-\x{1004d}\x{10050}-\x{1005d}\x{10080}-\x{100fa}\x{10100}\x{10102}\x{10107}-\x{10133}\x{10137}-\x{1013f}\x{101d0}-\x{101fc}\x{10280}-\x{1029c}\x{102a0}-\x{102d0}\x{10300}-\x{10323}\x{10330}-\x{1034a}\x{10350}-\x{10375}\x{10380}-\x{1039d}\x{1039f}-\x{103c3}\x{103c8}-\x{103d5}\x{10400}-\x{1049d}\x{104a0}-\x{104a9}\x{10500}-\x{10527}\x{10530}-\x{10563}\x{1056f}\x{10600}-\x{10736}\x{10740}-\x{10755}\x{10760}-\x{10767}\x{11000}\x{11002}-\x{11037}\x{11047}-\x{1104d}\x{11066}-\x{1106f}\x{11082}-\x{110b2}\x{110b7}\x{110b8}\x{110bb}-\x{110c1}\x{110d0}-\x{110e8}\x{110f0}-\x{110f9}\x{11103}-\x{11126}\x{1112c}\x{11136}-\x{11143}\x{11150}-\x{11172}\x{11174}-\x{11176}\x{11182}-\x{111b5}\x{111bf}-\x{111c9}\x{111cd}\x{111d0}-\x{111df}\x{111e1}-\x{111f4}\x{11200}-\x{11211}\x{11213}-\x{1122e}\x{11232}\x{11233}\x{11235}\x{11238}-\x{1123d}\x{11280}-\x{11286}\x{11288}\x{1128a}-\x{1128d}\x{1128f}-\x{1129d}\x{1129f}-\x{112a9}\x{112b0}-\x{112de}\x{112e0}-\x{112e2}\x{112f0}-\x{112f9}\x{11302}\x{11303}\x{11305}-\x{1130c}\x{1130f}\x{11310}\x{11313}-\x{11328}\x{1132a}-\x{11330}\x{11332}\x{11333}\x{11335}-\x{11339}\x{1133d}-\x{1133f}\x{11341}-\x{11344}\x{11347}\x{11348}\x{1134b}-\x{1134d}\x{11350}\x{11357}\x{1135d}-\x{11363}\x{11480}-\x{114b2}\x{114b9}\x{114bb}-\x{114be}\x{114c1}\x{114c4}-\x{114c7}\x{114d0}-\x{114d9}\x{11580}-\x{115b1}\x{115b8}-\x{115bb}\x{115be}\x{115c1}-\x{115db}\x{11600}-\x{11632}\x{1163b}\x{1163c}\x{1163e}\x{11641}-\x{11644}\x{11650}-\x{11659}\x{11680}-\x{116aa}\x{116ac}\x{116ae}\x{116af}\x{116b6}\x{116c0}-\x{116c9}\x{11700}-\x{11719}\x{11720}\x{11721}\x{11726}\x{11730}-\x{1173f}\x{118a0}-\x{118f2}\x{118ff}\x{11ac0}-\x{11af8}\x{12000}-\x{12399}\x{12400}-\x{1246e}\x{12470}-\x{12474}\x{12480}-\x{12543}\x{13000}-\x{1342e}\x{14400}-\x{14646}\x{16800}-\x{16a38}\x{16a40}-\x{16a5e}\x{16a60}-\x{16a69}\x{16a6e}\x{16a6f}\x{16ad0}-\x{16aed}\x{16af5}\x{16b00}-\x{16b2f}\x{16b37}-\x{16b45}\x{16b50}-\x{16b59}\x{16b5b}-\x{16b61}\x{16b63}-\x{16b77}\x{16b7d}-\x{16b8f}\x{16f00}-\x{16f44}\x{16f50}-\x{16f7e}\x{16f93}-\x{16f9f}\x{1b000}\x{1b001}\x{1bc00}-\x{1bc6a}\x{1bc70}-\x{1bc7c}\x{1bc80}-\x{1bc88}\x{1bc90}-\x{1bc99}\x{1bc9c}\x{1bc9f}\x{1d000}-\x{1d0f5}\x{1d100}-\x{1d126}\x{1d129}-\x{1d166}\x{1d16a}-\x{1d172}\x{1d183}\x{1d184}\x{1d18c}-\x{1d1a9}\x{1d1ae}-\x{1d1e8}\x{1d360}-\x{1d371}\x{1d400}-\x{1d454}\x{1d456}-\x{1d49c}\x{1d49e}\x{1d49f}\x{1d4a2}\x{1d4a5}\x{1d4a6}\x{1d4a9}-\x{1d4ac}\x{1d4ae}-\x{1d4b9}\x{1d4bb}\x{1d4bd}-\x{1d4c3}\x{1d4c5}-\x{1d505}\x{1d507}-\x{1d50a}\x{1d50d}-\x{1d514}\x{1d516}-\x{1d51c}\x{1d51e}-\x{1d539}\x{1d53b}-\x{1d53e}\x{1d540}-\x{1d544}\x{1d546}\x{1d54a}-\x{1d550}\x{1d552}-\x{1d6a5}\x{1d6a8}-\x{1d6da}\x{1d6dc}-\x{1d714}\x{1d716}-\x{1d74e}\x{1d750}-\x{1d788}\x{1d78a}-\x{1d7c2}\x{1d7c4}-\x{1d7cb}\x{1d800}-\x{1d9ff}\x{1da37}-\x{1da3a}\x{1da6d}-\x{1da74}\x{1da76}-\x{1da83}\x{1da85}-\x{1da8b}\x{1f110}-\x{1f12e}\x{1f130}-\x{1f169}\x{1f170}-\x{1f19a}\x{1f1e6}-\x{1f202}\x{1f210}-\x{1f23a}\x{1f240}-\x{1f248}\x{1f250}\x{1f251}\x{20000}-\x{2a6d6}\x{2a700}-\x{2b734}\x{2b740}-\x{2b81d}\x{2b820}-\x{2cea1}\x{2f800}-\x{2fa1d}\x{f0000}-\x{ffffd}\x{100000}-\x{10fffd}])|([\x{590}\x{5be}\x{5c0}\x{5c3}\x{5c6}\x{5c8}-\x{5ff}\x{7c0}-\x{7ea}\x{7f4}\x{7f5}\x{7fa}-\x{815}\x{81a}\x{824}\x{828}\x{82e}-\x{858}\x{85c}-\x{89f}\x{200f}\x{fb1d}\x{fb1f}-\x{fb28}\x{fb2a}-\x{fb4f}\x{10800}-\x{1091e}\x{10920}-\x{10a00}\x{10a04}\x{10a07}-\x{10a0b}\x{10a10}-\x{10a37}\x{10a3b}-\x{10a3e}\x{10a40}-\x{10ae4}\x{10ae7}-\x{10b38}\x{10b40}-\x{10e5f}\x{10e7f}-\x{10fff}\x{1e800}-\x{1e8cf}\x{1e8d7}-\x{1edff}\x{1ef00}-\x{1efff}\x{608}\x{60b}\x{60d}\x{61b}-\x{64a}\x{66d}-\x{66f}\x{671}-\x{6d5}\x{6e5}\x{6e6}\x{6ee}\x{6ef}\x{6fa}-\x{710}\x{712}-\x{72f}\x{74b}-\x{7a5}\x{7b1}-\x{7bf}\x{8a0}-\x{8e2}\x{fb50}-\x{fd3d}\x{fd40}-\x{fdcf}\x{fdf0}-\x{fdfc}\x{fdfe}\x{fdff}\x{fe70}-\x{fefe}\x{1ee00}-\x{1eeef}\x{1eef2}-\x{1eeff}]))/u';
+       // @codeCoverageIgnoreEnd
+
        /**
         * Get a cached or new language object for a given language code
         * @param string $code
@@ -1992,6 +2014,29 @@ class Language {
                return array( $gy_offset, $gm, $gd );
        }
 
+       /**
+        * Gets directionality of the first strongly directional codepoint, for embedBidi()
+        *
+        * 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.
+        *
+        * @param string $text Text to test
+        * @return null|string Directionality ('ltr' or 'rtl') or null
+        */
+       private static function strongDirFromContent( $text = '' ) {
+               if ( !preg_match( self::$strongDirRegex, $text, $matches ) ) {
+                       return null;
+               }
+               if ( $matches[1] === '' ) {
+                       return 'rtl';
+               }
+               return 'ltr';
+       }
+
        /**
         * Roman number formatting up to 10000
         *
@@ -3966,6 +4011,36 @@ class Language {
                return $forms;
        }
 
+       /**
+        * 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.
+        *
+        * @param string $text Text to wrap
+        * @return string Text, wrapped in LRE...PDF or RLE...PDF or nothing
+        */
+       public function embedBidi( $text = '' ) {
+               $dir = Language::strongDirFromContent( $text );
+               if ( $dir === 'ltr' ) {
+                       // Wrap in LEFT-TO-RIGHT EMBEDDING ... POP DIRECTIONAL FORMATTING
+                       return self::$lre . $text . self::$pdf;
+               }
+               if ( $dir === 'rtl' ) {
+                       // Wrap in RIGHT-TO-LEFT EMBEDDING ... POP DIRECTIONAL FORMATTING
+                       return self::$rle . $text . self::$pdf;
+               }
+               // No strong directionality: do not wrap
+               return $text;
+       }
+
        /**
         * @todo Maybe translate block durations.  Note that this function is somewhat misnamed: it
         * deals with translating the *duration* ("1 week", "4 days", etc), not the expiry time
index befe9b1..c8667e9 100644 (file)
        "no-null-revision": "تعذر إنشاء مراجعة جديدة فارغة لصفحة \"$1\"",
        "badtitle": "عنوان سيء",
        "badtitletext": "عنوان الصفحة المطلوب إما غير صحيح أو فارغ، وربما الرابط بين اللغات أو بين المشاريع خاطئ.\nربما يحوي محارف لا تصلح للاستخدام في العناوين.",
+       "title-invalid-empty": "عنوان الصفحة المطلوبة فارغ أو يحتوي اسم النطاق فقط.",
        "title-invalid-interwiki": "عنوان الصفحة المطلوب يتضمن وصلة لحلقة لغة وهو ما لا يمكن استخدامه في العناوين.",
        "title-invalid-talk-namespace": "عنوان الصفحة المطلوبة يشير إلى صفحة نقاش غير موجودة.",
        "title-invalid-characters": "عنوان الصفحة المطلوب يتضمن محارف غير صالحة: \"$1\"",
        "passwordreset": "إعادة ضبط كلمة السر",
        "passwordreset-text-one": "أكمل هذا النموذج لإعادة ضبط كلمة السر الخاصة بك.",
        "passwordreset-text-many": "{{PLURAL:$1||املأ الحقل لتستعيد كلمة السر|املأ أحد الحقلين لتستعيد كلمة السر|املأ أحد الحقول لتستعيد كلمة السر}}.",
-       "passwordreset-legend": "إعادة تعيين كلمة السر",
        "passwordreset-disabled": "عُطّلت إعادة تعيين كلمة السر على هذه الويكي.",
        "passwordreset-emaildisabled": "تم تعطيل ميزات البريد الإلكتروني على هذه الويكي.",
        "passwordreset-username": "اسم المستخدم:",
        "resettokens": "غير المفاتيح",
        "resettokens-text": " يمكن تغيير المفاتيح من الاطلاع على البيانات الخصوصية المتعلقة بحسابك.\nغير المفاتيح إذا أطلعت عليها أحدهم عن طريف الخطأ أو إذا كان حسابك قد اخترق.",
        "resettokens-no-tokens": "ما من مفاتيح للتغيير.",
-       "resettokens-legend": "غير المفاتيح",
        "resettokens-tokens": "مفاتيح:",
        "resettokens-token-label": "$1 (القيمة الحالية: $2)",
        "resettokens-watchlist-token": "رمز تغذية الوب (آتوم/آس إس إس) [[Special:Watchlist|للتغيرات التي على قائمة مراقبتك]]",
        "creating": "إنشاء «$1»",
        "editingsection": "تعديل $1 (قسم)",
        "editingcomment": "إنشاء قسم من «$1»",
-       "editconflict": "تضارب في التحرير: $1",
+       "editconflict": "تضارب تحرير: $1",
        "explainconflict": "لقد عدل شخص آخر هذه الصفحة بعد أن بدأت أنت بتحريرها.\nصندوق النصوص العلوي يحتوي على النص الموجود حاليا في الصفحة.\nالتعديلات التي أجريتها أنت معروضة في الصندوق أسفله.\nويلزم دمجها في النص الموجود حاليا.\n'''لن يحفظ''' بعد الضغط على زر \"احفظ الصفحة\" '''إلا''' ما هو موجود في الصندوق العلوي.",
        "yourtext": "نصك",
        "storedversion": "النسخة المخزنة",
        "right-override-export-depth": "تصدير الصفحات متضمنة الصفحات الموصولة حتى عمق 5",
        "right-sendemail": "إرسال رسائل بريد إلكتروني إلى مستخدمين آخرين",
        "right-passwordreset": "عرض رسائل إعادة ضبط كلمات السر",
+       "right-managechangetags": "إنشاء وحذف [[Special:Tags|الوسوم]] من قاعدة البيانات",
+       "right-applychangetags": "تطبيق [[Special:Tags|الوسوم]]  مع التغييرات التي أجريتها.",
        "newuserlogpage": "سجل إنشاء المستخدمين",
        "newuserlogpagetext": "هذا سجل بعمليات إنشاء المستخدمين.",
        "rightslog": "سجل صلاحيات المستخدمين",
        "randomincategory-nopages": "لا توجد صفحات في التصنيف [[:Category:$1|$1]].",
        "randomincategory-category": "التصنيف:",
        "randomincategory-legend": "صفحة عشوائية في التصنيف",
+       "randomincategory-submit": "اذهب",
        "randomredirect": "تحويلة عشوائية",
        "randomredirect-nopages": "لا توجد تحويلات في النطاق \"$1\".",
        "statistics": "إحصاءات",
        "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": "يمكنك تعديل هذه الصفحة.\nمن فضلك استخدم زر العرض المسبق قبل الحفظ.",
+       "tooltip-ca-edit": "تعديل هذه الصفحة",
        "tooltip-ca-addsection": "ابدأ قسما جديدا",
        "tooltip-ca-viewsource": "هذه الصفحة محمية.\nيمكنك رؤية مصدرها.",
        "tooltip-ca-history": "النسخ السابقة لهذه الصفحة",
        "deletedwhileediting": "'''تحذير''': هذه الصفحة تم حذفها بعد أن بدأت أنت بتعديلها!",
        "confirmrecreate": "حذف المستخدم [[User:$1|$1]] ([[User talk:$1|نقاش]]) هذه الصفحة بعد أن بدأت أنت بتحريرها للسبب التالي:\n:''$2''\nالرجاء التأكد من أنك تريد إعادة إنشاء هذه الصفحة.",
        "confirmrecreate-noreason": "حذف المستخدم [[User:$1|$1]] ([[User talk:$1|نقاش]]) هذه الصفحة بعد أن بدأت أنت بتحريرها. الرجاء التأكد من أنك تريد إعادة إنشاء هذه الصفحة.",
-       "recreate": "أعد Ø§Ù\84إنشاء",
+       "recreate": "إعادة إنشاء",
        "unit-pixel": "بك",
        "confirm_purge_button": "موافق",
        "confirm-purge-top": "امسح مختزن هذه الصفحة؟",
        "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/Example.jpg]] أو [[{{#Special:Redirect}}/revision/328429]] أو [[{{#Special:Redirect}}/user/101]].",
        "tags-activate": "نشط",
        "tags-deactivate": "تعطيل",
        "tags-hitcount": "{{PLURAL:$1|لا تغييرات|تغيير واحد|تغييران|$1 تغييرات|$1 تغييرا|$1 تغيير}}",
+       "tags-manage-no-permission": "ليس لديك صلاحية إدارة وسوم التغيير.",
        "tags-create-heading": "إنشاء وسم جديد",
        "tags-create-explanation": "في الوضع الافتراضي، الوسوم الجديدة المنشأة سيتاح استخدامها للبوتات والمستخدمين.",
        "tags-create-tag-name": "اسم الوسم:",
        "tags-activate-submit": "تفعيل",
        "tags-deactivate-title": "عطل الوسم",
        "tags-deactivate-reason": "سبب",
+       "tags-deactivate-not-allowed": "من غير الممكن تعطيل الوسم \"$1\".",
+       "tags-deactivate-submit": "عطل",
        "tags-update-remove-not-allowed-one": "من غير المسموح بإزالة وسم \"$1\".",
        "tags-edit-title": "تعديل الوسوم",
        "tags-edit-manage-link": "التحكم بالوسوم",
        "feedback-subject": "الموضوع:",
        "feedback-submit": "إرسال",
        "feedback-thanks": "شكرا! أُرسلت ملاحظاتك لصفحة \"[$2 $1]\".",
+       "feedback-thanks-title": "شكرا لك!",
        "feedback-useragent": "وكيل المستخدم:",
        "searchsuggest-search": "بحث",
        "searchsuggest-containing": "يحتوي...",
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 d5916eb..67f756a 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": "অক্টোবৰ",
        "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)",
        "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": "শেহতীয়া সাল-সলনিত দেখুৱাব লগা দিন:",
        "right-passwordreset": "পাছৱৰ্ড ৰি-চেটৰ ই-মেইলসমূহ দেখুৱাওক",
        "newuserlogpage": "সদস্যৰ সৃষ্টি অভিলেখ",
        "newuserlogpagetext": "এইখন এখন সদস্য সৃষ্টিৰ ল’গ।",
-       "rightslog": "সভ্যৰ অধিকাৰৰ লেখ",
+       "rightslog": "সদস্যৰ অধিকাৰৰ লেখ",
        "rightslogtext": "সদস্য অধিকাৰৰ পৰিৱৰ্তনসমূহৰ ল’গ",
        "action-read": "এই পৃষ্ঠা পঢ়ক",
        "action-edit": "এই পৃষ্ঠা সম্পাদনা কৰক",
        "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": "ডাউনল’ড কৰক",
        "nmembers": "{{PLURAL:|$1 টা প্ৰবন্ধ বা উপশ্ৰেণী|$1 টা প্ৰবন্ধ বা উপশ্ৰেণী}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|জন সদস্য}}",
        "nrevisions": "$1টা {{PLURAL:$1|সংশোধন|সংশোধন}}",
-       "nviews": "$1 {{PLURAL:$1|টা দৰ্শন|টা দৰ্শন}}",
        "nimagelinks": "$1 {{PLURAL:$1|টা পৃষ্ঠাত}} ব্যৱহৃত",
        "ntransclusions": "$1 {{PLURAL:$1|টা পৃষ্ঠাত}} ব্যৱহৃত",
        "specialpage-empty": "এই বিৱৰণৰ কোনো ফলাফল নাই ।",
        "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-ok": "সনà§\8dধান à¦\95ৰà¦\95",
        "linksearch-text": "ৱাইল্ডকাৰ্ডসমূহ যেনে \"*.wikipedia.org\" ব্যৱহাৰ কৰিব পাৰি।\nঅন্তত এটা উচ্চ-স্তৰৰ ডমেইনৰ প্ৰয়োজন, উদাহৰণস্বৰূপ \"*.org\"। <br />\nসমৰ্থিত {{PLURAL:$2|প্ৰ'ট'ক'ল|প্ৰ'ট'ক'লসমূহ}} : <code>$1</code> (কোনো প্ৰ'ট'ক'ল নিৰ্দিষ্ট নকৰিলে http:// সূচাব)।",
        "linksearch-line": "$2 পৰা $1 সংযোগ কৰা হৈছে",
        "linksearch-error": "ৱাইল্ডকাৰ্ড কেৱল হ'ষ্টনামৰ আৰম্ভণিতহে দেখা যাব ।",
        "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": "অসীম",
        "tooltip-t-print": "এই পৃষ্ঠাৰ ছপা উপযোগী সংস্কৰণ",
        "tooltip-t-permalink": "পৃষ্ঠাৰ এই সংস্কৰণৰ স্থায়ী সংযোগ",
        "tooltip-ca-nstab-main": "এই ৱিকিৰ সূচী চাওক",
-       "tooltip-ca-nstab-user": "সভà§\8dযৰ à¦¬à§\8dযà¦\95à§\8dতিà¦\97ত à¦ªà§\83ষà§\8dঠালà§\88",
+       "tooltip-ca-nstab-user": "সদসà§\8dয à¦ªà§\83ষà§\8dঠা à¦\9aাà¦\93à¦\95",
        "tooltip-ca-nstab-media": "মিডিয়া পৃষ্ঠাটো চাওক",
        "tooltip-ca-nstab-special": "এইটো এটা বিশেষ পৃষ্ঠা, আপুনি সম্পাদনা কৰিব নোৱাৰে",
        "tooltip-ca-nstab-project": "প্ৰকল্প পৃষ্ঠা চাওক",
        "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 f8258c2..79b1fca 100644 (file)
        "passwordreset": "Reaniciar contraseña",
        "passwordreset-text-one": "Complete esti formulariu pa reaniciar la contraseña.",
        "passwordreset-text-many": "{{PLURAL:$1|Rellene unu de los campos pa recibir una contraseña temporal per corréu.}}",
-       "passwordreset-legend": "Reaniciar contraseña",
        "passwordreset-disabled": "Los reanicios de contraseña tán desactivaos nesta wiki.",
        "passwordreset-emaildisabled": "Les funciones de corréu electrónicu tan desactivaes nesta wiki.",
        "passwordreset-username": "Nome d'usuariu:",
        "resettokens": "Reaniciar los pases",
        "resettokens-text": "Equí pue reaniciar los pases que permiten l'accesu a ciertos datos privaos asociaos cola so cuenta.\n\nTendría de facelo si los compartió con alguién de mou accidental o si la so cuenta quedó comprometida.",
        "resettokens-no-tokens": "Nun hai dengún pase que reaniciar.",
-       "resettokens-legend": "Reaniciar los pases",
        "resettokens-tokens": "Pases:",
        "resettokens-token-label": "$1 (valor actual: $2)",
        "resettokens-watchlist-token": "Pase pa la canal de noticies web (Atom/RSS) de los [[Special:Watchlist|cambios en páxines de la llista de vixilancia]]",
        "yourdiff": "Diferencies",
        "copyrightwarning": "Por favor, ten en cuenta que toles collaboraciones de {{SITENAME}} considérense espublizaes baxo la $2 (ver $1 pa más detalles). Si nun quies que'l to trabayu s'edite ensin midida y se distribuya al debalu, nun lu pongas equí.<br />\nAmás tas prometiéndonos qu'escribisti esto tu mesmu, o que lo copiasti d'una fonte llibre, de dominiu públicu o asemeyada.\n<strong>¡Nun unvies obres con drechos d'autor ensin permisu!</strong>",
        "copyrightwarning2": "Por favor, ten en cuenta que toles contribuciones de {{SITENAME}} se puen editar, alterar o desaniciar por otros usuarios. Si nun quies que'l to trabayu s'edite ensin midida, nun lu pongas equí.<br />\nAmás tas dexándonos afitao qu'escribisti esto tu mesmu, o que lo copiasti d'una fonte llibre de dominiu públicu o asemeyao (ver $1 pa más detalles).\n'''¡Nun pongas trabayos con drechos d'autor ensin permisu!'''",
+       "editpage-cannot-use-custom-model": "El modelu de conteníu d'esta páxina nun pue cambiase.",
        "longpageerror": "'''ERROR: El testu qu'unviasti tien {{PLURAL:$1|un quilobyte|$1 quilobytes}}, que pasa del máximu de {{PLURAL:$2|un quilobyte|$2 quilobytes}}.'''\nNun se pue grabar.",
        "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:",
        "randomincategory-nopages": "Nun hai páxines en [[:Category:$1]].",
        "randomincategory-category": "Categoría:",
        "randomincategory-legend": "Páxina al debalu de la categoría",
+       "randomincategory-submit": "Dir",
        "randomredirect": "Redireición al debalu",
        "randomredirect-nopages": "Nun hai redireiciones nel espaciu de nomes \"$1\".",
        "statistics": "Estadístiques",
        "rollback-success": "Revertíes les ediciones de $1; camudáu a la última versión de $2.",
        "sessionfailure-title": "Fallu de sesión",
        "sessionfailure": "Paez qu'hai un problema cola to sesión; por precaución\ncancelóse l'aición que pidisti. Da-y al botón \"Atrás\" del\nnavegador pa cargar otra vuelta la páxina y vuelve a intentalo.",
+       "changecontentmodel": "Cambiar el modelu de conteníu d'una páxina",
+       "changecontentmodel-legend": "Cambiar el modelu de conteníu",
+       "changecontentmodel-title-label": "Títulu de la páxina",
+       "changecontentmodel-model-label": "Nuevu modelu de conteníu",
+       "changecontentmodel-reason-label": "Motivu:",
+       "changecontentmodel-success-title": "Cambióse'l modelu de conteníu",
+       "changecontentmodel-success-text": "Cambióse'l tipu de conteníu de [[:$1]].",
+       "changecontentmodel-cannot-convert": "El conteníu de [[:$1]] nun puede convertise a un tipu de $2.",
+       "changecontentmodel-title-cantexist": "Nun ye posible tener una páxina en $1.",
+       "changecontentmodel-nodirectediting": "El modelu de conteníu $1 nun tien encontu pa edición direuta",
+       "log-name-contentmodel": "Rexistru de cambios del modelu de conteníu",
+       "log-description-contentmodel": "Socesos rellacionaos colos modelos de conteníu d'una páxina",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|cambió}}'l modelu de conteníu de la páxina $3 dende «$4» a «$5»",
+       "logentry-contentmodel-change-revertlink": "revertir",
+       "logentry-contentmodel-change-revert": "revertir",
        "protectlogpage": "Rexistru de proteiciones",
        "protectlogtext": "Darréu ta un rexistru de les protecciones de páxines.\nConsulta la [[Special:ProtectedPages|llista de páxines protexíes]] pa ver les proteiciones actives nestos momentos.",
        "protectedarticle": "protexó «[[$1]]»",
        "tooltip-pt-logout": "Salir",
        "tooltip-pt-createaccount": "Encamentámoste que crees una cuenta y qu'anicies sesión; sicasí, nun ye obligatorio",
        "tooltip-ca-talk": "Alderique tocante al conteníu de la páxina",
-       "tooltip-ca-edit": "Pues editar esta páxina. Por favor usa'l botón de vista previa enantes de guardar los cambios.",
+       "tooltip-ca-edit": "Editar esta páxina",
        "tooltip-ca-addsection": "Emprima una seición nueva",
        "tooltip-ca-viewsource": "Esta páxina ta protexida.\nPues ver el so códigu fonte.",
        "tooltip-ca-history": "Versiones antigües d'esta páxina",
        "pageinfo-robot-index": "Permitío",
        "pageinfo-robot-noindex": "Torgao",
        "pageinfo-watchers": "Númberu de vixilantes de la páxina",
+       "pageinfo-visiting-watchers": "Númberu d'usuarios que vixilen la páxina que visitaron ediciones recientes",
        "pageinfo-few-watchers": "Menos de $1 {{PLURAL:$1|vixilante|vixilantes}}",
+       "pageinfo-few-visiting-watchers": "Puede haber, o non, un usuariu que vixila páxines que visita les ediciones recientes",
        "pageinfo-redirects-name": "Númberu de redireiciones a esta páxina",
        "pageinfo-subpages-name": "Subpáxines d'esta páxina",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redireición|redireiciones}}; $3 {{PLURAL:$3|non-redireición|non-redireiciones}})",
        "version-libraries": "Biblioteques instalaes",
        "version-libraries-library": "Biblioteca",
        "version-libraries-version": "Versión",
+       "version-libraries-license": "Llicencia",
+       "version-libraries-description": "Descripción",
+       "version-libraries-authors": "Autores",
        "redirect": "Redireición por ficheru, usuariu, páxina o ID de revisión",
        "redirect-legend": "Redirixir a un ficheru o una páxina",
        "redirect-summary": "Esta páxina especial redirixe a un ficheru (dando'l so nome), una páxina (dando una ID de revisión o de páxina) o una páxina d'usuariu (dando un númberu d'ID d'usuariu). Usu: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]],  [[{{#Special:Redirect}}/revision/328429]], o [[{{#Special:Redirect}}/user/101]].",
        "special-characters-group-khmer": "Khmer",
        "special-characters-title-endash": "guión curtiu",
        "special-characters-title-emdash": "guión llargu",
-       "special-characters-title-minus": "signu menos"
+       "special-characters-title-minus": "signu menos",
+       "mw-widgets-titleinput-description-new-page": "la páxina inda nun esiste",
+       "mw-widgets-titleinput-description-redirect": "redirixir a $1"
 }
index c5158a4..d5fe7a2 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "1AnuraagPandey"
+                       "1AnuraagPandey",
+                       "राम प्रसाद जोशी"
                ]
        },
        "tog-underline": "कड़ि अधोरेखन:",
        "aboutpage": "Project:परिचय",
        "copyright": "उपलब्ध चिज $1 कय अधीन है जब तक अलग से उल्लेख नाई कई गा है।",
        "copyrightpage": "{{ns:project}}:कॉपीराइट",
-       "currentevents": "à¤\85भिन à¤\95य à¤\98à¤\9fना à¤¸à¤¬",
-       "currentevents-url": "Project:à¤\85भिन à¤\95य à¤\98à¤\9fना à¤¸à¤¬",
+       "currentevents": "नà¤\81वा à¤\98à¤\9fना",
+       "currentevents-url": "Project:नà¤\81वा à¤\98à¤\9fना",
        "disclaimers": "अस्वीकरण",
        "disclaimerpage": "Project:साधारण अस्वीकरण",
        "edithelp": "सम्पादन सहायता",
        "no-null-revision": "\"$1\" पृष्ठ के लिए बिना बदलावों का नया अवतरण बनाने में असफल।",
        "badtitle": "खराब शीर्षक",
        "badtitletext": "आप कय द्वारा अनुरोधित शीर्षक अयोग्य, ख़ाली या गलत जोड़ान अंतर-भाषीय या अंतर-विकि शीर्षक होय।\nएहमा एक या एक से ढेर अईसन कॅरेक्टर होई सकत हैं जवन शीर्षक में प्रयोग नाई कई  सका जात अहै।",
+       "title-invalid-empty": "निवेदित पन्ना कय शीर्षक खाली है या खाली नामस्थान है।",
+       "title-invalid-utf8": "निवेदित पन्ना कय शीर्षक अवैध यू०टी०एफ़-८ कय सिलसिला राखत है।",
+       "title-invalid-interwiki": "निवेदित पन्ना कय शीर्षक एकठु अंतर-विकी कड़ी रक्खत है जवने कय शीर्षक मा प्रयोग नाइ कै सका जात है।",
        "perfcached": "नीचे दिया हुआ डेटा कैशे मेमोरी से लिया हुआ है, अतः हो सकता है कि इसका पूर्ण अद्यतन न हुआ हो। कैशे मेमोरी में अधिकतम {{PLURAL:$1|एक  नतीजा|$1 नतीजे}} उपलब्ध हैं।",
        "perfcachedts": "नीचे दिया हुआ डेटा कैशे मेमोरी से है, और इसका अंतिम अद्यतन $1 को हुआ था। कैशे मेमोरी में अधिकतम {{PLURAL:$4|एक  नतीजा|$4 नतीजे}} उपलब्ध हैं।",
        "querypage-no-updates": "इस पृष्ठ का नवीनीकरण करना मना है। अभी यहाँ के डाटा को ताज़ा नहीं कर सकते।",
        "virus-badscanner": "गलत जमाव: अज्ञात वायरस जाँचक: ''$1''",
        "virus-scanfailed": "जाँच विफल (कूट $1)",
        "virus-unknownscanner": "अज्ञात ऐंटीवायरस:",
-       "logouttext": "'''à¤\85ब à¤\86प à¤²à¥\89à¤\97 à¤\86à¤\89à¤\9f à¤\95à¤\88 à¤\9aà¥\81à¤\95ा à¤¹à¤µà¥¤'''\nधà¥\8dयान à¤¦à¥\87वा à¤\9cाय à¤\95ि à¤\9cब à¤¤à¤\95 à¤\86प à¤\86पन à¤¬à¥\8dराà¤\89à¤\9c़र à¤\95à¥\88शà¥\87 à¤\96ालà¥\80 à¤¨à¤¾à¤\88 à¤\95रा à¤\9cाà¤\88, à¤\95à¥\81à¤\9b à¤ªà¤¨à¥\8dना à¤\85भà¥\80नà¥\8b à¤\85à¤\88सन à¤¦à¥\87à¤\96ाय à¤¸à¤\95तà¥\87 à¤¹à¥\88à¤\82 à¤\9cà¥\88सय à¤\95ि à¤\86प à¤\85भà¥\80नà¥\8b à¤²à¥\89à¤\97िन à¤\95रà¥\87 à¤¹à¤µ।",
+       "logouttext": "'''à¤\85ब à¤\86प à¤\96ाता à¤¸à¥\87 à¤¬à¤¹à¤°à¥\87 à¤\86à¤\87 à¤\97वा à¤\97य।'''\nधà¥\8dयान à¤¦à¤¿à¤¹à¤¾ à¤\9cाय à¤\95ि à¤\9cब à¤¤à¤\95 à¤\86प à¤\86पन à¤¬à¥\8dराà¤\89à¤\9c़र à¤\95à¥\88शà¥\87 à¤\96ालà¥\80 à¤¨à¤¾à¤\88 à¤\95रा à¤\9cाà¤\88, à¤\95à¥\81à¤\9b à¤ªà¤¨à¥\8dना à¤\85à¤\88सन à¤¦à¥\87à¤\96ाà¤\87 à¤\9cà¥\88सय à¤\95ि à¤\86प à¤\85बहिनà¥\8b à¤²à¥\89à¤\97िन à¤\95रा à¤\97ा à¤¹à¥\88।",
        "welcomeuser": "आप कय स्वागत है, $1!",
        "welcomecreation-msg": "आप कय खाता बनी गए।\nआपन [[Special:Preferences|{{SITENAME}} वरीयता]] बदलेक ना भूलावा जाइ।",
        "yourname": "सदस्यनावँ:",
        "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)कय नाते टोकन",
        "content-json-empty-object": "खाली चिज",
        "content-json-empty-array": "खाली एरे",
        "duplicate-args-category": "टेम्पलेट कॉल में डुप्लिकेट तर्क का उपयोग करते हुए पन्ने",
-       "duplicate-args-category-desc": "पà¥\87à¤\9c à¤\9cà¥\88सà¥\87 à¤¤à¤°à¥\8dà¤\95à¥\8bà¤\82 à¤\95à¥\87 à¤¡à¥\81पà¥\8dलिà¤\95à¥\87à¤\9f à¤\95ा à¤\89पयà¥\8bà¤\97 à¤\95रनà¥\87 à¤µà¤¾à¤²à¥\87 à¤\9fà¥\87मà¥\8dपलà¥\87à¤\9f à¤\95à¥\89ल, à¤\9cà¥\88सà¥\87 <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> à¤\93à¥\88र <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
+       "duplicate-args-category-desc": "पà¥\87à¤\9c à¤\9cà¥\88सà¥\87 à¤¤à¤°à¥\8dà¤\95à¥\8bà¤\82 à¤\95à¥\87 à¤¡à¥\81पà¥\8dलिà¤\95à¥\87à¤\9f à¤\95ा à¤\89पयà¥\8bà¤\97 à¤\95रनà¥\87 à¤µà¤¾à¤²à¥\87 à¤\9fà¥\87मà¥\8dपलà¥\87à¤\9f à¤\95à¥\89ल, à¤\9cà¥\88सà¥\87 <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> à¤\94र <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''चेतावनी:''' इ पन्ना पे बहुत ढेर संख्या में कीमती पार्सर फ़ंक्शनों कय प्रयोग कई गा है।\n\nएकर प्रयोग $2 से कम दाइ होएक चाहि, इ समय प्रयोग $1 दाइ कै गा {{PLURAL:$1|है}}।",
        "expensive-parserfunction-category": "अईसन पन्ना जवन महङा पार्सर फ़ंक्शनन् कय ढेर प्रयोग करत हैं",
        "post-expand-template-inclusion-warning": "'''चेतावनी:''' साँचा जोडे कय सीमा पार होई चुका है।\nकवनो-कवनो साँचा नाई जुड़ी।",
        "prefs-help-signature": "बातचीत पन्नन पे करल टिप्पणिन् पे \"<nowiki>~~~~</nowiki>\" से हस्ताक्षर करेक परि, इ आप कय हस्ताक्षर अव समय में परिवर्तित होई जाइ।",
        "badsig": "गलत कच्चा हस्ताक्षर।\nHTML टैग कय जाँच करा जाय।",
        "badsiglength": "ई हस्ताक्षर बहुत बड़ा है।\nई $1 {{PLURAL:$1|कैरैक्टर}} से ढेर कय नाई होएक चाहि।",
-       "yourgender": "à¤\86प à¤\85पनà¥\87 à¤\86प à¤\95य à¤\95à¥\88सन à¤¬à¤¤à¤¾à¤µà¥\87 à¤\9aाहा à¤\9cाà¤\87?",
-       "gender-unknown": "हम à¤\95à¥\81à¤\9b à¤¨à¤¾à¤\88 à¤\95हय à¤\9aाहित à¤\85हन",
-       "gender-male": "à¤\8fन à¤¸à¤®à¥\8dपादन à¤\95रत à¤¹à¤\81य।",
-       "gender-female": "à¤\8fन à¤¸à¤®à¥\8dपादन à¤\95रत à¤\85हिन।",
+       "yourgender": "à¤\86प à¤\95य à¤\95ाव à¤\95हा à¤\9cाय ?",
+       "gender-unknown": "हम à¤¨à¤¾à¤\87 à¤¬à¤¤à¤¾à¤\87ब",
+       "gender-male": "यन à¤¸à¤®à¥\8dपादन à¤\95रा à¤²à¤\81य ।",
+       "gender-female": "यन à¤¸à¤®à¥\8dपादन à¤\95रा à¤²à¤¿à¤¨ ।",
        "prefs-help-gender": "ई जानकारी देब वैकल्पिक होय।\nई सॉफ़्टवेयर में लिंग कय आधार पे आप कय लिए सही संबोधन कय नाते प्रयुक्त होत है।\nई जानकारी सार्वजनिक होइ।",
        "email": "ई-मेल",
        "prefs-help-realname": "असली नाँव कय कवनो जरुरत नाइ है।यकर इस्तेमाल आप कय काम कय बडाइ करय में होइ सकत है ।",
        "nmembers": "$1 {{PLURAL:$1|सदस्य}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|सदस्य}}",
        "nrevisions": "$1 {{PLURAL:$1|अवतरण}}",
-       "nviews": "{{PLURAL:$1|एक|$1}} दाइ देखि गा है",
        "nimagelinks": "$1 {{PLURAL:$1|पन्ना|पन्नन्}} पे प्रयुक्त",
        "ntransclusions": "$1 {{PLURAL:$1|पन्ना|पन्नन}} पे प्रयुक्त",
        "specialpage-empty": "इ ब्यौरा कय खर्तीन कवनो परिणाम नाई है।",
index 4da533f..c6fef14 100644 (file)
        "passwordreset": "Ачыстка паролю",
        "passwordreset-text-one": "Запоўніце гэтую форму, каб скінуць пароль.",
        "passwordreset-text-many": "{{PLURAL:$1|Запоўніце адно з палёў, каб атрымаць часовы пароль праз электронную пошту.}}",
-       "passwordreset-legend": "Ачысьціць пароль",
        "passwordreset-disabled": "Магчымасьць ачысткі паролю была забароненая ў {{GRAMMAR:месны|{{SITENAME}}}}.",
        "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|зьменаў у вашым сьпісе назіраньня]]",
        "creating": "Стварэньне «$1»",
        "editingsection": "Рэдагаваньне: $1 (сэкцыя)",
        "editingcomment": "Рэдагаваньне: $1 (новая сэкцыя)",
-       "editconflict": "Канфлікт рэдагаваньня: $1",
+       "editconflict": "Канфлікт рэдагаваньняў: $1",
        "explainconflict": "Нехта зьмяніў старонку падчас Вашага рэдагаваньня.\nУ верхнім тэкставым акне знаходзіцца цяперашні зьмест старонкі.\nВашыя зьмены паказаныя ў ніжнім акне.\nВам трэба перанесьці Вашыя зьмены ў цяперашні тэкст.\nКалі Вы націсьніце «{{int:savearticle}}», будзе захаваны '''толькі''' тэкст верхняга вакна.",
        "yourtext": "Ваш тэкст",
        "storedversion": "Захаваная вэрсія",
        "randomincategory-nopages": "У катэгорыі «[[:Category:$1|$1]]» старонак няма.",
        "randomincategory-category": "Катэгорыя:",
        "randomincategory-legend": "Выпадковая старонка ў катэгорыі",
+       "randomincategory-submit": "Перайсьці",
        "randomredirect": "Выпадковае перанакіраваньне",
        "randomredirect-nopages": "У прасторы назваў «$1» няма перанакіраваньняў.",
        "statistics": "Статыстыка",
        "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]]»",
        "tooltip-pt-logout": "Выйсьці",
        "tooltip-pt-createaccount": "Мы прапануем вам стварыць рахунак і ўвайсьці, але гэта не абавязкова",
        "tooltip-ca-talk": "Абмеркаваньне зьместу старонкі",
-       "tooltip-ca-edit": "Ð\92Ñ\8b Ð¼Ð¾Ð¶Ð°Ñ\86е Ñ\80Ñ\8dдагаваÑ\86Ñ\8c Ð³Ñ\8dÑ\82Ñ\83Ñ\8e Ñ\81Ñ\82аÑ\80онкÑ\83. Ð\9aалÑ\96 Ð»Ð°Ñ\81ка, Ñ\83жÑ\8bвайÑ\86е ÐºÐ½Ð¾Ð¿ÐºÑ\83 Ð¿Ñ\80аглÑ\8fдÑ\83 Ð¿ÐµÑ\80ад Ð·Ð°Ñ\85аванÑ\8cнем.",
+       "tooltip-ca-edit": "РÑ\8dдагаваÑ\86Ñ\8c Ð³Ñ\8dÑ\82Ñ\83Ñ\8e Ñ\81Ñ\82аÑ\80онкÑ\83",
        "tooltip-ca-addsection": "Пачаць новую сэкцыю",
        "tooltip-ca-viewsource": "Гэтая старонка абароненая. \nАле можна паглядзець яе крынічны тэкст",
        "tooltip-ca-history": "Мінулыя вэрсіі гэтай старонкі.",
        "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/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] або [[{{#Special:Redirect}}/user/101]].",
        "tags-delete-not-allowed": "Меткі, вызначаныя пашырэньнем, ня могуць быць выдаленыя, акрамя выпадку, калі пашырэньне дазваляе гэта.",
        "tags-delete-not-found": "Метка «$1» не існуе.",
        "tags-delete-too-many-uses": "Метка «$1» выкарыстаная ў больш чым $2 {{PLURAL:$2|вэрсіі|вэрсіях}}, адпаведна, яна ня можа быць выдаленая.",
+       "tags-delete-warnings-after-delete": "Метка «$1» была пасьпяхова выдаленая, але {{PLURAL:$2|1=атрыманае наступнае папярэджаньне|атрыманыя наступныя папярэджаньні}}:",
+       "tags-activate-title": "Актываваць метку",
        "comparepages": "Параўнаньне старонак",
        "compare-page1": "Старонка 1",
        "compare-page2": "Старонка 2",
index 3ce64ce..242bfa7 100644 (file)
@@ -24,7 +24,8 @@
                        "לערי ריינהארט",
                        "Aftabuzzaman",
                        "Wikisagnik",
-                       "Aashaa"
+                       "Aashaa",
+                       "Sayma Jahan"
                ]
        },
        "tog-underline": "সংযোগগুলির নিচে দাগ দেখানো হোক:",
        "passwordreset": "পাসওয়ার্ড রিসেট",
        "passwordreset-text-one": "আপনার পাসওয়ার্ড পুনরায় সেট করতে এই ফর্মটি পূরণ করুন।",
        "passwordreset-text-many": "{{PLURAL:$1|ইমেইলের মাধ্যমে একটি অস্থায়ী পাসওয়ার্ড পেতে ঘরগুলির একটি পূরণ করুন।}}",
-       "passwordreset-legend": "পাসওয়ার্ড রিসেট",
        "passwordreset-disabled": "এই উইকিতে পাসওয়ার্ড রিসেটের সুবিধা নিষ্ক্রিয় রয়েছে।",
        "passwordreset-emaildisabled": "এই উইকিতে ইমেইল অপশনটি বন্ধ করা হয়েছে।",
        "passwordreset-username": "ব্যবহারকারী নাম:",
        "resettokens": "রিসেট টোকেন",
        "resettokens-text": "আপনি টোকেন রিসেট করতে পারেন, যা অ্যাকাউন্টের সাথে সম্পর্কিত আপনার ব্যক্তিগত তথ্য দেখার কাজে ব্যবহার করা হয়।",
        "resettokens-no-tokens": "রিসেট করার মত কোনো টোকেন নেই।",
-       "resettokens-legend": "রিসেট টোকেন",
        "resettokens-tokens": "টোকেন:",
        "resettokens-token-label": "$1 (বর্তমান: $2)",
        "resettokens-watchlist-token": "ওয়েব ফিড (Atom/RSS) টোকেন পরিবর্তনের জন্য [[Special:Watchlist|নজরতালিকায় থাকা পাতাগুলোতে পরিবর্তন এসেছে]]",
        "yourdiff": "পার্থক্য",
        "copyrightwarning": "অনুগ্রহ করে লক্ষ্য করুন {{SITENAME}}-তে সমস্ত অবদান $2-এর আওতায় প্রাপ্য (বিস্তারিত $1-তে দেখুন)। আপনার জমা দেয়া লেখা যে কেউ হৃদয়হীনভাবে সম্পাদনা করতে এবং যথেচ্ছভাবে পুনর্বিতরণ করতে পারেন। আপনি যদি এ ব্যাপারে একমত না হন, তাহলে এখানে আপনার লেখা জমা দেবেন না।<br />\nআপনি আরো প্রতিজ্ঞা করছেন যে, এই লেখাগুলো আপনি নিজে লিখেছেন, বা সাধারণের ব্যবহারের জন্য উন্মুক্ত কোন উৎস থেকে সংগ্রহ করেছেন।\n'''স্বত্ব সংরক্ষিত কোন লেখা স্বত্বাধিকারীর অনুমতি ছাড়া এখানে জমা দেবেন না!'''",
        "copyrightwarning2": "অনুগ্রহ করে লক্ষ করুন: {{SITENAME}}-এর এই ভুক্তিতে আপনার লেখা বা অবদান অন্যান্য ব্যবহারকারীরা পরিবর্তন বা পরিবর্ধন করতে, এমনকি মুছে ফেলতে পারবেন। {{SITENAME}} এ আপনার সকল লেখালেখি/অবদান গনু ফ্রি ডকুমেন্টেশনের ($1) আওতায় বিনামূল্যে প্রাপ্য ও হস্তান্তরযোগ্য। আপনার জমা দেয়া লেখা যে কেউ হৃদয়হীনভাবে সম্পাদনা করতে এবং যথেচ্ছভাবে ব্যবহার করতে পারেন। আপনি যদি এ ব্যাপারে একমত না হন, তাহলে এখানে আপনার লেখা জমা দেবেন না। আপনি আরো প্রতিজ্ঞা করছেন যে, এই লেখাগুলো আপনি নিজে লিখেছেন (তবে কোন মৌলিক গবেষণা নয়) বা সাধারণের ব্যবহারের জন্য উন্মুক্ত কোন উৎস থেকে সংগ্রহ করেছেন। '''স্বত্ব সংরক্ষিত কোন লেখা স্বত্বাধিকারীর অনুমতি ছাড়া এখানে জমা দেবেন না।'''",
+       "editpage-cannot-use-custom-model": "এই পাতার বিষয়বস্তুর মডেল পরিবর্তন করা যাবে না।",
        "longpageerror": "'''ত্রুটি:  আপনার জমা দেয়া টেক্সটের পরিমাণ {{PLURAL:$1|এক কিলোবাইট|$1 কিলোবাইট}}, যা সর্বোচ্চ সীমা {{PLURAL:$2|এক কিলোবাইটের|$2 কিলোবাইটের}} চেয়ে বেশি।'''\nএটি সংরক্ষণ করা সম্ভব নয়।",
        "readonlywarning": "'''সতর্কীকরণ: রক্ষণাবেক্ষণের জন্য ডাটাবেজ অবরুদ্ধ রাখা হয়েছে, তাই এই মুহূর্তে আপনার সম্পাদনা সংরক্ষণ করতে পারবেন না।'''\nআপনি চাইলে লেখাটি কাট এবং পেষ্ট করে ভবিষ্যতের জন্য কোন টেক্সট ফাইলে সংরক্ষণ করতে পারেন।\n\nযে প্রশাসক এই ডাটাবেজটি অবরুদ্ধ করেছেন তিনি যা ব্যাখ্যা দিয়েছেন: $1",
        "protectedpagewarning": "'''সতর্কীকরণ: এই পাতাটি বন্ধ করা হয়েছে; কেবলমাত্র প্রশাসক মর্যাদার ব্যবহারকারীরাই এটি সম্পাদনা করতে পারবেন।'''\nআপনার সুবিধার্থে পাতাটির সাম্প্রতিক সংরক্ষণ লগের বিবরণ নিচে দেওয়া হলো।",
        "randomincategory-nopages": "[[:Category:$1]]-এ কোন পাতা নেই।",
        "randomincategory-category": "বিষয়শ্রেণী:",
        "randomincategory-legend": "বিষয়শ্রেণীর অজানা যেকোনো পাতা",
+       "randomincategory-submit": "যাও",
        "randomredirect": "অনির্ধারিত পুনর্নির্দেশ",
        "randomredirect-nopages": "\"$1\" এই নামস্থানে কোন পুনর্নির্দেশ নেই।",
        "statistics": "পরিসংখ্যান",
        "rollback-success": "$1-এর সম্পাদনাগুলি পূর্বাবস্থায় ফিরিয়ে নেওয়া হয়েছে; $2-এর করা শেষ সংস্করণে পাতাটি ফেরত নেওয়া হয়েছে।",
        "sessionfailure-title": "সেশন পরিত্যক্ত",
        "sessionfailure": "আপনার লগ ইন সেশনে একটি সমস্যা হয়েছে বলে মনে হচ্ছে;\nসেশন হাইজ্যাক প্রতিরোধের উপায় হিসেবে এই কাজটি বাতিল করা হয়েছে।\nঅনুগ্রহ ব্রাউজারের \"back\" বোতাম চাপুন এবং যে পাতা থেকে এসেছিলেন, তা রিলোড করুন এবং আবার চেষ্টা করুন।",
+       "logentry-contentmodel-change": "$1 $3 পাতার বিষয়বস্তুর মডেল \"$4\" থেকে \"$5\"-এ {{GENDER:$2|পরিবর্তন করেছেন}}",
        "protectlogpage": "সুরক্ষা লগ",
        "protectlogtext": "নিচে সুরক্ষিত পাতার  একটি তালিকা দেয়া হল। \nবর্তমানে সক্রিয় পাতার সুরক্ষাগুলির তালিকা দেখতে [[Special:ProtectedPages|সুরক্ষিত পাতার তালিকা]] দেখুন।",
        "protectedarticle": "সুরক্ষিত \"[[$1]]\"",
index 98cd52e..c9da4e7 100644 (file)
        "passwordreset": "Adderaouekaat ar ger-tremen",
        "passwordreset-text-one": "Leugnit ar furmskrid-mañ evit adderaouekaat ho ker-tremen.",
        "passwordreset-text-many": "{{PLURAL:$1|Leugnit unan eus ar maeziennoù da adderaouekaat ho ker-tremen.}}",
-       "passwordreset-legend": "Adsevel ar ger-tremen",
        "passwordreset-disabled": "Diweredekaet eo bet an adsevel gerioù-tremen war ar wiki-mañ.",
        "passwordreset-emaildisabled": "Ne c'haller ket ober gant posteloù er wiki-mañ.",
        "passwordreset-username": "Anv implijer :",
        "changeemail-throttled": "Betek re hoc'h heus klasket kevreañ en aner.\nGortozit $1, mar plij, a-raok esaeañ en-dro.",
        "resettokens": "Adderaouekaat ar jedoueroù",
        "resettokens-no-tokens": "N'eus jedouer ebet da adderaouekaat.",
-       "resettokens-legend": "Adderaouekaat ar jedoureoù",
        "resettokens-tokens": "Jedoueroù :",
        "resettokens-token-label": "$1 (talvoud bremañ : $2)",
        "resettokens-done": "Jedoueroù adderaouekaet.",
        "notextmatches": "N'emañ ar ger(ioù) goulennet e testenn pennad ebet",
        "prevn": "{{PLURAL:$1|$1}} kent",
        "nextn": "{{PLURAL:$1|$1}} war-lerc'h",
+       "prev-page": "pajenn gent",
+       "next-page": "pajenn war-lerc'h",
        "prevn-title": "$1 {{PLURAL:$1|disoc'h|disoc'h}} kent",
        "nextn-title": "$1 {{PLURAL:$1|disoc'h|disoc'h}} war-lerc'h",
        "shown-title": "Diskouez $1 {{PLURAL:$1|disoc'h|disoc'h}} dre bajenn",
        "randomincategory-nopages": "N'eus pajenn ebet e [[:Category:$1]].",
        "randomincategory-category": "Rummad :",
        "randomincategory-legend": "Ur bajenn dre zegouezh er rummad",
+       "randomincategory-submit": "Mont",
        "randomredirect": "Ur bajenn adkas dre zegouezh",
        "randomredirect-nopages": "N'eus pajenn adkas ebet en esaouenn anv \"$1\".",
        "statistics": "Stadegoù",
        "nmembers": "$1 {{PLURAL:$1|elfenn|elfenn}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|ezel}}",
        "nrevisions": "$1 {{PLURAL:$1|stumm|stumm}}",
-       "nviews": "$1 {{PLURAL:$1|selladenn|selladenn}}",
        "nimagelinks": "Implijet e $1 {{PLURAL:$1|pajenn|pajenn}}",
        "ntransclusions": "implijet e $1 {{PLURAL:$1|pajenn|pajenn}}",
        "specialpage-empty": "Goullo eo ar bajenn-mañ.",
index 6ca3827..f0ef2d7 100644 (file)
@@ -21,7 +21,8 @@
                        "Milicevic01",
                        "Macofe",
                        "Emir Mujadzic",
-                       "Srdjan m"
+                       "Srdjan m",
+                       "Semso98"
                ]
        },
        "tog-underline": "Podvuci veze:",
        "category-empty": "''Ova kategorija trenutno ne sadrži članke ni medije.''",
        "hidden-categories": "{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}}",
        "hidden-category-category": "Skrivene kategorije",
-       "category-subcat-count": "{{PLURAL:$2|Ova kategorija ima sljedeću potkategoriju.|Ova kategorija ima {{PLURAL:$1|sljedeću potkategoriju|sljedeće $1 potkategorije|sljedećih $1 potkategorija}}, od $2 ukupno.}}",
+       "category-subcat-count": "{{PLURAL:$2|Ova kategorija samo ima sljedeću potkategoriju.|Ova kategorija ima {{PLURAL:$1|sljedeću potkategoriju|sljedeće $1 potkategorije|sljedećih $1 potkategorija}}, od $2 ukupno.}}",
        "category-subcat-count-limited": "Ova kategorija sadrži {{PLURAL:$1|sljedeću $1 potkategoriju|sljedeće $1 potkategorije|sljedećih $1 potkategorija}}.",
        "category-article-count": "{{PLURAL:$2|U ovoj kategoriji nalazi se $1 članak.|{{PLURAL:$1|Prikazan je $1 članak|Prikazana su $1 članka|Prikazano je $1 članaka}} od ukupno $2 u ovoj kategoriji.}}",
        "category-article-count-limited": "{{PLURAL:$1|Slijedeća $1 stranica je|Slijedeće $1 stranice su|Slijedećih $1 stranica je}} u ovoj kategoriji.",
        "passwordreset": "Poništavanje šifre",
        "passwordreset-text-one": "Ispunite ovaj obrazac da biste resetovali Vašu šifru/lozinku.",
        "passwordreset-text-many": "{{PLURAL:$1|Ispunite jedno od polja kako biste dobili privremenu lozinku putem e-pošte.}}",
-       "passwordreset-legend": "Poništi šifru",
        "passwordreset-disabled": "Poništavanje šifre  je onemogućeno na ovoj wiki.",
        "passwordreset-emaildisabled": "E-pošta je onemogućena na ovom wikiju.",
        "passwordreset-username": "Korisničko ime:",
        "resettokens": "Resetovanje žetona",
        "resettokens-text": "Možete ponovno postaviti tokene koji će vam omogućiti pristup određenim privatnim podacima povezanim sa vašim računom ovdje.\n\nTrebali bi to učiniti ako ih mimo volje podijelite s nekim ili ako je vaš račun ugrožen.",
        "resettokens-no-tokens": "Nema žetona za resetovanje.",
-       "resettokens-legend": "Resetovanje žetona",
        "resettokens-tokens": "Žetoni:",
        "resettokens-token-label": "$1 (trenutna vrijednost: $2)",
        "resettokens-watchlist-token": "Token za web niz (Atom/RSS) [[Special:Watchlist|promjena na stranicama sa vašeg spiska praćenja]]",
        "creating": "Pravljenje stranice $1",
        "editingsection": "Uređujete $1 (dio)",
        "editingcomment": "Uređujete $1 (nova sekcija)",
-       "editconflict": "Sukobljenje izmjene: $1",
+       "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",
        "mergehistory-comment": "Spojeno [[:$1]] u [[:$2]]: $3",
        "mergehistory-same-destination": "Izvorne i odredišne stranice ne mogu biti iste",
        "mergehistory-reason": "Razlog:",
-       "mergelog": "Zapis spajanja",
+       "mergelog": "Zapisnik spajanja",
        "revertmerge": "Vrati spajanje",
        "mergelogpagetext": "Ispod je spisak nedavnih spajanja historija stranica.",
        "history-title": "Historija revizija \"$1\"",
        "searchrelated": "povezano",
        "searchall": "sve",
        "showingresults": "Dolje {{PLURAL:$1|je prikazan '''1''' rezultat|su prikazana '''$1''' rezultata|je prikazano '''$1''' rezultata}} počev od '''$2'''.",
+       "showingresultsinrange": "Ispod {{PLURAL:$1|je prikazan <strong>1</strong> rezultat|su prikazana <strong>$1</strong> rezultata|je prikazano <strong>$1</strong> rezultata}}, u rasponu od <strong>$2</strong> do <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Rezultat <strong>$1</strong> od <strong>$3</strong>|Rezultati <strong>$1 - $2</strong> od <strong>$3</strong>}}",
        "search-nonefound": "Nisu pronađeni rezultati koji odgovaraju upitu.",
        "powersearch-legend": "Napredna pretraga",
        "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",
        "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-rendering": "Izgled",
        "saveprefs": "Sačuvaj",
        "restoreprefs": "Vrati sve pretpostavljene postavke (u svim sekcijama)",
-       "prefs-editing": "Veličine tekstualnog polja",
+       "prefs-editing": "Uređivanje",
        "rows": "Redova",
        "columns": "Kolona",
        "searchresultshead": "Podešavanja rezultata pretrage",
        "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-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",
        "right-sendemail": "Slanje e-maila drugim korisnicima",
        "right-passwordreset": "Pogledaj e-mailove za obnavljanje šifre",
        "right-managechangetags": "Napravi i briši [[Special:Tags|oznake]] iz baze podataka",
-       "newuserlogpage": "Zapis novih korisnika",
+       "right-applychangetags": "Primijeni [[Special:Tags|oznake]] na nečije izmjene",
+       "newuserlogpage": "Zapisnik novih korisnika",
        "newuserlogpagetext": "Ovo je zapis o registraciji novih korisnika.",
        "rightslog": "Zapisnik korisničkih prava",
        "rightslogtext": "Ovo je zapis promjena korisničkih prava.",
        "action-createpage": "napravite stranicu",
        "action-createtalk": "kreirate stranice za razgovor",
        "action-createaccount": "napravite ovaj korisnički račun",
+       "action-history": "gledate historiju ove stranice",
        "action-minoredit": "da označite ovu izmjenu kao malu",
        "action-move": "premjestite ovu stranicu",
        "action-move-subpages": "premjestite ovu stranicu, i njene podstranice",
        "action-viewmywatchlist": "pogledajte svoj spisak praćenih stranica",
        "action-viewmyprivateinfo": "pogledajte svoje privatne informacije",
        "action-editmyprivateinfo": "uredite svoje privatne podatke",
+       "action-managechangetags": "napravite i uklonite oznake iz baze podataka",
        "nchanges": "$1 {{PLURAL:$1|promjena|promjene|promjena}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|izmjena od Vaše posljedne posjete}}",
        "enhancedrc-history": "historija",
        "recentchanges": "Nedavne izmjene",
        "recentchanges-legend": "Postavke nedavnih izmjena",
        "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.",
-       "uploadlogpage": "Protokol postavljanja",
-       "uploadlogpagetext": "Ispod je spisak najskorijih slanja.",
+       "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",
        "filedesc": "Sažetak",
        "fileuploadsummary": "Sažetak:",
        "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 preusmjerenje",
        "randomredirect-nopages": "Ne postoje preusmjerenja u imenskom prostoru \"$1\".",
        "statistics": "Statistike",
        "statistics-users": "Registrovani [[Special:ListUsers|korisnici]]",
        "statistics-users-active": "Aktivni korisnici",
        "statistics-users-active-desc": "Korisnici koji su izvršili akciju u toku {{PLURAL:$1|posljednjeg dana|posljednja $1 dana|posljednjih $1 dana}}",
+       "pageswithprop": "Stranice sa svojstvom stranice",
+       "pageswithprop-legend": "Stranice sa svojstvom stranice",
+       "pageswithprop-text": "Ova stranica prikazuje stranice koje imaju određeno svojstvo.",
        "pageswithprop-prop": "Naziv svojstva:",
        "pageswithprop-submit": "Idi",
        "doubleredirects": "Dvostruka preusmjerenja",
        "booksources-invalid-isbn": "Navedeni ISBN broj nije validan; molimo da provjerite da li je došlo do greške pri kopiranju iz prvobitnog izvora.",
        "specialloguserlabel": "Izvršilac:",
        "speciallogtitlelabel": "Cilj (naslov ili korisnik):",
-       "log": "Protokoli",
-       "all-logs-page": "Svi javni registri",
-       "alllogstext": "Zajednički prikaz svih dostupnih zapisa sa {{SITENAME}}.\nMožete specificirati prikaz izabiranjem specifičnog spiska, korisničkog imena ili promjenjenog članka (razlikovati velika slova).",
-       "logempty": "Ne postoji takav zapis.",
+       "log": "Zapisnici",
+       "all-logs-page": "Svi javni zapisnici",
+       "alllogstext": "Zajednički prikaz svih dostupnih zapisnika sa {{SITENAME}}.\nMožete specificirati prikaz izabiranjem specifičnog spiska, korisničkog imena ili promjenjenog članka (razlikovati velika slova).",
+       "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",
        "allpages": "Sve stranice",
        "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",
        "watchlistanontext": "Molimo logujte se da vidite ili uredite stavke na Vašem spisku praćenja.",
        "watchnologin": "Niste prijavljeni",
        "addwatch": "Dodaj na spisak praćenja",
-       "addedwatchtext": "Stranica \"[[:$1]]\" je dodata vašem [[Special:Watchlist|spisku praćenih članaka]]. \nBuduće promjene ove stranice i njoj pridružene stranice za razgovor će biti navedene ovde.",
+       "addedwatchtext": "Stranica \"[[:$1]]\" je dodata vašem [[Special:Watchlist|spisku praćenih članaka]]. \nBuduće promjene ove stranice i njoj pridružene stranice za razgovor će biti navedene ovdje.",
        "addedwatchtext-short": "Stranica \"$1\" je dodana na vaš spisak praćenja.",
        "removewatch": "Ukloni sa spiska praćenja",
        "removedwatchtext": "Stranica \"[[:$1]]\" je uklonjena iz [[Special:Watchlist|vašeg spiska praćenih članaka]].",
        "actioncomplete": "Akcija završena",
        "actionfailed": "Akcija nije uspjela",
        "deletedtext": "Članak \"$1\" je obrisan.\nPogledajte $2 za zapisnik nedavnih brisanja.",
-       "dellogpage": "Protokol brisanja",
+       "dellogpage": "Zapisnik brisanja",
        "dellogpagetext": "Ispod je spisak najskorijih brisanja.",
-       "deletionlog": "zapis brisanja",
+       "deletionlog": "zapisnik brisanja",
        "reverted": "Vraćeno na prijašnju reviziju",
        "deletecomment": "Razlog:",
        "deleteotherreason": "Ostali/dodatni razlozi:",
        "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.",
-       "protectlogpage": "Protokol zaključavanja",
+       "changecontentmodel-legend": "Promijeni model sadržaja",
+       "log-name-contentmodel": "Zapisnik promjene modela sadržaja",
+       "log-description-contentmodel": "Događaji koji su povezani s modelom sadržaja stranice",
+       "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",
        "modifiedarticleprotection": "promijenjen stepen zaštite za \"[[$1]]\"",
        "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-deleted": "obrisani doprinosi korisnika",
        "sp-contributions-uploads": "postavljanja",
        "sp-contributions-logs": "zapisnici",
        "contribslink": "doprinosi",
        "emaillink": "pošalji e-mail",
        "autoblocker": "Automatski ste blokirani jer dijelite IP-adresu sa \"[[User:$1|$1]]\".\nRazlog za blokiranje korisnika $1 je ''$2''",
-       "blocklogpage": "Evidencija blokiranja",
+       "blocklogpage": "Zapisnik blokiranja",
        "blocklog-showlog": "Ovaj korisnik je ranije blokiran. Zapisnik blokiranja je prikazan ispod kao referenca:",
        "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",
        "lockfilenotwritable": "Datoteka zaključavanja baze je zaštićena za pisanje.\nAko želite otključati ili zaključati bazu, ova datoteka mora biti omogućena za pisanje od strane web servera.",
        "databasenotlocked": "Baza podataka nije zaključana.",
        "lockedbyandtime": "(od $1 dana $2 u $3)",
-       "move-page": "Premještanje $1",
-       "move-page-legend": "Premjestite stranicu",
+       "move-page": "Premjesti $1",
+       "move-page-legend": "Premjesti stranicu",
        "movepagetext": "Korištenjem ovog formulara možete preimenovati stranicu, premještajući cijelu historiju na novo ime.\nČlanak pod starim imenom postat će stranica koja preusmjerava na članak pod novim imenom. \nMožete automatski izmijeniti preusmjerenje do izvornog naslova.\nAko se ne odlučite na to, provjerite [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|neispravna preusmjeravanja]].\nDužni ste provjeriti da svi linkovi i dalje nastave voditi na prave stranice.\n\nImajte na umu da članak '''neće''' biti premješten ako već postoji članak pod imenom na koje ga namjeravate preusmjeriti osim u slučaju stranice za preusmjeravanje koja nema nikakvih starih izmjena.\nTo znači da možete vratiti stranicu na prethodno mjesto ako pogriješite, ali ne možete zamijeniti postojeću stranicu.\n\n'''Pažnja!'''\nOvo može biti drastična i neočekivana promjena kad su u pitanju popularne stranice.\nMolimo da dobro razmislite prije no što premjestite stranicu.",
-       "movepagetext-noredirectfixer": "Koristeći donji obrazac, preimenovat ćete stranicu i premjestiti cijelu njenu historiju na novi naziv.\nStari naziv postat će preusmjerenje na novi naziv.\nMolimo da provjerite postoje li [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|nedovršena preusmjerenja]].\nVi ste za to odgovorni te morate provjeriti jesu li linkovi ispravni i vode li tamo kamo bi trebali voditi.\n\nImajte na umu da stranica '''neće''' biti premještena ako već postoji stranica s tim imenom, osim ako je prazna ili je preusmjerenje ili nema ranije historije.\nOvo znači da možete preimenovati stranicu nazad gdje je ranije bila preimenovana ako ste pogriješili, ali ne možete ponovo preimenovati postojeću stranicu.\n\n'''Pažnja!'''\nImajte na umu da preusmjeravanje popularnog članka može biti\ndrastična i neočekivana promjena za korisnike; molimo da budete sigurni da ste shvatili posljedice prije no što nastavite.",
-       "movepagetalktext": "Odgovarajuća stranica za razgovor, ako postoji, automatski će biti pomjerena istovremeno '''osim ako:'''\n*pomjerate 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 pomjeriti stranicu ako to želite.",
-       "movearticle": "Premjestite stranicu",
+       "movepagetext-noredirectfixer": "Koristeći donji obrazac, preimenovat ćete stranicu i premjestiti cijelu njenu historiju na novi naziv.\nStari naziv postat će preusmjerenje na novi naziv.\nMolimo da provjerite postoje li [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|nedovršena preusmjerenja]].\nVi ste za to odgovorni te morate provjeriti jesu li linkovi ispravni i vode li tamo kamo bi trebali voditi.\n\nImajte na umu da stranica '''neće''' biti premještena ako već postoji stranica s tim imenom, osim ako je prazna ili je preusmjerenje ili nema ranije historije.\nOvo znači da možete preimenovati stranicu nazad gdje je ranije bila preimenovana ako ste pogriješili, ali ne možete ponovo preimenovati postojeću stranicu.\n\n'''Pažnja!'''\nImajte na umu da premještanje popularnog članka može biti\ndrastična i neočekivana promjena za korisnike; molimo da budete sigurni da ste shvatili posljedice prije no što nastavite.",
+       "movepagetalktext": "Odgovarajuća stranica za razgovor, ako postoji, 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.",
        "movenologintext": "Morate biti registrovani korisnik i [[Special:UserLogin|prijavljeni]] da biste premjestili stranicu.",
        "movenotallowed": "Nemate dopuštenje za premještanje stranica.",
        "cant-move-to-user-page": "Nemate dopuštenje da premjestite stranicu na korisničku stranicu (osim na korisničku podstranicu).",
        "newtitle": "Novi naslov",
        "move-watch": "Prati ovu stranicu",
-       "movepagebtn": "premjestite stranicu",
+       "movepagebtn": "Premjesti stranicu",
        "pagemovedsub": "Premještanje uspjelo",
        "movepage-moved": "'''\"$1\" je premještena na \"$2\"'''",
        "movepage-moved-redirect": "Preusmjerenje je napravljeno.",
        "movepage-page-moved": "Stranica $1 je premještena na $2.",
        "movepage-page-unmoved": "Stranica $1 ne može biti premještena na $2.",
        "movepage-max-pages": "Maksimum od $1 {{PLURAL:$1|stranice|stranice|stranica}} je premješteno i više nije moguće premjestiti automatski.",
-       "movelogpage": "Protokol premještanja",
+       "movelogpage": "Zapisnik premještanja",
        "movelogpagetext": "Ispod je spisak stranica koje su premještene.",
        "movesubpage": "{{PLURAL:$1|Podstranica|Podstranice}}",
        "movesubpagetext": "Ova stranica ima $1 {{PLURAL:$1|podstranicu|podstranice|podstranica}} prikazanih ispod.",
        "watchlistedit-clear-submit": "Isprazni spisak nadgledanja (Ovo je trajno!)",
        "watchlistedit-clear-done": "Vaš spisak praćenja je očišćen.",
        "watchlisttools-clear": "Očisti spisak nadgledanja",
-       "watchlisttools-view": "Pregled promjena praćenih stranica",
-       "watchlisttools-edit": "Pogledaj i uredi listu praćenih članaka.",
-       "watchlisttools-raw": "Uređivanje praćenih stranica u okviru praćenja.",
+       "watchlisttools-view": "Pogledaj srodne izmjene",
+       "watchlisttools-edit": "Pogledaj i uredi spisak praćenja",
+       "watchlisttools-raw": "Uredi spisak praćenja u okviru za uređivanje",
        "iranian-calendar-m1": "Farvardin (Iranski kalendar)",
        "iranian-calendar-m2": "Ordibehesht",
        "iranian-calendar-m3": "Khordad",
        "tags-delete-title": "Izbriši oznaku",
        "tags-delete-reason": "Razlog:",
        "tags-delete-not-found": "Oznaka \"$1\" ne postoji.",
+       "tags-activate-reason": "Razlog:",
+       "tags-activate-not-found": "Oznaka \"$1\" ne postoji.",
        "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-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.",
        "revdelete-uname-unhid": "korisničko ime je otkriveno",
        "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-suppress-block": "$1 {{GENDER:$2|blokirao|blokirala}} je {{GENDER:$4|$3}} sa vremenom isticanja blokade od $5 $6",
        "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-rights": "$1 je {{GENDER:$2|promijenio|promijenila|promijenio}} članstvo grupe za $3 iz $4 u $5",
        "logentry-rights-rights-legacy": "$1 je {{GENDER:$2|promijenio|promijenila|promijenio}} članstvo grupe za $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$1|je automatski promijenjeno članstvo|su automatski promijenjena članstva}} iz $4 u $5",
-       "logentry-upload-upload": "$1 {{GENDER:$2|uploaded}} $3",
+       "logentry-upload-upload": "$1 {{GENDER:$2|postavio|postavila}} je $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|postavio|postavila}} је novu verziju $3",
+       "log-name-managetags": "Zapisnik upravljanja oznaka",
+       "log-name-tag": "Zapisnik oznaka",
        "rightsnone": "(nema)",
        "revdelete-summary": "sažetak",
        "feedback-adding": "Dodajem povratne informacije na stranicu...",
        "pagelang-language": "Jezik",
        "pagelang-use-default": "Koristi podrazumijevani jezik",
        "pagelang-select-lang": "Izaberi jezik",
+       "log-name-pagelang": "Zapisnik promjene jezika",
        "mediastatistics-table-count": "Broj datoteka",
        "mediastatistics-table-totalbytes": "Kombinirana veličina",
        "mediastatistics-header-unknown": "Nepoznato",
index ab1be9f..bb14cfc 100644 (file)
        "passwordreset": "Restablir contrasenya",
        "passwordreset-text-one": "Cal completar aquest formulari per reiniciar la contrasenya",
        "passwordreset-text-many": "{{PLURAL:$1|Ompliu un dels camps per a rebre una contrasenya temporal al vostre correu electrònic.}}",
-       "passwordreset-legend": "Restablir contrasenya",
        "passwordreset-disabled": "S'ha desactivat el restabliment de contranyes en aquest wiki.",
        "passwordreset-emaildisabled": "Les opcions de correu electrònic no estan habilitades en aquest wiki.",
        "passwordreset-username": "Nom d'usuari:",
        "resettokens": "Reinicia els testimonis",
        "resettokens-text": "Des d'aquí podeu reiniciar els testimonis que permeten l'accés a certes dades privades associades amb el vostre compte.\n\nHo hauríeu de fer si accidentalment els heu compartit amb algú o si el vostre compte ha estat compromès.",
        "resettokens-no-tokens": "No hi ha testimonis per reiniciar.",
-       "resettokens-legend": "Reinicia els testimonis",
        "resettokens-tokens": "Testimonis:",
        "resettokens-token-label": "$1 (valor actual: $2)",
        "resettokens-watchlist-token": "Testimoni del canal web (Atom/RSS) dels [[Special:Watchlist|canvis a la llista de seguiment]]",
        "filedelete-reason-dropdown": "*Motius d'eliminació comuns\n** Violació dels drets d'autor / copyright\n** Fitxer duplicat",
        "filedelete-edit-reasonlist": "Edita els motius d'eliminació",
        "filedelete-maintenance": "L'esborrament i recuperació de fitxers està temporalment deshabilitada durant el manteniment.",
-       "filedelete-maintenance-title": "No pot suprimir arxiu",
+       "filedelete-maintenance-title": "No es pot suprimir el fitxer",
        "mimesearch": "Cerca per MIME",
        "mimesearch-summary": "Aquesta pàgina habilita el filtratge de fitxers per llur tipus MIME. Contingut: contenttype/subtype o contenttype/*, p. ex. <code>image/jpeg</code>.",
        "mimetype": "Tipus MIME:",
        "randomincategory-nopages": "No hi ha pàgines a la categoria [[:Category:$1|$1]].",
        "randomincategory-category": "Categoria:",
        "randomincategory-legend": "Pàgina a l’atzar en la categoria",
+       "randomincategory-submit": "Vés-hi",
        "randomredirect": "Redirecció a l'atzar",
        "randomredirect-nopages": "No hi ha cap redirecció a l'espai de noms «$1».",
        "statistics": "Estadístiques",
        "version-libraries": "Biblioteques instal·lades",
        "version-libraries-library": "Biblioteca",
        "version-libraries-version": "Versió",
+       "version-libraries-license": "Llicència",
+       "version-libraries-description": "Descripció",
+       "version-libraries-authors": "Autors",
        "redirect": "Redirigeix per fitxer, usuari, pàgina o ID de la revisió",
        "redirect-legend": "Redirigeix a un fitxer o a una pàgina",
        "redirect-summary": "Aquesta pàgina especial redirigeix a un fitxer (donat el nom del fitxer), una pàgina (donats un ID de la revisió o un ID de pàgina), o a una pàgina d'usuari (donat un ID numèric d'usuari). Ús: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
index b7c7ca6..dc1c96b 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": "電批地址:",
index 52f656e..7aa3ff3 100644 (file)
        "faq": "СиХХ",
        "faqpage": "Project:СиХХ",
        "actions": "Дийраш",
-       "namespaces": "Цlерийн ана",
+       "namespaces": "ЦӀерийн ана",
        "variants": "Кепараш",
        "navigation-heading": "Навигацин меню",
        "errorpagetitle": "ГӀалат",
        "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": "Керла агӀо",
        "databaseerror-error": "ГӀалат: $1",
        "laggedslavemode": "Тергам бе: агӀона чохь керла йаьхинарш ца хила мега.",
        "readonly": "Блоктоьхна дӀайаздар хаамийн бухе",
-       "enterlockreason": "Ð\91илгалде Ð±Ð»Ð¾ÐºÑ\82оÑ\85аÑ\80ан Ð±Ð°Ñ\85Ñ\8cна Ð° и чекх йолу хан а.",
+       "enterlockreason": "Ð\91илгалде Ð±Ð»Ð¾ÐºÑ\82оÑ\85аÑ\80ан Ð±Ð°Ñ\85Ñ\8cана Ð°, и чекх йолу хан а.",
        "readonlytext": "АгӀонаш тӀетохар а кхин хийцамаш барна а блоктоьхна:\nБлокоьхначо биттина хаам: $1.",
        "missing-article": "ХӀокху чохь кароезаш йолу хьан дехарца йозан агӀонаш цакарийна «$1» $2.\n\nИштнарг наггахь хуьлу хьажорг дӀаяьккхина елахь я хийцам бина тиша хьажоргца дехьа гӀо гӀоьртича.\n\nНагахьсан гӀулкх цуьнах доьзна дацахь, хьуна карийна гӀирс латточехь гӀалат.\nДехар до, хаам бе оцуьнах [[Special:ListUsers/sysop|куьйгалхога]], гойтуш URL.",
        "missingarticle-rev": "(верси № $1)",
        "badarticleerror": "И хӀума кхочушъ дан йиш яц хӀокху агӀонехь.",
        "cannotdelete": "Цатарло дӀаяккха я цӀе хийца «$1».\nАгӀо хьалхо дӀаяьккхина хила тарло",
        "cannotdelete-title": "Цатарло агӀо дӀаяккха «$1»",
-       "delete-hook-aborted": "Нисдар юхадаьккхина тӀехьожучо.\nХӀу бахьна ду билгал дина дац.",
+       "delete-hook-aborted": "Ð\9dиÑ\81даÑ\80 Ñ\8eÑ\85адаÑ\8cккÑ\85ина Ñ\82Ó\80еÑ\85Ñ\8cожÑ\83Ñ\87о.\nÐ¥Ó\80Ñ\83 Ð±Ð°Ñ\85Ñ\8cана Ð´Ñ\83 Ð±Ð¸Ð»Ð³Ð°Ð» Ð´Ð¸Ð½Ð° Ð´Ð°Ñ\86.",
        "no-null-revision": "«$1» агӀона нисдар дан цаделира",
        "badtitle": "Цамегаш йолу цӀе",
        "badtitletext": "Дехарца йолу агӀонан цӀе нийса яц, йаьсса ю, хила мега нийса ца хӀоттийна меттаюкъар йа юкъарвики цӀе. Хила мега, цӀарца цамагош йолу символаш.",
        "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-агӀо тая, иза кхечу декъашхочун гӀерс болу дера.",
        "myprivateinfoprotected": "Хьайн долара хаамна хийцам ба хьа йиш яц",
        "mypreferencesprotected": "Хьай гӀирс нисбан хьа бакъо яц.",
        "ns-specialprotected": "ХӀокху «{{ns:special}}» цӀерийн меттигашан агӀонаш таян йиш яц.",
-       "titleprotected": "[[Декъашхочо:$1|$1]] дихкина ишта корта болуш агӀо кхоллар.\nГайтина бахьна: ''$2''.",
+       "titleprotected": "[[Декъашхо:$1|$1]] дихкина ишта корта болуш агӀо кхоллар.\nГайтина бахьана: ''$2''.",
        "filereadonlyerror": "файл хийца цатарло «$1», «$2» Ӏалаш ечехь ешаран хьолехь хилар бахьнехь.\n\nХӀара хьал хӀоттиначу куьйгалхочо битина хаам: «''$3''».",
        "invalidtitle-knownnamespace": "Магийна боцу коьртамогӀа цӀерийн меттигца «$2» йоза  «$3»",
        "invalidtitle-unknownnamespace": "Магийна боцу коьртамогӀа ца йовза меттигца $1 «$2» йозанца",
        "createacct-another-email-ph": "ДӀаязде электронан поштан адрес",
        "createaccountmail": "Лела йе цахууш нисйина хана пароль, кхин язйинчу электронан адрес тӀе яийта и.",
        "createacct-realname": "Хьан цӀе (ца язйича мега)",
-       "createaccountreason": "Бахьна:",
-       "createacct-reason": "Бахьна",
+       "createaccountreason": "Ð\91аÑ\85Ñ\8cана:",
+       "createacct-reason": "Ð\91аÑ\85Ñ\8cана",
        "createacct-reason-ph": "Стен кхуллуш ду ахьа керла декъашхочун дӀаяздар",
        "createacct-captcha": "Кхерамзалла хьажар",
        "createacct-imgcaptcha-ph": "ДӀаязде хьайна лакхахь гуш долу йоза",
        "passwordsent": "Керла пароль декъашхочун $1 электронан адрес тӀе дӀахьажина. Дехар до, керла пароль еъча юху системин чугӀо.",
        "blocked-mailpassword": "Хьан IP-адрес ца тадарш дан магийна дац, цуьндела пароль меттахӀотош йолу функци блоктоьхна ю.",
        "eauthentsent": "ДӀаяздинчу электронан адрес тӀе хаам баийтина.\nДаиман хаамаш баийта хааман чохь де бохург дан деза адрес хьай хилар бакъдеш.",
-       "throttled-mailpassword": "Ð\9fаÑ\80олÑ\8c Ð´Ð°Ð³Ð° Ð¹Ð¾Ñ\83Ñ\8cйÑ\82Ñ\83 Ñ\84Ñ\83нкÑ\86и {{PLURAL:$1|Ñ\82Ó\80ехьара $1 сахьтехь}} лелина.\nЗулам цахилийта $1 {{PLURAL:$1|сахьтан чохь}} цӀа бен функци лело йиш яц.",
+       "throttled-mailpassword": "Ð\9fаÑ\80олÑ\8c Ð´Ð°Ð³Ð° Ð¹Ð¾Ñ\83Ñ\8cйÑ\82Ñ\83 Ñ\84Ñ\83нкÑ\86и {{PLURAL:$1|Ñ\82Ó\80аÑ\8cÑ\85хьара $1 сахьтехь}} лелина.\nЗулам цахилийта $1 {{PLURAL:$1|сахьтан чохь}} цӀа бен функци лело йиш яц.",
        "mailerror": "Кехат дохьуьйтуш гӀалат ду: $1",
        "acct_creation_throttle_hit": "Де-буьйса хена чохь хьа IP-адрес тӀера {{PLURAL:$1|кхоьллина $1 декъашхочун дӀаяздар|кхоьллина $1 декъашхочун дӀаяздарш}} оьцу хана юкъахь кхин дукха дӀаяздарш кхолла магийна дац.\nЦундела и IP-адрес лелочарна кхин керла дӀаяздарш кхолла цало.",
        "emailauthenticated": "Хьан электронан поштан адрес бакъдина $2 $3.",
        "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|хьан тергаме могӀанан чура агӀонашна хийцамаш бар]]",
        "subject-preview": "Коьрта могӀа хира бу:",
        "previewerrortext": "Хьан хийцамашка хьалха хьажа гӀертачу хенахь гӀалат даьлла.",
        "blockedtitle": "Декъашхочун блоктоьхана",
-       "blockedtext": "'''Хьан декъашхочун дӀаяздар я IP-адрес блоктоьхна ду.'''\n\nБлоктоьхна куьйгалхочо $1.\nБилгалдина бахьна: «''$2''».\n\n* Блоктохар доладелла: $8\n* Блоктохар чекхдолу: $6\n* Блоктохаран Ӏалашо: $7\n\nХьа йиш ю $1 декъашхочуьнга дехардан я кхечу муьлха [[{{MediaWiki:Grouppage-sysop}}|куьйгалхочуьнга]].\nТергам бе, хьа таро яц «декъашхочунга кехат» олу функци лелаян, хьан [[Special:Preferences|гӀирс нисбар чохь]] нийса электронан поштан адрес яздина дацахь, я кехаташ кхехӀитарна а блоктоьхна елахь.\nХьан IP-адрес — $3, блоктохаран идентификатор — $5.\nДехар до, хьайн хаам чохь билгалде и.",
+       "blockedtext": "'''Ð¥Ñ\8cан Ð´ÐµÐºÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ð´Ó\80аÑ\8fздаÑ\80 Ñ\8f IP-адÑ\80еÑ\81 Ð±Ð»Ð¾ÐºÑ\82оÑ\8cÑ\85на Ð´Ñ\83.'''\n\nÐ\91локÑ\82оÑ\8cÑ\85на ÐºÑ\83Ñ\8cйгалÑ\85оÑ\87о $1.\nÐ\91илгалдина Ð±Ð°Ñ\85Ñ\8cана: Â«''$2''».\n\n* Ð\91локÑ\82оÑ\85аÑ\80 Ð´Ð¾Ð»Ð°Ð´ÐµÐ»Ð»Ð°: $8\n* Ð\91локÑ\82оÑ\85аÑ\80 Ñ\87екÑ\85долÑ\83: $6\n* Ð\91локÑ\82оÑ\85аÑ\80ан Ó\80алаÑ\88о: $7\n\nÐ¥Ñ\8cа Ð¹Ð¸Ñ\88 Ñ\8e $1 Ð´ÐµÐºÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83Ñ\8cнга Ð´ÐµÑ\85аÑ\80дан Ñ\8f ÐºÑ\85еÑ\87Ñ\83 Ð¼Ñ\83Ñ\8cлÑ\85а [[{{MediaWiki:Grouppage-sysop}}|кÑ\83Ñ\8cйгалÑ\85оÑ\87Ñ\83Ñ\8cнга]].\nТеÑ\80гам Ð±Ðµ, Ñ\85Ñ\8cа Ñ\82аÑ\80о Ñ\8fÑ\86 Â«Ð´ÐµÐºÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83нга ÐºÐµÑ\85аÑ\82» Ð¾Ð»Ñ\83 Ñ\84Ñ\83нкÑ\86и Ð»ÐµÐ»Ð°Ñ\8fн, Ñ\85Ñ\8cан [[Special:Preferences|гÓ\80иÑ\80Ñ\81 Ð½Ð¸Ñ\81баÑ\80 Ñ\87оÑ\85Ñ\8c]] Ð½Ð¸Ð¹Ñ\81а Ñ\8dлекÑ\82Ñ\80онан Ð¿Ð¾Ñ\88Ñ\82ан Ð°Ð´Ñ\80еÑ\81 Ñ\8fздина Ð´Ð°Ñ\86аÑ\85Ñ\8c, Ñ\8f ÐºÐµÑ\85аÑ\82аÑ\88 ÐºÑ\85еÑ\85Ó\80иÑ\82аÑ\80на Ð° Ð±Ð»Ð¾ÐºÑ\82оÑ\8cÑ\85на ÐµÐ»Ð°Ñ\85Ñ\8c.\nÐ¥Ñ\8cан IP-адÑ\80еÑ\81 â\80\94 $3, Ð±Ð»Ð¾ÐºÑ\82оÑ\85аÑ\80ан Ð¸Ð´ÐµÐ½Ñ\82иÑ\84икаÑ\82оÑ\80 â\80\94 $5.\nÐ\94еÑ\85аÑ\80 Ð´Ð¾, Ñ\85Ñ\8cайн Ñ\85аам Ñ\87оÑ\85Ñ\8c Ð±Ð¸Ð»Ð³Ð°Ð»Ð´Ðµ Ð¸.",
        "blockednoreason": "бахьана билгалдина дац",
        "whitelistedittext": "Ахьа да деза $1 агӀона хийцамаш бан.",
        "nosuchsectiontitle": "Дакъа каро йиш яц.",
        "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": "Хьан бакъо яц керла агӀонаш кхолла.",
        "recreate-moveddeleted-warn": "'''Тидам бе. Ахьа кхуллуш ю, хьалхо дӀаяьккхина йолу агӀо.'''\n\nХьажа, билгалла оьши хьуна хӀара агӀо юха кхолла.\nЛахахь далина ду дӀаяхарш тӀяхь долу тептарш а хӀокх агӀона цӀе хийцарш а.",
        "moveddeleted-notice": "Иза агӀо дӀаяьккхина яра.\nХаийтарна лахахьа гойту, цуьнца долу дӀаяздарш кху тептар чура дӀаяхарш а цӀе хийцарш а.",
        "log-fulllog": "Хьажа деригге тептаре",
-       "edit-hook-aborted": "Нисдар юхадаьккхина тӀехьожучо.\nХӀу бахьна ду билгал дина дац.",
+       "edit-hook-aborted": "Ð\9dиÑ\81даÑ\80 Ñ\8eÑ\85адаÑ\8cккÑ\85ина Ñ\82Ó\80еÑ\85Ñ\8cожÑ\83Ñ\87о.\nÐ¥Ó\80Ñ\83 Ð±Ð°Ñ\85Ñ\8cана Ð´Ñ\83 Ð±Ð¸Ð»Ð³Ð°Ð» Ð´Ð¸Ð½Ð° Ð´Ð°Ñ\86.",
        "edit-gone-missing": "АгӀо карлаяккха цатарло.\nИза дӀаяьккхина хила мега.",
        "edit-conflict": "Тадарна дойнаш.",
        "edit-no-change": "Хьан нисдар юхадаьккхина, ахьа хийцамаш бина цахилар бахьнехь.",
        "rev-deleted-user": "(авторан цӏе дӏаяйина)",
        "rev-deleted-event": "(дӀаяздар дӀаяьккхина)",
        "rev-deleted-user-contribs": "[декъашхочун цӀе я IP-адрес дӀаяхина — къинхьегаман агӀонгара нисдар къайлаяьккхина]",
-       "rev-deleted-text-permission": "ХӀара агӀона верси '''дӀаяьккхина''' ю.\nБахьна далина [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дӀаяьхнарш йолу тептар чохь].",
-       "rev-suppressed-text-permission": "ХӀара агӀона верси <strong>къайлаяьккхина ю</strong>.\nБахьна далина [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} къайлаяьхарш йолу тептар чохь].",
-       "rev-deleted-text-unhide": "ХӀара агӀона верси '''дӀаяьккхина''' ю.\nБахьна далина [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дӀаяьхнарш йолу тептар чохь].\nХьайна лаахь хьа йиш ю [$1 и верси хьажа].",
-       "rev-suppressed-text-unhide": "ХӀара агӀона верси '''къайлаяьккхина''' ю.\nБахьна далина [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дӀаяьхнарш йолу тептар чохь].\nХьайна лаахь хьа йиш ю [$1 и верси хьажа].",
-       "rev-deleted-text-view": "ХӀара агӀона верси '''дӀаяьккхина''' ю.\nБахьна далина [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дӀаяьхнарш йолу тептар чохь].",
-       "rev-suppressed-text-view": "ХӀара агӀона верси '''къайлаяьккхина''' ю.\nБахьна далина [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дӀаяьхнарш йолу тептар чохь].",
+       "rev-deleted-text-permission": "Ð¥Ó\80аÑ\80а Ð°Ð³Ó\80она Ð²ÐµÑ\80Ñ\81и '''дÓ\80аÑ\8fÑ\8cккÑ\85ина''' Ñ\8e.\nÐ\91аÑ\85Ñ\8cана Ð´Ð°Ð»Ð¸Ð½Ð° [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Ð´Ó\80аÑ\8fÑ\8cÑ\85наÑ\80Ñ\88 Ð¹Ð¾Ð»Ñ\83 Ñ\82епÑ\82аÑ\80 Ñ\87оÑ\85Ñ\8c].",
+       "rev-suppressed-text-permission": "Ð¥Ó\80аÑ\80а Ð°Ð³Ó\80она Ð²ÐµÑ\80Ñ\81и <strong>кÑ\8aайлаÑ\8fÑ\8cккÑ\85ина Ñ\8e</strong>.\nÐ\91аÑ\85Ñ\8cана Ð´Ð°Ð»Ð¸Ð½Ð° [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ÐºÑ\8aайлаÑ\8fÑ\8cÑ\85аÑ\80Ñ\88 Ð¹Ð¾Ð»Ñ\83 Ñ\82епÑ\82аÑ\80 Ñ\87оÑ\85Ñ\8c].",
+       "rev-deleted-text-unhide": "Ð¥Ó\80аÑ\80а Ð°Ð³Ó\80она Ð²ÐµÑ\80Ñ\81и '''дÓ\80аÑ\8fÑ\8cккÑ\85ина''' Ñ\8e.\nÐ\91аÑ\85Ñ\8cана Ð´Ð°Ð»Ð¸Ð½Ð° [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Ð´Ó\80аÑ\8fÑ\8cÑ\85наÑ\80Ñ\88 Ð¹Ð¾Ð»Ñ\83 Ñ\82епÑ\82аÑ\80 Ñ\87оÑ\85Ñ\8c].\nÐ¥Ñ\8cайна Ð»Ð°Ð°Ñ\85Ñ\8c Ñ\85Ñ\8cа Ð¹Ð¸Ñ\88 Ñ\8e [$1 Ð¸ Ð²ÐµÑ\80Ñ\81и Ñ\85Ñ\8cажа].",
+       "rev-suppressed-text-unhide": "Ð¥Ó\80аÑ\80а Ð°Ð³Ó\80она Ð²ÐµÑ\80Ñ\81и '''кÑ\8aайлаÑ\8fÑ\8cккÑ\85ина''' Ñ\8e.\nÐ\91аÑ\85Ñ\8cана Ð´Ð°Ð»Ð¸Ð½Ð° [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Ð´Ó\80аÑ\8fÑ\8cÑ\85наÑ\80Ñ\88 Ð¹Ð¾Ð»Ñ\83 Ñ\82епÑ\82аÑ\80 Ñ\87оÑ\85Ñ\8c].\nÐ¥Ñ\8cайна Ð»Ð°Ð°Ñ\85Ñ\8c Ñ\85Ñ\8cа Ð¹Ð¸Ñ\88 Ñ\8e [$1 Ð¸ Ð²ÐµÑ\80Ñ\81и Ñ\85Ñ\8cажа].",
+       "rev-deleted-text-view": "Ð¥Ó\80аÑ\80а Ð°Ð³Ó\80она Ð²ÐµÑ\80Ñ\81и '''дÓ\80аÑ\8fÑ\8cккÑ\85ина''' Ñ\8e.\nÐ\91аÑ\85Ñ\8cана Ð´Ð°Ð»Ð¸Ð½Ð° [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Ð´Ó\80аÑ\8fÑ\8cÑ\85наÑ\80Ñ\88 Ð¹Ð¾Ð»Ñ\83 Ñ\82епÑ\82аÑ\80 Ñ\87оÑ\85Ñ\8c].",
+       "rev-suppressed-text-view": "Ð¥Ó\80аÑ\80а Ð°Ð³Ó\80она Ð²ÐµÑ\80Ñ\81и '''кÑ\8aайлаÑ\8fÑ\8cккÑ\85ина''' Ñ\8e.\nÐ\91аÑ\85Ñ\8cана Ð´Ð°Ð»Ð¸Ð½Ð° [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Ð´Ó\80аÑ\8fÑ\8cÑ\85наÑ\80Ñ\88 Ð¹Ð¾Ð»Ñ\83 Ñ\82епÑ\82аÑ\80 Ñ\87оÑ\85Ñ\8c].",
        "rev-deleted-no-diff": "АгӀона цхьа верси '''дӀаяьккхина''' хилар бахьнехь, хӀуна версийн башхалла хьажа цало.\nМадарра каро мега [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дӀаяккхаран тептар чохь].",
        "rev-suppressed-no-diff": "Хьо хӀокху версешан башхала хьажа цало, царах цхьаъ '''дӀаяьккхина''' хилар бахьнехь.",
        "rev-delundel": "гайта/къайла",
        "revdelete-radio-unset": "Гуш ерг",
        "revdelete-suppress": "Къайлабаха хаамаш куьйгалхойх а",
        "revdelete-unsuppress": "МеттахӀоьттина версийн дихкар къайладаккха",
-       "revdelete-log": "Бахьна:",
+       "revdelete-log": "Ð\91аÑ\85Ñ\8cана:",
        "revdelete-submit": "Кхочушде {{PLURAL:$1|1=къастина версин|къастина версийн}}",
        "revdelete-success": "'''Версеш гуш хилар кхиамца хийцина.'''",
        "revdelete-failure": "'''Версеш гуш хилар хийца йиш яц:'''\n$1",
        "deletedhist": "ДӀаяккхаран истори",
        "revdelete-hide-current": "Цунах $2, $1: дӀаяздар къайладаккхаран гӀалат и верси карара ю.\nИза къайлаяккха йиш яц.",
        "revdelete-reason-dropdown": "Даржина долу дӀаяккхаран баьхьанаш \n** Авторан бакъонаш талхор\n** Бита йиш йоцу шех лаьцна хаам\n** Бакъдоцург зуламан хаам",
-       "revdelete-otherreason": "Кхин бахьна/тӀетохар:",
-       "revdelete-reasonotherlist": "Кхин бахьна",
+       "revdelete-otherreason": "Ð\9aÑ\85ин Ð±Ð°Ñ\85Ñ\8cана/Ñ\82Ó\80еÑ\82оÑ\85аÑ\80:",
+       "revdelete-reasonotherlist": "Ð\9aÑ\85ин Ð±Ð°Ñ\85Ñ\8cана",
        "revdelete-edit-reasonlist": "Бахьанин могӀам нисбар",
        "revdelete-offender": "АгӀона версин автор:",
        "suppressionlog": "Хьулдаран тептар",
        "mergehistory-invalid-destination": "Юзийна агӀона нийса корта хила еза.",
        "mergehistory-autocomment": "Дехьа яьккхина [[:$1]] [[:$2]] чу",
        "mergehistory-comment": "Дехьа яьккхина [[:$1]] [[:$2]] чу: $3",
-       "mergehistory-reason": "Бахьна:",
+       "mergehistory-reason": "Ð\91аÑ\85Ñ\8cана:",
        "mergelog": "Цхьаьнатохаршан тептар",
        "revertmerge": "Йекъа",
        "mergelogpagetext": "Лахахь гойту тӀеххьара вовшахтоьхна агӀонийн могӀам.",
        "userrights-groupsmember": "Декъашхо:",
        "userrights-groupsmember-auto": "Бакъонашан тоба:",
        "userrights-groups-help": "Хьона хийца ло декъашхочун бакъонаш.\n* Бакъона цӀера юххехь билгало елахь, цуна и бакъо йолуш ю.\n* Билгало яцахь — декъашхочун и бакъо яц.\n* Знако * билгала до ахьа бакъо еллачул тӀаьхьа хьона и дӀаяккха цалуш хилар.",
-       "userrights-reason": "Бахьна:",
+       "userrights-reason": "Ð\91аÑ\85Ñ\8cана:",
        "userrights-no-interwiki": "Хьан бакъо яц декъашхой бакъо хийца кхечу википеди чохь.",
        "userrights-nologin": "Куьйгалхочунна бакъо йолу [[Special:UserLogin|дӀаяздарца]] ло декъашхочун бакъо.",
        "userrights-notallowed": "Хьан дӀаяздарца магийна дац декъашхошна бакъо яла а дӀаяккха а.",
        "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-editusercss": "кхечу декъашхойн CSS-файлаш нсяр",
        "backend-fail-read": "Файл «$1» еша цаелира.",
        "backend-fail-create": "Файл $1 дӀаязъян цаелира.",
        "backend-fail-maxsize": "Файл $1 дӀаязъян цаелира, цуна барам $2 {{PLURAL:$2|байт}} сов хилар бахьнехь.",
-       "backend-fail-readonly": "ХӀара «$1» хӀинца еша бен таро яц. Бахьна: «$2»",
+       "backend-fail-readonly": "Ð¥Ó\80аÑ\80а Â«$1» Ñ\85Ó\80инÑ\86а ÐµÑ\88а Ð±ÐµÐ½ Ñ\82аÑ\80о Ñ\8fÑ\86. Ð\91аÑ\85Ñ\8cана: Â«$2»",
        "lockmanager-notlocked": "БлокдӀаяккха цаелира \"$1\"; цуна блоктоьхна яц.",
        "lockmanager-fail-closelock": "Блоктохаран «$1» файл къайлаяккха цаелира.",
        "lockmanager-fail-deletelock": "Блоктохаран файл «$1» дӀаяккха цатарло.",
        "filerevert": "Тохарлера верси юхаерзор $1",
        "filerevert-legend": "Файлан верси юхаерзо",
        "filerevert-intro": "<span class=\"plainlinks\">Файл юхаерзош ю '''[[Media:$1|$1]]''' оцу [$4 верси $3, $2].</span>",
-       "filerevert-comment": "Бахьна:",
+       "filerevert-comment": "Ð\91аÑ\85Ñ\8cана:",
        "filerevert-defaultcomment": "Юхаерзош ю оцу $2, $1 хенахь хила верси",
        "filerevert-submit": "Юхаяккха",
        "filerevert-success": "Юхаерзина файл '''[[Media:$1|$1]]''' оцу [$4 верси $3, $2].",
        "filedelete-legend": "ДӀаяккха файл",
        "filedelete-intro": "Хьо файл '''[[Media:$1|$1]]''' дӀаяккха гӀерта цунна массо истори цхьан.",
        "filedelete-intro-old": "<span class=\"plainlinks\">Ахьа дӀайоккхуш ю верси '''[[Media:$1|$1]]''' цу [$4 $3, $2].</span>",
-       "filedelete-comment": "Бахьна:",
+       "filedelete-comment": "Ð\91аÑ\85Ñ\8cана:",
        "filedelete-submit": "ДӀаяккха",
        "filedelete-success": "$1 дӀаяьккхи.",
        "filedelete-success-old": "Верси '''[[Media:$1|$1]]''' цу $3 $2 дӀаяьккхина.",
        "filedelete-nofile": "'''$1''' яц.",
-       "filedelete-otherreason": "Кхин бахьна:",
-       "filedelete-reason-otherlist": "Кхин бахьна",
+       "filedelete-otherreason": "Ð\9aÑ\85ин Ð±Ð°Ñ\85Ñ\8cана:",
+       "filedelete-reason-otherlist": "Ð\9aÑ\85ин Ð±Ð°Ñ\85Ñ\8cана",
        "filedelete-reason-dropdown": "* Даржина долу дӀаяккхаран баьхьанаш \n** Авторан бакъонаш талхор\n** ЦхӀатера файлаш хилар",
        "filedelete-edit-reasonlist": "Бахьанин могӀам нисбар",
        "filedelete-maintenance-title": "Файл дӀаяккха цало",
        "randomincategory-nopages": "[[:Category:$1]] категори чохь агӀонаш яц.",
        "randomincategory-category": "Категори:",
        "randomincategory-legend": "Категори чу цахууш нисъелла  агӀо",
+       "randomincategory-submit": "Дехьа гӀо",
        "randomredirect": "Цахууш нисделла дIасахьажор",
        "randomredirect-nopages": "«$1» цӀерийн меттиган чохь дӀасахьажораш яц.",
        "statistics": "Статистика",
        "shortpages": "Боца яззамаш",
        "longpages": "Беха яззамаш",
        "deadendpages": "Дика йоцу агӀонаш",
-       "protectedpages": "Ð\93IаÑ\80олла Ð´ина агӀонаш",
-       "protectedpages-indef": "Хан Ð¹Ð¾Ñ\86Ñ\83Ñ\88 Ð³Ó\80оÑ\80алла Ð´инарш бен",
-       "protectedpages-cascade": "ЧаÑ\85Ñ\87аÑ\80ин Ð³Ó\80оÑ\80алла бен",
+       "protectedpages": "Ð\9bаÑ\80йина агӀонаш",
+       "protectedpages-indef": "Хан Ð¹Ð¾Ñ\86Ñ\83Ñ\88 Ð»Ð°Ñ\80йинарш бен",
+       "protectedpages-cascade": "ЧаÑ\85Ñ\87аÑ\80ин Ð»Ð°Ñ\80Ñ\8aÑ\8fÑ\80 бен",
        "protectedpages-noredirect": "Къайлаяха дӀасахьажийнарш",
        "protectedpages-timestamp": "Терахь/хан",
        "protectedpages-page": "АгӀо",
        "protectedpages-expiry": "Чекхйолу",
        "protectedpages-performer": "Декъашхо ларор",
        "protectedpages-params": "ГӀаролийн параметраш",
-       "protectedpages-reason": "Бахьна",
+       "protectedpages-reason": "Ð\91аÑ\85Ñ\8cана",
        "protectedpages-unknown-timestamp": "Хууш дац",
        "protectedpages-unknown-performer": "Хууш доцу декъашхо",
-       "protectedtitles": "Ð\93Ó\80аÑ\80олла Ð´ина цӀерш",
+       "protectedtitles": "Ð\9bаÑ\80йина цӀерш",
        "listusers": "Декъашхойн могӀам",
        "listusers-editsonly": "Цхаъ мукъане а хийцам бина декъашхой гайта",
        "listusers-creationsort": "Кхоьллина хене хьаьжжина нисъяр",
        "dellogpage": "ДӀадаьхнарш долу тéптар",
        "dellogpagetext": "Лахахь гойтуш ю тӀаьххьара дӀаяьхнарш.",
        "deletionlog": "дӀадаьхнарш долу тéптар",
-       "deletecomment": "Бахьна:",
-       "deleteotherreason": "Кхин бахьна/тӀетохар:",
-       "deletereasonotherlist": "Кхин бахьна",
+       "deletecomment": "Ð\91аÑ\85Ñ\8cана:",
+       "deleteotherreason": "Ð\9aÑ\85ин Ð±Ð°Ñ\85Ñ\8cана/Ñ\82Ó\80еÑ\82оÑ\85аÑ\80:",
+       "deletereasonotherlist": "Ð\9aÑ\85ин Ð±Ð°Ñ\85Ñ\8cана",
        "deletereason-dropdown": "* Даржина долу дӀаяккхаран баьхьанаш \n** спам\n** зулма  \n** авторан лаамца\n** авторан бакъонаш талхор\n** болх цабо дӀасхьажорг",
        "delete-edit-reasonlist": "Бахьанин могӀам нисбар",
        "deleting-backlinks-warning": "'''ДӀахьедар:''' Ахьа дӀайоккхуш йолчун тӀе товжийна [[Special:WhatLinksHere/{{FULLPAGENAME}}|кхин агӀонаш]] ю.",
        "rollbacklinkcount": "юхадаккха $1 {{PLURAL:$1|1=нисдар|нисдарш}}",
        "rollbacklinkcount-morethan": "Юхадаккха $1 дукха {{PLURAL:$1|нисдар|нисдарш|нисдарш}}",
        "rollbackfailed": "Юхайоккхуш гӀалат ду",
-       "alreadyrolled": "ТÓ\80ехьара [[User:$2|$2]] ([[User talk:$2|дийцаре]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) декъашхочо «[[:$1]]» агӀона  бина хийцамаш юхабаха цатарло,\nхӀинцале цхъаъ кхиъна хийцамаш юхабаха я агӀо тая.\n\nХийцамаш бинарг [[User:$3|$3]] ([[User talk:$3|дийцаре]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
-       "editcomment": "Хийцамаш барна гайтина бахьна: ''$1''.",
+       "alreadyrolled": "ТÓ\80аÑ\8cÑ\85хьара [[User:$2|$2]] ([[User talk:$2|дийцаре]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) декъашхочо «[[:$1]]» агӀона  бина хийцамаш юхабаха цатарло,\nхӀинцале цхъаъ кхиъна хийцамаш юхабаха я агӀо тая.\n\nХийцамаш бинарг [[User:$3|$3]] ([[User talk:$3|дийцаре]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "editcomment": "ХийÑ\86амаÑ\88 Ð±Ð°Ñ\80на Ð³Ð°Ð¹Ñ\82ина Ð±Ð°Ñ\85Ñ\8cана: ''$1''.",
        "revertpage": "Нисдарш [[Special:Contributions/$2|$2]] ([[User talk:$2|дийцаре]]) юха даьхна версин [[User:$1|$1]]",
        "revertpage-nouser": "Нисдарш (декъашхочун цӀе хьулйина) юхадаьхина версин {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Юхадаьхна $1; нисдарш, $2 версин.",
        "sessionfailure-title": "Сеансан гӀалат",
        "sessionfailure": "Карара белхан сеансан гӀалат деллачух тера ду;\nиза дешдерг сацийна «сеанс долаерзийтта».\nДехар до, тӀетаӀе «ЮхугӀо» кнопка, кхин агӀо карлаяккха.",
+       "changecontentmodel": "АгӀона контентан модель таяр",
+       "changecontentmodel-title-label": "АгӀона цӀе",
+       "changecontentmodel-reason-label": "Бахьана:",
+       "logentry-contentmodel-change-revertlink": "юхаяккха",
+       "logentry-contentmodel-change-revert": "Юхаяккха",
        "protectlogpage": "Гlаролли тептар",
-       "protectlogtext": "Лахахь гойту агӀона гӀоралла дарна бина хийцамаш чохь болу тептар.\nХьа кхин йиш ю [[Special:ProtectedPages|хӀинца гӀоралла дина йолу агӀонийн могӀаме хьажа]].",
-       "protectedarticle": "гlаÑ\80олла Ð´Ð¸Ð½Ð° Ð°Ð³lо «[[$1]]»",
+       "protectlogtext": "Лахахь гойту агӀо лаъръяран хийцамаш чохь болу тептар.\nХьа кхин йиш ю [[Special:ProtectedPages|хӀинца ларйина йолу агӀонийн могӀаме хьажа]].",
+       "protectedarticle": "Ð\9bаÑ\80йина Ð°Ð³Ó\80о «[[$1]]»",
        "modifiedarticleprotection": "агlонан гlаролли локхалла хийцина «[[$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алла Ð´Ð°р",
-       "protectcomment": "Бахьна:",
+       "protect-legend": "Ð\91акÑ\8aде Ð°Ð³Ó\80о Ð»Ð°Ñ\80Ñ\8aÑ\8fр",
+       "protectcomment": "Ð\91аÑ\85Ñ\8cана:",
        "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-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": "Карара чекхйолу хан: $2, $3",
        "protect-existing-expiry-infinity": "Карара чекхйолу хан: чаккхе йоцу",
-       "protect-otherreason": "Кхин бахьна/тӀетохар:",
-       "protect-otherreason-op": "Кхин бахьна",
-       "protect-dropdown": "* Ð\93Ó\80оÑ\80алла Ð´Ð°Ñ\80на баьхьаш \n** сих-сиха зулам дар \n** дуккха спам хилар\n** нисдарийн тӀом \n** гӀараялл агӀо",
+       "protect-otherreason": "Ð\9aÑ\85ин Ð±Ð°Ñ\85Ñ\8cана/Ñ\82Ó\80еÑ\82оÑ\85аÑ\80:",
+       "protect-otherreason-op": "Ð\9aÑ\85ин Ð±Ð°Ñ\85Ñ\8cана",
+       "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": "ДӀаяьхна агӀонашка хьажар а меттахӀоттор а",
        "undeletelink": "хьажа/меттахӀоттае",
        "undeleteviewlink": "хьажа",
        "undeleteinvert": "Къастае массо",
-       "undeletecomment": "Бахьна:",
+       "undeletecomment": "Ð\91аÑ\85Ñ\8cана:",
        "undeletedrevisions": "{{PLURAL:$1|меттахӀоьттина}} $1 {{PLURAL:$1|хийцам}}",
        "undeletedrevisions-files": "меттахӀоьттина $1 {{PLURAL:$1|верси}} а $2 {{PLURAL:$2|файл}} а",
        "undeletedfiles": "$1 {{PLURAL:$1|файл меттахӀоттайина|файлаш меттахӀоттайина}}",
        "undelete-error-short": "Файл меттахӀоттаяран гӀалат: $1",
        "undelete-error-long": "Файл меттахӀоттош гӀалат даьлла:\n\n$1",
        "undelete-show-file-submit": "ХӀаъ",
-       "namespace": "Цlерийн ана:",
+       "namespace": "ЦӀерийн ана:",
        "invert": "Хаьржинарг къайлаяккха",
        "tooltip-invert": "ХӀоттае хӀара билгало, хаьржинчу цӀерийн анан агӀонийн хийцамаш къайлабаха (кхин дихкина цӀерийн анаш, гайтина елахь)",
        "namespace_association": "Йихкина ана",
        "unblock": "ДекъашхонтӀера блокдӀаякхар",
        "blockip": "Блоктоха {{GENDER:$1|декъашхочун}}",
        "blockip-legend": "Декъашхочун блоктохар",
-       "blockiptext": "Бухахь йолу форманца блоктоха IP-адресна цунтӏера дӏаяздарш ца дайта.\nБлоктоха магийна цо зенаш деш делахь кхин хӏокху [[{{MediaWiki:Policy-url}}|низам ца]].\nЛахахь билгалде блоктохарна бахьна.",
+       "blockiptext": "Ð\91Ñ\83Ñ\85аÑ\85Ñ\8c Ð¹Ð¾Ð»Ñ\83 Ñ\84оÑ\80манÑ\86а Ð±Ð»Ð¾ÐºÑ\82оÑ\85а IP-адÑ\80еÑ\81на Ñ\86Ñ\83нÑ\82Ó\8fеÑ\80а Ð´Ó\8fаÑ\8fздаÑ\80Ñ\88 Ñ\86а Ð´Ð°Ð¹Ñ\82а.\nÐ\91локÑ\82оÑ\85а Ð¼Ð°Ð³Ð¸Ð¹Ð½Ð° Ñ\86о Ð·ÐµÐ½Ð°Ñ\88 Ð´ÐµÑ\88 Ð´ÐµÐ»Ð°Ñ\85Ñ\8c ÐºÑ\85ин Ñ\85Ó\8fокÑ\85Ñ\83 [[{{MediaWiki:Policy-url}}|низам Ñ\86а]].\nÐ\9bаÑ\85аÑ\85Ñ\8c Ð±Ð¸Ð»Ð³Ð°Ð»Ð´Ðµ Ð±Ð»Ð¾ÐºÑ\82оÑ\85аÑ\80на Ð±Ð°Ñ\85Ñ\8cана.",
        "ipaddressorusername": "IP-адрес я декъашхочун цӀе:",
        "ipbexpiry": "Хан чекхйолу:",
-       "ipbreason": "Бахьна:",
+       "ipbreason": "Ð\91аÑ\85Ñ\8cана:",
        "ipbreason-dropdown": "* Белхан некъ дӀакъовлар бахьанаш:\n** Харца хаам бар\n** АгӀонан чураниг дӀаяккхар\n** Спам-хьажоргаш арахьара сайташна\n** МаьӀна доцу йоза тӀетохар\n** Декъашхой хьийзабар, кхерамаш тийсар\n** Масийтта лараман яздар зуламан лелаяр\n** Магийтина йоцу декъашхочун цӀе",
        "ipb-hardblock": "Шаш довзийтина болу декъашхошна бехкам бе хӀокху IP-адресца тадарш дан",
        "ipbcreateaccount": "Цамаго керла декъашхочун дӀаяздарш кхолла",
        "blocklist-expiry": "Чекхйолу",
        "blocklist-by": "Цунна блоктоьхана куьйгалхо",
        "blocklist-params": "Блоктохаран параметраш",
-       "blocklist-reason": "Бахьна:",
+       "blocklist-reason": "Ð\91аÑ\85Ñ\8cана:",
        "ipblocklist-submit": "Лахар",
        "ipblocklist-localblock": "Локальни блоктохар",
        "ipblocklist-otherblocks": "{{PLURAL:$1|Кхин блоктохар|Кхин блоктохарш}}",
        "movesubpage": "{{PLURAL:$1|1=Бухара агӀо|Бухара агӀонаш}}",
        "movesubpagetext": "ХӀокху агӀона $1 {{PLURAL:$1|1=бухара агӀо ю|бухара агӀонаш ю}}.",
        "movenosubpage": "ХӀокху агӀона бухара агӀонаш яц.",
-       "movereason": "Бахьна:",
+       "movereason": "Ð\91аÑ\85Ñ\8cана:",
        "revertmove": "юхаяккха",
        "delete_and_move": "Цle а хуьйцуш дӀаяккха",
        "delete_and_move_text": "== ДӀаяккха хьокъ ю ==\nИ цӀе йолу аг1о «[[:$1]]» йолуш ю. \nЛаьий хьуна и дӀаяккха, цӀе хийца таро хилийта?",
        "imageinvalidfilename": "Файлан цӀе гӀалате ю",
        "fix-double-redirects": "Хьалхара цӀе йолу дӀасахьажорг нисъян",
        "move-leave-redirect": "Ӏадйита дӀасахьажораг",
-       "protectedpagemovewarning": "'''ДӀахьедар.''' ХӀара агӀо гӀаролла йина ю; цӀе хийца я нисйа а бакъо йолуш куьйгалхой бе бац.\nЛахахьа тептаро балийна тӀаьхьаралера дӀаязбина хаам:",
-       "semiprotectedpagemovewarning": "'''ДӀахьедо.''' ХӀара агӀо гӀаролла йина ю; дӀабазбиначу декъашхошка бе цӀе хийцалуш яц.\nЛахахьа тептаро балийна тӀаьхьаралера дӀаязбина хаам:",
+       "protectedpagemovewarning": "'''ДӀахьедар.''' ХӀара агӀо ларйина ю; цӀе хийца я нисъян а бакъо йолуш куьйгалхой бе бац.\nЛахахьа тептаро балийна тӀаьхьаралера дӀаязбина хаам:",
+       "semiprotectedpagemovewarning": "'''ДӀахьедо.''' ХӀара агӀо ларйина ю; дӀабазбиначу декъашхошка бе цӀе хийцалуш яц.\nЛахахьа тептаро балийна тӀаьххьаралера дӀаязбина хаам:",
+       "move-over-sharedrepo": "== Файл йолуш ю ==\nВикигулам чохь йолуш ю [[:$1]]. ХӀокху файлан цӀе хийцича Викигулам чуьраниг дӀакъовлу.",
        "export": "АгӀонаш араяхар",
        "exporttext": "Шуьга далур ду кхечу меттера чудахарш, йоза а хийцаме тептарш билгалла йолу агӀонаш я гулдина йолу агӀонаш хӀокху XML барамца, юха тӀаьхьа чура [[Special:Import|хьаэцалурдолш]] кхечу вики-хьалхен, болх беш йолу хӀокху MediaWiki гӀирсаца.\n\nКхечу меттера яззамаш чуяха, чу язъе цӀе тадечу метте, цхьа могӀан цӀе могӀаршкахь, юха харжа лаьий шуна кхечу меттигера чуяха массо яззамашна истори хийцамбарш я тӀаьххьарлера яззаман верси.\n\nШуьга кхи далундерг, лелаеш йолу адресан хьажорг кхечу меттера чудаха тӀаьххьарлерачу версин яззамаш. Масала оцу яззаман [[{{MediaWiki:Mainpage}}]] хӀара хира ю хьажорг [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].",
        "exportall": "Массо агӀонаш экспорт ян",
        "tooltip-pt-logout": "Дlадерзадо болх бар",
        "tooltip-pt-createaccount": "Шу йиш ю дӀаяздар кхоьллина системин чудаха, амма иза тӀедожийна дац.",
        "tooltip-ca-talk": "Дийцаре агlон чулацам",
-       "tooltip-ca-edit": "Ð¥lаÑ\80а Ð°Ð³lо Ñ\85ийÑ\86алÑ\83Ñ\80 Ñ\8e. Ð\9bелайе, Ð´ÐµÑ\85аÑ\80 Ð´Ð¾, Ñ\85Ñ\8cалÑ\85Ñ\85Ñ\8cажаÑ\80 Ð°Ð¹Ñ\85Ñ\8cа Ñ\87Ñ\83Ñ\82оÑ\85але lалаÑ\88ан",
+       "tooltip-ca-edit": "Тае Ñ\85Ó\80аÑ\80а Ð°Ð³Ó\80о",
        "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": "АгӀон цӀе хийца",
        "tooltip-recreate": "АгӀо дӀаяьккхина хиларе ца хьоьжуш меттахӀоттае агӀо",
        "tooltip-upload": "Доладе чуяккхар",
        "tooltip-rollback": "Цхьоз тlетаlийча дlабаккха кхечо бина болу тlаьххьара хийцам",
-       "tooltip-undo": "ДӀабаккха бина болу хийцам а хьалхьажар гойтуш, дӀаяккхарна бахьна гайта аьтту беш",
+       "tooltip-undo": "Ð\94Ó\80абаккÑ\85а Ð±Ð¸Ð½Ð° Ð±Ð¾Ð»Ñ\83 Ñ\85ийÑ\86ам Ð° Ñ\85Ñ\8cалÑ\85Ñ\8cажаÑ\80 Ð³Ð¾Ð¹Ñ\82Ñ\83Ñ\88, Ð´Ó\80аÑ\8fккÑ\85аÑ\80на Ð±Ð°Ñ\85Ñ\8cана Ð³Ð°Ð¹Ñ\82а Ð°Ñ\8cÑ\82Ñ\82Ñ\83 Ð±ÐµÑ\88",
        "tooltip-preferences-save": "ГӀирс нисбар Ӏалашде",
        "tooltip-summary": "Язъе йоца цӀе",
        "interlanguage-link-title-nonlang": "$1 – $2",
        "creditspage": "Баркаллаш",
        "nocredits": "Бац декъашхойн могӀам хӀокху яззамца",
        "spamprotectiontitle": "Совбиларна литтар",
-       "spamprotectiontext": "Хьо дӀаязъян гӀерта агӀо спам-литтаро дӀакъоьвлина.\nЦуна бахьна хила там бу агӀона чохь зулам литтаран чутоьхна йолу хьажорг хилар.",
+       "spamprotectiontext": "Ð¥Ñ\8cо Ð´Ó\80аÑ\8fзÑ\8aÑ\8fн Ð³Ó\80еÑ\80Ñ\82а Ð°Ð³Ó\80о Ñ\81пам-лиÑ\82Ñ\82аÑ\80о Ð´Ó\80акÑ\8aоÑ\8cвлина.\nЦÑ\83на Ð±Ð°Ñ\85Ñ\8cана Ñ\85ила Ñ\82ам Ð±Ñ\83 Ð°Ð³Ó\80она Ñ\87оÑ\85Ñ\8c Ð·Ñ\83лам Ð»Ð¸Ñ\82Ñ\82аÑ\80ан Ñ\87Ñ\83Ñ\82оÑ\8cÑ\85на Ð¹Ð¾Ð»Ñ\83 Ñ\85Ñ\8cажоÑ\80г Ñ\85илаÑ\80.",
        "spambot_username": "Спам дӀацӀаняр",
        "pageinfo-title": "Хаамаш цу «$1»",
        "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": "Бухара категорийн дукхалла",
        "markaspatrolledtext": "Билгалъе хӀара агӀо хьаьжжина сана",
        "markedaspatrolled": "ДӀадахка теллина санна хилар",
        "markedaspatrolledtext": "Хаьржина [[:$1]] агӀона верси къобалйина сана билгалйина.",
-       "rcpatroldisabled": "ТÓ\80ехьара бина хийцамаш къобалбан магийна дац",
-       "rcpatroldisabledtext": "ТÓ\80ехьара бина хийцамаш къобалбар хӀинца дӀадайина ду.",
+       "rcpatroldisabled": "ТÓ\80аÑ\8cÑ\85хьара бина хийцамаш къобалбан магийна дац",
+       "rcpatroldisabledtext": "ТÓ\80аÑ\8cÑ\85хьара бина хийцамаш къобалбар хӀинца дӀадайина ду.",
        "markedaspatrollederror": "теллина сана билгалъян цало",
        "markedaspatrollednotify": "АгӀо «$1» пайдане хилар билгалдина",
        "markedaspatrollederrornotify": "Хийцамаш хьаьжжина сана билгал бан цабелира.",
        "exif-serialnumber": "Камеран серин номер",
        "exif-cameraownername": "Камера ерг",
        "exif-label": "Билгало",
-       "exif-datetimemetadata": "ТÓ\80ехьара метахаамаш хийцина терахь",
+       "exif-datetimemetadata": "ТÓ\80аÑ\8cÑ\85хьара метахаамаш хийцина терахь",
        "exif-nickname": "ЧӀагӀъелла йоцу суьртан цӀе",
        "exif-rating": "Мах хадор (5 нах)",
        "exif-rightscertificate": "Бакъонийн урхалладаран сертификат",
        "monthsall": "массо",
        "confirmemail": "Электронан поштан адрес бакъдар",
        "confirmemail_noemail": "Ахьа нийса электронан поштан адрес яздина дац [[Special:Preferences|гӀирсан чохь]].",
-       "confirmrecreate": "Декъашхочо [[User:$1|$1]] ([[User talk:$1|дийцаре]]) хӀара агӀо дӀаяьккхина, ахьа иза тая йолийча, дӀаяккхарна бахьна:\n: ''$2''\nДехар до, тешал де, хьо иза агӀо меттахӀотто лууш ву/ю але.",
+       "confirmrecreate": "Ð\94екÑ\8aаÑ\88Ñ\85оÑ\87о [[User:$1|$1]] ([[User talk:$1|дийÑ\86аÑ\80е]]) Ñ\85Ó\80аÑ\80а Ð°Ð³Ó\80о Ð´Ó\80аÑ\8fÑ\8cккÑ\85ина, Ð°Ñ\85Ñ\8cа Ð¸Ð·Ð° Ñ\82аÑ\8f Ð¹Ð¾Ð»Ð¸Ð¹Ñ\87а, Ð´Ó\80аÑ\8fккÑ\85аÑ\80на Ð±Ð°Ñ\85Ñ\8cана:\n: ''$2''\nÐ\94еÑ\85аÑ\80 Ð´Ð¾, Ñ\82еÑ\88ал Ð´Ðµ, Ñ\85Ñ\8cо Ð¸Ð·Ð° Ð°Ð³Ó\80о Ð¼ÐµÑ\82Ñ\82аÑ\85Ó\80оÑ\82Ñ\82о Ð»Ñ\83Ñ\83Ñ\88 Ð²Ñ\83\8e Ð°Ð»Ðµ.",
        "confirmrecreate-noreason": "Декъашхочо [[User:$1|$1]] ([[User talk:$1|дийцаре]]) хӀара агӀо дӀаяьккхина, ахьа иза тая йолийча. Дехар до, тешал де, хьо иза агӀо меттахӀотто лууш ву/ю але.",
        "recreate": "Юха кхолла",
        "confirm_purge_button": "ХӀаъ",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath АгӀона тӀе некъ]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Скриптан тӀе некъ]",
+       "version-libraries-description": "Цуьнах лаьцна",
+       "version-libraries-authors": "Автораш",
        "redirect": "Декъашхочун файлан тӀера дӀасхьажор",
        "redirect-legend": "Файлан я агӀона тӀера дӀасхьажор",
        "redirect-summary": "ХӀара агӀо лело йиш ю файлан я агӀона тӀера дӀасхьажош.",
        "tags-create-heading": "Кхолла керла билгало",
        "tags-create-explanation": "Юха кхоьллина билгалонаш декъашхошна а боташна а Ӏад йтарца тӀекхочуш хира ю.",
        "tags-create-tag-name": "Билгалонна цӀе:",
-       "tags-create-reason": "Бахьна:",
+       "tags-create-reason": "Ð\91аÑ\85Ñ\8cана:",
        "tags-create-submit": "Кхолла",
        "tags-create-no-name": "Ахьа билгалонан цӀе язъян езаш.",
        "tags-create-already-exists": "«$1» билгало яц.",
        "tags-create-warnings-below": "Лаьий хьуна билгало кхоллар чекхдакха?",
        "tags-delete-title": "ДӀаяккха билгало",
        "tags-delete-explanation-initial": "Хьо гӀерта «$1» базан чура билгало дӀаяккха.",
-       "tags-delete-reason": "Бахьна:",
+       "tags-delete-reason": "Ð\91аÑ\85Ñ\8cана:",
        "tags-activate-title": "Билгалона активациян",
        "tags-activate-question": "Хьо гӀерта «$1» билгалонан активациян.",
-       "tags-activate-reason": "Бахьна:",
+       "tags-activate-reason": "Ð\91аÑ\85Ñ\8cана:",
        "tags-activate-not-allowed": "«$1» билгалонан активациян цало.",
        "tags-activate-not-found": "«$1» билгало яц.",
        "tags-activate-submit": "Активациян",
        "tags-deactivate-title": "ДӀаяйа билгало",
-       "tags-deactivate-reason": "Бахьна:",
+       "tags-deactivate-reason": "Ð\91аÑ\85Ñ\8cана:",
        "tags-deactivate-submit": "ДӀаяйа",
        "tags-edit-title": "Тегаш таян",
        "tags-edit-manage-link": "Тегашна урхалладар",
        "tags-edit-remove": "ДӀаяха хӀара билгалонаш:",
        "tags-edit-remove-all-tags": "(дӀаяха массо билгалонаш)",
        "tags-edit-chosen-placeholder": "Харжа цхьаъ я массийта тег",
-       "tags-edit-reason": "Бахьна:",
+       "tags-edit-reason": "Ð\91аÑ\85Ñ\8cана:",
        "tags-edit-nooldid-title": "Ӏалашонан верси билгалйина яц",
        "comparepages": "АгӀонаш юстар",
        "compare-page1": "Дуьххьаралера агӀо",
        "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 4def6dd..2c88d50 100644 (file)
        "passwordreset": "Reset hesla",
        "passwordreset-text-one": "Pokud chcete e-mailem získat dočasné heslo, vyplňte tento formulář.",
        "passwordreset-text-many": "{{PLURAL:$1|Pokud chcete e-mailem získat dočasné heslo, vyplňte jeden z údajů.}}",
-       "passwordreset-legend": "Znovu nastavit heslo",
        "passwordreset-disabled": "Znovunastavení hesla je na této wiki zakázáno.",
        "passwordreset-emaildisabled": "E-mailové funkce byly na této wiki vypnuty.",
        "passwordreset-username": "Uživatelské jméno:",
        "resettokens": "Reinicializace klíčů",
        "resettokens-text": "Na této stránce můžete reinicializovat klíče, které umožňují přístup k jistým soukromým údajům spojeným s vaším účtem.\n\n{{GENDER:|Měl|Měla|Měli}} byste to provést v případě, že jste je omylem někomu {{GENDER:|prozradil|prozradila|prozradili}}, nebo byl váš účet narušen.",
        "resettokens-no-tokens": "Neexistují žádné klíče, které by bylo možno reinicializovat.",
-       "resettokens-legend": "Reinicializace klíčů",
        "resettokens-tokens": "Klíče:",
        "resettokens-token-label": "$1 (aktuální hodnota: $2)",
        "resettokens-watchlist-token": "Klíč k webovému kanálu (Atom/RSS) [[Special:Watchlist|změn sledovaných stránek]]",
        "yourdiff": "Rozdíly",
        "copyrightwarning": "Všechny příspěvky do {{grammar:2sg|{{SITENAME}}}} jsou zveřejňovány podle $2 (podrobnosti najdete na $1).\nPokud si nepřejete, aby váš text byl nemilosrdně upravován a volně šířen, pak ho do {{grammar:2sg|{{SITENAME}}}} neukládejte.<br />\nUložením příspěvku se zavazujete, že je vaším dílem nebo je zkopírován ze zdrojů, které nejsou chráněny autorským právem (tzv. <em>public domain</em>).\n'''NEVKLÁDEJTE DÍLA CHRÁNĚNÁ AUTORSKÝM PRÁVEM BEZ DOVOLENÍ!'''",
        "copyrightwarning2": "Uvědomte si, že všechny příspěvky do {{grammar:2sg|{{SITENAME}}}} mohou být ostatními uživateli upraveny, pozměněny či odstraněny. Pokud si nepřejete, aby váš text byl nemilosrdně upravován, pak ho do {{grammar:2sg|{{SITENAME}}}} neukládejte.<br />\nUložením příspěvku se zavazujete, že je vaším dílem nebo je zkopírován ze zdrojů, které nejsou chráněny autorským právem (tzv. <em>public domain</em>); podrobnosti najdete na $1. '''Nekopírujte díla chráněná autorským právem bez dovolení!'''",
+       "editpage-cannot-use-custom-model": "Model obsahu této stránky nelze změnit.",
        "longpageerror": "'''Chyba: Pokoušíte se uložit text o velikosti {{PLURAL:$1|$1 KiB}}, přičemž dovolené maximum je {{PLURAL:$2|$2 KiB}}.'''\nVaše změna nemůže být uložena.",
        "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:",
        "randomincategory-nopages": "V [[:Category:$1|kategorii $1]] žádné stránky nejsou.",
        "randomincategory-category": "Kategorie:",
        "randomincategory-legend": "Náhodná stránka v kategorii",
+       "randomincategory-submit": "Jít na",
        "randomredirect": "Náhodné přesměrování",
        "randomredirect-nopages": "Ve jmenném prostoru „$1“ nejsou žádná přesměrování.",
        "statistics": "Statistika",
        "rollback-success": "Editace uživatele $1 byly vráceny na poslední verzi od uživatele $2.",
        "sessionfailure-title": "Chyba sezení",
        "sessionfailure": "Zřejmě je nějaký problém s vaším přihlášením;\nvámi požadovaná činnost byla stornována jako prevence před neoprávněným přístupem.\nStiskněte tlačítko „zpět“, obnovte stránku, ze které jste přišli, a zkuste činnost znovu.",
+       "changecontentmodel": "Změna modelu obsahu stránky",
+       "changecontentmodel-legend": "Změnit model obsahu",
+       "changecontentmodel-title-label": "Název stránky",
+       "changecontentmodel-model-label": "Nový model obsahu",
+       "changecontentmodel-reason-label": "Důvod:",
+       "changecontentmodel-success-title": "Model obsahu byl změněn",
+       "changecontentmodel-success-text": "Model obsahu stránky [[:$1]] byl změněn.",
+       "changecontentmodel-cannot-convert": "Obsah stránky [[:$1]] nelze zkonvertovat na typ $2.",
+       "changecontentmodel-title-cantexist": "Pod názvem $1 nemůže být stránka.",
+       "changecontentmodel-nodirectediting": "Model obsahu $1 nepodporuje přímou editaci",
+       "log-name-contentmodel": "Kniha změny modelů obsahu",
+       "log-description-contentmodel": "Události týkající se modelů obsahu stránek",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|změnil|změnila}} obsah modelu stránky $3 z „$4“ na „$5“",
+       "logentry-contentmodel-change-revertlink": "vrátit",
+       "logentry-contentmodel-change-revert": "vrácení zpět",
        "protectlogpage": "Kniha zamčení",
        "protectlogtext": "Níže je uveden seznam všech změn zámků stránek.\nMůžete si prohlédnout též [[Special:ProtectedPages|seznam aktuálně platných zámků]].",
        "protectedarticle": "zamyká „[[$1]]“",
        "tooltip-pt-logout": "Odhlásit se",
        "tooltip-pt-createaccount": "Doporučujeme vytvořit si účet a přihlásit se, není to však povinné",
        "tooltip-ca-talk": "Diskuse ke stránce",
-       "tooltip-ca-edit": "Tuto stránku můžete editovat. Prosíme použijte tlačítko Ukázat náhled před uložením.",
+       "tooltip-ca-edit": "Editovat tuto stránku",
        "tooltip-ca-addsection": "Začít novou sekci",
        "tooltip-ca-viewsource": "Tato stránka je zamčena. Můžete si prohlédnout její zdrojový kód.",
        "tooltip-ca-history": "Starší verze této stránky.",
        "pageinfo-robot-index": "Dovoleno",
        "pageinfo-robot-noindex": "Zakázáno",
        "pageinfo-watchers": "Počet sledujících",
+       "pageinfo-visiting-watchers": "Počet sledujících uživatelů, kteří si prohlíželi nedávné změny",
        "pageinfo-few-watchers": "Méně než $1 {{PLURAL:$1|sledující|sledující|sledujících}}",
+       "pageinfo-few-visiting-watchers": "Není jisté, zda existují sledující uživatelé, kteří si prohlížejí nedávné změny",
        "pageinfo-redirects-name": "Počet přesměrování na tuto stránku",
        "pageinfo-subpages-name": "Podstránky této stránky",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|přesměrování}}; $3 {{PLURAL:$3|nepřesměrování}})",
        "deletedwhileediting": "'''Upozornění''': V průběhu vaší editace byla tato stránka smazána!",
        "confirmrecreate": "Uživatel [[User:$1|$1]] ([[User talk:$1|diskuse]]) tuto stránku smazal poté, co jste začali editovat, s odůvodněním:\n: „$2“\nOpravdu si přejete znovu tuto stránku založit?",
        "confirmrecreate-noreason": "{{gender:$1|Uživatel|Uživatelka|Uživatel}} [[User:$1|$1]] ([[User talk:$1|diskuse]]) {{gender:$1|smazal|smazala|smazal}} tuto stránku poté, co jste {{gender:|začal|začala|začali}} s editací. Potvrďte, zda chcete stránku skutečně znovu založit.",
-       "recreate": "Znovu založit",
+       "recreate": "Založit znovu",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Aktualizovat cachovanou verzi této stránky?",
        "confirm-purge-bottom": "Aktualizace stránky vymaže cache a vynutí zobrazení nejaktuálnější verze.",
        "version-libraries": "Nainstalované knihovny",
        "version-libraries-library": "Knihovna",
        "version-libraries-version": "Verze",
+       "version-libraries-license": "Licence",
+       "version-libraries-description": "Popis",
+       "version-libraries-authors": "Autoři",
        "redirect": "Přesměrování podle souboru, uživatele, stránky nebo ID revize",
        "redirect-legend": "Přesměrování na soubor či stránku",
        "redirect-summary": "Tato speciální stránka přesměrovává na soubor (podle názvu), stránku (podle ID stránky nebo revize) nebo uživatele (podle číselného uživatelského ID). Použití: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] nebo [[{{#Special:Redirect}}/user/101]].",
index 037455f..8f3d87b 100644 (file)
        "passwordreset-domain": "Домен:",
        "changeemail-none": "(çук)",
        "resettokens": "Токенĕсене пăрах",
-       "resettokens-legend": "Токенĕсене пăрах",
        "bold_sample": "Çурмахулăм текст",
        "bold_tip": "Çурмахулăм текст",
        "italic_sample": "Тайлăк текст",
        "ncategories": "$1 {{PLURAL:$1|категори|категорисем}}",
        "nlinks": "$1 {{PLURAL:$1|1=каçă|каçă}}",
        "nmembers": "$1 {{PLURAL:$1|тĕл|тĕлте}}",
-       "nviews": "$1 {{PLURAL:$1|пăхни|пăхнисем}}",
        "specialpage-empty": "Ку страница пушă",
        "lonelypages": "Тăлăх страницăсем",
        "uncategorizedpages": "Каталогсăр страницăсем",
        "ipblocklist-empty": "Чару списокĕ пушă.",
        "blocklink": "ĕçлеме чар",
        "unblocklink": "блокировкăран кăлар",
-       "contribslink": "ӳсĕмĕ",
+       "contribslink": "хушни",
        "blocklogpage": "Ĕçлеме чарнисен журналĕ",
        "unblocklogentry": "«$1» блокировкăран кăларнă",
        "block-log-flags-anononly": "анонимлă хутшăнакансем кăна",
index 0611617..0ee2be7 100644 (file)
        "passwordreset": "Ailosod cyfrinair",
        "passwordreset-text-one": "Cwblhewch y ffurflen hon er mwyn ailosod eich cyfrinair.",
        "passwordreset-text-many": "{{PLURAL:$1|Llanwch un o'r blychau er mwyn derbyn cyfrinair dros dro mewn ebost.}}",
-       "passwordreset-legend": "Ailosod y cyfrinair",
        "passwordreset-disabled": "Analluogwyd ailosod cyfrineiriau ar y wici hwn.",
        "passwordreset-emaildisabled": "Analluogwyd offer e-bost ar y wici hwn.",
        "passwordreset-username": "Eich enw defnyddiwr:",
        "resettokens": "Ailosod tocynnau",
        "resettokens-text": "Gallwch ailosod tocynnau sy'n galluogi mynediad at rai manylion preifat sydd ynghlwm wrth y cyfrif yma.\n\nDylech wneud hyn os wnaethoch rannu'r manylion hyn gyda rhywun ar ddamwain neu os oes problem wedi codi gyda diogelwch eich cyfrif.",
        "resettokens-no-tokens": "Nid oes unrhyw docynnau i'w hailosod.",
-       "resettokens-legend": "Ailosod tocynnau",
        "resettokens-tokens": "Tocynnau:",
        "resettokens-token-label": "$1 (gwerth presennol: $2)",
        "resettokens-watchlist-token": "Tocyn i borthiant gwe (Atom/RSS) y [[Special:Watchlist|newidiadau i'r tudalennau ar eich rhestr wylio]]",
        "mimesearch": "Chwiliad MIME",
        "mimesearch-summary": "Fe allwch ddefnyddio'r dudalen hon i hidlo'r ffeiliau yn ôl eu math MIME.\nMewnbwn: contenttype/subtype neu contenttype/*, e.e. <code>image/jpeg</code>.",
        "mimetype": "Ffurf MIME:",
-       "download": "islwytho",
+       "download": "lawrlwytho",
        "unwatchedpages": "Tudalennau sydd â neb yn eu gwylio",
        "listredirects": "Rhestru'r ail-gyfeiriadau",
        "listduplicatedfiles": "Rhestr y ffeiliau sydd wedi eu dyblygu",
        "nmembers": "$1 {{PLURAL:$1|aelod|aelod|aelod|aelod|aelod|aelod}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|aelodau|aelod|aelodau}}",
        "nrevisions": "$1 {{PLURAL:$1|diwygiad|diwygiad|ddiwygiad|diwygiad|diwygiad|diwygiad}}",
-       "nviews": "$1 {{PLURAL:$1|ymweliad|ymweliad|ymweliad|ymweliad|ymweliad|ymweliad}}",
        "nimagelinks": "Defnyddir ar {{PLURAL:$1||$1 dudalen|$1 dudalen|$1 tudalen|$1 thudalen|$1 tudalen}}",
        "ntransclusions": "defnyddir ar {{PLURAL:$1||$1 dudalen|$1 dudalen|$1 tudalen|$1 thudalen|$1 tudalen}}",
        "specialpage-empty": "Ni chafwyd canlyniadau i'w hadrodd.",
index 14c6003..eb9d933 100644 (file)
        "passwordreset": "Passwort zurücksetzen",
        "passwordreset-text-one": "Fülle dieses Formular aus, um dein Passwort zurückzusetzen.",
        "passwordreset-text-many": "{{PLURAL:$1|Füll eines der Felder aus, um ein temporäres Passwort per E-Mail zugesandt zu bekommen.}}",
-       "passwordreset-legend": "Passwort zurücksetzen",
        "passwordreset-disabled": "Das Zurücksetzen von Passwörtern wurde in diesem Wiki deaktiviert.",
        "passwordreset-emaildisabled": "Die E-Mail-Funktionen wurden auf diesem Wiki deaktiviert.",
        "passwordreset-username": "Benutzername:",
        "resettokens": "Tokens zurücksetzen",
        "resettokens-text": "Du kannst Tokens zurücksetzen, welche dir den Zugriff auf bestimmte private Daten ermöglichen, die mit deinem Benutzerkonto hier verknüpft sind.\n\nDu solltest dies nur machen, wenn du die Tokens versehentlich mit jemandem geteilt hast oder dein Konto gefährdet ist.",
        "resettokens-no-tokens": "Es gibt keine Tokens zum Zurücksetzen.",
-       "resettokens-legend": "Tokens zurücksetzen",
        "resettokens-tokens": "Tokens:",
        "resettokens-token-label": "$1 (aktueller Wert: $2)",
        "resettokens-watchlist-token": "Token für den Webfeed (Atom/RSS) der [[Special:Watchlist|Änderungen an Seiten auf deiner Beobachtungsliste]]",
        "resettokens-done": "Tokens zurückgesetzt.",
-       "resettokens-resetbutton": "Ausgewählte Token ändern",
+       "resettokens-resetbutton": "Ausgewählte Token zurücksetzen",
        "bold_sample": "Fetter Text",
        "bold_tip": "Fetter Text",
        "italic_sample": "Kursiver Text",
        "randomincategory-nopages": "Es gibt keine Seiten in der Kategorie [[:Category:$1|$1]].",
        "randomincategory-category": "Kategorie:",
        "randomincategory-legend": "Zufällige Seite in Kategorie",
+       "randomincategory-submit": "Los",
        "randomredirect": "Zufällige Weiterleitung",
        "randomredirect-nopages": "Im Namensraum „$1“ sind keine Weiterleitungen vorhanden.",
        "statistics": "Statistik",
        "rollback-success": "Die Änderungen von $1 wurden rückgängig gemacht und die letzte Version von $2 wurde wiederhergestellt.",
        "sessionfailure-title": "Sitzungsfehler",
        "sessionfailure": "Es gab ein Problem bei der Übertragung deiner Benutzerdaten.\nDiese Aktion wurde daher sicherheitshalber abgebrochen, um eine falsche Zuordnung deiner Änderungen zu einem anderen Benutzer zu verhindern.\nBitte gehe zurück zur vorherigen Seite, lade sie erneut und versuche, den Vorgang erneut auszuführen.",
+       "changecontentmodel": "Inhaltsmodell einer Seite ändern",
+       "changecontentmodel-legend": "Inhaltsmodell ändern",
+       "changecontentmodel-title-label": "Seitentitel",
+       "changecontentmodel-model-label": "Neues Inhaltsmodell",
+       "changecontentmodel-reason-label": "Grund:",
+       "changecontentmodel-success-title": "Das Inhaltsmodell wurde geändert",
+       "changecontentmodel-success-text": "Der Inhaltstyp von [[:$1]] wurde geändert.",
+       "changecontentmodel-cannot-convert": "Der Inhalt von [[:$1]] kann nicht zum Typ $2 konvertiert werden.",
+       "changecontentmodel-title-cantexist": "Auf $1 ist keine Seite möglich.",
+       "changecontentmodel-nodirectediting": "Das Inhaltsmodell „$1“ unterstützt keine direkten Bearbeitungen",
+       "log-name-contentmodel": "Inhaltsmodell-Änderungs-Logbuch",
+       "log-description-contentmodel": "Ereignisse bezüglich den Inhaltsmodellen einer Seite",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|änderte}} das Inhaltsmodell der Seite $3 von „$4“ nach „$5“",
+       "logentry-contentmodel-change-revertlink": "zurücksetzen",
+       "logentry-contentmodel-change-revert": "zurücksetzen",
        "protectlogpage": "Seitenschutz-Logbuch",
        "protectlogtext": "Dies ist das Seitenschutz-Logbuch.\nSiehe die [[Special:ProtectedPages|Liste der geschützten Seiten]] für alle aktuell geschützten Seiten.",
        "protectedarticle": "schützte „[[$1]]“",
        "protect-otherreason-op": "Anderer Grund",
        "protect-dropdown": "* Allgemeine Schutzgründe\n** Edit-War\n** Wiederkehrender Vandalismus\n** Wiederholtes Einstellen von Werbung\n** Häufig eingebundene Vorlage\n** Seite mit hoher Besucherzahl",
        "protect-edit-reasonlist": "Schutzgründe bearbeiten",
-       "protect-expiry-options": "1 Stunde:1 hour,1 Tag:1 day,1 Woche:1 week,2 Wochen:2 weeks,1 Monat:1 month,3 Monate:3 months,6 Monate:6 months,1 Jahr:1 year,Unbeschränkt:infinite",
+       "protect-expiry-options": "1 Stunde:1 hour,1 Tag:1 day,1 Woche:1 week,2 Wochen:2 weeks,1 Monat:1 month,3 Monaten:3 months,6 Monaten:6 months,1 Jahr:1 year,unbeschränkt:infinite",
        "restriction-type": "Schutzstatus:",
        "restriction-level": "Schutzhöhe:",
        "minimum-size": "Mindestgröße",
        "ipbenableautoblock": "Sperre die aktuell von diesem Benutzer genutzte IP-Adresse sowie automatisch alle folgenden, von denen aus er Bearbeitungen oder das Anlegen von Benutzerkonten versucht",
        "ipbsubmit": "IP-Adresse/Benutzer sperren",
        "ipbother": "Andere Dauer (englisch):",
-       "ipboptions": "2 Stunden:2 hours,1 Tag:1 day,3 Tage:3 days,1 Woche:1 week,2 Wochen:2 weeks,1 Monat:1 month,3 Monate:3 months,6 Monate:6 months,1 Jahr:1 year,unbeschränkt:infinite",
+       "ipboptions": "2 Stunden:2 hours,1 Tag:1 day,3 Tagen:3 days,1 Woche:1 week,2 Wochen:2 weeks,1 Monat:1 month,3 Monaten:3 months,6 Monaten:6 months,1 Jahr:1 year,unbeschränkt:infinite",
        "ipbhidename": "Benutzername in Bearbeitungen und Listen verstecken",
        "ipbwatchuser": "Benutzer(diskussions)seite beobachten",
        "ipb-disableusertalk": "Diesen Benutzer daran hindern, seine eigene Diskussionsseite zu bearbeiten, solange er gesperrt ist",
        "ipblocklist-submit": "Suchen",
        "ipblocklist-localblock": "Lokale Sperre",
        "ipblocklist-otherblocks": "Andere {{PLURAL:$1|Sperre|Sperren}}",
-       "infiniteblock": "unbegrenzt",
+       "infiniteblock": "unbeschränkt",
        "expiringblock": "endet am $1 um $2 Uhr",
        "anononlyblock": "nur Anonyme",
        "noautoblockblock": "Autoblock deaktiviert",
        "tooltip-pt-logout": "Abmelden",
        "tooltip-pt-createaccount": "Wir ermutigen dich dazu, ein Benutzerkonto zu erstellen und dich anzumelden. Es ist jedoch nicht zwingend erforderlich.",
        "tooltip-ca-talk": "Diskussion zum Seiteninhalt",
-       "tooltip-ca-edit": "Du kannst diese Seite bearbeiten. Bitte nutze die Vorschaufunktion vor dem Speichern.",
+       "tooltip-ca-edit": "Diese Seite bearbeiten",
        "tooltip-ca-addsection": "Neuen Abschnitt beginnen",
        "tooltip-ca-viewsource": "Diese Seite ist geschützt. Ihr Quelltext kann dennoch angesehen und kopiert werden.",
        "tooltip-ca-history": "Frühere Versionen dieser Seite",
        "pageinfo-robot-index": "Erlaubt",
        "pageinfo-robot-noindex": "Nicht erlaubt",
        "pageinfo-watchers": "Anzahl der Beobachter dieser Seite",
+       "pageinfo-visiting-watchers": "Anzahl der Seitenbeobachter, die die letzten Bearbeitungen besucht haben",
        "pageinfo-few-watchers": "Weniger als {{PLURAL:$1|ein|$1}} Beobachter",
+       "pageinfo-few-visiting-watchers": "Es könnte einen beobachtenden Benutzer geben oder nicht, der die letzten Bearbeitungen besucht hat",
        "pageinfo-redirects-name": "Anzahl der Weiterleitungen zu dieser Seite",
        "pageinfo-redirects-value": "$1",
        "pageinfo-subpages-name": "Unterseiten dieser Seite",
        "deletedwhileediting": "Achtung: Diese Seite wurde gelöscht, nachdem du angefangen hast, sie zu bearbeiten!\nIm [{{fullurl:{{#special:Log}}|type=delete&page={{FULLPAGENAMEE}}}} Lösch-Logbuch] findest du den Grund für die Löschung. Wenn du die Seite speicherst, wird sie neu angelegt.",
        "confirmrecreate": "Benutzer [[User:$1|$1]] ([[User talk:$1|Diskussion]]) hat diese Seite gelöscht, nachdem du angefangen hast, sie zu bearbeiten. Die Begründung lautete:\n:''$2''\nBitte bestätige, dass du diese Seite wirklich neu erstellen möchten.",
        "confirmrecreate-noreason": "Benutzer [[User:$1|$1 ]] ([[User talk:$1|Diskussion]]) hat diese Seite gelöscht, nachdem du mit der Bearbeitung begonnen hast. Bitte bestätige, dass du die Seite wirklich erneut erstellen möchtest.",
-       "recreate": "Erneut anlegen",
+       "recreate": "Neu erstellen",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Diese Seite aus dem Server-Cache löschen?",
        "confirm-purge-bottom": "Leert den Cache einer Seite und erzwingt die Anzeige der aktuellen Version.",
        "version-libraries": "Installierte Bibliotheken",
        "version-libraries-library": "Bibliothek",
        "version-libraries-version": "Version",
+       "version-libraries-license": "Lizenz",
+       "version-libraries-description": "Beschreibung",
+       "version-libraries-authors": "Autoren",
        "redirect": "Weiterleitung auf Benutzerseite, Seite, Seitenversion oder Datei",
        "redirect-legend": "Weiterleitung auf eine Benutzerseite, Seite, Seitenversion oder Datei",
        "redirect-summary": "Diese Spezialseite leitet auf eine Benutzerseite (numerische Benutzerkennung angegeben), Seite (Seitenkennung angegeben), Seitenversion (Versionskennung angegeben) oder Datei (Dateiname angegeben) weiter. Benutzung: [[{{#Special:Redirect}}/user/101]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] oder [[{{#Special:Redirect}}/file/Example.jpg]].",
index bbb8d91..e9fca76 100644 (file)
        "hidetoc": "लुकाउन्या",
        "collapsible-collapse": "खुम्च्याउन्या",
        "collapsible-expand": "फैलाउ",
-       "confirmable-confirm": "तमरà¥\8b {{GENDER:$1|लिà¤\99à¥\8dà¤\97}} à¤¹à¥\8b?",
+       "confirmable-confirm": "à¤\95à¥\8dया {{GENDER:$1|तम}} à¤¸à¥\81निशà¥\8dà¤\9aित à¤\9bà¥\8c ?",
        "confirmable-yes": "हो",
        "confirmable-no": "नाइँ",
        "thisisdeleted": "$1 हेर्न्या या पैल्लीका रुपमी फर्काउन्या हो?",
        "laggedslavemode": "<strong>चेतावनी:</strong> पानामी हालका अद्यतनहरू नहुनस्कदान ।",
        "readonly": "डेटाबेस बन्द गरिया छ",
        "enterlockreason": "ताल्चा मार्नुको कारण दिया, साथै ताल्चा हटाउने समयको अवधि अनुमान लगा।",
-       "readonlytext": "समà¥\8dभवतà¤\83 à¤¨à¤¿à¤¯à¤®à¤¿à¤¤ à¤¡à¥\87à¤\9fाबà¥\87स à¤°à¤\96-रà¤\96ाà¤\89à¤\95à¥\8b à¤\95ारण à¤\85हिलà¥\87लाà¤\88 à¤¨à¤¯à¤¾à¤\81 à¤¡à¥\87à¤\9fाबà¥\87स à¤ªà¥\8dरविषà¥\8dà¤\9fà¥\80 à¤° à¤\85नà¥\8dय à¤¸à¤\82शà¥\8bधनहरà¥\81  à¤¬à¤¨à¥\8dद à¤°à¤¾à¤\96िया à¤\9b, à¤\9cà¤\88लाà¤\88 à¤ªà¤\9bि à¤¬à¤ à¥\87 à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dय à¤\97रिनà¥\8dया à¤\9b। \nपà¥\8dरबनà¥\8dधà¤\95 à¤\9cà¤\88लà¥\87 à¤¯à¥\8b à¤¬à¤¨à¥\8dद à¤\97रयाà¤\9bनà¥\8d, à¤¯à¥\8b à¤¸à¥\8dपषà¥\8dà¤\9fà¥\80à¤\95रण à¤¦à¤¿à¤\8fकाछन्: $1",
+       "readonlytext": "समà¥\8dभवतà¤\83 à¤¨à¤¿à¤¯à¤®à¤¿à¤¤ à¤¡à¥\87à¤\9fाबà¥\87स à¤°à¤\96-रà¤\96ाà¤\89à¤\95à¥\8b à¤\95ारण à¤\85हिलà¥\87लाà¤\88 à¤¨à¤¯à¤¾à¤\81 à¤¡à¥\87à¤\9fाबà¥\87स à¤ªà¥\8dरविषà¥\8dà¤\9fà¥\80 à¤° à¤\85नà¥\8dय à¤¸à¤\82शà¥\8bधनहरà¥\82  à¤¬à¤¨à¥\8dद à¤°à¤¾à¤\96िया à¤\9b, à¤\9cà¤\88लाà¤\88 à¤ªà¤\9bि à¤¬à¤ à¥\87 à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dय à¤\97रिनà¥\8dया à¤\9b। \nपà¥\8dरबनà¥\8dधà¤\95 à¤\9cà¤\88लà¥\87 à¤¯à¥\8b à¤¬à¤¨à¥\8dद à¤\97रà¥\8dयाà¤\9bनà¥\8d, à¤¯à¥\8b à¤¸à¥\8dपषà¥\8dà¤\9fà¥\80à¤\95रण à¤¦à¤¿à¤¯à¤¾काछन्: $1",
        "missing-article": "नाम \"$1\" $2 भयाको भेटिनु पड्डे पानो पाठ डेटाबेसले  भेटाएन, \n\nयिसो प्राय: मिति नाघिसक्याको भिन्न वा इतिहास वा कुनै मेटिसक्याको पानाको लिंक पहिल्याउनाले हुन्छ ।\n\nयदि यसो भया नाइँहो भणे सफ्टवेयरको गल्ती लै हुनसकुन्छ ।\nकृपया यैको url खुलाइ [[Special:ListUsers/sysop|प्रबन्धक]]लाई उजुरी गर",
        "missingarticle-rev": "(संशोधन #: $1)",
        "missingarticle-diff": "(भिन्नता: $1, $2)",
        "resetpass-temp-password": "अस्थाइ पासवर्ड",
        "resetpass-abort-generic": "एक्सटेन्सनले पासवर्ड परिवर्तनलाई बन्द गराईया छ ।",
        "passwordreset": "पासवर्ड पूर्वनिर्धारित गर",
-       "passwordreset-legend": "पासवर्ड पूर्वनिर्धारित गर",
        "passwordreset-username": "प्रयोगकर्ता-नाम:",
        "passwordreset-domain": "डोमेन",
        "passwordreset-capture": "निस्कने इमेलको नमुना हेर्ने ?",
        "resettokens": "टोकन पूर्वरुपमी फर्काउन्या",
        "resettokens-text": "जो टोकन तमरो खातासँग सम्बद्ध केहि विशिष्ट व्यक्तिगत जानकारी प्रदान गर्छन, तम त्यसलाई यहाँ रिसेट गद्द सक्द्या हौ।\n\nयदि तमले तिनलाई भुलवस कैकनै देखाईदिया छौ वा तमरो खाता ह्याक भइसक्याको छ भन्या तम यसलाई रिसेट गर्या ।",
        "resettokens-no-tokens": "पूर्वरुमी फर्काउन्या कोई लै टोकन नाइथिन् ।",
-       "resettokens-legend": "टोकन पूर्वरुपमी फर्काउन्या",
        "resettokens-tokens": "टोकनहरू:",
        "resettokens-token-label": "$1 (यैलको मूल्यः $2)",
        "resettokens-done": "टोकन पूर्वरुपमी फर्काइयो ।",
        "editconflict": "सम्पादन बाँझ्यो: $1",
        "yourtext": "तमरा पाठहरू",
        "storedversion": "संग्रहित पुनरावलोकन",
+       "editingold": "<strong>चेतावनी: तम यै पानाको अति पुरानो अप्रचलित संशोधनलाई सम्पादन गद्द लाग्याछौ ।<strong>\nयदि तमीले यै परिवर्तनलाई सङ्ग्रह गर्यौ भण्या यै पछिका संशोधनहरू नष्ट हुन्याछन् ।",
        "yourdiff": "भिन्नताहरू",
+       "copyrightwarning2": "कृपया ध्यान देओ यै {{SITENAME}}मी दियाका योगदानहरूलाई अन्य योगदानकर्ताहरूद्वारा सम्पादन गरिन्याछ, परिवर्तन गरिन्याछ अथवा हटाइन्याछ । यदि तमरो लेखलाई निर्दयता पूर्वक सम्पादन गरेको चाहदैनौ भण्या त्यो यहाँ जनराख।<br />\nयदि तमी किटानसाथ भन्नाछौ कि यो लेख तम आफैले लेख्याको हो अथवा सार्वजनिक ज्ञानक्षेत्र अथवा मुक्त संसाधनबठे लियाको हो (विवरणकोलागि हेर $1 ). \n'''कपीराइट भयाको रचना अनुमति बिना  यहाँ जनराख!'''",
+       "readonlywarning": "<strong>चेतावनी: तथ्याङ्क मर्मतको निम्ति बन्द गरियाकोछ, यै कारण तमी आफ्नो सम्पादन अहिले सङ्ग्रह गद्द सक्द्याहौन ।</strong>\n\nयदि तमी चाहन्छौ भण्या अहिले यहाँ भयाका पाठलाई कपि गरि कतै टेक्स्ट फाइलमी पेस्ट गरिबर सङ्ग्रह गद्द सक्द्याहौ ।\n\nप्रवन्धक जनले यो बन्द गर्याको छ उनले यसो विवरण दियाको छ: $1",
        "protectedpagewarning": "<strong>सूचना: यै पानालाई सुरक्षित गरियाको छ यसकारण प्रवन्धकको विशेषाधिकार प्राप्त प्रयोगकर्ताहरूले मात्र यैलाई सम्पादन गद्द सक्द्याछन् ।</strong>\nसन्दर्भको लागि नविनतम लग प्रविष्टि तल दिइयाको छ:",
        "templatesused": "यै पानामी राखियाका {{PLURAL:$1|Template|ढाँचाहरू}} :",
+       "templatesusedsection": "यै खण्डमी {{PLURAL:$1|ढाँचा प्रयोग गरियाको छ|ढाँचाहरू प्रयोग गरियाका छन्}}",
        "template-protected": "(सुरक्षित)",
        "template-semiprotected": "(अर्ध-सुरक्षित)",
        "hiddencategories": "यो पानो निम्न {{PLURAL:$1|1 लुकाइयाको श्रेणी|$1 लुकाइयाका श्रेणीहरू}}को हिस्सादार(सदस्य) हो :",
        "content-failed-to-parse": "$1 को लागि $2 सामग्रीलाई पार्स गर्न विफल, गल्ती: $3",
        "invalid-content-data": "अमान्य सामग्री डेटा",
        "content-not-allowed-here": "सामग्री \"$1\"  [[$2]] पानामी राख्न अनुमती छैन ।",
+       "editwarning-warning": "यै पानाबठे बाहिर जाँदा तमले गर्याको कुनै पनि परिवर्तन हराउन्याछ ।\nयदि तमले लग इन गर्याको छ भण्या तमी यै सूचनालाई धेकाउन आफ्नो रोजाईहरूको \"{{int:prefs-editing}}\" भागमी गइबर बन्द गद्द सक्द्याहौ।",
        "content-model-wikitext": "विकिपाठ",
        "content-model-text": "साधारण पाठ",
        "content-model-javascript": "जाभास्क्रिप्ट",
        "last": "पल्लिको",
        "page_first": "पैल्लो",
        "page_last": "छाड्डीबारको",
+       "histlegend": "अन्तर चयन:संशोधनहरूको तुलनाको लागि रेडियो बाकसमी क्लिक गरिबर इण्टर गर अथवा तल दियाको बटनमी थिच <br />\nलिजेंड: (चालू): '''({{int:cur}})''' = अवतरणको बीचमी अन्तर, '''({{int:last}})''' = पैल्लीका अवतरणको बीचमी अन्तर, '''{{int:minoreditletter}}''' = नानो परिवर्तन।",
        "history-fieldset-title": "इतिहासको विचरण गर्ने",
        "history-show-deleted": "मेटिएका मात्र",
        "histfirst": "सबहै पुरानो",
        "histlast": "नयाँ",
-       "historysize": "({{PLURAL:$1|१ à¤¬à¤¾à¤\87à¤\9f |$1 à¤¬à¤¾à¤\87à¤\9fहरू}})",
+       "historysize": "({{PLURAL:$1|१ à¤\85à¤\95à¥\8dषर|$1 à¤\85à¤\95à¥\8dषरहरू}})",
        "historyempty": "(खाली)",
        "history-feed-title": "पुनरावलोकन इतिहास",
        "history-feed-description": "विकीमा यो पानको पुनरावलोकन इतिहास",
        "rev-deleted-comment": "(सम्पादन सारांश हटाइयो)",
        "rev-deleted-user": "(प्रयोगकर्ता नाम हटाइयो)",
        "rev-deleted-event": "(लग विवरण हटाइयो)",
+       "rev-suppressed-text-unhide": "यै पानाको पुनरावलोकन '''दमन''' गरियाको छ ।\nविस्तृत जानकारी [{{fullurl:{{#Special:Log}}/delete|पानो={{FULLPAGENAMEE}}}} दमन लग] पाउन सकिन्छ ।\nयदि तम अगाडि बढ्ड चाहन्छौ भण्या पनि तमीले  [$1 यि संशोधनहरू हेद्द] पाउन्या हौ ।",
        "rev-delundel": "दधेखाउने/लुकाउन्या",
        "rev-showdeleted": "धेकाउन्या",
        "revisiondelete": "मेटाउन्या/मेटाईया रद्दगर्ने  पुनरावलोकनहरु",
        "editundo": "रद्द गर्न्या",
        "diff-empty": "(कोइ भिन्नता छैन)",
        "diff-multi-sameuser": "(यिन प्रयोगकर्ताबठे {{PLURAL:$1|गरियाका बीचको एक बस्या काम नाइधेकियो|गरियाको बीचको $1 बस्याकाम नाइधेकियो}})",
+       "diff-multi-manyusers": "($2 {{PLURAL:$2|भन्दा अधिक प्रयोगकर्ता|भन्दा अधिक प्रयोगकर्ताहरू}}द्वारा {{PLURAL:$1|एउटा मध्यवर्ती संशोधन|$1 मध्यवर्ती संशोधनहरू}} नधेकायाएको)",
        "searchresults": "खोज नतिजाहरू",
        "searchresults-title": " \"$1\"का लागि खोज नतिजाहरू",
        "titlematches": "पाना शिर्षक मिलन्छ",
        "upload-recreate-warning": "'''चेतावनी: त्यस नाममी रह्याका फाइलहरू सारियाको या हटायाको छ।'''\n\nयै पानाको सारियाको र हटायाको लग तमरो सहजताको लागि दियाको छ।",
        "filedesc": "सारांश:",
        "large-file": "यो सिफारिस गर्याछकि फाइलहरूको आकार $1 भन्दा ठूला हुनु हुँदैन;\nयै फाइलको आकार $2 छ ।",
+       "fileexists": "यै नामको फाइल पैल्ली नैं छ, यदि तम परिवर्तन गद्या कुरडीमू सुनिश्चित छैनौ भण्या कृपया <strong>[[:$1]]</strong> जाँच गर।\n[[$1|thumb]]",
+       "filewasdeleted": "यै नामको एक फाइल पहिली पनि अपलोड गरिबर पछि हटाई सकियाको छ।\nपुनः अपलोड गद्दु पूर्व तम $1 लाई निक्करी जाँच गर ।",
        "uploadstash-nofiles": "तमरा कोइ पनि स्टाश गर्याका फाइलहरू नाइथिन् ।",
        "uploadstash-refresh": "फाइलहरूको सूची ताजा गर्न्या",
        "license-header": "कोइ केइ नाइथिन",
        "activeusers-hidesysops": "प्रवन्धकहरू लुकाउन्या",
        "activeusers-noresult": "प्रयोगकर्ताहरू भेटियानन्",
        "mailnologintext": "तमीले अरु प्रयोगकर्तानलाई ईमेल पठाउनको लागि आफु पहिली [[Special:UserLogin|प्रवेश(लगइन)गर्याको]] हुनुपडन्छ र [[Special:Preferences|आफ्नो रोजाइहरूमी]] एउटा वैध ईमेल ठेगाना भयाको हुनुपडन्छ ।",
+       "emailpagetext": "तल दियाको फार्मले तमी यै {{GENDER:$1|प्रयोगकर्ता}}लाई इमेल पठाउन सक्द्या हौ । तमीले जो ठेगाना [[Special:Preferences|आफ्नो प्रयोगकर्ता रोजाईहरू]]मी दियाका छियौ त्यो यै इमेललाई \"पठाउने\" को रूपमी आउन्याछ, अतः प्राप्तकर्ता तमीलाई सिधै जवाफ दिनसक्द्याछ ।",
+       "usermaildisabledtext": "यै विकिमी तम और प्रयोगकर्तानलाई ई-मेल पठाउन नाइसक्दा",
        "mywatchlist": "मेरो ध्यान सूची",
        "watch": "ध्यान राख",
        "watchthispage": "यै पानाको ध्यान राख",
        "notanarticle": "सामाग्री छैन",
        "enotif_reset": "सब्बै पानाहरू हेर्याको भनी चिनो लाउन्या",
        "enotif_body": "प्रिय $WATCHINGUSERNAME,\n\n\n{{SITENAME}}को पाना $PAGETITLE  $PAGEEDITDATE का दिन $PAGEEDITOR द्वारा $CHANGEDORCREATED, \nअहिलको संशोधनको निउती हेर  $PAGETITLE_URL ।\n\n$NEWPAGE\n\nसम्पादकको सारांश: $PAGESUMMARY $PAGEMINOREDIT\n\nसम्पादकसित सम्पर्क राख:\nमेल: $PAGEEDITOR_EMAIL\nविकि: $PAGEEDITOR_WIKI\n\nतमी यै पानामी नगयासम्म अब उसो कुनै परिवर्तन भयाका खण्डमी कुनै सूचना दिन्याछैन ।\nतमरा सम्पूर्ण ध्यान सूचीका पानानको लागि तमीले सूचना पताकालाई ध्यान सूचीमी पुनर्बहाली गद्द सक्द्या हौ । \n\n             तमरो मित्र {{SITENAME}} सूचना प्रणाली\n--\nइमेल सूचना व्यवस्था परिवर्तन गद्द, जाओ\n{{canonicalurl:{{#special:Preferences}}}}\n\nध्यान सूची व्यवस्थित गर्न, जाओ\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nध्यान सूची मेट्न, जाओ\n$UNWATCHURL\n\nप्रतिक्रिया र अन्य सहयोगका निउती:\n$HELPPAGE",
+       "confirmdeletetext": "तमी यो पानो र यैको इतिहास मेट्ट लाग्याछौ । कृपया पुष्टि गर कि [[{{MediaWiki:Policy-url}}|नियम]] मुताबिक तम मेट्ट लाग्याछौ।",
        "dellogpage": "मेटाइयाको लग",
        "delete-toobig": "यै पानाको सम्पादन इतिहास भौतै र  $1 {{PLURAL:$1|पुनरावलोक|पुनरावलोकहरू}}भन्दा बढी रह्याको छ।\n {{SITENAME}}मी दुर्घटनाको कारणले गडबडी आउनसक्द्या कुरडीलाई रोक्न यसा पानाहरूलाई मेट्नबठे निषेध गरियाको छ ।",
        "rollback": "सम्पादनहरू उल्टाउन्या",
        "protect-default": "सब्बै प्रयोगकर्तानहरूलाई अनुमति दिन्या",
        "protect-level-autoconfirmed": "नौला तथा दर्ता भयाका प्रयोगकर्तानलाई मात्र अनुमति दिन्या",
        "protect-cascade": "यै पानामी संलग्न सुरक्षित पानाहरू (लामबद्द सुरक्षा)",
+       "pagesize": "(अक्षरहरू)",
        "undeletepage": "मेट्याका पानाहरू हेद्या र पूर्वरुपमी फर्काउन्या",
+       "undeleterevisions": "$1 {{PLURAL:$1|संशोधन|संशोधनहरू}} संग्रहित",
        "undeletehistory": "यदि कुनै पानालाई पुन: स्थापन गरायौ भण्या सम्पूर्ण संस्करणहरू इतिहासमी पुन:स्थापन हुन्याछन् ।\nयदि यै नामबठे  नयाँ पानो निर्माण भैसक्याको छ भण्या पुन: स्थापित संस्करणहरू पूर्व इतिहासको रुपमी स्थापित हुन्याछन् ।",
        "undeleterevdel": "यदि यो मल्लो पानो बणन्छ  या फाइल संस्करणहरू आंशिक मेटियाका छन् भण्या मेट्न्या काम रद्द गरिन्या छैन।\nत्यै अवस्थामी तमीले छनौटमी अन्तिम मेटियाको नयाँ संस्करण नलुकाउन्यामी चिनो लगाउनु पडन्छ ।",
+       "undelete-revision": "$3द्वारा $1को ($4को  समय $5 मी) मेट्याका संशोधनहरू :",
+       "undeletedrevisions": "{{PLURAL:$1|एउटा संशोधन|$1 संशोधनहरू}} पुनर्स्थापित गरियो",
        "undeletedrevisions-files": "{{PLURAL:$1|एउटा संशोधन|$1 संशोधनहरू}} र {{PLURAL:$2|एउटा फाइल|$2 फाइलहरू}} पुनर्स्थापित गरियो",
        "undeletedfiles": "{{PLURAL:$1|१ फाइल|$1 फाइलहरू }} पूर्वस्थितिमी ल्याइयो",
        "undelete-header": "भर्खरै मेटायाका पानाहरू हेद्दाकीलाई [[Special:Log/delete|मेटायाका लग]]मी जाओ।",
        "whatlinkshere-filters": "छानियाका",
        "ipbreason-dropdown": "* ब्लक गर्नुका समान्य कारणहरू\n** झूटो सूचना दियाको\n** पानानबठे सामाग्रीहरू हटायाको\n** बाहिरी जालक्षेत्र (sites)सित नचाहिंदो लिङ्क गर्याको \n** पानानमी बकवास/गाली-गलौच हाल्याको\n** भै धेकाउने व्यवहार/उत्पीडन (सताउने कार्य) गर्याको\n** धेरै गलत खाताहरू बनायाको\n** प्रयोगकर्ता नाम अस्वीकार्य",
        "ipboptions": "२ घण्टाहरू:2 hours,१ दिन :1 day,३ दिनहरू:3 days,१ हप्ता:1 week,२ हप्ताहरू:2 weeks,१ महिना:1 month,३ महिनाहरू:3 months,६ महिनाहरू:6 months,१ वर्ष:1 year,अनगिन्ती:infinite",
+       "ipb-blockingself": "तमी आफैलाई ब्लक गद्द लाग्या छौ ! क्या तम पक्का यसो गद्द चाहन्छौ ?",
        "blocklist": "ब्लक गर्याका प्रयोगकर्ताहरू",
        "ipblocklist": "ब्लक गर्याका प्रयोगकर्ताहरू",
        "ipblocklist-legend": "ब्लक गर्याका प्रयोगकर्ताहरू खोज",
        "blocklink": "रोक्न्या",
        "contribslink": "योगदानहरू",
        "block-log-flags-anononly": "नाम नभयाका प्रयोकर्ताहरू मात्र",
+       "xffblockreason": "एउटा आइपि ठेगाना जुन X-Forwarded-For हेडरमी रह्याको छ, या त तमरो हो वा त्यै प्रक्सी सर्भरको हो जैको प्रयोग तमी गद्दा छौ रे यै माथि प्रतिबन्ध लगाइयाको छ । वास्तविक कारण थ्यो:$1",
        "ipbblocked": "तमी अरु प्रयोगकर्तानहरूलाई ब्लक गर्न वा उनीहरूको ब्लक खोल्न नाइसक्दा किनभने तमी आफै ब्लक भयाका छौ ।",
+       "lockdbtext": "डेटाबेसमी ताला लगाउनाले सबै प्रयोगकर्ता पृष्ठ सम्पादन, आफ्नो रौजाईमी परिवर्तन, आफ्नो ध्यानसूचीमी सम्पादन, र अन्य वस्तु जैको लागि डेटाबेसमी परिवर्तन गरें हुन्छ, त्यैबठे वन्चित हुन्याछ । कृपया यो सुनिश्चित गर कि तम यो गर्न चाहन्छौ, र तम रक्षण पश्चात ताला खोल्न्या हौ ।",
+       "movepagetext-noredirectfixer": "तल दियाको फारमले पानाको नाम परिवर्तन गद्याछ, उइको सबै इतिहास पनि नयाँ नामले धेकिन्याछ ।\nपुरानो शीर्षक नयाँ नाममी अनुप्रेषण गद्याछ ।\nमूल शीर्षक तर्फ लिएर जान्या सबै अनुप्रेषणहरूलाई तम स्वचालित रूपले परिवर्तन गद्द सक्द्या हौ ।\nयदि तम यसो नाइ गद्या भया कृपया [[Special:DoubleRedirects|दोहोरो]] पुनर्निर्देशन वा [[Special:BrokenRedirects|टुटेको पुनर्निर्देशन]]का लागि पक्कै जाँच गर ।\nलिङ्क आफ्नो स्थानमै रहोस्, यो सुनिश्चित गर्ने जिम्मेवारी तमरो हो ।\n\nयदि नयाँ शीर्षकको लेख पहिले देखि छ भण्या नाम परिवर्तन '''हुन''' सक्दैन । तर यदि नयाँ शीर्षक भयाको लेख खाली छ अथवा कतै अन्य स्थानमी अनुप्रेषित गद्दैछ र साथै उइको पुरानो संस्करण छैन भण्या त्यैको नाम परिवर्तन हुन्याछ ।\nयैको अभिप्राय यो हो कि यदि तमीबठे गल्ती भयाको छ भण्या तम फेरी पुरानो नाममी यस पानालाई सार्न सक्द्याछौ, र साथै तम कुनै पहिली बठे रह्याको पानाको सट्टा यो स्थानान्तरण गद्द सक्द्या हौन ।\n\n<strong>चेतावनी!<strong>\nयदि पानो खासै लोकप्रिय छ भण्या त्यैको लागि यो एउटा ठुलो र अकस्मात परिवर्तन हुन सक्छ;\nअगाडी बढ्नु भन्ना पहिली तमी यैको नतिजासँग परिचित भयाकाछौ ।",
        "cant-move-user-page": "तमसँग प्रयोगकर्ता पानाहरू साद्या अनुमती नाइथिन् (सहपानाहरू बाहेक)",
        "cant-move-to-user-page": "तमसँग पानाहरूलाई प्रयोगकर्ता पानामी साद्या अनुमती नाइथिन् (प्रयोगकर्ता सहपृष्ठहरूमी बाहेक)",
        "move-subpages": "उप पानाहरू सार्न्या($1 सम्मको)",
        "movenosubpage": "यै पानाको उपपाना नाइथी",
        "protectedpagemovewarning": "<strong>सूचना:</strong> यै पानालाई सुरक्षित गरियाको छ यसकारण प्रवन्धकको विशेषाधिकार प्राप्त प्रयोगकर्ताहरूले मात्र यैको नाम बदल्न सक्द्या छन् ।\nसन्दर्भको लागि नविनतम लग प्रविष्टि तल दियाको छ:",
        "export": "पानहरु पठौन्या",
+       "exporttext": "तमी विशिष्ठ पानाको विषय वस्तु र सम्पादन इतिहासलाई निर्यात गद्द सक्द्याहौ अथवा पानाहरूको समूहका केहि XML मी बेर्न सक्द्याहौ।\nयो [[Special:Import|आयात पाना]]को सहायताले मीडियाविकीको प्रयोग गरिवर दोश्रो विकीबठे आयात गद्द सकिन्याछ।\n\nपानाहरूको निर्यात गद्दका लागि, तल विषय वस्तु बाकसमी शीर्षक देओ, एक शीर्षक प्रति पङ्क्ति, र छान कि तम वर्तमान अवतरणसँग पुरानै अवतरण पनि चाहन्छौ वा चाहदैनौ, वा पछिल्लो सम्पादनका बारेमी जानकारीसँग मात्रै वर्तमान अवतरण चाहन्छौ।\n\nपछीको स्थितिको लागि तमी लिङ्कको पनि प्रयोग गद्द सक्द्याहौ, उदाहरणको लागि, \"[[{{MediaWiki:Mainpage}}]]\" पृष्ठको लागि [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]।",
+       "export-templates": "ढाँचाहरू संलग्न गर",
        "thumbnail-more": "ठूलो बनौन्या",
+       "import-interwiki-history": "यै पामैकोलागि सबै इतिहास संशोधनहरू प्रतिलिपि गद्या",
        "import-noarticle": "आयात गद्दाकी लाई पानाहरू नाइथिन्",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|संशोधन|संशोधनहरू}} आयात भयो",
        "tooltip-pt-userpage": "तमरो प्रयोगकर्ता पानो",
        "tooltip-pt-mytalk": "तमरो कुरणिकानी पानो",
        "tooltip-pt-preferences": "तमरा अभिरुचिहरू",
        "exif-orientation-1": "सानतिनो",
        "namespacesall": "सब्बै",
        "monthsall": "सब्बै",
+       "confirmrecreate": "प्रयोगकर्ता [[User:$1|$1]] ([[User talk:$1|कुरडी]])ले  तमले  सम्पादन सुरु गर्यापछि यो पानो मेट्याकाछन् । कारण थ्यो:\n: ''$2''\nकृपया सुनिश्चित गर कि तम यो पानो साँच्चै निर्माण गद्द चाहन्छौ ।",
+       "size-bytes": "$1 अक्षरहरू",
+       "size-kilobytes": "$1 किलोबाइट",
+       "size-megabytes": "$1 मेगाबाइट",
+       "size-gigabytes": "$1 गिगाबाइट",
        "lag-warn-normal": " $1 {{PLURAL:$1|सेकेन्ड |सेकेन्डहरू}} भन्दा नौला फेरबदलहरू यै सूचीमी नधेकाउन सक्छ ।",
        "lag-warn-high": "डेटावेस सर्भरको मस्तै ढिलाको कारणले  $1 {{PLURAL:$1|सेकेन्ड|सेकेन्डहरू}} पछिका परिवर्तनहरू नधेकिन सक्छ ।",
        "watchlisttools-view": "आधारित फेरबदलीहरू हेर",
        "tag-filter": "[[Special:Tags|पुछड]] छानिन्या",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ट्याग|ट्यागहरू}}]]: $2)",
        "tags-hitcount": "$1 {{PLURAL:$1|परिवर्तन|परिवर्तनहरू}}",
+       "tags-delete-explanation-warning": "यो क्रिया <strong>अपरिवर्तनीय</strong> हो र <strong>त्यसलाई परिवर्तन गर्न नाईसकिंदो</strong>, डेटाबेस प्रवन्धक पनि यैलाई केहि गद्द सक्दाइनन् । विश्वासपूर्ण रूपले तम तय गर कि तमी यै ट्यागलाई हटाउन चाहन्छौ ।",
        "logentry-delete-delete": "$1 बठे पानो $3 {{GENDER:$2|मेटाइयो}}",
        "logentry-move-move": "$1 {{GENDER:$2|द्वारा}} $3 पृष्ठलाई $4 मि सारियो",
        "logentry-newusers-create": "प्रयोगकर्ता खाता $1 {{GENDER:$2|खोलियो}}",
        "logentry-upload-upload": "$1 ले $3 {{GENDER:$2|अपलोड अरेका छन्}}",
+       "feedback-bugornote": "यदि तमी कुनै प्राविधिक समस्यालाई विस्तारले सम्झाउन तयार छौ भण्या कृपया [$1 बग राख]।\nयदि हैन, भण्या तमी तल दियाको सरल फारमको प्रयोग गद्दसक्द्याहौ । तमरो टिप्पणी, तमरो प्रयोगकर्ता नाम र तमरो ब्राउजरको नाम सहित \"[$3 $2]\" पानामी जोडिन्याछ ।",
        "searchsuggest-search": "खोज",
        "api-error-duplicate": "यै साइटमी पहिलीबठे यस्तै सामग्री {{PLURAL:$1|भयाको [$2 अर्को फाइल छ]|भयाका  [$2 केहि अरु फाइलहरू छन्]}} ।",
        "api-error-duplicate-archive": "यै साइटमी पहिलेबाट यस्तै सामग्री {{PLURAL:$1|भयाको [$2 अर्को फाइल थियो]|भयाका  [$2 केहि अरु फाइलहरू थिए]}} ।\nतर {{PLURAL:$1|यो मेट्याको थियो|यी मेटायाका थिए}} ।",
        "api-error-duplicate-archive-popup-title": "पैल्ली  {{PLURAL:$1|मेट्याको फाइलको|मेट्याका फाइलहरूको}} नकल प्रति बनाउन्या।",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|फाइल|फाइलहरू}} नकल प्रति बनाउन्या"
+       "api-error-duplicate-popup-title": "{{PLURAL:$1|फाइल|फाइलहरू}} नकल प्रति बनाउन्या",
+       "default-skin-not-found": "ओह! तमरो विकिको पूर्व निर्धारित खोल जस्तो कि <code dir=\"ltr\">$wgDefaultSkin</code> मी बताइयाको<code>$1</code>, उपलब्ध नाईथिन् ।\n\nतमरो इन्स्टलेसन यी खोलहरूलाई सम्मिलित गर्दछ {{PLURAL:$4|खोल|खोलहरू}}। हेर [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: खोललाई सम्मिलित गर्नु] ताकि तमीलाई जानकारी होस् कि कसरि {{PLURAL:$4|उसलाई|उसलाई सम्मिलित गर्न सकियोस् र निर्धारितलाई तय गद्दे}}।\n\n$2\n\n; यदि तमीले अहिले मीडियाविकि इन्स्टाल गर्याका छौ:\n: तमीले सम्भवत गिटबठे इन्स्टाल गर्याका छौ, वा सिधै स्रोत कोडबठे गर्याका छौ जैको लागि कुनै अर्कै तारिका प्रयोग गरियाको छ । यो आशा अनुरूप छ । कोशिश गर केहि खोलहरू\n[https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's मीडियाविकिको खोल डाइरेक्ट्रीबाट डाउनलोड गद्या], जैको लागि तमी:\n:* डाउनलोड गर [https://www.mediawiki.org/wiki/Download टरबल इन्स्टालर], जुन कयौं खोलहरू र विस्तारमी उपलब्ध छन्। तमी खोलहरूको कोड <code>skins/</code> त्यसको डाइरेक्ट्रीबाट कपी-पेस्ट गद्द सक्द्या हौ। \n:* व्यक्तिगत खोलहरू टरबलबठे डाउनलोड गर\n[https://www.mediawiki.org/wiki/Special:SkinDistributor मीडिया विकि] बठे।\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins गिटको प्रयोग गरेर डाउनलोड गद्द सकन्छौ]।\n: यदि तमी विकासकर्ता हौ भण्या यसो गद्दा तमरो गिट-रिपजिटरीमी केहि हुनुहुँदैन । \n; यदि तमीले अहिले मीडियाविकिलाई अपग्रेड गर्याका छौ:\n: मीडियाविकि १.२४ र यैको नवीन रूप स्वतः रूपले खोलहरूलाई सक्षम गद्दैनन् (हेर [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual:खोलहरूको स्वतः खोज])। तमी निम्नलिखितलाई पेस्ट गद्द सकन्छौ: {{PLURAL:$5|लाइन|लाइनहरू}}  <code>LocalSettings.php</code> मी ताकि {{PLURAL:$5|उसले|सबै}} सक्षम होस् जस्तो कि तमीले इन्स्टाल गर्याको {{PLURAL:$5|खोल|खोलहरू}}को मामिलामी:\n\n<pre dir=\"ltr\">$3</pre>\n\n; यदि तमीले अहिले परिवर्तन गर्याका छौ<code>LocalSettings.php</code>:\n: खोल नामहरूको अगाडी डबल-क्लिक गर जसले तमलाई विभिन्न प्रकारहरूको विकल्प दिन्छ।"
 }
index 9981328..b7fb79a 100644 (file)
        "passwordreset": "Κωδικός επαναφοράς",
        "passwordreset-text-one": "Συμπληρώστε την παρακάτω φόρμα για να επαναφέρετε τον κωδικό πρόσβασής σας.",
        "passwordreset-text-many": "{{PLURAL:$1|Συμπληρώστε ένα από τα πεδία για να λάβετε προσωρινό κωδικό πρόσβαση μέσω ηλεκτρονικού ταχυδρομείου.}}",
-       "passwordreset-legend": "Επαναφορά κωδικού πρόσβασης",
        "passwordreset-disabled": "Η επαναφορά κωδικού πρόσβασης έχει απενεργοποιηθεί σε αυτό το wiki",
        "passwordreset-emaildisabled": "Τα χαρακτηριστικά ηλεκτρονικού ταχυδρομείου έχουν απενεργοποιηθεί σ' αυτό το wiki.",
        "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|αλλαγών σε σελίδες στη λίστα παρακολούθησής σας]]",
        "creating": "Δημιουργία: $1",
        "editingsection": "Επεξεργασία $1 (ενότητα)",
        "editingcomment": "Επεξεργασία $1 (νέο τμήμα)",
-       "editconflict": "ΣÏ\8dγκÏ\81οÏ\85Ï\83η ÎµÏ\80εξεÏ\81γαÏ\83ίαÏ\82: $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α;",
        "explainconflict": "Κάποιος άλλος χρήστης έχει αλλάξει αυτή τη σελίδα από τότε που αρχίσατε να την επεξεργάζεστε.\nΣτο επάνω τμήμα βρίσκεται το τρέχον κείμενο της σελίδας.\nΟι δικές σας αλλαγές εμφανίζονται στο κάτω τμήμα.\nΘα πρέπει να ενσωματώσετε τις αλλαγές σας στο τρέχον κείμενο.\n'''Μόνο''' το επάνω τμήμα θα αποθηκευθεί όταν πατήσετε \"{{int:savearticle}}\".",
        "yourtext": "Το κείμενό σας",
        "storedversion": "Αποθηκευμένη έκδοση",
        "cascadeprotectedwarning": "'''Προσοχή:''' Αυτή η σελίδα έχει κλειδωθεί ώστε μόνο χρήστες με δικαιώματα διαχειριστή συστήματος (sysop) να μπορούν να την επεξεργαστούν, επειδή περιλαμβάνεται {{PLURAL:$1|στην|στις}} {{PLURAL:$1|ακόλουθη|ακόλουθες}} διαδοχικά (cascaded) {{PLURAL:$1|προστατευμένη|προστατευμένες}} {{PLURAL:$1|σελίδα|σελίδες}}:",
        "titleprotectedwarning": "'''Προειδοποίηση: Αυτή η σελίδα έχει κλειδωθεί ώστε χρειάζονται [[Special:ListGroupRights|ειδικά δικαιώματα]] για να δημιουργηθεί.'''\nΗ πιο πρόσφατη καταχώρηση στο αρχείο καταγραφής παρέχεται παρακάτω για αναφορά:",
        "templatesused": "{{PLURAL:$1|Πρότυπο που χρησιμοποιείται|Πρότυπα που χρησιμοποιούνται}} στη σελίδα αυτή:",
-       "templatesusedpreview": "{{PLURAL:$1|Πρότυπο|Πρότυπα}} που χρησιμοποιούνται σε αυτή την προεπισκόπηση:",
+       "templatesusedpreview": "{{PLURAL:$1|Πρότυπο που χρησιμοποιείται|Πρότυπα που χρησιμοποιούνται}} σε αυτήν την προεπισκόπηση:",
        "templatesusedsection": "{{PLURAL:$1|Πρότυπο|Πρότυπα}} που χρησιμοποιούνται σε αυτή την ενότητα:",
        "template-protected": "(προστατευμένη)",
        "template-semiprotected": "(ημιπροστατευμένη)",
        "revdelete-nooldid-title": "Άκυρη έκδοση-στόχος",
        "revdelete-nooldid-text": "Είτε δεν έχετε ορίσει μία έκδοση-στόχο για να εκτελεστεί η λειτουργία σε αυτή, είτε η ορισμένη έκδοση δεν υπάρχει, είτε προσπαθείτε να κρύψετε την τρέχουσα έκδοση.",
        "revdelete-no-file": "Το αρχείο που καθορίσατε δεν υπάρχει.",
-       "revdelete-show-file-confirm": "Î\95ίÏ\83Ï\84ε Ï\83ίγοÏ\85Ï\81οι Ï\8cÏ\84ι Î¸Î­Î»ÎµÏ\84ε Î½Î± Î´ÎµÎ¯Ï\84ε Î¼Î¯Î± Î´Î¹ÎµÎ³Ï\81αμμένη Î±Î½Î±Î¸ÎµÏ\8eÏ\81ηÏ\83η Ï\84οÏ\85 Î±Ï\81Ï\87είοÏ\85 \"<nowiki>$1</nowiki>\" από τις $2 στις $3;",
+       "revdelete-show-file-confirm": "Î\95ίÏ\83Ï\84ε Ï\83ίγοÏ\85Ï\81οι Ï\8cÏ\84ι Î¸Î­Î»ÎµÏ\84ε Î½Î± Î´ÎµÎ¯Ï\84ε Î¼Î¯Î± Î´Î¹Î±Î³ÎµÎ³Ï\81αμμένη Î±Î½Î±Î¸ÎµÏ\8eÏ\81ηÏ\83η Ï\84οÏ\85 Î±Ï\81Ï\87είοÏ\85 Â«<nowiki>$1</nowiki>» από τις $2 στις $3;",
        "revdelete-show-file-submit": "Ναι",
        "revdelete-selected-text": "{{PLURAL:$1|Επιλεγμένη έκδοση|Επιλεγμένες εκδόσεις}} της [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Επιλεγμένη έκδοση αρχείου|Επιλεγμένες εκδόσεις αρχείου}} του [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Επιλεγμένο γεγονός αρχείου καταγραφής|Επιλεγμένα γεγονότα αρχείου καταγραφής}}:",
-       "revdelete-text-text": "Οι διαγραμμένες αναθεωρήσεις θα εξακολουθούν να εμφανίζονται στο ιστορικό της σελίδας, αλλά τα μέρη του περιεχομένου τους θα είναι απροσπέλαστα για το κοινό.",
-       "revdelete-text-file": "Οι διαγραμμένες αναθεωρήσεις θα εξακολουθούν να εμφανίζονται στο ιστορικό του αρχείου, αλλά μέρη του περιεχομένου τους δεν θα είναι προσβάσιμα για το κοινό.",
-       "logdelete-text": "Οι διαγραμμένες καταγραφές ενεργειών θα εξακολουθούν να εμφανίζονται στις σελίδες καταγραφών, αλλά μέρη του περιεχομένου τους, θα είναι απροσπέλαστα για το κοινό.",
+       "revdelete-text-text": "Οι διαγεγραμμένες αναθεωρήσεις θα εξακολουθούν να εμφανίζονται στο ιστορικό της σελίδας, αλλά τα μέρη του περιεχομένου τους θα είναι απροσπέλαστα για το κοινό.",
+       "revdelete-text-file": "Οι διαγεγραμμένες αναθεωρήσεις θα εξακολουθούν να εμφανίζονται στο ιστορικό του αρχείου, αλλά μέρη του περιεχομένου τους θα είναι απροσπέλαστα από το κοινό.",
+       "logdelete-text": "Οι διαγεγραμμένες καταγραφές συμβάντων θα εξακολουθούν να εμφανίζονται στις σελίδες καταγραφών, αλλά μέρη του περιεχομένου τους θα είναι απροσπέλαστα για το κοινό.",
        "revdelete-text-others": "Άλλοι διαχειριστές θα εξακολουθεί να είναι σε θέση να αποκτήσουν πρόσβαση στο κρυφό περιεχόμενο και για να αναιρέσουν τη διαγραφή, εκτός αν τίθενται πρόσθετοι περιορισμοί.",
        "revdelete-confirm": "Παρακαλούμε επιβεβαιώστε ότι σκοπεύετε να το κάνετε αυτό, ότι αντιλαμβάνεσθε τις συνέπειες, και ότι το κάνετε σύμφωνα με την [[{{MediaWiki:Policy-url}}|πολιτική]].",
        "revdelete-suppress-text": "Η καταστολή μπορεί να χρησιμοποιηθεί <strong> μόνο </strong> για τις ακόλουθες περιπτώσεις:\n* Ενδεχόμενη συκοφαντική δυσφήμιση\n* Ακατάλληλες προσωπικές πληροφορίες\n*: <em>διευθύνσεις κατοικίας και αριθμοί τηλεφώνου, αριθμοί ταυτότητας, κλπ. </em>",
        "logdelete-failure": "'''Η ορατότητα του καταλόγου δεν μπορούσε να ρυθμιστεί:'''\n$1",
        "revdel-restore": "αλλαγή ορατότητας",
        "pagehist": "Ιστορικό σελίδας",
-       "deletedhist": "Διαγραμμένο ιστορικό",
+       "deletedhist": "Διαγεγραμμένο ιστορικό",
        "revdelete-hide-current": "Σφάλμα κατά την απόκρυψη του αντικειμένου στις $2, $1: αυτή είναι η τωρινή έκδοση.\nΔεν μπορεί να αποκρυφθεί.",
        "revdelete-show-no-access": "Σφάλμα στην προβολή του αντικειμένου στις $2, $1: αυτό το αντικείμενο έχει σημειωθεί ως \"περιορισμένο\".\nΔεν έχετε πρόσβαση σε αυτό.",
        "revdelete-modify-no-access": "Σφάλμα κατά τη μετατροπή του αντικειμένου στις $2, $1: αυτό το αντικείμενο σημάνθηκε ως \"περιορισμένο\".\nΔεν έχετε πρόσβαση σε αυτό.",
        "right-deletelogentry": "Διαγραφή και επαναφορά διαγραφής συγκεκριμένων καταχωρήσεων στη λίστα καταγραφών",
        "right-deleterevision": "Διαγραφή και επαναφορά συγκεκριμένων αναθεωρήσεων σελίδων",
        "right-deletedhistory": "Προβολή διαγραμμένων εκδόσεων του ιστορικού, χωρίς το σχετικό κείμενο",
-       "right-deletedtext": "Î\95μÏ\86άνιÏ\83η Î´Î¹ÎµÎ³Ï\81αμμένοÏ\85 ÎºÎµÎ¹Î¼Î­Î½Î¿Ï\85 ÎºÎ±Î¹ Î±Î»Î»Î±Î³Ï\8eν Î±Î½Î¬Î¼ÎµÏ\83α Ï\83Ï\84ιÏ\82 Î´Î¹ÎµÎ³Ï\81αμμένεÏ\82 ÎµÎºÎ´Ï\8cÏ\83ειÏ\82",
-       "right-browsearchive": "Αναζήτηση στις διαγραμμένες σελίδες",
+       "right-deletedtext": "Î\95μÏ\86άνιÏ\83η Î´Î¹Î±Î³ÎµÎ³Ï\81αμμένοÏ\85 ÎºÎµÎ¹Î¼Î­Î½Î¿Ï\85 ÎºÎ±Î¹ Î±Î»Î»Î±Î³Ï\8eν Î¼ÎµÏ\84αξÏ\8d Î´Î¹Î±Î³ÎµÎ³Ï\81αμμένÏ\89ν ÎµÎºÎ´Ï\8cÏ\83εÏ\89ν",
+       "right-browsearchive": "Αναζήτηση στις διαγεγραμμένες σελίδες",
        "right-undelete": "Ανάκληση διαγραφής μίας σελίδας",
        "right-suppressrevision": "Προβολή, απόκρυψη και επανεμφάνιση από οποιονδήποτε χρήστη συγκεκριμένων αναθεωρήσεων σελίδων",
        "right-viewsuppressed": "Προβολή αναθεωρήσεων κρυμμένων από κάθε χρήστη",
        "action-writeapi": "να χρησιμοποιήσετε το API για εγγραφή",
        "action-delete": "να διαγράψετε αυτή τη σελίδα",
        "action-deleterevision": "να διαγράψετε αυτή την έκδοση",
-       "action-deletedhistory": "να δείτε το διαγραμμένο ιστορικό αυτής της σελίδας",
-       "action-browsearchive": "να ÎµÏ\81εÏ\85νήÏ\83εÏ\84ε Î³Î¹Î± Î´Î¹Î±γραμμένες σελίδες",
+       "action-deletedhistory": "να προβάλετε το διαγεγραμμένο ιστορικό αυτής της σελίδας",
+       "action-browsearchive": "να Î±Î½Î±Î¶Î·Ï\84ήÏ\83εÏ\84ε Î´Î¹Î±Î³Îµγραμμένες σελίδες",
        "action-undelete": "να ακυρώσετε τη διαγραφή αυτής της σελίδας",
        "action-suppressrevision": "να επιθεωρήσετε και αποκαταστήσετε αυτή την κρυμμένη αναθεώρηση",
        "action-suppressionlog": "να δείτε αυτόν τον ιδιωτικό κατάλογο",
        "randomincategory-nopages": "Δεν υπάρχουν σελίδες στην κατηγορία [[:Category:$1|$1]].",
        "randomincategory-category": "Κατηγορία:",
        "randomincategory-legend": "Τυχαία σελίδα στην κατηγορία",
+       "randomincategory-submit": "Πήγαινε",
        "randomredirect": "Τυχαία ανακατεύθυνση",
        "randomredirect-nopages": "Δεν υπάρχουν ανακατευθύνσεις στον ονοματοχώρο \"$1\".",
        "statistics": "Στατιστικά",
        "pageswithprop-prop": "Όνομα ιδιότητας:",
        "pageswithprop-submit": "Μετάβαση",
        "doubleredirects": "Διπλές ανακατευθύνσεις",
-       "doubleredirectstext": "Αυτή η σελίδα συγκαταλέγει σελίδες οι οποίες ανακατευθύνουν σε άλλες σελίδες ανακατεύθυνσης. Κάθε σειρά περιέχει συνδέσμους προς την πρώτη και τη δεύτερη σελίδα ανακατεύθυνσης, όπως επίσης και την πρώτη αράδα του κειμένου στη δεύτερη σελίδα ανακατεύθυνσης η οποία και είναι, κανονικά, ο πραγματικός προορισμός της ανακατεύθυνσης -εκεί δηλαδή όπου θα έπρεπε να είχατε οδηγηθεί από την αρχή. Τα <del>διεγραμμένα</del> λήμματα έχουν επιλυθεί.",
+       "doubleredirectstext": "Αυτή η σελίδα καταγράφει σελίδες οι οποίες ανακατευθύνουν σε άλλες σελίδες ανακατεύθυνσης. \nΚάθε σειρά περιέχει συνδέσμους προς την πρώτη και τη δεύτερη ανακατεύθυνση, όπως επίσης και προς τον προορισμό της δεύτερης ανακατεύθυνσης, η οποία και είναι συνήθως η «πραγματική» σελίδα προορισμού στην οποία πρέπει να δείχνει η πρώτη ανακατεύθυνση. \nΤα <del>διαγεγραμμένα</del> λήμματα έχουν επιλυθεί.",
        "double-redirect-fixed-move": "Η [[$1]] έχει μετακινηθεί.\nΕνημερώθηκε αυτόματα και τώρα είναι ανακατεύθυνση στην [[$2]].",
        "double-redirect-fixed-maintenance": "Αυτόματη διόρθωση διπλής ανακατεύθυνσης από [[$1]] σε [[$2]] σε εργασία συντήρησης.",
        "double-redirect-fixer": "Διορθωτής ανακατευθύνσεων",
        "wantedfiletext-nocat-noforeign": "Τα ακόλουθα αρχεία χρησιμοποιούνται αλλά δεν υπάρχουν.",
        "wantedtemplates": "Ζητούμενα πρότυπα",
        "mostlinked": "Σελίδες με τους περισσότερους συνδέσμους προς αυτές",
-       "mostlinkedcategories": "ΠεÏ\81ιÏ\83Ï\83Ï\8cÏ\84εÏ\81ο Ï\87Ï\81ηÏ\83ιμοÏ\80οιοÏ\8dμενεÏ\82 ÎºÎ±Ï\84ηγοÏ\81ίες",
+       "mostlinkedcategories": "Î\9aαÏ\84ηγοÏ\81ίεÏ\82 Î¼Îµ Ï\84οÏ\85Ï\82 Ï\80εÏ\81ιÏ\83Ï\83Ï\8cÏ\84εÏ\81οÏ\85Ï\82 Ï\83Ï\85νδέÏ\83μοÏ\85Ï\82 Ï\80Ï\81οÏ\82 Î±Ï\85Ï\84ές",
        "mostlinkedtemplates": "Σελίδες που έχουν ενσωματωθεί περισσότερο από όλες τις άλλες",
        "mostcategories": "Σελίδες με τις περισσότερες κατηγορίες",
-       "mostimages": "ΠεÏ\81ιÏ\83Ï\83Ï\8cÏ\84εÏ\81ο Ï\87Ï\81ηÏ\83ιμοÏ\80οιοÏ\8dμενα Î±Ï\81Ï\87εία",
+       "mostimages": "Î\91Ï\81Ï\87εία Î¼Îµ Ï\84οÏ\85Ï\82 Ï\80εÏ\81ιÏ\83Ï\83Ï\8cÏ\84εÏ\81οÏ\85Ï\82 Ï\83Ï\85νδέÏ\83μοÏ\85Ï\82 Ï\80Ï\81οÏ\82 Î±Ï\85Ï\84ά",
        "mostinterwikis": "Σελίδες με τους περισσότερους διαγλωσσικούς συνδέσμους",
        "mostrevisions": "Σελίδες με τις περισσότερες αναθεωρήσεις",
        "prefixindex": "Όλες οι σελίδες με πρόθεμα",
        "categoriesfrom": "Εμφάνιση κατηγοριών που αρχίζουν από:",
        "special-categories-sort-count": "ταξινόμηση κατά απαρίθμηση",
        "special-categories-sort-abc": "αλφαβητική ταξινόμηση",
-       "deletedcontributions": "Διαγραμμένες συνεισφορές χρήστη",
-       "deletedcontributions-title": "Διαγραμμένες συνεισφορές χρήστη",
+       "deletedcontributions": "Διαγεγραμμένες συνεισφορές χρήστη",
+       "deletedcontributions-title": "Διαγεγραμμένες συνεισφορές χρήστη",
        "sp-deletedcontributions-contribs": "συνεισφορές",
        "linksearch": "Αναζήτηση εξωτερικών συνδέσμων",
        "linksearch-pat": "Μοτίβο αναζήτησης:",
        "restriction-level-all": "οποιοδήποτε επίπεδο",
        "undelete": "Αποκατάσταση σελίδων που έχουν διαγραφεί",
        "undeletepage": "Εμφάνιση και αποκατάσταση σελίδων που έχουν διαγραφεί",
-       "undeletepagetitle": "'''Οι ακόλουθες είναι διαγραμμένες επεξεργασίες του [[:$1|$1]]'''.",
+       "undeletepagetitle": "<strong>Οι ακόλουθες είναι διαγεγραμμένες επεξεργασίες του [[:$1|$1]]</strong>.",
        "viewdeletedpage": "Εμφάνιση διεγραμμένων σελίδων",
        "undeletepagetext": "{{PLURAL:$1|Η σελίδα που ακολουθεί έχει|$1 Οι σελίδες που ακολουθούν έχουν}} διαγραφεί αλλά {{PLURAL:βρίσκεται|βρίσκονται}} ακόμα {{PLURAL:αποθηκευμένη|αποθηκευμένες}} στο αρχείο και {{PLURAL:μπορεί να αποκατασταθεί|μπορούν να αποκατασταθούν}}. Κατά καιρούς γίνεται εκκαθάριση του αρχείου.",
        "undelete-fieldset-title": "Αποκατάσταση αναθεωρήσεων",
        "undeleteextrahelp": "Για να επαναφέρετε ολόκληρο το ιστορικό της σελίδας, μην επιλέγετε κανένα πλαίσιο ελέγχου και κάντε κλικ στο '''''{{int:undeletebtn}}'''''.\nΓια να κάνετε μια προσαρμοσμένη επαναφορά, επιλέξτε τα πλαίσια που αντιστοιχούν στις αναθεωρήσεις που πρόκειται να επαναφερθούν και κάντε κλικ στο '''''{{int:undeletebtn}}'''''.",
        "undeleterevisions": "$1 {{PLURAL:$1|τροποποίηση|τροποποιήσεις}} αρχειοθετήθηκαν.",
        "undeletehistory": "Αν επαναφέρετε την σελίδα, όλες οι εκδόσεις θα επαναφερθούν στο ιστορικό.\n\nΑν μια νέα σελίδα με το ίδιο όνομα δημιουργήθηκε μετά την διαγραφή, οι επαναφερμένες εκδόσεις θα εμφανιστούν στο πρότερο ιστορικό.",
-       "undeleterevdel": "Η επαναφορά δεν θα εκτελεστεί αν θα έχει ως αποτέλεσμα η πιο πρόσφατη έκδοση της σελίδας ή αρχείου να είναι διαγραμμένη μερικώς. Σε τέτοιες περιπτώσεις, πρέπει να αποεπιλέξετε ή να εμφανίσετε την νεότερη διαγραμμένη έκδοση.",
+       "undeleterevdel": "Η επαναφορά δεν θα εκτελεστεί αν θα έχει ως αποτέλεσμα η πιο πρόσφατη έκδοση της σελίδας ή αρχείου να είναι διαγεγραμμένη μερικώς. Σε τέτοιες περιπτώσεις, πρέπει να αποεπιλέξετε ή να εμφανίσετε την νεότερη διαγεγραμμένη έκδοση.",
        "undeletehistorynoadmin": "Αυτό το άρθρο έχει διαγραφεί. Ο λόγος για τη διαγραφή φαίνεται\nστη σύνοψη παρακάτω, μαζί με λεπτομέρειες των χρηστών που επεξεργάστηκαν τη σελίδα\nπριν τη διαγραφή. Το αρχικό κείμενο αυτών των διεγραμμένων αναθεωρήσεων είναι διαθέσιμο μόνο στους διαχειριστές.",
-       "undelete-revision": "Διαγραμμένη αναθεώρηση του $1 (από $4, στις $5) από $3:",
+       "undelete-revision": "Διαγεγραμμένη αναθεώρηση του $1 (από τις $4, στις $5) από $3:",
        "undeleterevision-missing": "Άκυρη ή ανύπαρκτη αναθεώρηση. Μπορεί να έχετε έναν κακό σύνδεσμο, ή η\nαναθεώρηση μπορεί να έχει επαναφερθεί ή αφαιρεθεί από το αρχείο.",
        "undelete-nodiff": "Δεν βρέθηκε προηγούμενη αναθεώρηση.",
        "undeletebtn": "Επαναφορά",
        "undeletedfiles": "$1 {{PLURAL:$1|αρχείο|αρχεία}} επαναφέρθηκαν",
        "cannotundelete": "Η αναίρεση διαγραφής απέτυχε: $1",
        "undeletedpage": "'''Η $1 έχει επαναφερθεί'''\n\nΣυμβουλευτείτε το [[Special:Log/delete|αρχείο καταγραφής διαγραφών]] για ένα μητρώο των πρόσφατων διαγραφών και επαναφορών.",
-       "undelete-header": "Δείτε [[Special:Log/delete|το αρχείο καταγραφής διαγραφών]] για πρόσφατα διεγραμμένες σελίδες.",
-       "undelete-search-title": "Αναζήτηση στις διεγραμμένες σελίδες",
+       "undelete-header": "Î\94είÏ\84ε [[Special:Log/delete|Ï\84ο Î±Ï\81Ï\87είο ÎºÎ±Ï\84αγÏ\81αÏ\86ήÏ\82 Î´Î¹Î±Î³Ï\81αÏ\86Ï\8eν]] Î³Î¹Î± Ï\80Ï\81Ï\8cÏ\83Ï\86αÏ\84α Î´Î¹Î±Î³ÎµÎ³Ï\81αμμένεÏ\82 Ï\83ελίδεÏ\82.",
+       "undelete-search-title": "Αναζήτηση διαγεγραμμένων σελίδων",
        "undelete-search-box": "Αναζήτηση διεγραμμένων σελίδων",
        "undelete-search-prefix": "Εμφάνισε σελίδες που αρχίζουν με:",
        "undelete-search-submit": "Αναζήτηση",
        "undelete-error": "Σφάλμα κατά την αναίρεση διαγραφής της σελίδας",
        "undelete-error-short": "Σφάλμα κατά τη διαγραφή του αρχείου: $1",
        "undelete-error-long": "Αντιμετωπίστηκαν σφάλματα καθώς επαναφερόταν το αρχείο:\n\n$1",
-       "undelete-show-file-confirm": "Είστε σίγουρος ότι θέλετε να δείτε μια διεγραμμένη έκδοση του αρχείου \"<nowiki>$1</nowiki>\" από $2 σε $3;",
+       "undelete-show-file-confirm": "Είστε σίγουροι ότι θέλετε να δείτε μια διαγεγραμμένη έκδοση του αρχείου «<nowiki>$1</nowiki>» από τις $2 στις $3;",
        "undelete-show-file-submit": "Ναι",
        "namespace": "Ονοματοχώρος:",
        "invert": "Αντιστροφή επιλογής",
        "sp-contributions-newbies-title": "Συνεισφορές χρηστών για νέους λογαριασμούς",
        "sp-contributions-blocklog": "αρχείο καταγραφών φραγών",
        "sp-contributions-suppresslog": "διαγεγραμμένες συνεισφορές χρήστη",
-       "sp-contributions-deleted": "διαγραμμένες συνεισφορές χρήστη",
+       "sp-contributions-deleted": "διαγεγραμμένες συνεισφορές χρήστη",
        "sp-contributions-uploads": "ανεβάσματα αρχείων",
        "sp-contributions-logs": "καταγραφές",
        "sp-contributions-talk": "συζήτηση",
        "pageinfo-header-edits": "Ιστορικό επεξεργασίας",
        "pageinfo-header-restrictions": "Προστασία σελίδας",
        "pageinfo-header-properties": "Ιδιότητες σελίδας",
-       "pageinfo-display-title": "Î\95μÏ\86άνιÏ\83η Ï\84ίÏ\84λοÏ\85",
+       "pageinfo-display-title": "Î\95μÏ\86ανιζÏ\8cμενοÏ\82 Ï\84ίÏ\84λοÏ\82",
        "pageinfo-default-sort": "Προεπιλεγμένο κλειδί ταξινόμησης",
        "pageinfo-length": "Μήκος σελίδας (σε bytes)",
        "pageinfo-article-id": "Αναγνωριστικό σελίδας",
-       "pageinfo-language": "Î\93λÏ\8eÏ\83Ï\83α Ï\83ελίδαÏ\82 Ï\80εÏ\81ιεÏ\87ομένοÏ\85",
+       "pageinfo-language": "Î\93λÏ\8eÏ\83Ï\83α Ï\80εÏ\81ιεÏ\87ομένοÏ\85 Ï\83ελίδαÏ\82",
        "pageinfo-content-model": "Μοντέλο περιεχομένου σελίδας",
        "pageinfo-robot-policy": "Ευρετηρίαση από ρομπότ",
        "pageinfo-robot-index": "Επιτρεπτό",
        "deletedwhileediting": "'''Προσοχή''': Αυτή η σελίδα έχει διαγραφεί αφότου ξεκινήσατε την επεξεργασία!",
        "confirmrecreate": "Ο χρήστης [[User:$1|$1]] ([[User talk:$1|συζήτηση]]) διέγραψε αυτή τη σελίδα αφότου ξεκινήσατε την επεξεργασία με αιτιολόγηση:\n: ''$2''\nΠαρακαλώ επιβεβαιώστε ότι θέλετε πραγματικά να ξαναδημιουργήσετε αυτή τη σελίδα.",
        "confirmrecreate-noreason": "Ο χρήστης [[User:$1|$1]] ([[User talk:$1|συζήτηση]]) διέγραψε αυτή τη σελίδα αφότου ξεκινήσατε την επεξεργασία.\nΠαρακαλούμε επιβεβαιώστε ότι θέλετε πραγματικά να ξαναδημιουργήσετε αυτή τη σελίδα.",
-       "recreate": "Î\95Ï\80αναδημιοÏ\85Ï\81γία",
+       "recreate": "Î\97 Ï\83ελίδα Î­Ï\87ει Î´Î¹Î±Î³Ï\81αÏ\86εί Î±Ï\80Ï\8c Ï\84Ï\8cÏ\84ε Ï\80οÏ\85 Î±Ï\81Ï\87ίÏ\83αÏ\84ε Î½Î± Ï\84ην ÎµÏ\80εξεÏ\81γάζεÏ\83Ï\84ε. Î Î±Ï\84ήÏ\83Ï\84ε \"$1\" Î³Î¹Î± Î½Î± Ï\84η Î´Î·Î¼Î¹Î¿Ï\85Ï\81γήÏ\83εÏ\84ε Î¾Î±Î½Î¬.",
        "confirm_purge_button": "Εντάξει",
        "confirm-purge-top": "Καθαρισμός της λανθάνουσας μνήμης αυτής της σελίδας.",
        "confirm-purge-bottom": "Η εκκαθάριση μιας σελίδας εκκαθαρίζει την μνήμη cache και εξαναγκάζει την πλέον πρόσφατη έκδοση να εμφανιστεί.",
        "specialpages-group-changes": "Πρόσφατες αλλαγές και καταγραφές γεγονότων",
        "specialpages-group-media": "Αναφορές πολυμέσων και ανέβασμα αρχείων",
        "specialpages-group-users": "Χρήστες και δικαιώματα",
-       "specialpages-group-highuse": "ΠολÏ\85Ï\83Ï\8dÏ\87ναÏ\83Ï\84εÏ\82 Ï\83ελίδες",
+       "specialpages-group-highuse": "ΣελίδεÏ\82 Ï\85Ï\88ηλήÏ\82 Ï\87Ï\81ήÏ\83ης",
        "specialpages-group-pages": "Κατάλογοι σελίδων",
        "specialpages-group-pagetools": "Εργαλεία σελίδων",
        "specialpages-group-wiki": "Δεδομένα και εργαλεία",
-       "specialpages-group-redirects": "Î\91νακαÏ\84εÏ\8dθÏ\85νÏ\83η ÎµÎ¹Î´Î¹ÎºÏ\8eν Ï\83ελίδÏ\89ν",
+       "specialpages-group-redirects": "Î\91νακαÏ\84εÏ\85θÏ\85νÏ\84ικέÏ\82 ÎµÎ¹Î´Î¹ÎºÎ­Ï\82 Ï\83ελίδεÏ\82",
        "specialpages-group-spam": "Εργαλεία κατά των ανεπιθύμητων διαφημιστικών",
        "specialpages-group-developer": "Εργαλεία προγραμματιστών",
        "blankpage": "Κενή σελίδα",
        "pagelang-select-lang": "Επιλογή γλώσσας",
        "right-pagelang": "Αλλαγή γλώσσας σελίδας",
        "action-pagelang": "αλλαγή της γλώσσας σελίδας",
+       "log-name-pagelang": "Αρχείο καταγραφών αλλαγών γλώσσας",
        "logentry-pagelang-pagelang": "{{GENDER:$2|Ο|Η}} $1 άλλαξε τη γλώσσα σελίδας της σελίδας $3 από $4 σε $5.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> /$2 (ενεργοποιημένο)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''απενεργοποιημένο''')",
index 25ae0a2..3a47bce 100644 (file)
        "passwordreset": "Reset password",
        "passwordreset-text-one": "Complete this form to receive a temporary password via email.",
        "passwordreset-text-many": "{{PLURAL:$1|Fill in one of the fields to receive a temporary password via email.}}",
-       "passwordreset-legend": "Reset password",
        "passwordreset-disabled": "Password resets have been disabled on this wiki.",
        "passwordreset-emaildisabled": "Email features have been disabled on this wiki.",
        "passwordreset-username": "Username:",
        "resettokens-summary": "",
        "resettokens-text": "You can reset tokens which allow access to certain private data associated with your account here.\n\nYou should do it if you accidentally shared them with someone or if your account has been compromised.",
        "resettokens-no-tokens": "There are no tokens to reset.",
-       "resettokens-legend": "Reset tokens",
        "resettokens-tokens": "Tokens:",
        "resettokens-token-label": "$1 (current value: $2)",
        "resettokens-watchlist-token": "Token for the web feed (Atom/RSS) of [[Special:Watchlist|changes to pages on your watchlist]]",
        "randomincategory-nopages": "There are no pages in the [[:Category:$1|$1]] category.",
        "randomincategory-category": "Category:",
        "randomincategory-legend": "Random page in category",
+       "randomincategory-submit": "Go",
        "randomredirect": "Random redirect",
        "randomredirect-nopages": "There are no redirects in the namespace \"$1\".",
        "statistics": "Statistics",
        "rollback-success": "Reverted edits by $1;\nchanged back to last revision by $2.",
        "sessionfailure-title": "Session failure",
        "sessionfailure": "There seems to be a problem with your login session;\nthis action has been canceled as a precaution against session hijacking.\nGo back to the previous page, reload that page and then try again.",
+       "changecontentmodel" : "Change content model of a page",
+       "changecontentmodel-legend": "Change content model",
+       "changecontentmodel-title-label": "Page title",
+       "changecontentmodel-model-label": "New content model",
+       "changecontentmodel-reason-label": "Reason:",
+       "changecontentmodel-success-title": "The content model was changed",
+       "changecontentmodel-success-text": "The content type of [[:$1]] has been changed.",
+       "changecontentmodel-cannot-convert": "The content on [[:$1]] cannot be converted to a type of $2.",
+       "changecontentmodel-title-cantexist": "It is not possible to have a page at $1.",
+       "changecontentmodel-nodirectediting": "The $1 content model does not support direct editing",
+       "log-name-contentmodel": "Content model change log",
+       "log-description-contentmodel": "Events related to the content models of a page",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|changed}} the content model of the page $3 from \"$4\" to \"$5\"",
+       "logentry-contentmodel-change-revertlink": "revert",
+       "logentry-contentmodel-change-revert": "revert",
        "protectlogpage": "Protection log",
        "protectlogtext": "Below is a list of changes to page protections.\nSee the [[Special:ProtectedPages|protected pages list]] for the list of currently operational page protections.",
        "protectedarticle": "protected \"[[$1]]\"",
        "tooltip-pt-logout": "Log out",
        "tooltip-pt-createaccount": "You are encouraged to create an account and log in; however, it is not mandatory",
        "tooltip-ca-talk": "Discussion about the content page",
-       "tooltip-ca-edit": "You can edit this page. Please use the preview button before saving",
+       "tooltip-ca-edit": "Edit this page",
        "tooltip-ca-addsection": "Start a new section",
        "tooltip-ca-viewsource": "This page is protected.\nYou can view its source",
        "tooltip-ca-history": "Past revisions of this page",
        "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-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",
        "pageinfo-redirects-value": "$1",
        "pageinfo-subpages-name": "Number of subpages of this page",
        "version-libraries": "Installed libraries",
        "version-libraries-library": "Library",
        "version-libraries-version": "Version",
+       "version-libraries-license": "License",
+       "version-libraries-description": "Description",
+       "version-libraries-authors": "Authors",
        "redirect": "Redirect by file, user, page or revision ID",
        "redirect-legend": "Redirect to a file or page",
        "redirect-text": "",
index 919a625..5f5be28 100644 (file)
        "passwordreset": "Restablecer contraseña",
        "passwordreset-text-one": "Completa este formulario para recibir una contraseña temporal por correo electrónico.",
        "passwordreset-text-many": "{{PLURAL:$1|Elige una de las opciones para recibir una contraseña temporal por correo electrónico.}}",
-       "passwordreset-legend": "Restablecer contraseña",
        "passwordreset-disabled": "Se ha desactivado el restablecimiento de contraseñas en este wiki.",
        "passwordreset-emaildisabled": "Se han desactivado las funciones de correo electrónico en este wiki.",
        "passwordreset-username": "Nombre de usuario:",
        "resettokens": "Restablecer claves",
        "resettokens-text": "Aquí puedes restablecer las claves que permiten el acceso a ciertos datos privados asociados a tu cuenta.\n\nDeberías hacerlo si los has compartido por accidente, o si ha habido intrusiones en tu cuenta.",
        "resettokens-no-tokens": "No hay claves para restablecer.",
-       "resettokens-legend": "Restablecer claves",
        "resettokens-tokens": "Claves:",
        "resettokens-token-label": "$1 (valor actual: $2)",
        "resettokens-watchlist-token": "Clave para el canal (RSS/Atom) de los [[Special:Watchlist|cambios a las páginas en tu lista de seguimiento]]",
        "creating": "Creación de «$1»",
        "editingsection": "Edición de «$1» (sección)",
        "editingcomment": "Edición de «$1» (sección nueva)",
-       "editconflict": "Conflicto de edición: $1",
+       "editconflict": "No se pudieron guardar tus cambios debido a un conflicto de edición. {{GENDER:|¿Deseas}} resolver el conflicto manualmente?",
        "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",
        "content-model-css": "CSS",
        "content-json-empty-object": "Objeto vacío",
        "content-json-empty-array": "Matriz vacía",
-       "duplicate-args-warning": "<strong>Aviso:</strong> [[:$1]] usa [[:$2]] con más de un valor para el parámetro «$3». Se usará solo el último valor proporcionado.",
+       "duplicate-args-warning": "<strong>Aviso:</strong> [[:$1]] convoca a [[:$2]] con más de un valor para el parámetro «$3». Se usará solo el último valor proporcionado.",
        "duplicate-args-category": "Páginas que usan argumentos duplicados en invocaciones de plantillas",
        "duplicate-args-category-desc": "La página contiene invocaciones de plantillas que utilizan argumentos duplicados, como <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "<strong>Advertencia:</strong> esta página contiene demasiadas llamadas a funciones sintácticas costosas.\n\nTiene {{PLURAL:$1|una llamada|$1 llamadas}}, pero debería tener menos de {{PLURAL:$2|una|$2}}.",
        "filedelete-nofile-old": "No existe una versión guardada de '''$1''' con los atributos especificados.",
        "filedelete-otherreason": "Otra razón:",
        "filedelete-reason-otherlist": "Otra razón",
-       "filedelete-reason-dropdown": "*Razones de borrado habituales\n** Violación de copyright\n** Archivo duplicado",
+       "filedelete-reason-dropdown": "*Razones habituales de borrado\n** Violación de derechos de autor\n** Archivo duplicado",
        "filedelete-edit-reasonlist": "Edita los motivos del borrado",
        "filedelete-maintenance": "Borrado y restauración de archivos temporalmente deshabilitados durante el mantenimiento.",
        "filedelete-maintenance-title": "No se puede eliminar el archivo",
        "randomincategory-nopages": "No hay páginas en la categoría [[:Category:$1|$1]].",
        "randomincategory-category": "Categoría:",
        "randomincategory-legend": "Página aleatoria en categoría",
+       "randomincategory-submit": "Ir",
        "randomredirect": "Ir a una redirección cualquiera",
        "randomredirect-nopages": "No hay redirecciones en el espacio de nombres «$1».",
        "statistics": "Estadísticas",
        "unwatchthispage": "Dejar de vigilar",
        "notanarticle": "No es un artículo",
        "notvisiblerev": "La última revisión de un usuario diferente ha sido borrada",
-       "watchlist-details": "{{PLURAL:$1|$1 página|$1 páginas}} en su lista de seguimiento, sin contar las de discusión.",
+       "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'''.",
        "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.",
        "historywarning": "<strong>Atención:</strong> la página que estás a punto de borrar tiene un historial con $1 {{PLURAL:$1|revisión|revisiones}}:",
        "confirmdeletetext": "Estás a punto de borrar una página, así como todo su historial.\nPor favor, confirma que realmente quieres hacer eso, que entiendes las consecuencias, y que lo estás haciendo de acuerdo con [[{{MediaWiki:Policy-url}}|las políticas]].",
        "actioncomplete": "Acción completada",
-       "actionfailed": "Acción fallida",
+       "actionfailed": "Falló la acción",
        "deletedtext": "«$1» ha sido borrado.\nVéase $2 para un registro de los borrados recientes.",
        "dellogpage": "Registro de borrados",
        "dellogpagetext": "A continuación se muestra una lista de los borrados más recientes.",
        "deletereason-dropdown": "*Razones comunes de borrado\n** Spam\n** Vandalismo\n** Violación de copyright\n** A petición del mismo autor\n** Redirección incorrecta",
        "delete-edit-reasonlist": "Editar razones de borrado",
        "delete-toobig": "Esta página tiene un historial muy grande, con más de $1 {{PLURAL:$1|revisión|revisiones}}. Borrar este tipo de páginas ha sido restringido para prevenir posibles problemas en {{SITENAME}}.",
-       "delete-warning-toobig": "Esta página tiene un historial de más de $1 {{PLURAL:$1|revisión|revisiones}}. Eliminarla puede perturbar las operaciones de la base de datos de {{SITENAME}}. Ten cuidado al borrar.",
+       "delete-warning-toobig": "Esta página tiene un historial de más de $1 {{PLURAL:$1|revisión|revisiones}}.\nEliminarla puede perturbar las operaciones de la base de datos de {{SITENAME}}.\nProcede con cautela.",
        "deleteprotected": "No puedes eliminar esta página porque ha sido protegida.",
        "deleting-backlinks-warning": "'''Advertencia:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Otras páginas]] enlazan o transcluyen la página que vas a eliminar.",
        "rollback": "Revertir ediciones",
        "rollback-success": "Revertidas las ediciones de $1; recuperada la última versión de $2.",
        "sessionfailure-title": "Error de sesión",
        "sessionfailure": "Parece que hay un problema con tu sesión;\nesta acción ha sido cancelada como medida de precaución contra secuestros de sesión.\nPor favor, pulsa «Atrás», recarga la página de la que viniste e inténtalo de nuevo.",
+       "changecontentmodel": "Cambiar el modelo de contenido de una página",
+       "changecontentmodel-legend": "Cambiar el modelo de contenido",
+       "changecontentmodel-title-label": "Título de página",
+       "changecontentmodel-model-label": "Modelo de contenido nuevo",
+       "changecontentmodel-reason-label": "Motivo:",
+       "changecontentmodel-success-title": "Se cambió el modelo de contenido",
+       "changecontentmodel-success-text": "Se ha cambiado el tipo de contenido de [[:$1]].",
+       "changecontentmodel-cannot-convert": "El contenido de [[:$1]] no se puede convertir a un tipo de $2.",
+       "changecontentmodel-title-cantexist": "No es posible tener una página en $1.",
+       "changecontentmodel-nodirectediting": "El modelo de contenido $1 no admite la edición directa",
+       "log-name-contentmodel": "Registro de cambios del modelo de contenido",
+       "log-description-contentmodel": "Eventos relacionados con los modelos de contenido de una página",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|cambió}} el modelo de contenido de la página $3 de \"$4\" a \"$5\"",
+       "logentry-contentmodel-change-revertlink": "revertir",
+       "logentry-contentmodel-change-revert": "revertir",
        "protectlogpage": "Registro de protección",
        "protectlogtext": "Abajo se presenta una lista de protección y desprotección de página.\nVéase [[Special:ProtectedPages|la lista de páginas protegidas]] para ver las protecciones activas en páginas.",
        "protectedarticle": "protegió «[[$1]]»",
        "sp-contributions-uploads": "subidas",
        "sp-contributions-logs": "registros",
        "sp-contributions-talk": "discusión",
-       "sp-contributions-userrights": "administración de derechos de usuarios",
+       "sp-contributions-userrights": "gestión de permisos del usuario",
        "sp-contributions-blocked-notice": "Este usuario está actualmente bloqueado. La última entrada del registro de bloqueos es presentada debajo para mayor referencia:",
        "sp-contributions-blocked-notice-anon": "Esta dirección IP se encuentra actualmente bloqueada.\nA continuación se muestra la última entrada del registro de bloqueos para mayor referencia.",
        "sp-contributions-search": "Buscar contribuciones",
        "tooltip-pt-logout": "Salir de la sesión",
        "tooltip-pt-createaccount": "Te recomendamos crear una cuenta e iniciar sesión; sin embargo, no es obligatorio",
        "tooltip-ca-talk": "Discusión acerca de la página de contenido",
-       "tooltip-ca-edit": "Puedes editar esta página. Utiliza el botón de previsualización antes de guardar",
+       "tooltip-ca-edit": "Editar esta página",
        "tooltip-ca-addsection": "Iniciar una sección nueva",
        "tooltip-ca-viewsource": "Esta página está protegida.\nPuedes ver su código fuente",
        "tooltip-ca-history": "Versiones anteriores de esta página",
        "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-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",
        "pageinfo-redirects-value": "$1",
        "pageinfo-subpages-name": "Subpáginas de esta página",
        "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": "Crear de nuevo",
+       "recreate": "La página fue borrada después de que comenzaste a editarla. Pulsa en «$1» para crearla de nuevo.",
        "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-libraries": "Bibliotecas instaladas",
        "version-libraries-library": "Biblioteca",
        "version-libraries-version": "Versión",
+       "version-libraries-license": "Licencia",
+       "version-libraries-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]].",
        "logentry-delete-revision-legacy": "$1 ha {{GENDER:$2|cambiado}} la visibilidad de las revisiones en la página $3",
        "logentry-suppress-delete": "$1 {{GENDER:$2|borró}}, con restricciones para administradores aplicadas, la página $3",
        "logentry-suppress-event": "$1 {{GENDER:$2|modificó}} secretamente la visibilidad de {{PLURAL:$5|una edición|$5 ediciones}} en la página $3: $4",
-       "logentry-suppress-revision": "$1 modificó secretamente la visibilidad de {{PLURAL:$5|una edición|$5 ediciones}} en la página $3: $4",
+       "logentry-suppress-revision": "$1 {{GENDER:$2|modificó}} secretamente la visibilidad de {{PLURAL:$5|una edición|$5 ediciones}} en la página $3: $4",
        "logentry-suppress-event-legacy": "$1 {{GENDER:$2|modificó}} secretamente la visibilidad de los eventos del registro en $3",
        "logentry-suppress-revision-legacy": "$1 {{GENDER:$2|modificó}} secretamente la visibilidad de varias ediciones en la página $3",
        "revdelete-content-hid": "contenido ocultado",
        "logentry-import-interwiki": "$1 {{GENDER:$2|importó}} $3 desde otro wiki",
        "logentry-merge-merge": "$1 {{GENDER:$2|combinó}} $3 en $4 (revisiones hasta el $5)",
        "logentry-move-move": "$1 {{GENDER:$2|trasladó}} la página $3 a $4",
-       "logentry-move-move-noredirect": "$1 movió la página $3 a $4 sin dejar una redirección",
+       "logentry-move-move-noredirect": "$1 {{GENDER:$2|trasladó}} la página $3 a $4 sin dejar una redirección",
        "logentry-move-move_redir": "$1 {{GENDER:$2|trasladó}} la página $3 a $4 sobre una redirección",
        "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|trasladó}} la página $3 a $4 sobre una redirección y sin dejar una redirección",
        "logentry-patrol-patrol": "$1 {{GENDER:$2|marcó}} como patrullada la edición $4 de la página $3",
        "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|marcó}} automáticamente la edición $4 de la página $3 como patrullada",
        "logentry-newusers-newusers": "La cuenta de usuario $1 ha sido {{GENDER:$2|creada}}",
        "logentry-newusers-create": "Se ha {{GENDER:$2|creado}} la cuenta de usuario $1",
-       "logentry-newusers-create2": "La cuenta de usuario $3 ha sido creada por $1",
-       "logentry-newusers-byemail": "la cuenta de usuario $3 ha sido creada por $1 y la contraseña ha sido enviada por correo",
+       "logentry-newusers-create2": "La cuenta de usuario $3 ha sido {{GENDER:$2|creada}} por $1",
+       "logentry-newusers-byemail": "La cuenta de usuario $3 ha sido {{GENDER:$2|creada}} por $1 y la contraseña ha sido enviada por correo",
        "logentry-newusers-autocreate": "La cuenta $1 se {{GENDER:$2|creó}} automáticamente",
        "logentry-rights-rights": "$1 modificó los grupos a los que pertenece $3: de $4 a $5",
-       "logentry-rights-rights-legacy": "$1 modificó los grupos a los que pertenece $3",
+       "logentry-rights-rights-legacy": "$1 {{GENDER:$2|modificó}} los grupos a los que pertenece $3",
        "logentry-rights-autopromote": "$1 ha sido {{GENDER:$2|promocionado|promocionada}} automáticamente de $4 a $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|subió}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|subió}} una nueva versión de $3",
index ecd1865..c0f3da4 100644 (file)
        "passwordreset": "Parooli lähtestamine",
        "passwordreset-text-one": "Täida see vorm, et oma parool lähtestada.",
        "passwordreset-text-many": "{{PLURAL:$1|Täida üks väljadest, et saada e-kiri ajutise parooliga.}}",
-       "passwordreset-legend": "Parooli lähtestamine",
        "passwordreset-disabled": "Selles vikis on paroolide lähtestamine keelatud.",
        "passwordreset-emaildisabled": "E-posti funktsioonid on selles vikis keelatud.",
        "passwordreset-username": "Kasutajanimi:",
        "resettokens": "Lubade lähtestamine",
        "resettokens-text": "Saad lähtestada load, mida on vaja siin sinu kontoga seotud kindlatele eraandmetele ligipääsuks.\n\nPeaksid load lähtestama, kui jagasid neid kogemata või kui su konto on kellegi teise võimusesse sattunud.",
        "resettokens-no-tokens": "Lähtestatavad load puuduvad.",
-       "resettokens-legend": "Lubade lähtestamine",
        "resettokens-tokens": "Load:",
        "resettokens-token-label": "$1 (praegune väärtus: $2)",
        "resettokens-watchlist-token": "[[Special:Watchlist|Jälgimisloendis olevatel lehekülgedel tehtud muudatuste]] veebivoo (Atom/RSS) luba",
        "yourdiff": "Erinevused",
        "copyrightwarning": "Pea silmas, et kogu kaastöö võrgukohale {{SITENAME}} loetakse avaldatuks litsentsi $2 all (üksikasjad leheküljel $1). Kui sa ei soovi, et sinu kirjutatut halastamatult redigeeritakse ja oma äranägemise järgi kasutatakse, siis ära seda siia salvesta.<br />\nKinnitad ka, et kirjutasid selle ise või võtsid selle allikast, mille materjale ei kaitsta autoriõigusega või muust sarnasest vabast allikast.<br />\n'''Ära salvesta autoriõigusega kaitstud materjali ilma loata!'''",
        "copyrightwarning2": "Pea silmas, et teised kaastöölised võivad kogu {{GRAMMAR:inessive|{{SITENAME}}}} tehtud kaastööd muuta või eemaldada. Kui sa ei soovi, et su kirjutatut halastamatult redigeeritakse, siis ära seda siia salvesta.<br />\nSa kinnitad ka, et kirjutasid selle ise või võtsid selle kopeerimiskitsenduseta allikast (vaata ka $1).\n'''Ära saada autoriõigusega kaitstud materjali loata!'''",
+       "editpage-cannot-use-custom-model": "Selle lehekülje sisumudelit ei saa muuta.",
        "longpageerror": "'''Tõrge: Lehekülge ei saa salvestada, sest sinu esitatud {{PLURAL:$1|ühe|$1}} kilobaidi suurune tekst ületab {{PLURAL:$2|ühekilobaidist|$2-kilobaidist}} ülemmäära.'''",
        "readonlywarning": "'''Hoiatus: Andmebaas on lukustatud hooldustöödeks, nii et praegu ei saa parandusi salvestada.'''\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:",
        "randomincategory-nopages": "Kategoorias \"[[:Category:$1|$1]]\" puuduvad leheküljed.",
        "randomincategory-category": "Kategooria:",
        "randomincategory-legend": "Juhuslik lehekülg kategoorias",
+       "randomincategory-submit": "Mine",
        "randomredirect": "Juhuslik ümbersuunamine",
        "randomredirect-nopages": "Nimeruumis \"$1\" ei ole ümbersuunamislehekülgi.",
        "statistics": "Arvandmestik",
        "version-libraries": "Paigaldatud teegid",
        "version-libraries-library": "Teek",
        "version-libraries-version": "Versioon",
+       "version-libraries-license": "Litsents",
+       "version-libraries-description": "Kirjeldus",
+       "version-libraries-authors": "Autorid",
        "redirect": "Ümbersuunamine faili, kasutaja, lehekülje või redaktsiooni identifikaatori järgi",
        "redirect-legend": "Ümbersuunamine faili juurde või leheküljele",
        "redirect-summary": "See erilehekülg suunab ümber faili (toodud failinimi), lehekülje (toodud redaktsiooni või lehekülje identifikaator) või kasutajalehekülje (toodud numbriline kasutaja identfikaator) juurde. Kasutamine: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] või [[{{#Special:Redirect}}/user/101]].",
        "special-characters-title-endash": "mõttekriips",
        "special-characters-title-emdash": "pikk mõttekriips",
        "special-characters-title-minus": "miinusmärk",
-       "mw-widgets-titleinput-description-new-page": "lehekülge pole veel"
+       "mw-widgets-titleinput-description-new-page": "lehekülge pole veel",
+       "mw-widgets-titleinput-description-redirect": "ümbersuunamine leheküljele \"$1\""
 }
index e118c55..0a74c8f 100644 (file)
        "passwordreset": "Pasahitzaren berrezarpena",
        "passwordreset-text-one": "Bete formulario hau zure pasahitza berrezartzeko.",
        "passwordreset-text-many": "{{PLURAL:$1|Sartu datuetako bat zure pasahitza berrezartzeko.}}",
-       "passwordreset-legend": "Pasahitza berrezarri",
        "passwordreset-disabled": "Pasahitza berrezartzea ez da posible wiki honetan.",
        "passwordreset-emaildisabled": "E-posta aukerak ez daude eskuragarri wiki honetan.",
        "passwordreset-username": "Lankide izena:",
        "changeemail-submit": "E-posta aldatu",
        "resettokens": "Tokenak berrezarri",
        "resettokens-no-tokens": "Ez dago tokenik berrezartzeko.",
-       "resettokens-legend": "Tokenak berrezarri",
        "resettokens-tokens": "Tokenak:",
        "resettokens-token-label": "$1 (oraingo balioa: $2)",
        "resettokens-watchlist-token": "(Atom/RSS) jarioarentzako tokenak [[Special:Watchlist|jarraitzen dituzun orrialdeen aldaketetarako]]",
        "creating": "«$1» sortzen",
        "editingsection": "«$1» aldatzen (atala)",
        "editingcomment": "«$1» aldatzen (atal berria)",
-       "editconflict": "Aldaketa gatazka: $1",
+       "editconflict": "Zure aldaketak ezin izan dira gorde, edizio gatazka bat izan delako. Gatazka eskuz konpondu nahi {{GENDER:|duzu}}?",
        "explainconflict": "Zu orrialdea aldatzen hasi ondoren beste norbaitek ere aldaketak egin ditu.\nGoiko testu koadroan ikus daiteke orrialdeak uneotan duen edukia.\nZure aldaketak beheko testu koadroan ikus daitezke.\nZure testua dagoenarekin elkartu beharko duzu.\nOrrialdea gordetzeko erabakitzen duzun unean goiko koadroko edukia '''bakarrik''' gordeko da.",
        "yourtext": "Zure testua",
        "storedversion": "Gordetako bertsioa",
        "currentrev": "Oraingo berrikuspena",
        "currentrev-asof": "Hauxe da oraingo bertsioa, $1 data duena",
        "revisionasof": "$1(e)ko berrikuspena",
-       "revision-info": "$2(r)en berrikusketa, ordua: $1",
+       "revision-info": "{{GENDER:$6|$2}}$7(r)en berrikusketa, ordua: $1",
        "previousrevision": "←Berrikuspen zaharragoa",
        "nextrevision": "Berrikuspen berriagoa→",
        "currentrevisionlink": "Oraingo berrikuspena ikusi",
        "license": "Lizentzia:",
        "license-header": "Lizentzia",
        "nolicense": "Hautatu gabe",
+       "licenses-edit": "Aldatu lizentzien aukerak",
        "license-nopreview": "(Aurreikuspenik ez)",
        "upload_source_url": " (baliozko URL publikoa)",
        "upload_source_file": " (zure ordenagailuko fitxategi bat)",
        "randomincategory-invalidcategory": "\"$1\" ez da kategoria izen baliagarri bat.",
        "randomincategory-nopages": "Ez dago orrialderik [[:Category:$1|$1]] kategorian.",
        "randomincategory-category": "Kategoria:",
+       "randomincategory-submit": "Joan",
        "randomredirect": "Ausazko birbideratzea",
        "randomredirect-nopages": "Ez dago birzuzenketarik \"$1\" izen-tartean.",
        "statistics": "Estatistikak",
        "protectedpages-indef": "Babes mugagabeak bakarrik",
        "protectedpages-cascade": "Kaskada moduko babesak bakarrik",
        "protectedpagesempty": "Ez dago parametro horiek dituen babesturiko orrialderik oraintxe.",
+       "protectedpages-page": "Orria",
+       "protectedpages-expiry": "Epemuga:",
        "protectedpages-reason": "Arrazoia",
        "protectedpages-unknown-timestamp": "Ezezaguna",
        "protectedpages-unknown-performer": "Erabiltzaile ezezaguna",
        "rollback-success": "$1 wikilariaren aldaketak deseginda,\nedukia $2 wikilariaren azken bertsiora itzuli da.",
        "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",
        "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\"",
        "import": "Orrialdeak inportatu",
        "importinterwiki": "Wikien arteko inportazioa",
        "import-interwiki-text": "Aukeratu inportatzeko wiki eta orrialde izenburu bat. Berrikuspenen datak eta egileak gorde egingo dira. Inportazio ekintza guzti hauek [[Special:Log/import|inportazio erregistroan]] gordetzen dira.",
+       "import-interwiki-sourcewiki": "Jatorrizko wikia:",
+       "import-interwiki-sourcepage": "Jatorrizko orria:",
        "import-interwiki-history": "Orrialde honen historiako bertsio guztiak kopiatu",
        "import-interwiki-templates": "Txantiloi guztiak sartu",
        "import-interwiki-submit": "Inportatu",
        "tooltip-pt-logout": "Saioa itxi",
        "tooltip-pt-createaccount": "Kontu bat sortu eta horrekin saioa hastea eskatu nahi genizuke; ez da ezinbestekoa, ordea.",
        "tooltip-ca-talk": "Artikuluari buruzko eztabaida",
-       "tooltip-ca-edit": "Artikulu hau aldatu dezakezu. Mesedez, aurrebista botoia erabil ezazu gorde baino lehen.",
+       "tooltip-ca-edit": "Orri hau aldatu iturburu kodea erabiliz",
        "tooltip-ca-addsection": "Iruzkin berria erantsi",
        "tooltip-ca-viewsource": "Artikulu hau babesturik dago. Bere kodea soilik ikus dezakezu.",
        "tooltip-ca-history": "Artikulu honen aurreko bertsioak.",
        "version-entrypoints-header-entrypoint": "Sarrera puntua",
        "version-entrypoints-header-url": "URL",
        "version-libraries-version": "Bertsioa",
+       "version-libraries-license": "Lizentzia",
+       "version-libraries-description": "Deskribapena",
+       "version-libraries-authors": "Egileak",
        "redirect": "Birzuzendu fitxategi, lankide edo berrikuspen IDaren arabera",
        "redirect-legend": "Orrialde edo fitxategi batera birzuzendu",
        "redirect-submit": "Joan",
        "tags-active-yes": "Bai",
        "tags-active-no": "Ez",
        "tags-edit": "aldatu",
+       "tags-delete": "ezabatu",
+       "tags-activate": "aktibatu",
        "tags-hitcount": "$1 {{PLURAL:$1|aldaketa|aldaketa}}",
        "tags-create-reason": "Arrazoia:",
        "tags-create-submit": "Sortu",
        "tags-delete-reason": "Arrazoia:",
        "tags-activate-reason": "Arrazoia:",
+       "tags-activate-submit": "Aktibatu",
        "tags-deactivate-reason": "Arrazoia:",
        "tags-edit-new-tags": "Etiketa berriak:",
        "tags-edit-add": "Gehitu etiketa hauek:",
index 2509fb2..288e4b8 100644 (file)
        "nospecialpagetext": "<strong>شما یک صفحهٔ ویژهٔ نامجاز را درخواست کرده‌اید.</strong>\n\nفهرستی از صفحه‌های ویژهٔ مجاز در [[Special:SpecialPages|{{int:specialpages}}]] وجود دارد.",
        "error": "خطا",
        "databaseerror": "خطای پایگاه داده",
-       "databaseerror-text": "مشکلی در پایگاه‌داده‌ها رخ دادهاست. \nاین ممکن است نشان‌دهندهٔ ایرادی در نرم‌افزار باشد.",
-       "databaseerror-textcl": "یک خطای پرس‌وجوی پایگاه داده‌های رخ دادهاست.",
+       "databaseerror-text": "مشکلی در پایگاه‌داده‌ها رخ داده است. \nاین ممکن است نشان‌دهندهٔ ایرادی در نرم‌افزار باشد.",
+       "databaseerror-textcl": "یک خطای پرس‌وجوی پایگاه داده‌های رخ داده است.",
        "databaseerror-query": "پرس‌وجو: $1",
        "databaseerror-function": "تابع: $1",
        "databaseerror-error": "خطا: $1",
        "userlogin-signwithsecure": "از ورود امن استفاده کنید",
        "yourdomainname": "دامنهٔ شما:",
        "password-change-forbidden": "شما نمی‌توانید گذرواژه‌ها را در این ویکی تغییر دهید.",
-       "externaldberror": "خطایی در ارتباط با پایگاه داده رخ دادهاست یا اینکه شما اجازهٔ به‌روزرسانی حساب خارجی خود را ندارید.",
+       "externaldberror": "خطایی در ارتباط با پایگاه داده رخ داده است یا اینکه شما اجازهٔ به‌روزرسانی حساب خارجی خود را ندارید.",
        "login": "ورود به سامانه",
        "nav-login-createaccount": "ورود به سامانه / ایجاد حساب کاربری",
        "userlogin": "ورود به سامانه / ایجاد حساب کاربری",
        "userlogin-helplink2": "کمک با ورود",
        "userlogin-loggedin": "شما در حال حاضر به عنوان {{GENDER:$1|$1}} وارد شده‌اید.\nاز فرم پایین برای ورود به عنوان یک کاربر دیگر استفاده کنید.",
        "userlogin-createanother": "ایجاد یک حساب کاربری دیگر",
-       "createacct-emailrequired": "آدرس ایمیل",
-       "createacct-emailoptional": "آدرس ایمیل (اختیاری)",
-       "createacct-email-ph": "آدرس ایمیل خود را وارد کنید",
+       "createacct-emailrequired": "نشانی ایمیل",
+       "createacct-emailoptional": "نشانی ایمیل (اختیاری)",
+       "createacct-email-ph": "نشانی ایمیل خود را وارد کنید",
        "createacct-another-email-ph": "آدرس ایمیل را وارد کنید",
        "createaccountmail": "استفاده از رمز عبور موقت تصادفی و ارسال آن به آدرس ایمیل مشخص شده",
        "createacct-realname": "نام واقعی (اختیاری)",
        "createacct-imgcaptcha-ph": "متن تصویری که در بالا می‌بینید، وارد کنید",
        "createacct-submit": "حسابتان را بسازید",
        "createacct-another-submit": "ایجاد حساب کاربری دیگر",
-       "createacct-benefit-heading": "{{SITENAME}} توسط افرادی مانند شما ساخته شدهاست",
+       "createacct-benefit-heading": "{{SITENAME}} توسط افرادی مانند شما ساخته شده است",
        "createacct-benefit-body1": "{{PLURAL:$1|ویرایش}}",
        "createacct-benefit-body2": "{{PLURAL:$1|صفحه}}",
        "createacct-benefit-body3": "{{PLURAL:$1|مشارکت‌کنندهٔ}} اخیر",
        "passwordreset": "بازنشانی گذرواژه",
        "passwordreset-text-one": "برای بازنشانی گذرواژه‌تان این فرم را کامل کنید.",
        "passwordreset-text-many": "{{PLURAL:$1|برای دریافت یک گذرواژهٔ موقت از طریق ایمیل، یکی از خانه‌ها را پر کنید.}}",
-       "passwordreset-legend": "بازنشانی گذرواژه",
        "passwordreset-disabled": "بازنشانی گذرواژه در این ویکی غیرفعال شده است.",
        "passwordreset-emaildisabled": "قابلیت‌های ایمیل در این ویکی غیرفعال شده‌اند.",
        "passwordreset-username": "نام کاربری:",
        "passwordreset-capture-help": "اگر این گزینه را علامت بزنید، ایمیل (حاوی گذرواژهٔ موقت) به شما نشان داده خواهد شد و برای کاربر نیز فرستاده خواهد شد.",
        "passwordreset-email": "نشانی ایمیل:",
        "passwordreset-emailtitle": "جزئیات حساب در {{SITENAME}}",
-       "passwordreset-emailtext-ip": "یک نفر (احتمالاً شما، با نشانی آی‌پی $1) درخواست بازنشانی گذرواژه‌تان در {{SITENAME}} ($4) را کرده‌است. {{PLURAL:$3|حساب|حساب‌های}} کاربری زیر با این آدرس ایمیل مرتبط هستند:\n\n$2\n\n{{PLURAL:$3|این گذرواژهٔ موقت|این گذرواژه‌های موقت}} پس از {{PLURAL:$5|یک روز|$5 روز}} باطل خواهند شد.\nشما باید هم‌اکنون ثبت ورود کنید و گذرواژه‌ای جدید برگزینید. اگر فکر می‌کنید شخص دیگری این درخواست را دادهاست یا اگر گذرواژهٔ اصلی‌تان را به یاد آوردید و دیگر نمی‌خواهید آن را تغییر دهید، می‌توانید این پیغام را نادیده بگیرید و به استفاده از گذرواژهٔ قبلی‌تان ادامه دهید.",
+       "passwordreset-emailtext-ip": "یک نفر (احتمالاً شما، با نشانی آی‌پی $1) درخواست بازنشانی گذرواژه‌تان در {{SITENAME}} ($4) را کرده‌است. {{PLURAL:$3|حساب|حساب‌های}} کاربری زیر با این آدرس ایمیل مرتبط هستند:\n\n$2\n\n{{PLURAL:$3|این گذرواژهٔ موقت|این گذرواژه‌های موقت}} پس از {{PLURAL:$5|یک روز|$5 روز}} باطل خواهند شد.\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",
        "passwordreset-emailsent": "یک نامهٔ بازنشانی گذرواژه فرستاده شده‌است.",
        "passwordreset-emailsent-capture": "یک ایمیل بازنشانی که در پایین نمایش داده شده، فرستاده شده است.",
        "passwordreset-emailerror-capture": "ایمیل بازنشانی، که در زیر نمایش داده شده، ایجاد شد، ولی ارسال آن به {{GENDER:$2|کاربر}} موفقیت‌آمیز نبود: $1",
-       "changeemail": "تغییر آدرس ایمیل",
+       "changeemail": "تغییر نشانی ایمیل",
        "changeemail-text": "این فرم را تکمیل کنید تا آدرس ایمیلتان تغییر یابد. برای این که این تغییر را تأیید کنید لازم است گذرواژهٔ خود را وارد کنید.",
        "changeemail-no-info": "برای دسترسی مستقیم به این صفحه شما باید به سامانه وارد شده باشید.",
        "changeemail-oldemail": "آدرس ایمیل کنونی:",
        "resettokens": "بازنشانی شناساننده‌ها",
        "resettokens-text": "شما می توانید شناساننده‌ها که اجازهٔ دسترسی به برخی داده‌های خصوصی مرتبط با حسابتان را می‌دهد بازنشانی کنید.\nدر صورتی باید این کار را انجام دهید که تصادقاً آن‌ها را با کسی در میان گذاشته‌اید یا به حسابتان نفوذ شده است.",
        "resettokens-no-tokens": "هیچ شناساننده‌ای برای بازنشانی وجود ندارد.",
-       "resettokens-legend": "بازنشانی شناساننده‌ها",
        "resettokens-tokens": "شناساننده‌ها:",
        "resettokens-token-label": "$1 (مقدار کنونی: $2)",
        "resettokens-watchlist-token": "شناسانندهٔ خوراک وبِی [[Special:Watchlist|تغییرات صفحه‌هایی که پی‌گیری می‌کنید]] (اتم/آراس‌اس)",
        "creating": "ایجاد $1",
        "editingsection": "در حال ویرایش $1 (بخش)",
        "editingcomment": "در حال ویرایش $1 (بخش تازه)",
-       "editconflict": "تعارض Ù\88Û\8cراÛ\8cØ´Û\8c: $1",
-       "explainconflict": "از وقتی ویرایش این صفحه را آغاز کرده‌اید شخص دیگری آن را تغییر داده‌است.\nناحیهٔ متنی بالایی شامل متن صفحه به شکل کنونی آن است.\nتغییرات شما در ناحیهٔ متنی پایینی نشان داده شده‌است.\nشما باید تغییراتتان را با متن کنونی ترکیب کنید.\nبا فشردن دکمهٔ «{{int:savearticle}}» '''فقط''' متن ناحیهٔ متنی بالایی ذخیره خواهد شد.",
+       "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",
+       "explainconflict": "از وقتی ویرایش این صفحه را آغاز کرده‌اید شخص دیگری آن را تغییر داده است.\nناحیهٔ متنی بالایی شامل متن صفحه به شکل کنونی آن است.\nتغییرات شما در ناحیهٔ متنی پایینی نشان داده شده‌است.\nشما باید تغییراتتان را با متن کنونی ترکیب کنید.\nبا فشردن دکمهٔ «{{int:savearticle}}» <strong>فقط</strong> متن ناحیهٔ متنی بالایی ذخیره خواهد شد.",
        "yourtext": "متن شما",
        "storedversion": "نسخهٔ ذخیره شده",
        "nonunicodebrowser": "'''هشدار: مرورگر شما با استانداردهای یونیکد سازگار نیست.'''\nراه حلی به کار گرفته شده تا شما بتوانید صفحات را با امنیت ویرایش کنید: کاراکترهای غیر ASCII به صورت کدهایی در مبنای شانزده به شما نشان داده می‌شوند.",
        "yourdiff": "تفاوت‌ها",
        "copyrightwarning": "لطفاً توجه داشته‌باشید که همهٔ مشارکت‌ها در {{SITENAME}} منتشرشده تحت $2 در نظر گرفته‌می‌شوند (برای جزئیات بیش‌تر $1 را ببینید).\nاگر نمی‌خواهید نوشته‌هایتان بی‌رحمانه ویرایش و توزیع شوند؛ بنابراین، آنها را اینجا ارائه نکنید.<br />\nشما همچنین به ما تعهد می‌کنید که خودتان این را نوشته‌اید یا آن را از یک منبع با مالکیت عمومی یا مشابه آزاد آن برداشته‌اید (برای جزئیات بیش‌تر $1 را ببینید).\n<strong>کارهای دارای حق تکثیر را بدون اجازه ارائه نکنید!</strong>",
        "copyrightwarning2": "لطفاً توجه داشته‌باشید که همهٔ مشارکت‌ها در {{SITENAME}} ممکن است توسط دیگر مشارکت‌کنندگان تغییر یابند، ویرایش یا حذف شوند.\nاگر نمی‌خواهید نوشته‌هایتان بی‌رحمانه ویرایش شوند؛ بنابراین، آنها را اینجا ارائه نکنید.<br />\nشما همچنین به ما تعهد می‌کنید که خودتان این را نوشته‌اید یا آن را از یک منبع با مالکیت عمومی یا مشابه آزاد آن برداشته‌اید ($1 را برای جزئیات بیشتر ببینید).\n<strong>کارهای دارای حق تکثیر را بدون اجازه ارائه نکنید!</strong>",
+       "editpage-cannot-use-custom-model": "مدل محتوای این صفحه نمی‌تواند عوض شود.",
        "longpageerror": "'''خطا: متنی که ارسال کرده‌اید {{PULAR:$1|یک کیلوبایت|$1 کیلوبایت}} طول دارد. این مقدار از مقدار بیشینهٔ {{PLURAL:$2|یک کیلوبایت|$2 کیلوبایت}} بیشتر است.'''\nنمی‌توان آن را ذخیره کرد.",
        "readonlywarning": "'''هشدار: پایگاه داده برای نگهداری قفل شده‌است، به همین علت هم‌اکنون نمی‌توانید ویرایش‌هایتان را ذخیره کنید.'''\nاگر می‌خواهید متن را در یک پروندهٔ متنی کپی کنید و برای آینده ذخیره‌اش کنید.\n\nمدیری که آن را قفل کرده این توضیح را ارائه کرده‌است: $1",
        "protectedpagewarning": "'''هشدار: این صفحه قفل شده‌است تا فقط کاربران با دسترسی مدیریت بتوانند ویرایشش کنند.'''\nآخرین موارد سیاهه در زیر آمده‌است:",
        "content-model-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> یا <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''هشدار:''' این صفحه حاوی تعدادی زیادی فراخوانی دستورهای تجزیه‌گر است.\n\nتعداد آن‌ها باید کمتر از $2 {{PLURAL:$2|فراخوانی|فراخوانی}} باشد، و اینک {{PLURAL:$1|$1 فراخوانی|$1 فراخوانی}} است.",
        "prefs-watchlist-token": "رمز فهرست پی‌گیری:",
        "prefs-misc": "متفرقه",
        "prefs-resetpass": "تغییر گذرواژه",
-       "prefs-changeemail": "تغییر آدرس ایمیل",
+       "prefs-changeemail": "تغییر نشانی ایمیل",
        "prefs-setemail": "تنظیم آدرس ایمیل",
        "prefs-email": "گزینه‌های ایمیل",
        "prefs-rendering": "نمایش صفحه",
        "badsig": "امضای خام نامجاز.\nلطفاً برچسب‌های اچ‌تی‌ام‌ال را بررسی کنید.",
        "badsiglength": "امضای شما بیش از اندازه طولانی است.\nامضا باید کمتر از $1 {{PLURAL:$1|نویسه}} طول داشته باشد.",
        "yourgender": "ترجیح می‌دهید چگونه توصیف شوید؟",
-       "gender-unknown": "ترجیح می‌دهم مشخص نکنم",
+       "gender-unknown": "هنگام ذکر شما، نرم‌افزار تا جای ممکن از کلمات خنثی از نظر جنسیت استفاده خواهد",
        "gender-male": "مرد",
        "gender-female": "زن",
        "prefs-help-gender": "انجام این تنظیم اختیاری است.\nنرم‌افزار از این مقدار برای اشارهٔ صحیح به جنسیت و ذکر شما برای دیگران با استفاده از دستور زبان درست استفاده می‌کند.\nاین اطلاعات عمومی خواهند بود.",
        "right-createpage": "ایجاد صفحه (در مورد صفحه‌های غیر بحث)",
        "right-createtalk": "ایجاد صفحه‌های بحث",
        "right-createaccount": "ایجاد حساب‌های کاربری",
-       "right-minoredit": "علامتزدن ویرایش‌ها به عنوان جزئی",
+       "right-minoredit": "علامت زدن ویرایش‌ها به عنوان جزئی",
        "right-move": "انتقال صفحه",
        "right-move-subpages": "انتقال صفحات به همراه زیر‌صفحات‌شان",
        "right-move-rootuserpages": "انتقال صفحه‌های کاربری سرشاخه",
        "right-editmyprivateinfo": "داده‌های خصوصی خود را ویرایش کنید (مانند آدرس ایمیل و نام واقعی)",
        "right-editmyoptions": "ترجیحات خود را ویرایش",
        "right-rollback": "واگردانی سریع ویرایش‌های آخرین کاربری که یک صفحه را ویرایش کرده‌است",
-       "right-markbotedits": "علامتزدن ویرایش‌های واگردانی‌شده به عنوان ویرایش ربات",
+       "right-markbotedits": "علامت زدن ویرایش‌های واگردانی‌شده به عنوان ویرایش ربات",
        "right-noratelimit": "تاثیر نپذیرفتن از محدودیت سرعت",
        "right-import": "واردکردن صفحه از ویکی‌های دیگر",
        "right-importupload": "واردکردن صفحه از طریق بارگذاری پرونده",
        "recentchanges-feed-description": "آخرین تغییرات ویکی را در این خوراک پی‌گیری کنید.",
        "recentchanges-label-newpage": "این ویرایش صفحه‌ای تازه ایجاد کرد",
        "recentchanges-label-minor": "این یک ویرایش جزئی‌است",
-       "recentchanges-label-bot": "این ویرایش را یک ربات انجام دادهاست",
-       "recentchanges-label-unpatrolled": "این ویرایش هنوز گشت‌زنی نشدهاست",
+       "recentchanges-label-bot": "این ویرایش را یک ربات انجام داده است",
+       "recentchanges-label-unpatrolled": "این ویرایش هنوز گشت‌زنی نشده است",
        "recentchanges-label-plusminus": "حجم صفحه به اندازه این مقدار بایت تغییر یافته است",
        "recentchanges-legend-heading": "'''اختصارها:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (همچنین به [[Special:NewPages|فهرست صفحات تازه]] نگاه کنید)",
        "rcshowhidebots-hide": "پنهان کردن",
        "rcshowhideliu": "$1 کاربران ثبت‌نام‌کردە",
        "rcshowhideliu-show": "نمایش",
-       "rcshowhideliu-hide": "Ù¾Ù\86Ù\87اÙ\86 Ú©Ø±Ø¯ن",
+       "rcshowhideliu-hide": "Ù\86Ù\87Ù\81تن",
        "rcshowhideanons": "$1 کاربران ناشناس",
        "rcshowhideanons-show": "نمایش",
        "rcshowhideanons-hide": "پنهان کردن",
        "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:, etc) در پرونده‌های اس‌وی‌جی مجاز نیست.",
        "uploadscriptednamespace": "این پوشه اس‌وی‌جی شامل فضای نام غیرقانونی '$1' است",
        "uploadinvalidxml": "XML در پروندهٔ بارگذاری‌شده نمی‌تواند تجزیه شود.",
        "uploadvirus": "این پرونده ویروس دارد!\nجزئیات : $1",
        "uploadstash-nofiles": "شما هیچ پروندهٔ انبارشده‌ای ندارید.",
        "uploadstash-badtoken": "انجام این اقدام ناموفق بود، احتمالاً به این دلیل که اعتبار ویرایش شما به اتمام رسیده است. دوباره امتحان کنید.",
        "uploadstash-errclear": "پاک‌کردن پرونده‌ها ناموفق بود.",
-       "uploadstash-refresh": "تازهکردن فهرست پرونده‌ها",
+       "uploadstash-refresh": "تازه کردن فهرست پرونده‌ها",
        "invalid-chunk-offset": "جابجایی نامعتبر قطعه",
        "img-auth-accessdenied": "منع دسترسی",
        "img-auth-nopathinfo": "PATH_INFO موجود نیست.\nسرور شما برای ردکردن این مقدار تنظیم نشده‌است.\nممکن است مبتنی بر سی‌جی‌آی باشد و از img_auth پشتیبانی نکند.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization را ببینید.",
        "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": "نتیجه‌ای برای این گزارش وجود ندارد.",
        "ip_range_toolarge": "قطع دسترسی بازه‌های بزرگتر از /$1 مجاز نیست.",
        "proxyblocker": "مسدود کننده پروکسی",
        "proxyblockreason": "نشانی آی‌پی شما بسته شده است چون متعلق به یک پروکسی باز است.\nلطفاً با ارائه دهندهً خدمات اینترنت خود یا پشتیبانی فنی تماس بگیرید و آنها را از این مشکل امنیتی جدی آگاه کنید.",
-       "sorbsreason": "نشانی آی‌پی شما توسط DNSBL مورد استفاده {{SITENAME}} به عنوان یک پروکسی باز گزارش شدهاست.",
+       "sorbsreason": "نشانی آی‌پی شما توسط DNSBL مورد استفاده {{SITENAME}} به عنوان یک پروکسی باز گزارش شده است.",
        "sorbs_create_account_reason": "نشانی آی‌پی شما توسط DNSBL مورد استفاده {{SITENAME}} به عنوان یک پروکسی باز گزارش شده‌است.\nشما اجازهٔ ساختن حساب کاربری ندارید.",
        "xffblockreason": "نشانی آی‌پی در X-Forwarded-For header موجود است و پروکسی شما یا سروری که از آن استفاده می‌کنید بسته‌شده‌است. دلیل بسته‌شدن: $1",
        "cant-see-hidden-user": "کاربری که می‌خواهید ببندید قبلاً بسته شده و پنهان گردیده است. چون شما دسترسی پنهان کردن کاربران را ندارید، نمی‌توانید قطع دسترسی کاربر را ببینید یا ویرایش کنید.",
        "confirmemail_subject": "تأیید آدرس ایمیل {{SITENAME}}",
        "confirmemail_body": "یک نفر، احتمالاً خود شما، از نشانی آی‌پی $1 حساب کاربری‌ای با نام «$2» و این آدرس ایمیل در {{SITENAME}} ایجاد کرده است.\n\nبرای تأیید این که این حساب واقعاً متعلق به شماست و نیز برای فعال سازی قابلیت ایمیل {{SITENAME}} پیوند زیر را در مرورگر اینترنت خود باز کنید:\n\n$3\n\nاگر شما این حساب کاربری را ثبت *نکرده‌اید*، لطفاً پیوند زیر را\nباز کنید تا تأیید آدرس ایمیل لغو شود:\n\n$5\n\nاین کدِ تأیید در تاریخ $4 منقضی خواهد شد.",
        "confirmemail_body_changed": "یک نفر، احتمالاً خود شما، از نشانی آی‌پی $1 آدرس ایمیل حساب «$2» در {{SITENAME}} را تغییر داده است.\n\nبرای تأیید این که این حساب واقعاً به شما تعلق دارد و فعال کردن دوبارهٔ قابلیت ایمیل در {{SITENAME}}، پیوند زیر را در مرورگرتان باز کنید:\n\n$3\n\nاگر این حساب متعلق به شما نیست، پیوند زیر را باز کنید تا تغییر آدرس ایمیل لغو شود:\n\n$5\n\nاین تأییدیه در $4 منقضی می‌گردد.",
-       "confirmemail_body_set": "یک نفر، احتمالاً خود شما، از نشانی آی‌پی $1,\nآدرس ایمیل حساب «$2» در {{SITENAME}} را به این آدرس تغییر دادهاست.\n\nبرای تأیید این که این حساب واقعاً به شما تعلق دارد و فعال کردن دوبارهٔ قابلیت ایمیل در {{SITENAME}}، پیوند زیر را در مرورگرتان باز کنید:\n\n$3\n\nاگر این حساب متعلق به شما نیست، پیوند زیر را باز تا تغییر آدرس ایمیل، لغو شود:\n\n$5\n\nاین تأییدیه در $4 منقضی می‌گردد.",
+       "confirmemail_body_set": "یک نفر، احتمالاً خود شما، از نشانی آی‌پی $1,\nآدرس ایمیل حساب «$2» در {{SITENAME}} را به این آدرس تغییر داده است.\n\nبرای تأیید این که این حساب واقعاً به شما تعلق دارد و فعال کردن دوبارهٔ قابلیت ایمیل در {{SITENAME}}، پیوند زیر را در مرورگرتان باز کنید:\n\n$3\n\nاگر این حساب متعلق به شما نیست، پیوند زیر را باز تا تغییر آدرس ایمیل، لغو شود:\n\n$5\n\nاین تأییدیه در $4 منقضی می‌گردد.",
        "confirmemail_invalidated": "تأیید آدرس ایمیل لغو شد",
        "invalidateemail": "لغو تأیید آدرس ایمیل",
        "scarytranscludedisabled": "[تراگنجانش بین‌ویکیانه فعال نیست]",
        "deletedwhileediting": "'''هشدار''': این صفحه پس از اینکه شما آغاز به ویرایش آن کرده‌اید، حذف شده است!",
        "confirmrecreate": "کاربر [[User:$1|$1]] ([[User talk:$1|بحث]]) این مقاله را پس از اینکه شما آغاز به ویرایش آن نموده‌اید به دلیل زیر حذف کرده است :\n: ''$2''\nلطفاً تأیید کنید که مجدداً می‌خواهید این مقاله را بسازید.",
        "confirmrecreate-noreason": "کاربر [[User:$1|$1]] ([[User talk:$1|بحث]]) این صفحه را پس از شروع ویرایش‌تان پاک کرده‌است.  لطفاً تأیید کنید که شما واقعاً می‌خواهید آن را دوباره ایجاد کنید.",
-       "recreate": "بازاÛ\8cجاد",
+       "recreate": "صÙ\81Ø­Ù\87 Ø§Ø² Ø²Ù\85اÙ\86Û\8c Ú©Ù\87 Ø´Ù\85ا Ù\85شغÙ\88Ù\84 Ù\88Û\8cراÛ\8cØ´ Ø´Ø¯Û\8cد Ø­Ø°Ù\81 Ø´Ø¯. Ø¨Ø±Ø§Û\8c Ø³Ø§Ø®Øª Ù\85جدد ØµÙ\81Ø­Ù\87 \"$1\" Ø±Ø§ Ù\81شار Ø¯Ù\87Û\8cد.",
        "confirm_purge_button": "تأیید",
        "confirm-purge-top": "پاک‌کردن نسخهٔ حافظهٔ نهانی (Cache) این صفحه را تأیید می‌کنید؟",
        "confirm-purge-bottom": "خالی کردن میانگیر یک صفحه باعث می‌شود که آخرین نسخهٔ آن نمایش یابد.",
        "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/Example.jpg]]، \n[[{{#Special:Redirect}}/page/64308]]، [[{{#Special:Redirect}}/revision/328429]] یا [[{{#Special:Redirect}}/user/101]].",
        "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 82b0741..a76cdcd 100644 (file)
        "passwordreset": "Salasanan uudistus",
        "passwordreset-text-one": "Täytä tämä lomake uudistaaksesi salasanasi.",
        "passwordreset-text-many": "{{PLURAL:$1|Täytä yksi kentistä, jotta saat väliaikaisen salasanan sähköpostitse.}}",
-       "passwordreset-legend": "Salasanan uudistus",
        "passwordreset-disabled": "Salasanojen uudistaminen ei ole mahdollista tässä wikissä.",
        "passwordreset-emaildisabled": "Sähköpostitoiminnot on poistettu käytöstä tässä wikissä.",
        "passwordreset-username": "Käyttäjätunnus:",
        "resettokens": "Uudista avaimet",
        "resettokens-text": "Tällä sivulla voit uudistaa avaimesi (''eng.'' reset tokens), jotka mahdollistavat pääsyn käyttäjätunnukseesi liittyviin tiettyihin yksityisiin tietoihin.\n\nSinun pitäisi tehdä tämä, jos olet vahingossa jakanut avaimet jonkun kanssa tai jos käyttäjätunnuksesi on vaarannettu.",
        "resettokens-no-tokens": "Avaimia ei ole uudistettavaksi.",
-       "resettokens-legend": "Uudista avaimet",
        "resettokens-tokens": "Avaimet:",
        "resettokens-token-label": "$1 (nykyinen arvo: $2)",
        "resettokens-watchlist-token": "[[Special:Watchlist|Tarkkailulistan]] verkkosyötteen (Atom tai RSS) avain",
        "yourdiff": "Eroavaisuudet",
        "copyrightwarning": "'''Muutoksesi astuvat voimaan välittömästi.''' Kaikki {{GRAMMAR:illative|{{SITENAME}}}} tehtävät tuotokset katsotaan julkaistuksi $2 -lisenssin mukaisesti ($1). Jos et halua, että kirjoitustasi muokataan armottomasti ja uudelleenkäytetään vapaasti, älä tallenna kirjoitustasi. Tallentamalla muutoksesi lupaat, että kirjoitit tekstisi itse, tai kopioit sen jostain vapaasta lähteestä. '''ÄLÄ KÄYTÄ TEKIJÄNOIKEUDEN ALAISTA MATERIAALIA ILMAN LUPAA!'''",
        "copyrightwarning2": "Huomaa, että kuka tahansa voi muokata, muuttaa ja poistaa kaikkia sivustolle tekemiäsi lisäyksiä ja muutoksia. Muokkaamalla sivustoa luovutat sivuston käyttäjille tämän oikeuden ja takaat, että lisäämäsi aineisto on joko itse kirjoittamaasi tai peräisin jostain vapaasta lähteestä. Lisätietoja sivulla $1. '''TEKIJÄNOIKEUDEN ALAISEN MATERIAALIN KÄYTTÄMINEN ILMAN LUPAA ON EHDOTTOMASTI KIELLETTYÄ!'''",
+       "editpage-cannot-use-custom-model": "Tämän sivun sisältömallia (content model) ei voida muuttaa.",
        "longpageerror": "'''Virhe: Lähettämäsi tekstin pituus on {{PLURAL:$1|kilotavu|$1 kilotavua}}. Tekstiä ei voida tallentaa, koska se on pitempi kuin sallittu enimmäispituus {{PLURAL:$2|yksi kilotavu|$2 kilotavua}}.'''",
        "readonlywarning": "'''Varoitus: Tietokanta on lukittu huoltoa varten, joten et pysty tallentamaan muokkauksiasi juuri nyt.'''\nSaattaa olla paras leikata ja liimata tekstisi omaan tekstitiedostoosi ja tallentaa se tänne myöhemmin.\n\nLukitsemisen syy: $1",
        "protectedpagewarning": "'''Varoitus: Tämä sivu on suojattu niin, että vain ylläpitäjät voivat muokata sitä.'''\nAlla on viimeisin lokitapahtuma:",
        "php-uploaddisabledtext": "PHP:n tiedostojen lähetys ei ole käytössä. Tarkista asetukset kohdasta file_uploads.",
        "uploadscripted": "Tämä tiedosto sisältää HTML-koodia tai skriptejä, jotka selain saattaa virheellisesti suorittaa.",
        "upload-scripted-pi-callback": "Ei voida tallentaa tiedostoa, joka sisältää XML-tyylimääritteen käsittelyohjeen.",
+       "uploaded-script-svg": "Found scriptable element \"$1\" in the uploaded SVG file.",
        "uploaded-hostile-svg": "Tallennetun SVG-tiedoston tyylielementissä löytyi turvaton CSS.",
+       "uploaded-event-handler-on-svg": "Setting event-handler attributes <code>$1=\"$2\"</code> is not allowed in SVG files.",
+       "uploaded-href-attribute-svg": "href attributes <code>&lt;$1 $2=\"$3\"&gt;</code> with non-local target (e.g. http://, javascript:, etc) are not allowed in SVG files.",
+       "uploaded-href-unsafe-target-svg": "Found href to unsafe target <code>&lt;$1 $2=\"$3\"&gt;</code> in the uploaded SVG file.",
+       "uploaded-animate-svg": "Found \"animate\" tag that might be changing href, using the \"from\" attribute <code>&lt;$1 $2=\"$3\"&gt;</code> in the uploaded SVG file.",
+       "uploaded-setting-event-handler-svg": "Setting event-handler attributes is blocked, found <code>&lt;$1 $2=\"$3\"&gt;</code> in the uploaded SVG file.",
+       "uploaded-setting-href-svg": "Using the \"set\" tag to add \"href\" attribute to parent element is blocked.",
+       "uploaded-wrong-setting-svg": "Using the \"set\" tag to add a remote/data/script target to any attribute is blocked. Found <code>&lt;set to=\"$1\"&gt;</code> in the uploaded SVG file.",
+       "uploaded-setting-handler-svg": "SVG that sets the \"handler\" attribute with remote/data/script is blocked. Found <code>$1=\"$2\"</code> in the uploaded SVG file.",
+       "uploaded-remote-url-svg": "SVG that sets any style attribute with remote URL is blocked. Found <code>$1=\"$2\"</code> in the uploaded SVG file.",
+       "uploaded-image-filter-svg": "Found image filter with URL: <code>&lt;$1 $2=\"$3\"&gt;</code> in the uploaded SVG file.",
        "uploadscriptednamespace": "Tämä SVG-tiedosto sisältää nimiavaruuden ”$1”, joka ei ole sallittu.",
        "uploadinvalidxml": "Ladatun tiedoston XML-koodia ei voitu jäsentää kunnolla.",
        "uploadvirus": "Tiedosto sisältää viruksen. Tarkemmat tiedot: $1",
        "randomincategory-nopages": "Luokassa [[:Category:$1|$1]] ei ole sivuja.",
        "randomincategory-category": "Luokka:",
        "randomincategory-legend": "Satunnainen sivu luokassa",
+       "randomincategory-submit": "Siirry",
        "randomredirect": "Satunnainen ohjaus",
        "randomredirect-nopages": "Nimiavaruudessa ”$1” ei ole ohjaussivuja.",
        "statistics": "Tilastot",
        "rollback-success": "Käyttäjän $1 tekemät muokkaukset kumottiin ja sivu palautettiin käyttäjän $2 versioon.",
        "sessionfailure-title": "Istuntovirhe",
        "sessionfailure": "Istuntosi kanssa on ongelma. Muutosta ei toteutettu varotoimena istuntokaappauksien takia. Käytä selaimen paluutoimintoa ja päivitä sivu, jolta tulit, ja yritä uudelleen.",
+       "changecontentmodel": "Muuta sivun sisältömallia",
+       "changecontentmodel-legend": "Muuta sisältömallia",
+       "changecontentmodel-title-label": "Sivun otsikko",
+       "changecontentmodel-model-label": "Uusi sisältömalli",
+       "changecontentmodel-reason-label": "Syy:",
+       "changecontentmodel-success-title": "Sisältömallia on muutettu",
+       "changecontentmodel-success-text": "Sisältötyyppiä kohteessa [[:$1]] on muutettu.",
+       "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-revertlink": "kumoa",
+       "logentry-contentmodel-change-revert": "kumottu",
        "protectlogpage": "Suojausloki",
        "protectlogtext": "Alla on loki muutoksista sivujen suojauksiin. Luettelo tällä hetkellä suojatuista sivuista löytyy [[Special:ProtectedPages|suojattujen sivujen luettelosta]].",
        "protectedarticle": "suojasi sivun [[$1]]",
        "pageinfo-robot-index": "Indeksoitava",
        "pageinfo-robot-noindex": "Ei indeksoitava",
        "pageinfo-watchers": "Sivun tarkkailijoiden lukumäärä",
+       "pageinfo-visiting-watchers": "Sivun tuoreiden muutosten tarkkailijoiden lukumäärä",
        "pageinfo-few-watchers": "Vähemmän kuin $1 {{PLURAL:$1|tarkkailija|tarkkailijaa}}",
+       "pageinfo-few-visiting-watchers": "Tuoreita muutoksia saatetaan tarkkailla, mutta tämä ei ole varmaa",
        "pageinfo-redirects-name": "Sivulle johtavat ohjaukset",
        "pageinfo-subpages-name": "Sivun alasivut",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|ohjaus|ohjausta}}; $3 {{PLURAL:$3|ei-ohjausta}})",
        "version-libraries": "Asennetut kirjastot",
        "version-libraries-library": "Kirjasto",
        "version-libraries-version": "Versio",
+       "version-libraries-license": "Lisenssi",
+       "version-libraries-description": "Kuvaus",
+       "version-libraries-authors": "Tekijät",
        "redirect": "Ohjaus tiedoston, käyttäjän, sivun tai version tunnisteen mukaan",
        "redirect-legend": "Ohjaus tiedostoon tai sivulle",
        "redirect-summary": "Tämä toimintosivu ohjaa tiedostoon (tiedostonimen mukaan), sivulle (version numeron tai sivun tunnisteen mukaan) tai käyttäjäsivulle (käyttäjän numeron mukaan). Käyttö: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] tai [[{{#Special:Redirect}}/user/101]].",
        "log-name-pagelang": "Kielenvaihtoloki",
        "log-description-pagelang": "Tämä on loki, johon merkitään muutokset sivujen kieliasetuksissa.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|muutti}} sivun kieltä sivulla $3 kielestä $4 kieleksi $5.",
-       "default-skin-not-found": "Hupsista! Oletuksena tuleva ulkoasu sinun wikillesi, joka on määritelty koodissa <code dir=\"ltr\">$wgDefaultSkin</code> muotoon <code>$1</code>, ei ole saatavilla.\n\n\n<strong>Alla on ohjeita englanniksi:</strong>\n\nYour installation seems to include the following {{PLURAL:$4|skin|skins}}. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable {{PLURAL:$4|it|them and choose the default}}.\n\n$2\n\n; If you have just installed MediaWiki:\n: You probably installed from git, or directly from the source code using some other method. This is expected. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by:\n:* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the <code>skins/</code> directory from it.\n:* Downloading individual skin tarballs from [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Cloning one of the <code>mediawiki/skins/*</code> repositories via git into the <code dir=\"ltr\">skins/</code> directory of your MediaWiki installation.\n: Doing this should not interfere with your git repository if you're a MediaWiki developer.\n\n; If you have just upgraded MediaWiki:\n: MediaWiki 1.24 and newer no longer automatically enables installed skins (see [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). You can paste the following {{PLURAL:$5|line|lines}} into <code>LocalSettings.php</code> to enable {{PLURAL:$5|the|all}} currently installed {{PLURAL:$5|skin|skins}}:\n\n<pre dir=\"ltr\">$3</pre>",
-       "default-skin-not-found-no-skins": "Hupsista! Oletusulkoasua sinun wikillesi ei ole saatavilla. Se on määritelty ulkoasuksi <code>$1</code> kohteessa <code>$wgDefaultSkin</code>.\n\nSinulla ei ole lainkaan asennettuja ulkoasuja. (You have no installed skins.)\n\nAlla on lisäohjeita englanniksi:\n\n\n; If you have just installed or upgraded MediaWiki: \n\n: You probably installed from git, or directly from the source code using some other method. This is expected. MediaWiki 1.24 and newer doesn't include any skins in the main repository. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by: \n\n:* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the <code>skins/</code> directory from it. \n\n:* Downloading individual skin tarballs from [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n\n:* Cloning one of the <code>mediawiki/skins/*</code> repositories via git into the <code dir=\"ltr\">skins/</code> directory of your MediaWiki installation. \n\n: Doing this should not interfere with your git repository if you're a MediaWiki developer. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable skins and choose the default.",
+       "default-skin-not-found": "Hupsista! Oletuksena tuleva ulkoasu sinun wikillesi, joka on määritelty koodissa <code dir=\"ltr\">$wgDefaultSkin</code> muotoon <code>$1</code>, ei ole saatavilla.\n\nAlla on ohjeet englannin kielellä:\n\nYour installation seems to include the following {{PLURAL:$4|skin|skins}}. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable {{PLURAL:$4|it|them and choose the default}}.\n\n$2\n\n; If you have just installed MediaWiki:\n: You probably installed from git, or directly from the source code using some other method. This is expected. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by:\n:* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the <code>skins/</code> directory from it.\n:* Downloading individual skin tarballs from [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Using Git to download skins].\n: Doing this should not interfere with your git repository if you're a MediaWiki developer.\n\n; If you have just upgraded MediaWiki:\n: MediaWiki 1.24 and newer no longer automatically enables installed skins (see [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). You can paste the following {{PLURAL:$5|line|lines}} into <code>LocalSettings.php</code> to enable {{PLURAL:$5|the|all}} installed {{PLURAL:$5|skin|skins}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; If you have just modified <code>LocalSettings.php</code>:\n: Double-check the skin names for typos.",
+       "default-skin-not-found-no-skins": "Hupsista! Oletusulkoasua sinun wikillesi ei ole saatavilla. Se on määritelty ulkoasuksi <code>$1</code> kohteessa <code>$wgDefaultSkin</code>.\n\nAlla on ohjeet englannin kielellä:\n\nYou have no installed skins.\n\n; If you have just installed or upgraded MediaWiki:\n: You probably installed from git, or directly from the source code using some other method. This is expected. MediaWiki 1.24 and newer doesn't include any skins in the main repository. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by:\n:* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the <code>skins/</code> directory from it.\n:* Downloading individual skin tarballs from [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Using Git to download skins].\n: Doing this should not interfere with your git repository if you're a MediaWiki developer. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable skins and choose the default.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (käytössä)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''ei käytössä''')",
        "mediastatistics": "Median tilastotiedot",
        "special-characters-title-endash": "ajatusviiva",
        "special-characters-title-emdash": "pitkä ajatusviiva",
        "special-characters-title-minus": "miinusmerkki",
-       "mw-widgets-titleinput-description-new-page": "sivua ei ole vielä olemassa",
-       "mw-widgets-titleinput-description-redirect": "ohjaus sivulle $1"
+       "mw-widgets-titleinput-description-new-page": "sivua ei ole olemassa vielä",
+       "mw-widgets-titleinput-description-redirect": "ohjaus kohteeseen $1"
 }
index 692e037..0bc19c0 100644 (file)
        "invalidtitle-unknownnamespace": "Titre invalide avec le numéro d'espace de noms $1 et l'intitulé « $2 » inconnus",
        "exception-nologin": "Non connecté",
        "exception-nologin-text": "Veuillez vous connecter pour pouvoir accéder à cette page ou cette action.",
-       "exception-nologin-text-manual": "Veuillez $1 pour pouvoir accéder à cette page ou cette action.",
+       "exception-nologin-text-manual": "Veuillez vous $1 pour pouvoir accéder à cette page ou cette action.",
        "virus-badscanner": "Mauvaise configuration : scanneur de virus inconnu : ''$1''",
        "virus-scanfailed": "Échec de la recherche (code $1)",
        "virus-unknownscanner": "antivirus inconnu :",
        "passwordreset": "Remise à zéro du mot de passe",
        "passwordreset-text-one": "Remplissez ce formulaire pour réinitialiser votre mot de passe.",
        "passwordreset-text-many": "{{PLURAL:$1|Remplissez un des champs pour recevoir un mot de passe temporaire par courriel.}}",
-       "passwordreset-legend": "Remise à zéro du mot de passe",
        "passwordreset-disabled": "La réinitialisation des mots de passe a été désactivée sur ce wiki.",
        "passwordreset-emaildisabled": "Les fonctionnalités e-mail ont été désactivées sur ce wiki.",
        "passwordreset-username": "Nom d'utilisateur :",
        "resettokens": "Réinitialiser les jetons",
        "resettokens-text": "Ici, vous pouvez réinitialiser les jetons qui permettent d’accéder à certaines données privées associées à votre compte.\n\nVous devriez le faire si vous les avez partagés accidentellement avec quelqu'un ou si votre compte a été compromis.",
        "resettokens-no-tokens": "Il n’y a aucun jeton à réinitialiser.",
-       "resettokens-legend": "Réinitialiser les jetons",
        "resettokens-tokens": "Jetons :",
        "resettokens-token-label": "$1 (valeur actuelle : $2)",
        "resettokens-watchlist-token": "Jeton pour le flux (Atom/RSS) web de [[Special:Watchlist|modifications de pages de votre liste de suivi]]",
        "blockedtext": "'''Votre compte utilisateur ou votre adresse IP a été bloqué.'''\n\nLe blocage a été effectué par $1.\nLa raison invoquée est la suivante : ''$2''.\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Compte bloqué : $7.\n\nVous pouvez contacter $1 ou un autre [[{{MediaWiki:Grouppage-sysop}}|administrateur]] pour en discuter.\nVous ne pouvez utiliser la fonction « {{MediaWiki:emailpage}} » que si une adresse de courriel valide est spécifiée dans vos [[Special:Preferences|préférences]] et que si cette fonctionnalité n’a pas été bloquée.\nVotre adresse IP actuelle est $3 et votre identifiant de blocage est $5.\nVeuillez préciser ces indications dans toutes les requêtes que vous ferez.",
        "autoblockedtext": "Votre adresse IP a été bloquée automatiquement car elle a été utilisée par un autre utilisateur, lui-même bloqué par $1.\nLa raison invoquée est :\n\n:''$2''\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Compte bloqué : $7\n\nVous pouvez contacter $1 ou l’un des autres [[{{MediaWiki:Grouppage-sysop}}|administrateurs]] pour discuter de ce blocage.\n\nNotez que vous ne pourrez utiliser la fonctionnalité d’envoi de courriel que si vous avez une adresse de courriel validée dans vos [[Special:Preferences|préférences]] et que si cette fonctionnalité n’a pas été désactivée.\n\nVotre adresse IP actuelle est $3, et le numéro de blocage est $5.\nVeuillez préciser ces indications dans toutes les requêtes que vous ferez.",
        "blockednoreason": "aucune raison donnée",
-       "whitelistedittext": "Vous devez être $1 pour avoir la permission de modifier le contenu.",
+       "whitelistedittext": "Vous devez vous $1 pour avoir la permission de modifier le contenu.",
        "confirmedittext": "Vous devez confirmer votre adresse de courriel avant de modifier les pages.\nVeuillez entrer et valider votre adresse de courriel dans vos [[Special:Preferences|préférences]].",
        "nosuchsectiontitle": "Impossible de trouver la section",
        "nosuchsectiontext": "Vous avez essayé de modifier une section qui n'existe pas.\nElle a peut-être été déplacée ou supprimée depuis que vous avez lu cette page.",
        "reuploaddesc": "Annuler et retourner au formulaire d'import",
        "upload-tryagain": "Envoyer la description du fichier modifiée",
        "uploadnologin": "Non connecté",
-       "uploadnologintext": "Vous devez $1 pour importer des fichiers.",
+       "uploadnologintext": "Vous devez vous $1 pour importer des fichiers.",
        "upload_directory_missing": "Le répertoire d’import de fichier ($1) est introuvable et n’a pas pu être créé par le serveur web.",
        "upload_directory_read_only": "Le répertoire d’import de fichier ($1) n’est pas accessible en écriture depuis le serveur web.",
        "uploaderror": "Erreur lors de l’import",
        "randomincategory-nopages": "Il n’y a pas de page dans [[:Category:$1]].",
        "randomincategory-category": "Catégorie :",
        "randomincategory-legend": "Page aléatoire dans la catégorie",
+       "randomincategory-submit": "Lancer",
        "randomredirect": "Page de redirection au hasard",
        "randomredirect-nopages": "Il n'y a aucune page de redirection dans l'espace de noms « $1 ».",
        "statistics": "Statistiques",
        "rollback-success": "Révocation des modifications effectuées par $1 ;\nrétablissement de la dernière version par $2.",
        "sessionfailure-title": "Erreur de session",
        "sessionfailure": "Votre session de connexion semble avoir des problèmes ;\ncette action a été annulée en prévention d'un piratage de session.\nVeuillez cliquer sur « Précédent », rechargez la page d'où vous venez, puis réessayez.",
+       "changecontentmodel": "Modifier le modèle de contenu d’une page",
+       "changecontentmodel-legend": "Modifier le modèle de contenu",
+       "changecontentmodel-title-label": "Titre de la page",
+       "changecontentmodel-model-label": "Nouveau modèle de contenu",
+       "changecontentmodel-reason-label": "Motif :",
+       "changecontentmodel-success-title": "Le modèle de contenu a été modifié",
+       "changecontentmodel-success-text": "Le modèle de contenu de [[:$1]] a été modifié.",
+       "changecontentmodel-cannot-convert": "Le contenu sur [[:$1]] n’a pas pu être converti en un type de $2.",
+       "changecontentmodel-title-cantexist": "Impossible d’avoir une page à $1.",
+       "changecontentmodel-nodirectediting": "Le modèle de contenu $1 ne permet pas la modification directe",
+       "log-name-contentmodel": "Journal de modification de modèle de contenu",
+       "log-description-contentmodel": "Événements relatifs aux modèles de contenu d’une page",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|a modifié}} le modèle de contenu de la page $3 de « $4 » en « $5 »",
+       "logentry-contentmodel-change-revertlink": "rétablir",
+       "logentry-contentmodel-change-revert": "rétablir",
        "protectlogpage": "Journal des protections",
        "protectlogtext": "Voici une liste des modifications des protections de pages.\nConsultez la [[Special:ProtectedPages|liste des pages protégées]] pour la liste des protections actuellement opérationnelles.",
        "protectedarticle": "a protégé « [[$1]] »",
        "tooltip-pt-logout": "Se déconnecter",
        "tooltip-pt-createaccount": "Il vous est conseillé de créer un compte et de vous connecter ; cependant, ce n’est pas obligatoire",
        "tooltip-ca-talk": "Discussion au sujet de cette page de contenu",
-       "tooltip-ca-edit": "Vous pouvez modifier cette page.\nVeuillez utiliser le bouton de prévisualisation avant d'enregistrer.",
+       "tooltip-ca-edit": "Modifier le wikicode",
        "tooltip-ca-addsection": "Commencer une nouvelle section",
        "tooltip-ca-viewsource": "Cette page est protégée.\nVous pouvez toutefois en visualiser la source.",
        "tooltip-ca-history": "Les versions passées de cette page (avec leurs contributeurs)",
        "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 la page ayant visité les modifications récentes",
        "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",
        "pageinfo-subpages-name": "Sous-pages de cette page",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirection|redirections}}; $3 {{PLURAL:$3|non-redirection|non-redirections}})",
        "version-libraries": "Bibliothèques installées",
        "version-libraries-library": "Bibliothèque",
        "version-libraries-version": "Version",
+       "version-libraries-license": "Licence",
+       "version-libraries-description": "Description",
+       "version-libraries-authors": "Auteurs",
        "redirect": "Redirigé par fichier, utilisateur, page ou ID de révision",
        "redirect-legend": "Rediriger vers une page ou un fichier",
        "redirect-summary": "Cette page spéciale redirige vers un fichier (nom de fichier fourni), une page (ID de révision ou de page fourni) ou une page d’utilisateur (identifiant numérique de l’utilisateur fourni). Utilisation : [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], ou [[{{#Special:Redirect}}/user/101]].",
        "special-characters-title-emdash": "tiret cadratin",
        "special-characters-title-minus": "signe moins",
        "mw-widgets-titleinput-description-new-page": "la page n’existe pas encore",
-       "mw-widgets-titleinput-description-redirect": "Redirection vers $1"
+       "mw-widgets-titleinput-description-redirect": "redirection vers $1"
 }
index 31e7e3e..7eb4d8e 100644 (file)
        "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.",
        "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 b24724d..7e1e4d4 100644 (file)
        "passwordreset": "Restablecer o contrasinal",
        "passwordreset-text-one": "Encha este formulario para restablecer o seu contrasinal.",
        "passwordreset-text-many": "{{PLURAL:$1|Encha un dos campos para recibir por correo electrónico un contrasinal temporal.}}",
-       "passwordreset-legend": "Restablecer o contrasinal",
        "passwordreset-disabled": "O restablecemento de contrasinais está desactivado neste wiki.",
        "passwordreset-emaildisabled": "As funcións do correo electrónico están desactivadas neste wiki.",
        "passwordreset-username": "Nome de usuario:",
        "resettokens": "Restablecer os pases",
        "resettokens-text": "Aquí pode restablecer os pases que permiten acceder a certos datos privados asociados á súa conta.\n\nDebería facelo se os compartiu accidentalmente con alguén ou se a súa conta foi comprometida.",
        "resettokens-no-tokens": "Non hai ningún pase que restablecer.",
-       "resettokens-legend": "Restablecer os pases",
        "resettokens-tokens": "Pases:",
        "resettokens-token-label": "$1 (valor actual: $2)",
        "resettokens-watchlist-token": "Pase para a fonte de novas (Atom/RSS) web dos [[Special:Watchlist|cambios feitos nas páxinas da súa lista de vixilancia]]",
        "creating": "Creando \"$1\"",
        "editingsection": "Editando unha sección de \"$1\"",
        "editingcomment": "Editando unha nova sección de \"$1\"",
-       "editconflict": "Conflito de edición: \"$1\"",
+       "editconflict": "Conflito de edición: $1",
        "explainconflict": "Alguén cambiou esta páxina desde que comezou a editala.\nA área de texto superior contén o texto da páxina tal e como existe na actualidade.\nOs seus cambios móstranse na área inferior.\nPode mesturar os seus cambios co texto existente.\n'''Só''' se gardará o texto na área superior cando prema en \"{{int:savearticle}}\".",
        "yourtext": "O seu texto",
        "storedversion": "Versión gardada",
        "randomincategory-nopages": "Non hai páxinas na [[:Category:$1]].",
        "randomincategory-category": "Categoría:",
        "randomincategory-legend": "Páxina aleatoria na categoría",
+       "randomincategory-submit": "Continuar",
        "randomredirect": "Redirección aleatoria",
        "randomredirect-nopages": "Non hai redireccións no espazo de nomes \"$1\".",
        "statistics": "Estatísticas",
        "rollback-success": "Desfixéronse as edicións de $1;\nvolveuse á última edición, feita por $2.",
        "sessionfailure-title": "Erro de sesión",
        "sessionfailure": "Parece que hai un problema co rexistro da súa sesión;\nesta acción cancelouse como precaución fronte ao secuestro de sesións.\nPrema no botón \"atrás\", volva cargar a páxina da que proviña e inténteo de novo.",
+       "changecontentmodel": "Cambiar o modelo do contido dunha páxina",
+       "changecontentmodel-legend": "Cambiar o modelo do contido",
+       "changecontentmodel-title-label": "Título da páxina",
+       "changecontentmodel-model-label": "Novo modelo de contido",
+       "changecontentmodel-reason-label": "Motivo:",
+       "changecontentmodel-success-title": "O modelo de contido foi modificado",
+       "changecontentmodel-success-text": "O tipo de contido de [[:$1]] foi modificado.",
+       "changecontentmodel-cannot-convert": "O contido en [[:$1]] non pode converterse ó tipo de $2.",
+       "changecontentmodel-title-cantexist": "Imposible ter unha páxina en $1.",
+       "changecontentmodel-nodirectediting": "O modelo de contido $1 non permite a modificación directa",
+       "log-name-contentmodel": "Rexistro de cambios de modelo de contido",
+       "log-description-contentmodel": "Eventos relacinados cos modelos de contido dunha páxina",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|cambiou}} o modelo de contido da páxina $3 de \"$4\" a \"$5\"",
+       "logentry-contentmodel-change-revertlink": "reverter",
+       "logentry-contentmodel-change-revert": "reverter",
        "protectlogpage": "Rexistro de proteccións",
        "protectlogtext": "A continuación móstrase a lista cos cambios de protección nas páxinas.\nVexa a [[Special:ProtectedPages|lista de páxinas protexidas]] se quere obter a lista coas proteccións de páxinas vixentes.",
        "protectedarticle": "protexeu \"[[$1]]\"",
        "tooltip-pt-logout": "Saír ao anonimato",
        "tooltip-pt-createaccount": "Recoméndaselle crear unha conta e acceder ao sistema, se ben non é obrigatorio",
        "tooltip-ca-talk": "Conversa acerca do contido desta páxina",
-       "tooltip-ca-edit": "Pode modificar esta páxina; antes de gardala, por favor, utilice o botón de vista previa",
+       "tooltip-ca-edit": "Edite esta páxina",
        "tooltip-ca-addsection": "Comezar unha nova sección",
        "tooltip-ca-viewsource": "Esta páxina está protexida.\nPode ver o código fonte.",
        "tooltip-ca-history": "Versións anteriores desta páxina",
        "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-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",
        "pageinfo-subpages-name": "Subpáxinas desta páxina",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirección|redireccións}}; $3 {{PLURAL:$3|non-redirección|non-redireccións}})",
        "version-libraries": "Bibliotecas instaladas",
        "version-libraries-library": "Biblioteca",
        "version-libraries-version": "Versión",
+       "version-libraries-license": "Licenza",
+       "version-libraries-description": "Descrición",
+       "version-libraries-authors": "Autores",
        "redirect": "Redirixir por nome de ficheiro, ID de usuario, ID de páxina ou ID de revisión",
        "redirect-legend": "Redirixir a un ficheiro ou unha páxina",
        "redirect-summary": "Esta páxina especial redirixe cara a un ficheiro (dado o nome), unha páxina (dado o ID da páxina ou o dunha revisión) ou unha páxina de usuario (dado o ID dun usuario). Utilización: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] ou [[{{#Special:Redirect}}/user/101]].",
index 478b55e..a710ada 100644 (file)
@@ -9,11 +9,13 @@
                        "Sanket.prabhu26",
                        "Santhosh.thottingal",
                        "Supriya kankumbikar",
-                       "Vaishali Parab"
+                       "Vaishali Parab",
+                       "The Discoverer",
+                       "Cliffa fernandes"
                ]
        },
        "tog-hideminor": "हालींच बदल केल्ल्यांतले बारीक संपादन लिपय",
-       "tog-numberheadings": "शà¥\80रà¥\8dषà¤\95 स्वंय क्रमांकित कर",
+       "tog-numberheadings": "माथाळà¥\87 स्वंय क्रमांकित कर",
        "tog-showtoolbar": "संपादन उपकरणाची पट्टी दाखय",
        "tog-editondblclick": "दोट्टी क्लिकाचेर पानां संपादीत कर",
        "tog-watchdefault": "हांवें संपादीत केल्लीं पानां आनी फायल म्हजे ध्यानसूचीक जोड",
@@ -23,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": "सदा (केधन्नय) (केन्नय)",
        "october-date": "ऑक्टोबर $1",
        "november-date": "नोव्हेंबर $1",
        "december-date": "डिसेंबर $1",
-       "pagecategories": "{{PLURAL:$1|à¤\97à¤\9f}}",
-       "category_header": "\"$1\" à¤¹à¥\8dया à¤¶à¥\8dरà¥\87णà¥\80à¤\82तलीं पानां",
-       "subcategories": "à¤\89पशà¥\8dरà¥\87णà¥\80",
-       "category-media-header": "\"$1\" à¤¶à¥\8dरà¥\87णà¥\80à¤\82तलें प्रसार माध्यम",
-       "hidden-categories": "{{PLURAL:$1|लिपिलà¥\8dलà¥\87à¤\82 à¤\97à¤\9f|लिपिलà¥\8dलà¥\87à¤\82 à¤\97à¤\9f }}",
+       "pagecategories": "{{PLURAL:$1|वरà¥\8dà¤\97}}",
+       "category_header": "\"$1\" à¤¹à¥\8dया à¤µà¤°à¥\8dà¤\97ातलीं पानां",
+       "subcategories": "à¤\89पवरà¥\8dà¤\97",
+       "category-media-header": "\"$1\" à¤µà¤°à¥\8dà¤\97ातलें प्रसार माध्यम",
+       "hidden-categories": "{{PLURAL:$1|लिपिलà¥\8dलà¥\87à¤\82 à¤µà¤°à¥\8dà¤\97|लिपिलà¥\8dलà¥\87à¤\82 à¤µà¤°à¥\8dà¤\97 }}",
        "hidden-category-category": "लिपयिल्ले विभाग",
-       "category-subcat-count": "{{PLURAL:$2|हà¥\8dया à¤µà¤¿à¤­à¤¾à¤\97ान à¤«à¤\95त à¤¸à¤\95यल à¤¦à¤¿à¤²à¥\8dलà¥\87 à¤\89पविभाà¤\97 à¤\86सात.|हà¥\8dया à¤µà¤¿à¤­à¤¾à¤\97ातलà¥\8dया $2 à¤µà¤\9fà¥\8dà¤\9f {{PLURAL:$1|सà¤\95यल à¤¦à¤¿à¤²à¥\8dलà¥\87 à¤\89पविभाà¤\97 à¤\86सात.|$1सà¤\95यल à¤¦à¤¿à¤²à¥\8dलà¥\87 à¤\89पविभाग आसात.}}}}",
-       "category-article-count": "{{PLURAL:$2|हà¥\8dया à¤µà¤¿à¤­à¤¾à¤\97ाà¤\82त à¤¸à¤\95यल à¤¦à¤¿à¤²à¥\8dलà¥\80à¤\82 à¤ªà¤¾à¤¨à¤¾à¤\82 à¤\86सात.|हà¥\8dया à¤µà¤¿à¤­à¤¾गांत सकलय दिल्लीं {{PLURAL:$1|पानां आसात|$1 पानां आसात}}, वट्ट पानां $2}}",
-       "category-file-count": "{{PLURAL:$2|हà¥\8dया à¤µà¤¿à¤­à¤¾à¤\97ाà¤\82त à¤«à¤\95त à¤¸à¤\95यलà¥\80 à¤«à¤¾à¤¯à¤² à¤\86सपावता.|हà¥\8dया à¤µà¤¿à¤­à¤¾गांत सकयल दिल्लीं {{PLURAL:$1|फायल|$1 फायलीं}} आसता, वट्ट फायलीं $2}}",
+       "category-subcat-count": "{{PLURAL:$2|हà¥\8dया à¤µà¤°à¥\8dà¤\97ान à¤«à¤\95त à¤¸à¤\95यल à¤¦à¤¿à¤²à¥\8dलà¥\87 à¤\89पविभाà¤\97 à¤\86सात.|हà¥\8dया à¤µà¤°à¥\8dà¤\97ातलà¥\8dया $2 à¤µà¤\9fà¥\8dà¤\9f {{PLURAL:$1|सà¤\95यल à¤¦à¤¿à¤²à¥\8dलà¥\87 à¤\89पवरà¥\8dà¤\97 à¤\86सात.|$1सà¤\95यल à¤¦à¤¿à¤²à¥\8dलà¥\87 à¤\89पवरà¥\8dग आसात.}}}}",
+       "category-article-count": "{{PLURAL:$2|हà¥\8dया à¤µà¤°à¥\8dà¤\97ाà¤\82त à¤¸à¤\95यल à¤¦à¤¿à¤²à¥\8dलà¥\80à¤\82 à¤ªà¤¾à¤¨à¤¾à¤\82 à¤\86सात.|हà¥\8dया à¤µà¤°à¥\8dगांत सकलय दिल्लीं {{PLURAL:$1|पानां आसात|$1 पानां आसात}}, वट्ट पानां $2}}",
+       "category-file-count": "{{PLURAL:$2|हà¥\8dया à¤µà¤°à¥\8dà¤\97ाà¤\82त à¤«à¤\95त à¤¸à¤\95यलà¥\80 à¤«à¤¾à¤¯à¤² à¤\86सपावता.|हà¥\8dया à¤µà¤°à¥\8dगांत सकयल दिल्लीं {{PLURAL:$1|फायल|$1 फायलीं}} आसता, वट्ट फायलीं $2}}",
        "listingcontinuesabbrev": "चालू.",
        "noindex-category": "बिननिर्देशांकी पानां",
        "about": "विशीं",
        "article": "मजकूराचीं पानां",
-       "newwindow": "(नवà¥\8dया à¤µà¤¿à¤\82डà¥\8bंत उकतें जाता)",
+       "newwindow": "(नवà¥\8dया à¤\9c़à¥\8bणà¥\87लांत उकतें जाता)",
        "cancel": "रद्द करात",
        "moredotdotdot": "आनीक",
        "morenotlisted": "ही सूची पूर्ण ना",
        "mypage": "पान",
-       "mytalk": "à¤\89लà¥\8bवप",
-       "navigation": "भà¥\8bà¤\82वडà¥\80",
+       "mytalk": "à¤\9aरà¥\8dà¤\9aा",
+       "navigation": "दिशा-नियà¤\82तà¥\8dरण",
        "and": "&#32;आनीक",
        "qbfind": "सोदात",
        "qbbrowse": "ब्राउज",
        "qbpageoptions": "हें पान",
        "qbmyoptions": "म्हजी पानां",
        "faq": "परत परत विचारिल्ले प्रस्न",
-       "faqpage": "सदांच विचारील्ले प्रस्न",
+       "faqpage": "Project:सदांच विचारील्ले प्रस्न",
        "actions": "क्रिया",
-       "namespaces": "नाà¤\82वाà¤\82à¤\9aà¥\80 à¤¸à¥\81वात",
+       "namespaces": "नाà¤\82वथलाà¤\82",
        "variants": "वेगवेगळें",
-       "navigation-heading": "भà¥\8bà¤\82वडी",
+       "navigation-heading": "दिशा-नियà¤\82तà¥\8dरण à¤¸à¥\82à¤\9aी",
        "errorpagetitle": "चूक",
        "returnto": "$1 चेर परत येयात.",
        "tagline": "{{SITENAME}} कडल्यान",
        "printableversion": "छापपायोग्य आवृत्ती",
        "permalink": "सदांकाळ जोडणी",
        "print": "छाप",
-       "view": "पळय, दृश्य",
+       "view": "पळय",
        "view-foreign": " $1 चेर पळयात",
        "edit": "संपादन",
        "edit-local": "थळाव्या संपादनाचें वर्णन",
        "personaltools": "खाजगी साधनां",
        "articlepage": "मजकूर पान पळयात",
        "talk": "भासाभास",
-       "views": "मतां",
+       "views": "दà¥\83शà¥\8dयां",
        "toolbox": "साधनां",
        "userpage": "वापरप्याचें पान दाखय",
        "projectpage": "प्रकल्पाचें पान पळेयात",
        "lastmodifiedat": " ह्या पानांत निमाणो बदल,$1 वेर $2 वेळार केल्लो",
        "protectedpage": "राखून दवरिल्लें पान",
        "jumpto": "हुपून वचात:",
-       "jumptonavigation": "भà¥\8bà¤\82वडà¥\80",
+       "jumptonavigation": "दिशा-नियà¤\82तà¥\8dरण",
        "jumptosearch": "सोद",
        "pool-queuefull": "पूल वळ भरिल्ली आसा",
        "pool-errorunknown": "खबर नाशिल्ली चूक",
        "poolcounter-usage-error": "उपयोगी त्रुटि: $1",
        "aboutsite": "{{SITENAME}}विशीं",
        "aboutpage": "Project:विशीं",
-       "copyrightpage": "{{ns:project}}:à¤\95à¥\89पà¥\80राà¤\87à¤\9f",
+       "copyrightpage": "{{ns:project}}:पà¥\8dरात-हà¤\95",
        "currentevents": "सद्याच्यो घडणुकों",
        "currentevents-url": "Project:सद्याच्यो घडणुको",
        "disclaimers": "न्हयकारणी",
        "helppage-top-gethelp": "मजत कर",
        "mainpage": "मुखेल पान",
        "mainpage-description": "मुखेल पान",
-       "portal": "समाà¤\9cाà¤\9aà¥\87 à¤®à¥\81à¤\96à¥\87लपान",
-       "portal-url": "Project:समाà¤\9cाà¤\9aà¥\87 à¤®à¥\81à¤\96à¥\87ल à¤ªà¤¾à¤¨",
+       "portal": "समà¥\81दाà¤\88à¤\95 à¤ªà¥\8dरवà¥\87स-दà¥\8dवार",
+       "portal-url": "Project:समà¥\81दाà¤\88à¤\95 à¤ªà¥\8dरवà¥\87स-दà¥\8dवार",
        "privacy": "गुप्ततायेचें धोरण",
        "privacypage": "Project:गुप्ततायेचें धोरण",
        "ok": "बरें",
        "editsection": "संस्करण",
        "editold": "संस्करण",
        "viewsourceold": "उगम पळेयात",
-       "editlink": "सà¤\82सà¥\8dà¤\95रण",
+       "editlink": "बदल",
        "viewsourcelink": "उगम पळयात",
-       "editsectionhint": "सà¤\82सà¥\8dà¤\95रण à¤µà¤¿à¤­à¤¾à¤\97: $1",
-       "toc": "मà¤\9cà¤\95à¥\82र",
+       "editsectionhint": "विभाà¤\97 à¤¸à¤\82सà¥\8dà¤\95रण: $1",
+       "toc": "विशय à¤¸à¥\81à¤\9aà¥\80",
        "showtoc": "दाखयात",
        "hidetoc": "लिपयात",
        "collapsible-collapse": "ल्हान कर",
        "site-rss-feed": "$1 चीं आर.एस.एस फीड",
        "site-atom-feed": "$1 एटम फिड",
        "page-rss-feed": "\"$1\" आर॰एस॰एस फीड",
-       "page-atom-feed": "$1 à¤\8fà¤\9fम à¤«à¤¿à¤¡",
+       "page-atom-feed": "$1 à¤\8fà¤\9fम à¤ªà¥\82रà¥\8dवण",
        "red-link-title": "$1 (पान अस्तित्वांत ना)",
        "sort-descending": "देवत्या क्रमाचेर क्रमबध्द कर",
        "sort-ascending": "चडत्या क्रमाचेर क्रमबध्द कर",
        "nstab-mediawiki": "संदेश",
        "nstab-template": "प्रारूप",
        "nstab-help": "सहायक पान",
-       "nstab-category": "शà¥\8dरà¥\87णà¥\80",
+       "nstab-category": "वरà¥\8dà¤\97",
        "nosuchaction": "असले तरेचे कार्य ना",
        "nosuchspecialpage": "असले कांयच खाशेलें पान ना",
        "error": "चूक",
        "databaseerror-error": "चूक: $1",
        "missing-article": "डेटाबेजाक \"$1\" $2 ह्या नांवाचें जे मजकूराचें पान मेळूंक जाय आसलें तें मेळ्ळेंना. हें चड करून जेन्ना काडून उडयिल्ल्या पानाक मुजत सोंपिळ्ळे डिफ वा इतिहासाची जोडणी दिवप जाता तेन्ना घडटा..जर अशें नासत तर तुमकां सॉफ्टवेरांत चूक सांपडूंक जाय हें अँडमिनिस्ट्रेटराक URLची नोंद करून कळयात.",
        "missingarticle-rev": "पुनर्नियाळ $1",
-       "badtitle": "वायà¤\9f माथाळो",
+       "badtitle": "à¤\9aà¥\81à¤\95à¥\80à¤\9aà¥\8b माथाळो",
        "badtitletext": "विनवणी केल्लें पानाचो माथाळो अवैध, रितो वा अयोग्य तरेन आंतरभाशी वा आंतर विकी माथाळ्या कडे जोडणी केल्लो आशिल्लो. तातूंत माथाळ्यांत वापरुं नजो अशी एक वा चड अक्षरां आसूं येतात.",
        "viewsource": "उगम पळेयात",
        "yourname": "वापरप्याचे नांव",
        "userlogin-yourname-ph": "वापरप्याचे नांव घालात",
        "createacct-another-username-ph": "वापरप्याचे नांव घालात",
        "yourpassword": "खास उतर",
-       "userlogin-yourpassword": "à¤\96ास उतर",
-       "userlogin-yourpassword-ph": "à¤\96ाशà¥\87लà¥\87 उतर घालात",
-       "createacct-yourpassword-ph": "à¤\96ाशà¥\87लà¥\87 उतर घालात",
+       "userlogin-yourpassword": "à¤\97à¥\81पितउतर",
+       "userlogin-yourpassword-ph": "à¤\97à¥\81पितउतर घालात",
+       "createacct-yourpassword-ph": "à¤\97à¥\81पितउतर घालात",
        "yourpasswordagain": "गुपीत उतर परतें टायप करात",
-       "createacct-yourpasswordagain": "गुपीत उतराची खात्री कर",
-       "createacct-yourpasswordagain-ph": "à¤\96ाशà¥\87लà¥\87 उतर परत घालात",
+       "createacct-yourpasswordagain": "गुपीतउतराची खात्री कर",
+       "createacct-yourpasswordagain-ph": "à¤\97à¥\81पितउतर परत घालात",
        "remembermypassword": "ह्या ब्राउजराचेर म्हजें लॉग इन याद दवरात (चडांतचड $1 {{PLURAL:$1|दिस|दिसां}} खातीर)",
-       "userlogin-remembermypassword": "मà¥\8dहाà¤\95ा à¤²à¥\89à¤\97 à¤\87न दवर",
+       "userlogin-remembermypassword": "मà¥\8dहà¤\9cà¥\87à¤\82 à¤¸à¤¤à¥\8dर à¤\9aालà¥\82 दवर",
        "userlogin-signwithsecure": "सुरक्षित कनेक्शन वापर",
        "yourdomainname": "तुमचो डोमेन:",
        "password-change-forbidden": "ह्या विकीचेर गुपीत उतरां बदलूंक शकनात",
        "userlogout": "सत्र शेवट",
        "notloggedin": "लॉग इन ना",
        "userlogin-noaccount": "तुमचें खातें ना?",
-       "userlogin-joinproject": "जोड{{SITENAME}}",
+       "userlogin-joinproject": "{{SITENAME}} हाचो वांगडी ज़ा",
        "nologin": "तुमचें खातें ना? $1.",
        "nologinlink": "खातें तयार करात",
-       "createaccount": "à¤\96ातà¥\87à¤\82 à¤¤à¤¯à¤¾à¤° à¤\95रात",
+       "createaccount": "à¤\96ातà¥\87à¤\82 à¤°à¥\8bà¤\9a",
        "gotaccount": " आदीं सावन तुजें खातें आसा?$1.",
        "gotaccountlink": "लॉग इन",
        "userlogin-resetlink": "तुजो लॉग इन तपशील विसरलें?",
-       "userlogin-resetpassword-link": "à¤\96ास उतर विसरला?",
-       "userlogin-helplink2": "लà¥\89न à¤\87न करपाक आदार कर",
+       "userlogin-resetpassword-link": "à¤\97à¥\81पितउतर विसरला?",
+       "userlogin-helplink2": "सतà¥\8dरारà¤\82भ करपाक आदार कर",
        "userlogin-createanother": "दुसरें खातें तयार कर",
        "createacct-emailrequired": "ईमेल नामो",
-       "createacct-emailoptional": "à¤\88मà¥\87ल à¤¨à¤¾à¤®à¥\8b",
+       "createacct-emailoptional": "à¤\88मà¥\87ल à¤ªà¤¤à¥\8dतà¥\8b (सà¥\8bà¤\95तà¥\80 à¤¨à¤¾)",
        "createacct-email-ph": "तुमचो इमेल पत्तो घालात",
        "createacct-another-email-ph": "तुमचो इमेल पत्तो घालात",
        "createacct-realname": "खरें नांव (पर्यायी)",
        "createacct-reason-ph": "तूं दुसरें खातें कित्याक उगडटात",
        "createacct-captcha": "सुरक्षा तपासणी",
        "createacct-imgcaptcha-ph": "वयर दिसता तो मजकूर बरय",
-       "createacct-submit": "तà¥\81मà¤\9aà¥\87 à¤\96ातà¥\87à¤\82 à¤¤à¤¯à¤¾à¤° à¤\95रात",
+       "createacct-submit": "तà¥\81मà¤\9aà¥\87 à¤\96ातà¥\87à¤\82 à¤°à¥\8bà¤\9aात",
        "createacct-another-submit": "दुसरें खातें तयार कर",
-       "createacct-benefit-heading": "{{SITENAME}}तुमच्या सारख्या लोकांनी केल्लो",
-       "createacct-benefit-body1": "{{बहुवचन:$1|संपादन|संपादना}}",
+       "createacct-benefit-heading": "{{SITENAME}} तुमच्या सारख्या लोकांनी केल्लो",
+       "createacct-benefit-body1": "{{PLURAL:$1|संपादन|संपादना}}",
        "createacct-benefit-body2": "{{PLURAL:$1|पान|पानां}}",
-       "createacct-benefit-body3": "सद्याचे{{बहुवचन:$1|योगदान करपी|ते योगदान करपी}}",
+       "createacct-benefit-body3": "सद्याचे{{PLURAL:$1|योगदान करपी|ते योगदान करपी}}",
        "badretype": "तुवें घातिल्लीं गुपीत उतरां जुळनात",
        "userexists": "घातिल्लें वापरप्याचें नांव पयलींच वापरांत आसा.\nउपकार करून दुसरें नांव वेंच",
        "loginerror": "लॉन इन त्रुटी",
        "loginlanguagelabel": "भास:$1",
        "pt-login": "सत्रारंभ करात",
        "pt-login-button": "सत्रारंभ करात",
-       "pt-createaccount": "à¤\96ातà¥\87à¤\82 à¤¤à¤¯à¤¾à¤° à¤\95रात",
+       "pt-createaccount": "à¤\96ातà¥\87à¤\82 à¤°à¥\8bà¤\9aात",
        "pt-userlogout": "सत्र शेवट",
        "changepassword": "गुपीत उतर",
        "resetpass_header": "खात्याचें गुपीत उतर बदल",
        "resetpass-submit-cancel": "रद्द करात",
        "resetpass-temp-password": "तात्पुरतें गुपीत उतर",
        "resetpass-expired": "तुजें गुपीत उतर पिड्ड्यार जालां. उपकार करून लॉग इन जावपाक नवें गुपीत उतर तयार कर.",
-       "passwordreset": "à¤\96ास उतर बदलात",
+       "passwordreset": "à¤\97à¥\81पितउतर बदलात",
        "passwordreset-text-one": "तात्पुरतें गुपीत उतर ईमेला वरवीं मेळपा खातीर हें फॉर्म पुराय कर.",
-       "passwordreset-legend": "गुपीत उतर परतून तयार कर",
        "passwordreset-username": "वापरप्याचे नांव",
        "passwordreset-domain": "डोमेन:",
        "passwordreset-email": "ईमेल नामो:",
        "changeemail-submit": "ई-मेल बदलात",
        "resettokens": "टोकन रीसेट करात",
        "resettokens-no-tokens": "रीसेट करपा खातीर कसलेंच टोकन ना",
-       "resettokens-legend": "टोकन रीसेट करात",
        "resettokens-tokens": "टोकन",
        "resettokens-token-label": "$1 (सद्याचें मूल्य: $2)",
-       "bold_sample": "बà¥\8bलà¥\8dड बरप",
-       "bold_tip": "बà¥\8bलà¥\8dड à¤¬à¤°à¤ª",
-       "italic_sample": "à¤\87à¤\9fालà¥\80à¤\95 बरप",
-       "italic_tip": "à¤\87à¤\9fालà¥\80à¤\95 à¤¬à¤°à¤ª",
+       "bold_sample": "डाà¤\9f बरप",
+       "bold_tip": "डाà¤\9f à¤®à¤\9cà¤\95à¥\82र",
+       "italic_sample": "पालसà¥\8b बरप",
+       "italic_tip": "पालसà¥\8b à¤®à¤\9cà¤\95à¥\82र",
        "link_sample": "जोडणेचो माथाळो",
-       "link_tip": "à¤\85à¤\82तरà¥\8dà¤\97त जोडणी",
-       "extlink_sample": "http://www.example.com माथाळो जोडात",
+       "link_tip": "भà¥\80तरलà¥\80 जोडणी",
+       "extlink_sample": "http://www.udaronn.in जोडण्येचे माथाळो",
        "extlink_tip": "भायली जोडणी (उपसर्ग http:// याद दवरात)",
        "headline_sample": "माथाळयाचो मजकूर",
        "headline_tip": "दुसऱ्या पांवड्याचो माथाळो",
        "nowiki_tip": "विकिचें सरूपण आडनदर करात",
        "image_tip": "अंत: स्थापीत फायल",
        "media_tip": "फायलीची जोडणी",
-       "sig_tip": "वेळाचे म्होरे सयत तुमची निशाणी",
+       "sig_tip": "वेळ-छाप सयत तुमची निशाणी",
        "hr_tip": "आडवी वळ (उणो उपेग करचो)",
        "summary": "आपरोस:",
        "subject": "विशय/माथाळो",
-       "minoredit": "हà¥\87à¤\82 à¤²à¥\8dहानशें संस्करण",
-       "watchthis": "हें पान पळेयात",
-       "savearticle": "पान à¤°à¤¾à¤\96à¥\82न à¤¦à¤µà¤°à¤¾à¤¤",
+       "minoredit": "हà¥\87à¤\82 à¤¦à¤¾à¤\95à¤\9fें संस्करण",
+       "watchthis": "हें पानार नदर दवरात",
+       "savearticle": "पान à¤¸à¤¾à¤\82भाळ",
        "preview": "पूर्वनियाळ",
        "showpreview": "पूर्वनियाळ दाखय",
        "showdiff": "बदल दाखयात",
-       "anoneditwarning": "'''शिटकावणी:''' तूं लॉग इन ना.\nतुजो IP पत्तो ह्या पानाच्या संपादन इतिहासांत नोंद जातलो.जर तुमी <strong>[$1 लॉग इन]</strong> करता वा <strong>[$2 खातें उगडटा]</strong> जाल्यार हेर सुविधांसयत तुमच्या संपादनाचें श्रेय तुमच्या सदस्य नांवाचेर दितलें.",
+       "anoneditwarning": "'''शिटकावणी:''' तूंवें सत्रारंभ करूंक ना.\nतुजो IP पत्तो ह्या पानाच्या संपादन इतिहासांत नोंद जातलो.जर तुमी <strong>[$1 सत्रारंभ]</strong> करता वा <strong>[$2 खातें उगडटा]</strong> जाल्यार हेर सुविधांसयत तुमच्या संपादनाचें श्रेय तुमच्या सदस्य नांवाचेर दितलें.",
        "missingcommenttext": "उपकार करून तुमच्यो शिरो सकयल घाल.",
        "blockedtitle": "वापरप्याक बंद केला",
        "blockednoreason": "कांयच कारण दिवंक ना",
        "loginreqlink": "सत्रारंभ करात",
        "accmailtitle": "गुपीत उतर धाडलां",
        "newarticle": "(नवें)",
-       "newarticletext": "à¤\9cà¥\87à¤\82 à¤ªà¤¾à¤¨ à¤\85à¤\9cà¥\82न à¤\85सà¥\8dतितà¥\8dवाà¤\82त à¤¨à¤¾ à¤\85शा à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\87 à¤\9cà¥\8bडणà¥\87 à¤«à¤¾à¤\9fलà¥\8dयान à¤¤à¥\81मà¥\80 à¤\86सात. à¤ªà¤¾à¤¨ à¤¤à¤¯à¤¾à¤° à¤\95रपाक सकयले चौकटींत टायप करपाक सुरु करात (चड म्हायती खातीर [$1 मजत पान] पळेयात) जर ह्या पानार तुमी चुकून पावल्यात तर ब्रावजराचो बॅक (<strong>फटीं</strong>) हो बटन दामात",
-       "noarticletext": "सदà¥\8dया à¤¹à¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\87र à¤\95सलà¥\80à¤\9a à¤²à¤¿à¤\96à¥\80त à¤¸à¤\82हिता ना. \nतुमी हेर पानांचेर [[Special:Search/{{PAGENAME}}|हो माथाळो]] सोदूं शकतात,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} संबंदीत लॉग सोदूं शकतात],\nवा ह्या पानाक [{{fullurl:{{FULLPAGENAME}}|action=edit}} संपादीत] करूं शकतात</span>।",
+       "newarticletext": "à¤\9cà¥\87à¤\82 à¤ªà¤¾à¤¨ à¤\85à¤\9cà¥\82न à¤\85सà¥\8dतितà¥\8dवाà¤\82त à¤¨à¤¾ à¤\85शा à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\87 à¤\9cà¥\8bडणà¥\87 à¤«à¤¾à¤\9fलà¥\8dयान à¤¤à¥\81मà¥\80 à¤\86सात. à¤ªà¤¾à¤¨ à¤°à¤\9aपाक सकयले चौकटींत टायप करपाक सुरु करात (चड म्हायती खातीर [$1 मजत पान] पळेयात) जर ह्या पानार तुमी चुकून पावल्यात तर ब्रावजराचो बॅक (<strong>फटीं</strong>) हो बटन दामात",
+       "noarticletext": "सदà¥\8dया à¤¹à¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\87र à¤\95सलà¥\80à¤\9a à¤®à¤\9cà¤\95à¥\82र ना. \nतुमी हेर पानांचेर [[Special:Search/{{PAGENAME}}|हो माथाळो]] सोदूं शकतात,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} संबंदीत लॉग सोदूं शकतात],\nवा ह्या पानाक [{{fullurl:{{FULLPAGENAME}}|action=edit}} संपादीत] करूं शकतात</span>।",
        "noarticletext-nopermission": "तुर्ताक ह्या पानाचेर कसलोच मजकूर ना. तुमी हेर पानांचेर [[Special:Search/{{PAGENAME}}|ह्या माथाळ्याचो सोद]] घेवं शकतात,\nवा <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} संबंदीत लॉग सोदूं शकतात]</span>, पूण तुमकां हें पानाची रचणूक करपाची परवानगी ना।",
        "userpage-userdoesnotexist-view": "\"$1\" ह्या वापरप्याच्या खात्याची नोंदणी करूंक ना.",
        "previewnote": "'''ही फकत एक दाखवण हें मतींत दवरात.'''\nतुमचें बदल आडून राखून दवरूंक ना!",
        "editing": "संपादता $1",
-       "creating": "$1 à¤¨à¤¿à¤°à¥\8dमाण à¤\95र",
-       "editingsection": "संस्करण $1 (विभाग)",
+       "creating": "$1 à¤°à¥\8bà¤\9aता",
+       "editingsection": "(विभाग) $1 संस्करण",
        "yourtext": "तुमचो मजकूर",
        "templatesused": "ह्या पानाचेर {{PLURAL:$1|वापरिल्लें}} प्रारूप",
-       "template-protected": "(राखिल्लें) संरक्षीत",
+       "template-protected": "(राखिल्लें)",
        "template-semiprotected": "(अर्द-सुरक्षीत)",
-       "hiddencategories": "हà¥\87à¤\82 à¤ªà¤¾à¤¨ {{PLURAL:$1|लिपिलà¥\8dलà¥\87 à¤¶à¥\8dरà¥\87णà¥\80चें}} आसा",
+       "hiddencategories": "हà¥\87à¤\82 à¤ªà¤¾à¤¨ {{PLURAL:$1|लिपिलà¥\8dलà¥\87 à¤µà¤°à¥\8dà¤\97ाचें}} आसा",
        "permissionserrorstext-withaction": "ह्या {{PLURAL:$1|कारण|कारणां}}: खातीर तुका $2 मान्यताय ना.",
        "recreate-moveddeleted-warn": "शिटकावणीः तुमी आदीं काडून उडयिल्लें पान परतून तयार करतात ह्या पानाचे फासून उडोवपी आनी दुसरे कडे व्हरपी लाग फकत सोपेपणा खातीर दिल्यात",
        "moveddeleted-notice": "हें पान काडून उडयला.\nह्या पानाचो काडून उडोवपी आनी हालोवपी लॉग संदर्भा खातीर सकयल दिला.",
        "post-expand-template-inclusion-category": "जंय प्रारुप धरून आवांठ व्हड जाता अशीं पानां",
        "post-expand-template-argument-warning": "शिटकावणीः ह्या पानाचेर खुब व्हड आंवाठ आशिल्लो एक तरी प्रारुप मुद्दो आसा. हे मुद्दे भायरायल्यात",
        "post-expand-template-argument-category": "भायरायिल्ल्या प्रारूपांसंबंदीचे मुद्दे आशिल्लीं पानां",
-       "viewpagelogs": "हà¥\8dया à¤ªà¤¾à¤¨à¤¾ à¤\96ातà¥\80र à¤²à¥\89à¤\97à¥\8dस पळेयात",
+       "viewpagelogs": "हà¥\8dया à¤ªà¤¾à¤¨à¤¾ à¤\96ातà¥\80र à¤¸à¥\8bतà¥\8dराà¤\82 पळेयात",
        "currentrev-asof": "$1 मेरेनचो सगळ्यांत निमणो पुनर्नियाळ",
        "revisionasof": " $1 मेरेन पुनर्नियाळ",
        "revision-info": "$2 कडल्यान  $1 मेरेनची तपासणी",
        "currentrevisionlink": "सगळ्यांत हालींचो पुनर्नियाळ",
        "cur": "चालंत",
        "next": "दुसरें",
-       "last": "à¤\86दलें",
+       "last": "à¤\85ादलें",
        "page_first": "पयलें",
        "page_last": "निमणें",
        "histlegend": "फरकाची निवडः पुनर्नियाळांची तुळा करपा खातीर रेडियो चौकटीं चेर कुरु करात आनी एंटर ना तर तळाकडे आशिल्लो बटन दामात",
        "next-page": "दुसरें पान",
        "prevn-title": "{{PLURAL:$1|आदलो|आदलें}} $1 निकाल",
        "nextn-title": "{{PLURAL:$1|फुडलो|फुडलें}} $1 निकाल",
-       "shown-title": "दर एका पानार {{PLURAL:$1|निकाल}}दाखय",
+       "shown-title": "दर एका पानार {{PLURAL:$1|निकाल}} दाखय",
        "viewprevnext": "पळयात ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "ह्या'''विकीचेर \"[[:$1]]\" ह्या नांवाचें पान आसा .''' {{PLURAL:$2|0=|See also the other search results found.}}",
-       "searchmenu-new": "ह्या विकीचेर $1 हें पान तयार करात, {{PLURAL:$2|}} सोदून मेळिल्लें पानय पळेयात. / सोदून मेळिल्ले निकाळय पळेयात.",
+       "searchmenu-new": "<strong>ह्या विकीचेर \"[[:$1]]\" हें पान रोचात!<strong> {{PLURAL:$2|सोदून मेळिल्लें पानय पळेयात.|सोदून मेळिल्ले निकाळय पळेयात.}}",
        "searchprofile-articles": "मजकूराचीं पानां",
-       "searchprofile-images": "मलà¥\8dà¤\9fà¥\80मिडà¥\80या",
-       "searchprofile-everything": "à¤\9cणà¥\87à¤\95लें",
-       "searchprofile-advanced": "पà¥\8dरà¤\97त",
+       "searchprofile-images": "भà¥\8bवमाधà¥\8dयम",
+       "searchprofile-everything": "सà¤\97ळें",
+       "searchprofile-advanced": "सà¥\8bदपाà¤\9aà¥\87 à¤ªà¤°à¥\8dयाय",
        "searchprofile-articles-tooltip": " $1 त सोदात",
-       "searchprofile-images-tooltip": "फायलीं सोदात धारिक सोदात",
-       "searchprofile-everything-tooltip": "सà¤\97ळà¥\8b à¤®à¤\9cà¤\95à¥\82र à¤¸à¥\8bदात(à¤\89लà¥\8bवपाचें पाना सयत)",
-       "searchprofile-advanced-tooltip": "à¤\96ाशà¥\87लà¥\8dया à¤¨à¤¾à¤\82वाà¤\82à¤\9aà¥\8dया à¤¸à¥\81वाताà¤\82नी सोदात",
+       "searchprofile-images-tooltip": "फायलीं सोदात",
+       "searchprofile-everything-tooltip": "सà¤\97ळà¥\8b à¤®à¤\9cà¤\95à¥\82र à¤¸à¥\8bदात(à¤\9aरà¥\8dà¤\9aà¥\87चें पाना सयत)",
+       "searchprofile-advanced-tooltip": "à¤\96ाशà¥\87लà¥\8dया à¤¨à¤¾à¤\82वथà¥\8bळाणी सोदात",
        "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 नव्यान नामो दियात)",
        "prefs-watchlist": "लक्ष वळेरी",
        "youremail": "इमेल",
        "yourrealname": "खरें नांवः",
-       "right-writeapi": "Wrtie API चो उपेग करात",
-       "newuserlogpage": "à¤\89पà¥\87à¤\97à¤\95रà¥\8dतà¥\8dयान à¤\95à¥\87लà¥\8dलà¥\80 à¤\95ारà¥\8dय वळेरी",
+       "right-writeapi": "बरोवपाचे API चो उपेग करात",
+       "newuserlogpage": "à¤\89पà¥\87à¤\97à¤\95रà¥\8dतà¥\8dयà¥\87 à¤°à¥\8bà¤\9aनà¥\87à¤\9aà¥\87 वळेरी",
        "action-edit": "हें पान संपादीत कर",
        "nchanges": "$1 {{PLURAL:$1|बदल|बदल}}",
        "enhancedrc-history": "इतिहास",
        "recentchanges-summary": "ह्या विकीचेर हालींच जाल्ल्या बदलांचो माग ह्या भरणांतल्यान दवरात",
        "recentchanges-feed-description": "ह्या विकीचेर हालींच जाल्ल्या बदलांचो माग ह्या भरणांतल्यान दवरात.",
        "recentchanges-label-newpage": "ह्या संपादनांन नवें पान निर्माण केला.",
-       "recentchanges-label-minor": "हà¥\87à¤\82 à¤²à¥\8dहानशà¥\87à¤\82 संपादन",
-       "recentchanges-label-bot": "हà¥\87à¤\82 à¤¸à¤\82पादन à¤¬à¥\89à¤\9fा à¤µà¤°à¤µà¥\80à¤\82 केला.",
+       "recentchanges-label-minor": "हà¥\87à¤\82 à¤¦à¤¾à¤\95à¥\8dà¤\9fà¥\87 संपादन",
+       "recentchanges-label-bot": "हà¥\87à¤\82 à¤¸à¤\82पादन à¤°à¥\8bबà¥\89à¤\9fान केला.",
        "recentchanges-label-unpatrolled": "हें संपादन आजून तपासूंक ना",
        "recentchanges-label-plusminus": "ह्या पानाचो आकार इतल्या बाइट्सन बदललो",
        "recentchanges-legend-heading": "'''कुंजी:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages| नव्या पानांची सुची]] पळयात)",
        "rcnotefrom": "$2 पासून केल्ले बदल सकयल दिल्यात ($1 मेरेन दाखयल्यात)",
        "rclistfrom": "$3 $2 साकून नवें बदल दाखयात",
-       "rcshowhideminor": "$1 à¤²à¥\8dहानशà¥\87à¤\82 बदल",
+       "rcshowhideminor": "$1 à¤¦à¤¾à¤\95à¤\9fà¥\8dयà¥\8b बदल",
        "rcshowhideminor-show": "दाखयात",
        "rcshowhideminor-hide": "लिपयात",
-       "rcshowhidebots": "$1 बॉट",
+       "rcshowhidebots": "$1 à¤°à¥\8bबà¥\89à¤\9f",
        "rcshowhidebots-show": "दाखयात",
        "rcshowhidebots-hide": "लिपयात",
        "rcshowhideliu": "$1 अधिकृत नोंदीचे उपेग कर्ते",
        "rcshowhidemine-show": "दाखयात",
        "rcshowhidemine-hide": "लिपयात",
        "rclinks": "फाटल्या $2 दिसांनी जाल्लो $1 बदल दाखयात<br />$3",
-       "diff": "वà¥\87à¤\97ळà¥\87à¤\82",
-       "hist": "इतिहास",
+       "diff": "फरà¤\95",
+       "hist": "इति",
        "hide": "लिपयात",
        "show": "दाखयात",
-       "minoreditletter": "म",
+       "minoreditletter": "द",
        "newpageletter": "न",
-       "boteditletter": "ब",
+       "boteditletter": "र",
        "rc-change-size-new": "$1 {{बहुवचन:$1|byte|bytes}}बदल केल्या उपरांत",
        "rc-enhanced-expand": "म्हायती दाखय",
        "rc-enhanced-hide": "म्हायती लिपय",
-       "recentchangeslinked": "सà¤\82बà¤\82दातलà¥\87 बदल",
+       "recentchangeslinked": "सà¤\82बà¤\82दित बदल",
        "recentchangeslinked-toolbox": "संबंदीत बदल",
        "recentchangeslinked-title": "\"$1\" च्या संबंदातले बदल",
-       "recentchangeslinked-summary": "à¤\96ाशà¥\87लà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\82 à¤\95डलà¥\8dयान à¤\9cà¥\8bडणà¥\80 à¤®à¥\87ळिलà¥\8dलà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\82मदà¥\80à¤\82 (वा à¤µà¤¿à¤¶à¤¿à¤¶à¥\8dà¤\9f à¤¶à¥\8dरà¥\87णà¥\80à¤\9aà¥\8dया à¤µà¤¾à¤\82à¤\97डà¥\8dयाà¤\82मदà¥\80à¤\82)हालà¥\80à¤\82à¤\9a à¤\95à¥\87लà¥\8dलà¥\8dया à¤¬à¤¦à¤²à¤¾à¤\82à¤\9aà¥\80 à¤¹à¥\80 à¤µà¤³à¥\87रà¥\80. à¤¤à¥\81मà¤\9aà¥\8dया à¤²à¤\95à¥\8dष à¤µà¤³à¥\87रà¥\87à¤\82तलà¥\80à¤\82 पाना '''ठळक''' दाखयल्यात",
+       "recentchangeslinked-summary": "à¤\96ाशà¥\87लà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\82 à¤\95डलà¥\8dयान à¤\9cà¥\8bडणà¥\80 à¤®à¥\87ळिलà¥\8dलà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\82मदà¥\80à¤\82 (वा à¤µà¤¿à¤¶à¤¿à¤¶à¥\8dà¤\9f à¤µà¤°à¥\8dà¤\97ाà¤\82à¤\9aà¥\8dया à¤µà¤¾à¤\82à¤\97डà¥\8dयाà¤\82मदà¥\80à¤\82) à¤¹à¤¾à¤²à¥\80à¤\82à¤\9a à¤\95à¥\87लà¥\8dलà¥\8dया à¤¬à¤¦à¤²à¤¾à¤\82à¤\9aà¥\80 à¤¹à¥\80 à¤µà¤³à¥\87रà¥\80. à¤¤à¥\81मà¤\9aà¥\8dया [[Special:Watchlist|लà¤\95à¥\8dष à¤µà¤³à¥\87रà¥\87à¤\82तलà¥\80à¤\82]] पाना '''ठळक''' दाखयल्यात",
        "recentchangeslinked-page": "पानाचें नांव",
        "recentchangeslinked-to": "ह्या पाना बदला दिल्ल्या पानांक जुळून आशिल्ल्या पानांचे बदल दाखय",
        "upload": "फायल अपलोड करात",
        "filedesc": "सारांश",
        "fileuploadsummary": "आपरोस:",
        "license": "लायसन्सीग",
-       "license-header": "लायसनà¥\8dसà¥\80à¤\82à¤\97",
+       "license-header": "परवाà¤\82à¤\97à¥\80",
        "listfiles-delete": "काडून उडयात",
        "imgfile": "फायल",
        "listfiles_date": "तारीख",
        "filehist-revert": "परतुवप",
        "filehist-current": "चालंत",
        "filehist-datetime": "दिस / वेळ",
-       "filehist-thumb": "लà¤\98à¥\81पà¥\8dरतिमा",
-       "filehist-thumbtext": " $1मà¥\87रà¥\87नà¤\9aà¥\87 à¤\86वà¥\83तà¥\8dतà¥\80 à¤\96ातà¥\80र à¤²à¤\98à¥\81पà¥\8dरतिमा",
+       "filehist-thumb": "लà¥\8dहान-à¤\87माà¤\9c़",
+       "filehist-thumbtext": " $1मà¥\87रà¥\87नà¤\9aà¥\87 à¤\86वà¥\83तà¥\8dतà¥\80 à¤\96ातà¥\80र à¤²à¥\8dहान-à¤\87माà¤\9c़",
        "filehist-user": "उपेगकर्तो",
        "filehist-dimensions": "परिमाण",
        "filehist-comment": "शेरो",
-       "imagelinks": "फायल वापरपाची तरा",
+       "imagelinks": "फायलिचो वापर",
        "linkstoimage": "हे फायलीक सकयल दिल्ल्यो पानाच्यो जोडण्यो {{PLURAL:$1|आसात}}.",
        "nolinkstoimage": "हे फायलीक जोडणी आशिल्लीं आनीक पानां नात.",
        "sharedupload-desc-here": "ही फयल $1 हांगाची आनी ती हे प्रकल्पां खातीर वापरल्यार चलता. (तिच्या $2 ह्या फयलींतलें वर्णनाचे पान) तातूंतलें वर्णन सकयल दिलां.",
        "upload-disallowed-here": "तूं ह्या फायलीचेर अधिलेखीत करूंक शकना",
-       "randompage": "खंयचेंय आदलें मदलें",
+       "randompage": "खंयचेंय आदलें मदलें पान",
        "statistics": "संख्याशास्त्र",
        "statistics-pages": "पान:",
        "statistics-files": "फायल अपलोड करात",
        "booksources": "पुस्तकांचो स्त्रोत",
        "booksources-search-legend": "पुस्तकाचे स्त्रोत सोदात",
        "booksources-search": "सोद",
-       "log": "लà¥\89à¤\97à¥\8dस",
+       "log": "सà¥\8bतà¥\8dराà¤\82",
        "allpages": "सगळीं पाना",
        "allarticles": "सगळीं पानां",
        "allpagessubmit": "वचात",
-       "categories": "à¤\97à¤\9f",
+       "categories": "वरà¥\8dà¤\97",
        "linksearch-ns": "नांवाची सुवात",
        "linksearch-ok": "सोद",
        "linksearch-line": "$2 तल्यान $1 जोडिल्लो आसा",
        "dellogpage": "काडून उडयिल्ल्यांची वळेरी",
        "rollbacklink": "फाटीं घेयात",
        "rollbacklinkcount": "$1 {{PLURAL:$1|संपादन}} फाटीं घेयात",
-       "protectlogpage": "सà¥\81रà¤\95à¥\8dषा à¤¨à¥\8bà¤\82दà¥\80",
+       "protectlogpage": "सà¥\81रà¤\95à¥\8dषितà¥\87à¤\9aà¥\87à¤\82 à¤¸à¥\8bतà¥\8dर",
        "protectedarticle": "राखिल्ले\"[[$1]]\"",
        "restriction-edit": "संस्करण",
        "restriction-move": "दुसरेकडे व्हरात",
        "restriction-create": "निर्माण कर",
        "undeletelink": "पळेयात/परत हाडात",
        "undeleteviewlink": "पळय, दृश्य",
-       "namespace": "नांवाची सुवात",
+       "namespace": "नांव-थोळ",
        "invert": "विपरीत प्रवरण",
        "tooltip-invert": "वेंचीक नांवांचे सुवाते(आनी संबंदीत नांवांची सुवात तपासल्या जाल्यार) भीतर पानांनी केल्ले बदल लिपोवंक ह्या बॉक्सांत तपासून पळयात.",
-       "namespace_association": "सà¤\82बà¤\82दà¥\80त à¤¨à¤¾à¤®à¤¸à¥\8dथान",
+       "namespace_association": "सà¤\82बà¤\82दà¥\80त à¤¨à¤¾à¤\82वथà¥\8bळ",
        "tooltip-namespace_association": "चर्चा वा वेंचीक नांवाचें सुवातीक संबंदीत विशयाच्या नांवाची सुवात आस्पावन घेवपाखातीर ह्या बॉक्सांत पळयात",
        "blanknamespace": "(मुखेल)",
        "contributions": "{{GENDER:$1|उपेगकर्तो}} योगदानां",
        "linkshere": "मुखावेली पानां '''[[:$1]]''': हाका जोडणी करतात",
        "nolinkshere": "$1हाका खंयच्याच पानाची जोडणी ना",
        "isredirect": "पान नव्या नाम्यार धाडात",
-       "istemplate": "$1 à¤\9fà¥\8dरानà¥\8dसà¥\8dà¤\95à¥\8dलà¥\8dयà¥\81à¤\9cनà¥\8dस",
+       "istemplate": "$1 à¤¦à¥\82सरात-समावà¥\87स",
        "isimage": "फायलीचो दुवो",
        "whatlinkshere-prev": "{{PLURAL:$1|आदलें|आदलीं $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|फुडलें|फुडलें $1}}",
        "whatlinkshere-links": "← जोडण्यो",
        "whatlinkshere-hideredirs": "$1 पुनर्निर्देशन",
-       "whatlinkshere-hidetrans": "$1 à¤\9fà¥\8dरानà¥\8dसà¥\8dà¤\95à¥\8dलà¥\8dयà¥\81à¤\9cनà¥\8dस",
+       "whatlinkshere-hidetrans": "$1 à¤¦à¥\82सà¥\8dरात-समावà¥\87श",
        "whatlinkshere-hidelinks": "$1 जोडण्यो",
        "whatlinkshere-hideimages": "$1 फायल जोडणी",
        "whatlinkshere-filters": "गाळणे",
        "ipboptions": "2 वरां: 2hours ,1 दीस:1 day,3 दीस:3 days,1 सुमान:1 week,2 सुमनां:2 weeks,1 म्हयनो:1 month,3 म्हयने:3 months,6 म्हयने:6 months,1 वर्स:1 year,अनिश्चीत:infinte",
        "ipblocklist": "आडायल्लें वापरपी",
-       "blocklink": "विभाà¤\97",
+       "blocklink": "à¤\86डावणà¥\80",
        "change-blocklink": "विभाग सुदारप",
        "contribslink": "योगदान",
        "blocklogpage": "कार्यवळेरी आडायात",
        "blocklogentry": "$2 $3 हो सोंपपी वेळ आशिल्लो $1 बंद दवरल्ला",
        "block-log-flags-nocreate": "खातें निर्माण जावूंक ना",
-       "movepagebtn": "पान à¤°à¤¾à¤\96à¥\82न à¤¦à¤µà¤°à¤¾à¤¤",
-       "movelogpage": "लà¥\89à¤\97 à¤¹à¤¾à¤²à¤¯",
+       "movepagebtn": "पान à¤¹à¤¾à¤²à¤¯",
+       "movelogpage": "पान à¤¹à¤¾à¤²à¥\8bवणà¥\8dयाà¤\82à¤\9aà¥\8b à¤¸à¥\8bतà¥\8dर",
        "revertmove": "मूळ पदार व्हरप",
-       "export": "निरà¥\8dयात à¤ªà¤¾à¤¨à¤¾à¤\82",
+       "export": "पानाà¤\82 à¤¨à¤¿à¤°à¥\8dयात à¤\95र",
        "allmessagesname": "नांव",
        "allmessagesdefault": "पूर्वनिर्धारित संदेशाचो मजकूर",
        "thumbnail-more": "व्हड करात",
        "thumbnail_error": "$1ः लघुप्रतिमा करतांनाची चूक",
        "tooltip-pt-userpage": "तुमचें वापरपाचें पान",
-       "tooltip-pt-mytalk": "तà¥\81मà¤\9aà¥\87à¤\82 à¤\89लà¥\8bवपाचें पान",
+       "tooltip-pt-mytalk": "तà¥\81मà¤\9aà¥\87à¤\82 à¤\9aरà¥\8dà¤\9aà¥\87चें पान",
        "tooltip-pt-preferences": "तुमची पसंती",
        "tooltip-pt-watchlist": "तुमी बदल करपा खातीर देखरेख करतात त्या पानांची वळेरी",
        "tooltip-pt-mycontris": "तुमच्या योगदानांची वळेरी",
-       "tooltip-pt-login": "लà¥\8bà¤\97 à¤\87न करप बरें, पूण तशी सक्ती ना.",
+       "tooltip-pt-login": "सतà¥\8dरारà¤\82भ करप बरें, पूण तशी सक्ती ना.",
        "tooltip-pt-logout": "सत्र शेवट",
-       "tooltip-pt-createaccount": "तà¥\81मà¥\80 à¤\96ातà¥\87à¤\82 à¤\89à¤\97डà¥\82न à¤²à¤¾à¥\85à¤\97 à¤\87न करचें अशें सुचयतात, पूण तें सक्तीचे ना.",
-       "tooltip-ca-talk": "मà¤\9cà¤\95à¥\82राà¤\9aà¥\8dया à¤ªà¤¾à¤¨à¤¾ à¤¸à¤\82बà¤\82दान à¤\9aरà¥\8dà¤\9aा",
-       "tooltip-ca-edit": "तà¥\81मà¤\9aà¥\8dयानà¥\80à¤\82 à¤¹à¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\87à¤\82 à¤¸à¤\82सà¥\8dà¤\95रण à¤\95रà¥\82à¤\82 à¤¯à¥\87ता. à¤\89पà¤\95ार à¤\95रà¥\82न à¤°à¤¾à¤\96à¥\82न à¤¦à¤µà¤°à¤\9aà¥\8dया à¤\86दà¥\80à¤\82 à¤ªà¥\82रà¥\8dवनियाळ à¤¬à¤\9fन à¤µà¤¾à¤ªà¤°à¤\9aà¥\8b",
-       "tooltip-ca-addsection": "नवà¥\80न विभाग सुरु करात",
-       "tooltip-ca-viewsource": "हें पान संरक्षीत आसा. तुमच्यानी ताचो उगम पळोवं येता",
-       "tooltip-ca-history": "हà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\87 à¤\86दलà¥\87 à¤¨à¤¿à¤¯à¤¾à¤³",
+       "tooltip-pt-createaccount": "तà¥\81मà¥\80 à¤\96ातà¥\87à¤\82 à¤\89à¤\97डà¥\82न à¤¸à¤¤à¥\8dरारà¤\82भ करचें अशें सुचयतात, पूण तें सक्तीचे ना.",
+       "tooltip-ca-talk": "मà¤\9cà¤\95à¥\82राà¤\9aà¥\8dया à¤ªà¤¾à¤¨à¤¾ à¤¸à¤\82बà¤\82दान à¤­à¤¾à¤¸à¤¾à¤­à¤¾à¤¸",
+       "tooltip-ca-edit": "हà¥\87à¤\82 à¤ªà¤¾à¤¨ à¤¬à¤¦à¤²",
+       "tooltip-ca-addsection": "नवà¥\80à¤\82 विभाग सुरु करात",
+       "tooltip-ca-viewsource": "हें पान संरक्षीत आसा.\nतुमच्यानी ताचो उगम पळोवं येता",
+       "tooltip-ca-history": "हà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\8dयà¥\8b à¤\86दलà¥\8dयà¥\8b à¤\89à¤\9cà¤\82ळणà¥\8dयà¥\8b",
        "tooltip-ca-protect": "हें पान राखून दवर",
        "tooltip-ca-delete": "हें पान काडून उडयात",
        "tooltip-ca-move": "दुसरे कडे व्हरात",
        "tooltip-n-help": "सोदपाचो जागो",
        "tooltip-t-whatlinkshere": "हांगा जोडणी आशिल्ल्या सगळ्या विकी पानांची वळेरी",
        "tooltip-t-recentchangeslinked": "ह्या पानावेल्यान जोडणी दिल्ल्या पानांतले हालींचे बदल",
-       "tooltip-feed-atom": "हà¥\8dया à¤ªà¤¾à¤¨à¤¾ à¤\96ातà¥\80र à¤\8dà¤\9fम à¤°à¤¸à¤¦",
+       "tooltip-feed-atom": "हà¥\8dया à¤ªà¤¾à¤¨à¤¾ à¤\96ातà¥\80र à¤\8dà¤\9fम à¤ªà¥\82रà¥\8dवण",
        "tooltip-t-contributions": "ह्या वापरप्याची योगदानाची वळेरी",
        "tooltip-t-emailuser": "ह्या उपेगकर्त्याक इ-मेल धाडात",
-       "tooltip-t-upload": "फायल अपलोड करात",
+       "tooltip-t-upload": "फायल अपलोड करात",
        "tooltip-t-specialpages": "सगळ्या खाशेल्या पानांची वळेरी",
        "tooltip-t-print": "ह्या पानाची छापपायोग्य आवृत्ती",
        "tooltip-t-permalink": "ह्या पानाच्या ह्या पुनर्नियाळाकडे सदांकाळ जोडणी",
        "tooltip-ca-nstab-main": "मजकूर पान पळेयात",
        "tooltip-ca-nstab-user": "वापरप्याचें पान दाखय",
-       "tooltip-ca-nstab-special": "हें खेरीत पान,तुमच्यांनीं खुद्द त्या पानार संस्करण करूं नजो",
+       "tooltip-ca-nstab-special": "हें खेरीत पान, तुमच्यांनीं खुद्द त्या पानार संस्करण करूं नजो",
        "tooltip-ca-nstab-project": "प्रकल्पाचें पान पळेयात",
        "tooltip-ca-nstab-image": "फायलीचें पान पळेयात",
        "tooltip-ca-nstab-template": "प्रारुप पळेयात",
-       "tooltip-ca-nstab-category": "शà¥\8dरà¥\87णà¥\80à¤\82à¤\9aà¥\87à¤\82 पान पळेयात",
+       "tooltip-ca-nstab-category": "वरà¥\8dà¤\97ाà¤\82à¤\9aà¥\87 पान पळेयात",
        "tooltip-minoredit": "हो ल्हानसो बदल म्हूण कुरू करात",
-       "tooltip-save": "तà¥\81मà¤\9aà¥\87 à¤¬à¤¦à¤² à¤°à¤¾à¤\96à¥\82न à¤¦à¤µà¤°ात",
+       "tooltip-save": "तà¥\81मà¤\9aà¥\87 à¤¬à¤¦à¤² à¤¸à¤¾à¤\82भाळात",
        "tooltip-preview": "तुमचे बदल परतून नियाळचे. हें राखून दवरचे पयलीं करचें",
        "tooltip-diff": "लिखीत मजकूरांत तुमी खंयचो बदल केला तो दाखयात",
        "tooltip-compareselectedversions": "ह्या पानाच्या दोन वेंचिल्ल्या पुनर्नियाळां मदलो फरक पळेयात.",
        "tooltip-rollback": "निमाण्या योगदान करप्यान ह्या पानाचेर केल्लें संस्करण (‍णां) रोलबॅक  (फाटीं घेयात) एकाच क्लीकान मूळ पदार हाडटा",
        "tooltip-undo": "\"आदलें स्थितीर हाडचें\" ह्या बदलाक परत व्हरुन संपादन स्थितीन झलक रितीन दाखयतात.\nहाचेवरवीं सारांशान आदल्या स्थितीर हाडपाचें कारण बरोवं शकता.",
        "tooltip-summary": "आपरोसाची नोंदणी करात",
-       "simpleantispam-label": "एन्टी-स्पैम तपासप. हातूंतल्यान <strong>NOT</strong> भरात!",
+       "simpleantispam-label": "एन्टी-स्पैम तपासप.\nहे भरी<strong>नकाय</strong>!",
        "pageinfo-toolboxlink": "पानाची म्हायती",
        "previousdiff": "← आदलें संपादन",
        "nextdiff": "नवें संपादन →",
        "file-info-size": "$1 × $2 चित्रतत्व, फायलीचो आकार: $3, माइम प्रकार: $4",
-       "file-nohires": "हाà¤\9aà¥\8dया à¤ªà¤°à¤¸ à¤µà¤¯à¤²à¥\87 à¤°à¥\87à¤\9cलà¥\8dयà¥\81शन उपल्बद ना",
-       "svg-long-desc": "SVG à¤«à¤¾à¤¯à¤², à¤¸à¤¾à¤¦à¤¾à¤°à¤£à¤ªà¤£à¤¾à¤¨ $1 Ã\97 $2 à¤ªà¥\80à¤\95à¥\8dसलà¥\8dस, फायलीचो आकार: $3",
+       "file-nohires": "हाà¤\9aà¥\8dया à¤ªà¤°à¤¸ à¤µà¤¯à¤²à¥\87 à¤¬à¤¾à¤°à¤¿à¤\95à¥\8dसाय उपल्बद ना",
+       "svg-long-desc": "SVG à¤«à¤¾à¤¯à¤², à¤¨à¤¾à¤\82वाà¤\95 $1 Ã\97 $2 à¤\9aितà¥\8dरततà¥\8dवाà¤\82, फायलीचो आकार: $3",
        "show-big-image": "मुळावी फायल",
        "show-big-image-preview": "ह्या दाखवणीचो आकार: $1.",
-       "show-big-image-other": "हेर  {{PLURAL:$2| resolution|resolutions}}:  $1 ।",
-       "show-big-image-size": "$1 Ã\97 $2 à¤ªà¤¿à¤\95à¥\8dसà¥\87ल",
+       "show-big-image-other": "हेर {{PLURAL:$2|बारिकसाय}}: $1।",
+       "show-big-image-size": "$1 Ã\97 $2 à¤\9aितà¥\8dरततà¥\8dवाà¤\82",
        "bad_image_list": "सरुपण सकयले भाशेन आसाः फक्त वळेरेंतल्यान विशयांचो (*न सुरु जावपी वळी) विचार जाला वळी वयली पयली जोडणी ही वायट फायलीक जोडणी ही वायट फायलीक जोडणी आसूंक जाय. ते लायनीवेल्यो ताचे उपरांतच्यो खंयच्योय जोडण्यो ह्यो आडवाद अशो धरतात म्हळ्यार जंय फायल  इन लायन आसूं येता अशी पानां.",
        "metadata": "मेटाडॅटा",
-       "metadata-help": "हà¥\8dया à¤«à¤¾à¤¯à¤²à¥\80न à¤\9aड à¤®à¥\8dहायतà¥\80 à¤\86सा, à¤\98डयà¥\87 à¤¹à¥\80 à¤«à¤¾à¤¯à¤² à¤¤à¤¯à¤¾à¤° à¤\95रताना वापरिल्ल्या स्कॅनर वा कॅमेरा कडल्यान ही मेळ्ळ्या आसुंये. जर ही फायल बदल्ल्या जाल्यार ही म्हायती नव्या फायलींकडे जुळची ना असो दुबाव आसा.",
-       "metadata-fields": "जेन्ना मेटाडेटा टेबल कोसळटा तेन्ना ह्या संदेशांत आसपाव केल्लीं मेटाडेटाची चित्ररूपां दर्शक पानांत आसपावतलीं बाकीचीं पूर्वनिर्धारीत रितीन लिपून उरतलीं\nबनावट\nनमुनो\nमूळ तारीख-वेळ\nउकतो वेळ\nकलाकार\nसर्वाधिकार\nप्रतिमावर्णन",
+       "metadata-help": "हà¥\8dया à¤«à¤¾à¤¯à¤²à¥\80न à¤\9aड à¤®à¥\8dहायतà¥\80 à¤\86सा, à¤\98डयà¥\87 à¤¹à¥\80 à¤«à¤¾à¤¯à¤² à¤°à¤\9aताना वापरिल्ल्या स्कॅनर वा कॅमेरा कडल्यान ही मेळ्ळ्या आसुंये. जर ही फायल बदल्ल्या जाल्यार ही म्हायती नव्या फायलींकडे जुळची ना असो दुबाव आसा.",
+       "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": "à¤\86डवà¥\87à¤\82 à¤°à¤¿à¤\9cà¥\8bलà¥\8dयà¥\82शन",
-       "exif-yresolution": "à¤\89बà¥\87à¤\82 à¤°à¤¿à¤\9cà¥\8bलà¥\8dयà¥\82शन",
-       "exif-datetime": "फायल बदल वेळ आनी तारीक",
+       "exif-xresolution": "à¤\86डवà¥\87à¤\82 à¤¬à¤¾à¤°à¤¿à¤\95à¥\8dसाय",
+       "exif-yresolution": "à¤\89बà¥\87à¤\82 à¤¬à¤¾à¤°à¤¿à¤\95à¥\8dसाय",
+       "exif-datetime": "फायलीचें बदलपाचें वेळ आनी तारीक",
        "exif-make": "कॅमेरा उत्पादक",
        "exif-model": "कॅमेरा मॉडेल",
        "exif-software": "वापरिल्लो सॉफ्टवेर",
        "exif-exifversion": "Exif आवृत्ती",
-       "exif-colorspace": "रà¤\82à¤\97 à¤¸à¥\8dथान",
+       "exif-colorspace": "रà¤\82à¤\97 à¤\9c़ाà¤\97à¥\8b",
        "exif-datetimeoriginal": "म्हायती निर्मितीची तारीख आनी वेळ",
-       "exif-datetimedigitized": "डिà¤\9cिà¤\9fायà¤\9c à¤\95à¥\87लà¥\8dलà¥\8dयाची तारीक आनी वेळ",
+       "exif-datetimedigitized": "फाà¤\87ल à¤°à¥\8bà¤\9aपाची तारीक आनी वेळ",
        "exif-orientation-1": "सामान्य",
        "namespacesall": "सगळें",
        "monthsall": "सगळे",
        "watchlisttools-view": "प्रस्तूत बदल पळयात.",
        "watchlisttools-edit": "लक्ष वळेंरी पळय आनी संपादीत करात",
-       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|à¤\89लà¥\8bवप]])",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|à¤\89लà¥\8bयात]])",
        "specialpages": "खाशेलीं पानां",
-       "tag-filter": "[[Special:Tags|लà¥\87बल]]गाळणो:",
-       "tag-list-wrapper": "([[विशेश:कुरवेचीट|{{बहुवचन:$1|कुरवेचीट|कुरवेचीटी}}]]: $2)",
+       "tag-filter": "[[Special:Tags|à¤\95à¥\81रà¥\8dवà¥\87à¤\9aà¥\80à¤\9f]] गाळणो:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|कुरवेचीट|कुरवेचीटी}}]]: $2)",
        "logentry-delete-delete": "$1 {{GENDER:$2|काडून उडयल्ले पान}} $3",
        "logentry-move-move": "$1 न $3 पानाचेर $4 {{GENDER:$2|हालयला}}",
-       "logentry-newusers-create": "उपयोगकत्याचें $1 {{लिंग:$2|तयार केलें}}",
+       "logentry-newusers-create": "उपयोगकत्याचें $1 {{GENDER:$2|तयार केलें}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|अपलोड केला}} $3",
        "searchsuggest-search": "सोद"
 }
index d7a1ab7..ec62ada 100644 (file)
@@ -7,8 +7,24 @@
                        "아라"
                ]
        },
+       "tog-underline": "Zoddnienche adhorekhan",
+       "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 +93,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": "Nanv-thollam",
+       "namespaces": "Nanvthollam",
        "variants": "Dusre",
        "navigation-heading": "Dixa-niontron suchi",
        "errorpagetitle": "Chuk",
        "search": "Sod",
        "searchbutton": "Sod",
        "go": "Pavl mar",
-       "searcharticle": "Fuddem voch",
+       "searcharticle": "Voch",
        "history": "Panacho itihas",
        "history_short": "Itihas",
-       "printableversion": "Chapp'pachi avruti",
-       "permalink": "Togpi zodd",
+       "printableversion": "Chapp'pakyogya avruti",
+       "permalink": "Togpi zoddni",
        "print": "Chap",
        "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",
        "personaltools": "Khasgi avtam",
        "articlepage": "Vixoi sombondhi pan poloi",
        "talk": "Bhasabhas",
-       "views": "Niall",
+       "views": "Drishya",
        "toolbox": "Avtam",
        "userpage": "Vangddiacho pan poloi",
        "imagepage": "Imazichem pan poloi",
        "viewhelppage": "Adar pan poloi",
        "categorypage": "Vorgachem pan poloi",
-       "otherlanguages": "Dusrea bhasanim",
+       "otherlanguages": "Her bhasanim",
        "redirectedfrom": "($1 savn porot dixent)",
        "redirectpagesub": "Punornirdexan pan",
        "redirectto": "Hanga ponornirdeshit kor:",
        "lastmodifiedat": "Hem pan xevtim $1 disa, $2 vazta bodolelem.",
-       "jumpto": "Hangachean voch",
-       "jumptonavigation": "Dixa-niontronn",
+       "jumpto": "Hupun voch",
+       "jumptonavigation": "dixa-niontronn",
        "jumptosearch": "sod",
        "aboutsite": "{{SITENAME}} babtint",
        "aboutpage": "Project:Vixoiavixim",
        "currentevents": "Chalu ghoddnneo",
        "currentevents-url": "Project:Chalu ghoddneo",
        "disclaimers": "Nhoikarnio",
-       "disclaimerpage": "Project:Sadeo nhoikarnio",
+       "disclaimerpage": "Project:Sadeo nhoikarni",
        "edithelp": "Bodlunk adar",
        "mainpage": "Mukhel Pan",
-       "mainpage-description": "Mukhel Pan",
+       "mainpage-description": "Mukhel pan",
        "portal": "Somudaik proves-dar",
        "portal-url": "Project:Somudaik proves-dar",
        "privacy": "Gupitaiechem dhoronn",
        "red-link-title": "$1 (hea nanvachem pan na)",
        "nstab-main": "Pan",
        "nstab-user": "Vapuddpeachem pan",
-       "nstab-special": "Kherit pan",
-       "nstab-project": "Project-ache pan",
+       "nstab-special": "Khaxelem pan",
+       "nstab-project": "Prokolpache pan",
        "nstab-image": "Fail",
        "nstab-mediawiki": "Sondex",
        "nstab-template": "Saacho",
        "createacct-imgcaptcha-ph": "Voir dixta to mozkur boroi",
        "createacct-submit": "Tujem khatem roch",
        "createacct-benefit-heading": "{{SITENAME}} tujea bhaxen lokani kel'la",
-       "createacct-benefit-body1": "{{PLURAL:$1|bodlop|bodlopam}}",
+       "createacct-benefit-body1": "{{PLURAL:$1|bodol|bodlopam}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pan|panam}}",
        "createacct-benefit-body3": "halincheo {{PLURAL:$1|yogdan diupi}}",
        "mailmypassword": "Novem gupitutor",
        "pt-login": "Sotrorombh kor",
        "pt-login-button": "Sotrorombh kor",
        "pt-createaccount": "Khatem roch",
-       "pt-userlogout": "Sotracho xevott",
+       "pt-userlogout": "Sotr xevott",
        "passwordreset": "Novem gupitutor",
        "bold_sample": "Datt mozkur",
        "bold_tip": "Datt mozkur",
        "italic_sample": "Palso mozkur",
        "italic_tip": "Palso mozkur",
-       "link_sample": "Zoddachem nanv",
-       "link_tip": "Bhitorlem zoddop",
+       "link_sample": "Zoddnieche nanv",
+       "link_tip": "Bhitorlem zoddni",
        "extlink_sample": "http://www.udaronn.in zoddachem nanv",
        "extlink_tip": "Bhailem site (survatek http:// visronakai)",
        "headline_sample": "Mathalleacho mozkur",
        "nowiki_sample": "Sworup diunk naslelem mozkur hanga ghal",
        "nowiki_tip": "Wiki sworup durlokx kor",
        "image_tip": "Bosoileli fail",
-       "media_tip": "Failichem zodd",
+       "media_tip": "Failichi zoddni",
        "sig_tip": "Tuji soi, vell-chaap soit",
        "hr_tip": "Adhvem rang (Komi uzar kor)",
        "summary": "Sar:",
        "anoneditwarning": "<strong>Chotrai:</strong> Tuven sotrorombh korunk nai. Tu bodlopam korit zalear tuzo internet potto soglleank polleunk zatelem. Tu <strong>[$1 sotrorombh korit]</strong> vo <strong>[$2 kont rochit]</strong> zalear, tujeo bodlopam tuzo vagddiachem nanvak zoddteleo ani anik-ui faide asat.",
        "loginreqlink": "sotrorombh kor",
        "newarticle": "(Novem)",
-       "newarticletext": "Tuven ek zoddache patlav kelai, zachem pan azun rochunk na.\nPan rochunk, khallchea chovkottan boroi (anik mahitik [$1 adar pan] polloi).\nTu hangasor chukin pavlai zalear tujea internet browser-achi '''Fatim'' vo '''Back''' butao dab.",
+       "newarticletext": "Tuven ek zoddneche patlav kelai, zachem pan azun rochunk na.\nPan rochunk, khallchea chovkottan boroi (anik mahitik [$1 adar pan] polloi).\nTu hangasor chukin pavlai zalear tujea internet browser-achi '''Fatim'' vo '''Back''' butao dab.",
        "noarticletext": "Sodheak hem pan rinte asa.\nTujean dusrea panani [[Special:Search/{{PAGENAME}}|hea panache nanv sodunk zata]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sombondhi sotrani sodunk zata], vo [{{fullurl:{{FULLPAGENAME}}|action=edit}} hem pan sudharunk zata]</span>.",
        "noarticletext-nopermission": "Sodheak hem pan rinte asa.\nTujean dusrea panani [[Special:Search/{{PAGENAME}}|hea panache nanv sodunk zata]], vo <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sombondhi sotrani sodunk zata], pun tuka hem pan rochunk porvangi na.",
        "previewnote": "'''Hi fokot ek zholok mhonn ugddas dhor.'''\nTujim bodolpam azun sambhallun dovrunk nant!",
        "editing": "$1 bodolta",
        "creating": "$1 rochta",
-       "editingsection": "(Khond) $1 sudar",
+       "editingsection": "(Khond) $1 bodol",
        "templatesused": "Hea panant uzar {{PLURAL:$1|kel'lo sancho|kel'le sanche}}:",
        "template-protected": "(rakhlelem)",
        "template-semiprotected": "(ordhem rakhun dovorlelem)",
        "difference-title": "\"$1\"-chea avruttint ontor",
        "lineno": "Line ank $1:",
        "compareselectedversions": "Nivodloleo uzollneo comparar kor",
-       "editundo": "rod'd kor",
-       "diff-multi-sameuser": "(Heach vangdian {{PLURAL:$1|kel'lo modlo ek bodlop dakhounk na|kel'le modle $1 bodlopam dakhounk nan}})",
-       "searchresults": "Sodacho nikal",
+       "editundo": "kel'lem portavchem",
+       "diff-multi-sameuser": "(Heach vangdian {{PLURAL:$1|kel'lo modlo ek bodol dakhounk na|kel'le modle $1 bodlopam dakhounk nan}})",
+       "searchresults": "Sodache nikal",
        "searchresults-title": "\"$1\" -khatir sodacho nikal",
        "prevn": "adlem {{PLURAL:$1|$1}}",
        "nextn": "fuddlem {{PLURAL:$1|$1}}",
        "prevn-title": "{{PLURAL:$1|Fattlem $1 porinnam|Fattlem $1 porinam}}",
        "nextn-title": "{{PLURAL:$1|Fuddlem $1 porinnam|Fudnlim $1 porinnam}}",
-       "shown-title": "Dor panar {{PLURAL:$1|porinam|porinam}} dakhoi",
+       "shown-title": "Dor eka panar {{PLURAL:$1|porinam}} dakhoi",
        "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) poloi",
        "searchmenu-exists": "'''Hea Wikicher \"[[:$1]]\" nanvanche pan asa.'''",
        "searchmenu-new": "<strong>\"[[:$1]]\" hem pan hea vikint roch!<strong> {{PLURAL:$2|0=|Tujea sodan mellelem panui polloi.|Tujea sodan mellelem panamui polloi.}}",
        "searchprofile-advanced": "Sodpache poryay",
        "searchprofile-articles-tooltip": "$1 hantunt sod",
        "searchprofile-images-tooltip": "Faili sod",
-       "searchprofile-everything-tooltip": "Akhea sitin sod (Bhasabhas panant'ui)",
-       "searchprofile-advanced-tooltip": "chalu nanvthollancher sod",
+       "searchprofile-everything-tooltip": "Akhea saitin sod (Bhasabhas panant'ui)",
+       "searchprofile-advanced-tooltip": "Khaxel'lea nanvthollanni sod",
        "search-result-size": "$1 {{PLURAL:$2|1 utor|$2 utram}}",
        "search-result-category-size": "{{PLURAL:$1|1 vangddi|$1 vangddi}} ({{PLURAL:$2|1 upvorg|$2 upvorg}}, {{PLURAL:$3|1 fichier|$3 fichieri}})",
        "search-redirect": "($1 porot dixen dhaddop)",
        "search-section": "(vibhag $1)",
-       "search-suggest": "mhonnunk sodi: $1",
+       "search-suggest": "Tu mhonnunk sodi: $1 ?",
        "searchrelated": "sombondit",
        "searchall": "soglle",
        "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> modlean <strong>$1</strong> porinam|<strong>$3</strong> modlean porinam <strong>$1 - $2</strong>}}",
        "action-edit": "hem pan sudar",
        "nchanges": "$1 {{PLURAL:$1|bodlop|bodlopam}}",
        "enhancedrc-history": "itihas",
-       "recentchanges": "Halincho bodol",
-       "recentchanges-legend": "Hallinch zalleo bodlopancheo poryay",
-       "recentchanges-summary": "Hea wikicher halinch zal'le bodlopancher nodor dovor.",
+       "recentchanges": "Halinche bodol",
+       "recentchanges-legend": "Hallinch zalleo bodolancheo poryay",
+       "recentchanges-summary": "Hea wikicher halinch zal'le bodolancher nodor dovor.",
        "recentchanges-feed-description": "Wiki'k kel'le halinche bodlopancher hea vhawa vorvim nodor dovor.",
-       "recentchanges-label-newpage": "Hea bodlopan ek novem pan rochlam",
-       "recentchanges-label-minor": "Ho ek dhaktto bodlop",
-       "recentchanges-label-bot": "Hem bodlop eka robotan kel'lem",
+       "recentchanges-label-newpage": "Hea bodolan ek novem pan rochlam",
+       "recentchanges-label-minor": "Ho ek dhaktto bodol",
+       "recentchanges-label-bot": "Hem bodol eka robotan kel'lem",
        "recentchanges-label-unpatrolled": "Hem sudharop azun topasunk nam",
-       "recentchanges-label-plusminus": "Hea panacho akar itlea baitani bodollo",
+       "recentchanges-label-plusminus": "Hea panacho akar itlea baitani bodol'lo",
        "recentchanges-legend-heading": "\"Kunji:\"",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|nove pananchi suchi]]-ui polloi)",
        "rcnotefrom": "Sokoil <strong>$3, $4<strong> savnsavn {{PLURAL:$5|zalelem bodlop dilam|zalelim bodolpam dileant}} (<strong>$1<strong> meren {{PLURAL:$5|dakhoilam|dakhoileant}}).",
        "rc-enhanced-expand": "Bariksann dakhoi",
        "rc-enhanced-hide": "Bariksann lipoi",
        "recentchangeslinked": "Sombondit bodolpam",
-       "recentchangeslinked-toolbox": "Sombondit bodolpam",
-       "recentchangeslinked-title": "\"$1\" sombondit zalelim bodolpam",
-       "recentchangeslinked-summary": "Hem zaun asa eke panaksun vo eka voraksun, halinch kel'lim bodlopanchi suchi.\n\n[[Special:Watchlist|Tujea sadurvollerint]] aslelim panam 'datt' asat.",
+       "recentchangeslinked-toolbox": "Sombondit bodlopam",
+       "recentchangeslinked-title": "\"$1\"che sombondit bodolpam",
+       "recentchangeslinked-summary": "Hem zaun asa eke panaksun vo eka vorgaksun, halinch kel'lim bodolanchi suchi.\n\n[[Special:Watchlist|Tujea sadurvollerint]] aslelim panam 'datt' asat.",
        "recentchangeslinked-page": "Panache nanv:",
        "recentchangeslinked-to": "Dil'em panache bodlek haka zodlelem panank kel'lim bodlopam dakhoi",
        "upload": "Fail upload kor",
        "filehist-current": "chalont",
        "filehist-datetime": "Tarikh/Vell",
        "filehist-thumb": "Lhan-imaz",
-       "filehist-thumbtext": "$1 avrute khatir lhan-imaz",
-       "filehist-user": "Vaporpi",
+       "filehist-thumbtext": "$1chi avrutti khatir lhan-imaz",
+       "filehist-user": "Vapurpi",
        "filehist-dimensions": "Akar",
        "filehist-comment": "vivek",
        "imagelinks": "Failicho vapor",
        "sharedupload-desc-here": "Hi fail $1, hachi ani dusreo projectanim haka uzar korunk zata.\nHachem [$2 failichem vivron panan] asleli vivron khala dilea:",
        "upload-disallowed-here": "Tu hea faili voir borounk xokonai",
        "filedelete-otherreason": "Dusrem/aniki karon:",
-       "randompage": "Khoincheim pan",
+       "randompage": "Khoincheim adlem modlem pan",
        "statistics": "Ankddevari",
        "nbytes": "$1 {{PLURAL:$1|byte|bytesi}}",
        "nmembers": "$1 {{PLURAL:$1|vangddi}}",
        "prevpage": "Ad'dlem pan ($1)",
        "allpagesfrom": "Hanga thavn suru zatelea panank dakhoi:",
        "allarticles": "Sogllim panam",
-       "allpagessubmit": "Fuddem voch",
+       "allpagessubmit": "Voch",
        "categories": "Vorg",
        "linksearch-line": "$1 $2 savn zoddlelem asa",
        "listgrouprights-members": "(vapuddpeanchi suchi)",
        "watchlist": "Sadurachi volleri",
        "mywatchlist": "Sadurachi volleri",
        "watchlistfor2": "$1 hache khatir $2",
-       "watch": "Sadur rav",
+       "watch": "Nodor dovor",
        "watchthispage": "Hea panar dixtt dovor",
        "unwatch": "Nodor kadd",
        "watchlist-details": "Tujea sadurvollerint {{PLURAL:$1|$1 pan asa|$1 panam asat}}, ulovpachim panam veglim mezonastanam.",
        "dellogpage": "Vogllaoneche sotr",
        "deleteotherreason": "Dusrem/aniki karon:",
        "rollbacklink": "kovoll",
-       "rollbacklinkcount": "$1 {{PLURAL:$1|bodlop|bodlopam}} kovoll",
+       "rollbacklinkcount": "$1 {{PLURAL:$1|bodol|bodlopam}} kovoll",
        "protectlogpage": "Surokxitechem sotr",
        "protectedarticle": "rakhlelem \"[[$1]]\"",
        "protect-otherreason": "Dusrem/aniki karon:",
        "namespace_association": "Sombondhit nanvtholl",
        "tooltip-namespace_association": "Vinchlele nanvthollache sombondhit bhasabhas vo vixoiacho nanvthollakui gheupak hem boks khunnai",
        "blanknamespace": "(Mukhel)",
-       "contributions": "{{GENDER:$1|Vapuddpi}} borovpam",
+       "contributions": "{{GENDER:$1|Vapuddpi}} yogdanam",
        "contributions-title": "$1 hea vapuddpean kelelim borovpam",
        "mycontris": "Borovpam",
        "contribsub2": "{{GENDER:$3|$1}} hacheo ($2)",
        "whatlinkshere": "Hanga kitem zoddta",
        "whatlinkshere-title": "\"$1\" haka zoddlelim panam",
        "whatlinkshere-page": "Pan:",
-       "linkshere": "Sokoilim panam '''[[:$1]]''' ak zoddtat:",
+       "linkshere": "Sokoilim panam <strong>[[:$1]]</strong> ak zoddtat:",
        "nolinkshere": "Khoincheim pan '''[[:$1]]''' ak zoddna.",
        "isredirect": "Porot dixen pan dhadd",
        "istemplate": "Durasth-somaves",
        "isimage": "failichem zoddop",
        "whatlinkshere-prev": "{{PLURAL:$1|adlem|adlem $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|fuddlem|fuddlim $1}}",
-       "whatlinkshere-links": "← zoddpam",
+       "whatlinkshere-links": "← zoddnio",
        "whatlinkshere-hideredirs": "$1 porot dixen",
        "whatlinkshere-hidetrans": "$1 durasth-somaves",
-       "whatlinkshere-hidelinks": "$1 zoddpam",
+       "whatlinkshere-hidelinks": "$1 zoddnio",
        "whatlinkshere-hideimages": "Failinchim zoddpam $1",
        "whatlinkshere-filters": "Challnio",
        "ipboptions": "2 voram:2 hours,1 dis:1 day,3 dis:3 days,1 satollo:1 week,2 satolle:2 weeks,1 mhoino:1 month,3 mhoine:3 months,6 mhoine:6 months,1 voros:1 year,sasnnank:infinite",
        "blocklink": "addavnnni",
        "unblocklink": "Addavnni kadd",
        "change-blocklink": "Addavnnni bodol",
-       "contribslink": "borovp",
+       "contribslink": "yogdan",
        "blocklogpage": "addavnnechem sotr",
        "blocklogentry": "[[$1]] addailelem $2 asun vellacho ont: $3",
        "block-log-flags-nocreate": "Khatem rochop opatr kelam",
        "move-watch": "Hea panar disht dovor",
-       "movelogpage": "Sotr bodol",
+       "movepagebtn": "Pan haloi",
+       "movelogpage": "Pan halovneancho sotr",
        "movereason": "Karonn:",
        "revertmove": "porti",
        "export": "Panank niryat kor",
        "allmessagesname": "Nanv",
        "allmessagesdefault": "Falta sondex mozkur",
-       "thumbnail-more": "vaddoi",
+       "thumbnail-more": "Vhodlem kor",
        "thumbnail_error": "Lhan-imaz toiar kortana chuk zali. Karonn: $1",
        "tooltip-pt-userpage": "Tujem vapuddpachem pan",
-       "tooltip-pt-mytalk": "Tumchem ulovpachem pan",
+       "tooltip-pt-mytalk": "Tumchem bhasabhasachem pan",
        "tooltip-pt-preferences": "Tumcheo avddi",
        "tooltip-pt-watchlist": "Bodlachea dekhrekh korpachea panachi volleri",
-       "tooltip-pt-mycontris": "Tujea borovpanchi suchi",
-       "tooltip-pt-login": "Tumkam sotrormbh korunk protsavan asa; em soktichem nhoi",
-       "tooltip-pt-logout": "Sotracho xevott",
-       "tooltip-pt-createaccount": "Sotrorombh kelear borem; pun toxi sokti nam",
-       "tooltip-ca-talk": "Mozkurachea vixoiavoir bhasabhas",
-       "tooltip-ca-edit": "Tumchean hem pan bodlunk zata. Upkar korun sambhallche adim zholok butanv vapor",
-       "tooltip-ca-addsection": "Novo vibhag suru kor",
-       "tooltip-ca-viewsource": "Hem pan rakhun dovorlam.\nTujean tachem mull pollonv ieta",
+       "tooltip-pt-mycontris": "Tujea yogdanachi suchi",
+       "tooltip-pt-login": "Tumkam sotrormbh korunk protsavan asa; pun hem soktichem nhoi",
+       "tooltip-pt-logout": "Sotr xevott",
+       "tooltip-pt-createaccount": "Tumi khatem ugdun sotrorombh korunk protsavn asa; pun toxi sokti nam",
+       "tooltip-ca-talk": "Mozkurachea pana-vixim bhasabhas",
+       "tooltip-ca-edit": "Hem pan bodol",
+       "tooltip-ca-addsection": "Novi vibhag suru kor",
+       "tooltip-ca-viewsource": "Hem pan rakhun dovorlam.\nTujean tachem mull pollovnk ieta",
        "tooltip-ca-history": "Hea panacheo adleo uzollnneo",
        "tooltip-ca-protect": "Hem pan rakh",
        "tooltip-ca-delete": "Hem pan vogllai",
        "tooltip-ca-move": "Hem pan fuddem vhor",
        "tooltip-ca-watch": "Hem pan tujea sadurvollerint zodd",
        "tooltip-ca-unwatch": "Hem pan tumchea sadurtaievelean kadd",
-       "tooltip-search": "{{SITENAME}}  sod",
-       "tooltip-search-go": "Hea just nanvachem pan asa zalear tea panar voch",
-       "tooltip-search-fulltext": "Hea utarea khatir pana sod",
+       "tooltip-search": "{{SITENAME}}cher sod",
+       "tooltip-search-go": "Heach nanvachem pan ostitvant asa zalear thoim voch",
+       "tooltip-search-fulltext": "Hea mozkura khatir pana sod",
        "tooltip-p-logo": "Mukhel panak bhett di",
        "tooltip-n-mainpage": "Mukhel panak bhett di",
        "tooltip-n-mainpage-description": "Mukhel Panak bhett di",
        "tooltip-n-portal": "Hea prokolpa vixim, tumchean kitem korum ieta, khoim kitem sodchem",
        "tooltip-n-currentevents": "Chalu ghoddneachea fattbhuichi mahiti sod",
        "tooltip-n-recentchanges": "Wikint halinch bodol keleleachi volleri",
-       "tooltip-n-randompage": "Khoincheim ek pan uktem kor",
+       "tooltip-n-randompage": "Khoincheim adlem modlem pan uktem kor",
        "tooltip-n-help": "Sodpachem tholl",
        "tooltip-t-whatlinkshere": "Hanga zoddlelea sogllea wiki pananchi volleri",
-       "tooltip-t-recentchangeslinked": "Hea panak zoddlelea panachim halinchim bodolpam",
+       "tooltip-t-recentchangeslinked": "Hea panak-sun zoddlelea panachim halinche bodol",
        "tooltip-feed-atom": "Hea panak Atom purovnni",
        "tooltip-t-contributions": "Hea vapuddpeachea borovpanchi suchi",
        "tooltip-t-emailuser": "Hea vapuddpeak email patthoi",
        "tooltip-t-upload": "Faili upload kor",
-       "tooltip-t-specialpages": "Kherit pananchi volleri",
-       "tooltip-t-print": "Hea panachem chhapunk ietelem rupantor",
-       "tooltip-t-permalink": "Hea panache uzollnnek togpi zodd",
-       "tooltip-ca-nstab-main": "Suchi pan polloi",
+       "tooltip-t-specialpages": "Sogllea khaxelim pananchi volleri",
+       "tooltip-t-print": "Hea panachem chap'pakyogya avrutti",
+       "tooltip-t-permalink": "Hea panache hea uzollnnek togpi zoddni",
+       "tooltip-ca-nstab-main": "Mozkur pan polloi",
        "tooltip-ca-nstab-user": "Vapuddpeachem pan polloi",
        "tooltip-ca-nstab-special": "Hem ek kherit pan, tujeam hem pan bodlunk zaina",
-       "tooltip-ca-nstab-project": "Project-achem pan polloi",
+       "tooltip-ca-nstab-project": "Prokolpachem pan polloi",
        "tooltip-ca-nstab-image": "Failichem pan polloi",
        "tooltip-ca-nstab-template": "Saacho polloi",
        "tooltip-ca-nstab-category": "Vorgachem pan polloi",
        "tooltip-minoredit": "Haka ek kirkoll sudharop mhunn khunnay",
        "tooltip-save": "Tujim bodolpam sambhall",
-       "tooltip-preview": "Bodlopanchi zholok polloi, upkar hem samballche adim vapor!",
+       "tooltip-preview": "Bodolanchi zholok polloi, upkar hem samballche adim vapor!",
        "tooltip-diff": "Tumi hea mozkurant kelelo bodol dakhoiat",
        "tooltip-compareselectedversions": "Hea panacheo don nivoddleleo uzollneo modem forok polloi",
        "tooltip-watch": "Hem pan tujea xadurvollerint zodd",
        "tooltip-summary": "Mottvo sar ghal",
        "simpleantispam-label": "Spam-virudh topasni.\nHem bhori <strong>NAKAI</strong>",
        "pageinfo-toolboxlink": "Panachi mahiti",
-       "previousdiff": "←  Adlo bodlop",
-       "nextdiff": "Fuddlem bodlop →",
-       "file-info-size": "$1 × $2 pixelam, failicho akar: $3, MIME prokar: $4",
+       "previousdiff": "←  Adlo bodol",
+       "nextdiff": "Fuddlem bodol →",
+       "file-info-size": "$1 × $2 chitrotvam, failicho akar: $3, MIME prokar: $4",
        "file-nohires": "Odhik bariksai na.",
-       "svg-long-desc": "SVG fail, nanvak $1 × $2 pixeli, failcho akar: $3",
-       "show-big-image": "Mull fail",
+       "svg-long-desc": "SVG fail, nanvak $1 × $2 chitrotvam, failcho akar: $3",
+       "show-big-image": "Mullavi fail",
        "show-big-image-preview": "Hea dakhovnicho akar: $1",
        "show-big-image-other": "Her {{PLURAL:$2|bariksai}}: $1.",
-       "show-big-image-size": "$1 × $2 piksel",
+       "show-big-image-size": "$1 × $2 chitrotvam",
        "bad_image_list": "Akar oso asa:\n\nFokot suchicheo vostu (*-chean suru zateleo) dheanant ghevcheo\nTech vollir, uprantli zoddnni opvad dhorpant ieta,mhonnche zoim pana failichea ek vollint asunk xoktat.",
        "metadata": "Metadata",
        "metadata-help": "Hea failin anikui mahiti asa, hi fail korunk uzar kel'le digital camera vo scanner sun tem aila zait.\nZori tor hi failik bodol'lam zalear kai mahiti bodololem failik sarkem mell khaina zait.",
        "exif-exifversion": "Exif-achi avrutti",
        "exif-colorspace": "Rongacho zago",
        "exif-datetimeoriginal": "Mahiti-nirmitichi tarikh ani vell",
-       "exif-datetimedigitized": "Fail rochpachem tarikh ani vell",
+       "exif-datetimedigitized": "Fail rochpachi tarikh ani vell",
        "exif-orientation-1": "Samanya",
        "namespacesall": "sogllem",
        "monthsall": "sogllem",
        "duplicate-defaultsort": "'''Chotrai:''' Falta anukraman mukhel ''$2'' rodd korta adhlem falta anukraman mukhel ''$1'', haka.",
        "specialpages": "Khaxelim Panam",
        "external_image_whitelist": " #Hi voll asa toxich dovor<pre>\n#Khala sodpache sache (''regular expressions'') ghal (fokot // modem voita poi tem bhag)\n#Hanche borobor bhaile zodlele murt comparar kel'le zatele\n#Mell khatat tim murt koxeo distele, na zalear fokot mortek ek zodd distele\n#Jeo voll #-an suru zatele tem vivek mhunn manlele zatele\n#Hanga vhodle and dhakte okxora modem forok podona\n\n#Soglle sodpache sache hea volla voir ghal. Hi voll asa toxich dovor</pre>",
-       "tag-filter": "[[Special:Tags|Dospi]] challni:",
-       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Khunoptako|Khunoptake}}]]: $2)",
+       "tag-filter": "[[Special:Tags|Kurvechit]] challni:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Kurvechit|Kurvechiti}}]]: $2)",
        "logentry-delete-delete": "$1-an {{GENDER:$2|kadun udoile}} pan $3",
        "logentry-move-move": "$1{{GENDER:$2|-an}} $3 panak $4 haloilea",
        "logentry-newusers-create": "Vapurpeacho kont $1 {{GENDER:$2|rochlam}}",
index ca4bb3e..55a6083 100644 (file)
        "passwordreset": "ગુપ્ત સંજ્ઞા ફરી ગોઠવો",
        "passwordreset-text-one": "તમારો પાસવર્ડ બદલવા માટે આ ફોર્મ પૂરુ કરો.",
        "passwordreset-text-many": "{{PLURAL:$1|ઇમેલ વડે કામચલાઉ પાસવર્ડ મેળવવા માટે કોઈ એક ખાનું ભરો.}}",
-       "passwordreset-legend": "ગુપ્ત સંજ્ઞા ફરી ગોઠવો",
        "passwordreset-disabled": "આ વિકી પર ગુપ્ત સંજ્ઞા ફરી ગોઠવવા પર પ્રતિબંધ છે.",
        "passwordreset-emaildisabled": "આ વિકિ પર ઇમેઇલ સગવડ બંધ છે.",
        "passwordreset-username": "સભ્ય નામ:",
        "changeemail-submit": "ઈમેલ બદલો",
        "resettokens": "નિશાનીઓ ફરી ગોઠવો",
        "resettokens-no-tokens": "અહીં ફરી ગોઠવવા માટેનાં કોઇ ટોકન નથી",
-       "resettokens-legend": "નિશાનીઓ ફરી ગોઠવો",
        "resettokens-tokens": "નિશાનીઓ:",
        "resettokens-token-label": "$1 (હાલની કિંમત: $2)",
        "resettokens-watchlist-token": "[[Special:Watchlist|તમારી ધ્યાનસૂચિના પાનામાં ફેરફાર ]]ની વેબ ફીડ (Atom/RSS) નિશાની",
        "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": "આ પાનાનાં અગાઉનાં ફેરફારો",
        "logentry-delete-restore": "$1 {{GENDER:$2|પુનઃસંગ્રહ}} પાનું $3",
        "logentry-delete-event": "$1 એ {{PLURAL:$5|લૉગ ઘટના|$5 લૉગ ઘટનાઓ}} ની દ્રશ્યતા $3 પર {{GENDER:$2|બદલેલ}} છે: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|એ}} પૃષ્ઠ $3 પરના {{PLURAL:$5|એક પુનરાવર્તન|$5 પુનરાવર્તનો}}ની દૃષ્યતા બદલી: $4",
-       "logentry-delete-event-legacy": "$1 એ $3 પર ફેરફારની દૃશ્યતા બદલી",
+       "logentry-delete-event-legacy": "$1એ $3 પર લોગ ઘટનાઓની દૃશ્યતા {{GENDER:$2|બદલી}}",
        "logentry-delete-revision-legacy": "પૃષ્ઠ $3 પરના પુનરાવર્તનોની દૃશ્યતા $1 {{GENDER:$2|એ બદલી}}",
        "logentry-suppress-delete": "$1 એ $3 પાનું {{GENDER:$2|દબાવ્યું}}",
        "logentry-suppress-event": "$1  ખાનગી રીતે {{GENDER:$2|દ્વારા માહિતીની દૃશ્યતા}} $3 : $4 પર બદલાઈ {{PLURAL:$5 | લોગ ઘટના | $5 લોગ}}",
        "logentry-suppress-revision": "$1 {{GENDER:$2|એ છાનામાના}} પૃષ્ઠ $3 પરના {{PLURAL:$5|એક પુનરાવર્તન|$5 પુનરાવર્તનો}}ની દૃષ્યતા બદલી: $4",
-       "logentry-suppress-event-legacy": "$1એ ગુપ્ત રીતે $3 પર લોગ ઘટનાઓની દૃશ્યતા બદલી",
+       "logentry-suppress-event-legacy": "$1એ ગુપ્ત રીતે $3 પર લોગ ઘટનાઓની દૃશ્યતા {{GENDER:$2|બદલી}}",
        "logentry-suppress-revision-legacy": "$1 ગુપ્ત {{GENDER:$2|બદલેલ}} બદલાઈ પાનાં પર આવૃત્તિઓની દૃશ્યતા $3",
        "revdelete-content-hid": "માહિતી છુપાવી",
        "revdelete-summary-hid": "ફેરફારનો સારાંશ છુપાવ્યો",
index 9e33fee..46b89e1 100644 (file)
@@ -5,7 +5,8 @@
                        "Kaganer",
                        "MacTire02",
                        "Shimmin Beg",
-                       "아라"
+                       "아라",
+                       "Xð"
                ]
        },
        "tog-underline": "Cur linnaghyn fo chianglaghyn:",
        "march-date": "$1 Mayrnt",
        "april-date": "$1 Averil",
        "may-date": "$1 Boaldyn",
-       "june-date": "1 Mean Souree",
+       "june-date": "$1 Mean Souree",
        "july-date": "$1 Jerrey Souree",
        "august-date": "$1 Luanistyn",
        "september-date": "$1 Mean Fouyir",
        "unusedtemplates": "Clowanyn neuymmydit",
        "unusedtemplateswlh": "kianglaghyn elley",
        "randompage": "Duillag gyn tort",
+       "randomincategory-submit": "Gow",
        "randomredirect": "Aa-enmys gyn tort",
        "statistics": "Staydraa",
        "statistics-header-users": "Staydraa ymmydeyr",
index d328a4a..8bc83be 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": "סטטיסטיקות",
        "listgrouprights-namespaceprotection-namespace": "מרחב השם",
        "listgrouprights-namespaceprotection-restrictedto": "ההרשאה או ההרשאות המאפשרות למשתמשים לערוך",
        "trackingcategories": "קטגוריות מעקב",
-       "trackingcategories-summary": "×\93×£ ×\96×\94 ×\9b×\95×\9c×\9c ×¨×©×\99×\9e×\94 ×©×\9c ×§×\98×\92×\95ר×\99×\95ת ×\9eעק×\91, ×©× ×\95צר×\95ת ×\90×\95×\98×\95×\9e×\98×\99ת ×¢×\9cÖ¾×\99×\93×\99 ×ª×\95×\9bנת ×\9e×\93×\99×\94â\80\8fâ\80\8fÖ«Ö¾×\95×\99ק×\99. × ×\99ת×\9f ×\9cשנ×\95ת ×\90ת ×©×\9e×\95ת×\99×\94×\9f ×¢×\9câ\80\8fâ\80\8fÖ«־ידי שינוי הודעות המערכת הרלוונטיות במרחב השם \"{{ns:8}}\".",
+       "trackingcategories-summary": "×\93×£ ×\96×\94 ×\9b×\95×\9c×\9c ×¨×©×\99×\9e×\94 ×©×\9c ×§×\98×\92×\95ר×\99×\95ת ×\9eעק×\91, ×©× ×\95צר×\95ת ×\90×\95×\98×\95×\9e×\98×\99ת ×¢×\9cÖ¾×\99×\93×\99 ×ª×\95×\9bנת ×\9e×\93×\99×\94â\80\8fâ\80\8fÖ¾×\95×\99ק×\99. × ×\99ת×\9f ×\9cשנ×\95ת ×\90ת ×©×\9e×\95ת×\99×\94×\9f ×¢×\9câ\80\8fâ\80\8f־ידי שינוי הודעות המערכת הרלוונטיות במרחב השם \"{{ns:8}}\".",
        "trackingcategories-msg": "קטגוריית מעקב",
        "trackingcategories-name": "שם ההודעה",
        "trackingcategories-desc": "הקריטריון להכללה בקטגוריה",
        "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]]\"",
        "tooltip-pt-logout": "יציאה מהחשבון",
        "tooltip-pt-createaccount": "מומלץ ליצור חשבון ולהיכנס אליו; עם זאת, זו אינה חובה",
        "tooltip-ca-talk": "שיחה על דף זה",
-       "tooltip-ca-edit": "×\91×\90פשר×\95ת×\9b×\9d ×\9cער×\95×\9a ×\93×£ ×\96×\94. ×\90× ×\90 ×\94שת×\9eש×\95 ×\91×\9c×\97צ×\9f \"תצ×\95×\92×\94 ×\9eק×\93×\99×\9e×\94\" ×\9cפנ×\99 ×\94ש×\9e×\99ר×\94",
+       "tooltip-ca-edit": "ער×\99×\9bת ×\93×£ ×\96×\94 ×\91×\90×\9eצע×\95ת ×§×\95×\93 ×\95×\99ק×\99",
        "tooltip-ca-addsection": "הוספת פסקה חדשה",
        "tooltip-ca-viewsource": "דף זה מוגן.\nבאפשרותך לצפות בטקסט המקור שלו",
        "tooltip-ca-history": "גרסאות קודמות של דף זה",
        "pageinfo-robot-index": "מותר",
        "pageinfo-robot-noindex": "אסור",
        "pageinfo-watchers": "מספר העוקבים אחר הדף",
+       "pageinfo-visiting-watchers": "מספר העוקבים אחר הדף שמבקרים בעריכות האחרונות",
        "pageinfo-few-watchers": "פחות מ{{PLURAL:$1|עוקב אחד|־$1 עוקבים}}",
+       "pageinfo-few-visiting-watchers": "ייתכן שיש וייתכן שאין משתמש שעוקב אחר הדף ומבקר בעריכות האחרונות",
        "pageinfo-redirects-name": "מספר ההפניות לדף זה",
        "pageinfo-subpages-name": "מספר דפי המשנה של דף זה",
        "pageinfo-subpages-value": "$1 ({{PLURAL:$2|הפניה אחת|$2 הפניות}}; {{PLURAL:$3|דף רגיל אחד|$3 דפים רגילים}})",
        "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/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], או [[{{#Special:Redirect}}/user/101]].",
index fab2988..69c694f 100644 (file)
@@ -62,7 +62,8 @@
                        "Macofe",
                        "Ankita-ks",
                        "Sahilrathod",
-                       "Hindustanilanguage"
+                       "Hindustanilanguage",
+                       "राम प्रसाद जोशी"
                ]
        },
        "tog-underline": "कड़ियाँ अधोरेखन:",
        "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) हेतु टोकन",
        "content-json-empty-array": "रिक्त ऐरे",
        "duplicate-args-warning": "<strong>चेतावनी:</strong> [[:$1]] प्राचल \"$3\" के लिए [[:$2]] को एक से अधिक बार काम में ले रहा है। केवल अन्त में दिया गया मान ही काम में लिया जायेगा।",
        "duplicate-args-category": "टेम्पलेट कॉल में डुप्लिकेट तर्क का उपयोग करते हुए पन्ने",
-       "duplicate-args-category-desc": "पà¥\87à¤\9c à¤\9cà¥\88सà¥\87 à¤¤à¤°à¥\8dà¤\95à¥\8bà¤\82 à¤\95à¥\87 à¤¡à¥\81पà¥\8dलिà¤\95à¥\87à¤\9f à¤\95ा à¤\89पयà¥\8bà¤\97 à¤\95रनà¥\87 à¤µà¤¾à¤²à¥\87 à¤\9fà¥\87मà¥\8dपलà¥\87à¤\9f à¤\95à¥\89ल, à¤\9cà¥\88सà¥\87 <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> à¤\93à¥\88र <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
+       "duplicate-args-category-desc": "पà¥\87à¤\9c à¤\9cà¥\88सà¥\87 à¤¤à¤°à¥\8dà¤\95à¥\8bà¤\82 à¤\95à¥\87 à¤¡à¥\81पà¥\8dलिà¤\95à¥\87à¤\9f à¤\95ा à¤\89पयà¥\8bà¤\97 à¤\95रनà¥\87 à¤µà¤¾à¤²à¥\87 à¤\9fà¥\87मà¥\8dपलà¥\87à¤\9f à¤\95à¥\89ल, à¤\9cà¥\88सà¥\87 <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> à¤\94र <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''चेतावनी:''' इस पृष्ठ पर बहुत अधिक संख्या में कीमती पार्सर फ़ंक्शनों का प्रयोग किया गया है।\n\nइनका प्रयोग $2 से कम बार होना चाहिये, इस समय प्रयोग $1 बार {{PLURAL:$1|है|हैं}}।",
        "expensive-parserfunction-category": "कीमती पार्सर फ़ंक्शनों का अत्यधिक प्रयोग कर रहे पृष्ठ",
        "post-expand-template-inclusion-warning": "'''चेतावनी:''' साँचे जुड़ने की सीमा पार हो चुकी है।\nकुछ साँचे नहीं जुड़ेंगे।",
        "randomincategory-nopages": "[[:Category:$1|$1]] श्रेणी में कोई पृष्ठ नहीं हैं।",
        "randomincategory-category": "श्रेणी:",
        "randomincategory-legend": "श्रेणी में यादृच्छिक पृष्ठ",
+       "randomincategory-submit": "जायें",
        "randomredirect": "किसी एक पुनर्निर्देशन पर जाएँ",
        "randomredirect-nopages": "नामस्थान \"$1\" में कोई पुनर्निर्देशन नहीं हैं।",
        "statistics": "आँकड़े",
index de47187..ddb95b4 100644 (file)
        "resetpass-wrong-oldpass": "Sala nga temporaryo ukon subong nga pasword.\nMahimo nga madinalag-on mo nga nga gin-ilisan ang imo pasword ukon nagpangabay ka na sang bag-o nga temporaryo nga pasword.",
        "resetpass-temp-password": "Temporaryo nga pasword:",
        "passwordreset": "Liwaton ang pasword",
-       "passwordreset-legend": "Liwaton ang pasword",
        "passwordreset-disabled": "Ang mga pagliwat sang pasword gin-untat sa sini nga wiki.",
        "passwordreset-username": "Ngalan sang Manog-gamit\"",
        "passwordreset-domain": "Domeyn:",
index 40c3757..dfafa77 100644 (file)
@@ -30,7 +30,8 @@
                        "아라",
                        "Macofe",
                        "Fraxinus",
-                       "Srdjan m"
+                       "Srdjan m",
+                       "Teoo3"
                ]
        },
        "tog-underline": "Podcrtane poveznice",
        "october-date": "$1. listopada",
        "november-date": "$1. studenoga",
        "december-date": "$1. prosinca",
-       "pagecategories": "{{PLURAL:$1|Kategorija|Kategorije}}",
+       "pagecategories": "{{PLURAL:$1|Kategorija|Kategorije|Kategorija}}",
        "category_header": "Članci u kategoriji \"$1\"",
        "subcategories": "Potkategorije",
        "category-media-header": "Mediji u kategoriji \"$1\":",
        "moredotdotdot": "Više...",
        "morenotlisted": "Ovaj popis nije potpun.",
        "mypage": "Stranica",
-       "mytalk": "Moj razgovor",
+       "mytalk": "Razgovor",
        "anontalk": "Razgovor za ovu IP adresu",
        "navigation": "Orijentacija",
        "and": "&#32;i",
        "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.",
        "pt-login": "Prijavi se",
        "pt-login-button": "Prijavi se",
        "pt-createaccount": "Otvori novi suradnički račun",
-       "pt-userlogout": "odjavi se",
+       "pt-userlogout": "Odjavi se",
        "php-mail-error-unknown": "Nepoznata pogrješka u funkciji PHP-poruke()",
        "user-mail-no-addy": "Pokušaj slanja e-maila bez e-mail adrese.",
        "user-mail-no-body": "Pokušali ste poslati e-mail bez sadržaja ili s prekratkim sadržajem.",
        "passwordreset": "Ponovno postavi lozinku",
        "passwordreset-text-one": "Ispunite ovaj obrazac ako želite ponovno postaviti Vašu zaporku.",
        "passwordreset-text-many": "{{PLURAL:$1|Ispunite jedno od polja da biste dobili privremenu zaporku e-poštom.}}",
-       "passwordreset-legend": "Poništi zaporku",
        "passwordreset-disabled": "Poništavanje lozinke je onemogućeno na ovom wikiju.",
        "passwordreset-emaildisabled": "Funkcija e-pošte je onemogućena na ovom wikiju.",
        "passwordreset-username": "Suradničko ime:",
        "searchdisabled": "<p>Oprostite! Pretraga po cjelokupnoj bazi je zbog bržeg rada projekta {{SITENAME}} trenutačno onemogućena. Možete se poslužiti tražilicom Google.</p>",
        "search-error": "Greška prilikom pretrage: $1",
        "preferences": "Postavke",
-       "mypreferences": "Moje postavke",
+       "mypreferences": "Postavke",
        "prefs-edits": "Broj uređivanja:",
        "prefsnologintext2": "Molimo Vas prijavite se da biste promijenili postavke.",
        "prefs-skin": "Izgled",
        "randomincategory-invalidcategory": "\"$1\" nije valjano ime kategorije.",
        "randomincategory-category": "Kategorija:",
        "randomincategory-legend": "Slučajna stranica u kategoriji",
+       "randomincategory-submit": "Kreni",
        "randomredirect": "Slučajno preusmjeravanje",
        "randomredirect-nopages": "Nema preusmjeravanja u imenskom prostoru \"$1\".",
        "statistics": "Statistika",
        "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}}",
        "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}}",
        "usermessage-summary": "Ostavljanje poruke sustava.",
        "usermessage-editor": "Uređivač sistemskih poruka",
        "watchlist": "Moj popis praćenja",
-       "mywatchlist": "Moj popis praćenja",
+       "mywatchlist": "Popis praćenja",
        "watchlistfor2": "Za $1 $2",
        "nowatchlist": "Na Vašem popisu praćenja nema nijednog članka.",
        "watchlistanontext": "Molimo Vas prijavite se kako biste mogli vidjeti ili uređivati Vaš popis praćenih stranica.",
        "blanknamespace": "(Glavni)",
        "contributions": "Doprinosi {{GENDER:$1|suradnika|suradnice}}",
        "contributions-title": "Suradnički doprinosi za $1",
-       "mycontris": "Moji doprinosi",
+       "mycontris": "Doprinosi",
        "contribsub2": "Za {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Suradnički račun \"$1\" nije registriran.",
        "nocontribs": "Nema promjena koje udovoljavaju ovim kriterijima.",
        "tooltip-pt-logout": "Odjavi se",
        "tooltip-pt-createaccount": "Nudimo vam mogućnost da napravite račun i prijavite se, iako to nije nužno.",
        "tooltip-ca-talk": "Razgovor o stranici",
-       "tooltip-ca-edit": "Možete uređivati ovu stranicu. Koristite Pregled kako će izgledati prije nego što snimite.",
+       "tooltip-ca-edit": "Uredi ovu stranicu",
        "tooltip-ca-addsection": "Dodaj novi odlomak",
        "tooltip-ca-viewsource": "Ova stranica je zaštićena. Možete pogledati izvorni kod.",
        "tooltip-ca-history": "Ranije izmjene na ovoj stranici.",
        "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.",
        "expand_templates_remove_nowiki": "Ukloni <nowiki> tagove u rezultatima.",
        "expand_templates_generate_xml": "Prikaži XML stablo",
        "expand_templates_preview": "Vidi kako će izgledati",
+       "pagelang-select-lang": "Odaberi jezik",
        "mediastatistics": "Statistika datoteka",
        "mediastatistics-summary": "Slijede statistike postavljenih datoteka koje pokazuju zadnju inačicu datoteke. Starije ili izbrisane inačice nisu prikazane.",
        "headline-anchor-title": "Poveznica na ovaj odlomak",
        "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 301fa9c..64acf51 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Paul Beppler"
+                       "Paul Beppler",
+                       "Midnight Gambler"
                ]
        },
        "tog-underline": "Links (Verbinnunge) unnerstreiche:",
@@ -28,7 +29,7 @@
        "tog-shownumberswatching": "Oonzoohl der beobachtende Benutzer oonzeiche",
        "tog-oldsig": "Voarhandne Signatuar:",
        "tog-fancysig": "Signatuar als Wikitext behandle (ohne automatische Verlinkung)",
-       "tog-uselivepreview": "Voarschau sofort oonzeiche (experimentell)",
+       "tog-uselivepreview": "Voarschau sofort oonzeiche",
        "tog-forceeditsummary": "Warne, soweit beim Speichre die Zusammerfassung fehlt",
        "tog-watchlisthideown": "Eigne Beoorbeitunge in der Beobachtungslist ausblenne",
        "tog-watchlisthidebots": "Beoorbeitunge doorrich Bots in der Beobachtungslist ausblenne",
        "otherlanguages": "In annre Sproche",
        "redirectedfrom": "(Weitergeleitet von $1)",
        "redirectpagesub": "Weiterleitung",
+       "redirectto": "Weiterleitunge noh:",
        "lastmodifiedat": "Die Seit woor zuletzt am $1 um $2 Uhr geännert.",
        "viewcount": "Die Seit woard bisher {{PLURAL:$1|einmal|$1 mal}} abgeruff.",
        "protectedpage": "Geschützte Seit",
        "disclaimers": "Impressum",
        "disclaimerpage": "Project:Impressum",
        "edithelp": "Beoorbeitungshellef",
+       "helppage-top-gethelp": "Hellef",
        "mainpage": "Hauptseit",
        "mainpage-description": "Hauptseit",
        "policy-url": "Project:Richtlinie",
        "hidetoc": "Verberriche",
        "collapsible-collapse": "Inklappe",
        "collapsible-expand": "Ausklappe",
+       "confirmable-yes": "Jo",
+       "confirmable-no": "Nee",
        "thisisdeleted": "$1 oonsiehn orrer wiederherstelle?",
        "viewdeleted": "$1 oonzeiche?",
        "restorelink": "$1 {{PLURAL:$1|gelöschte Version|gelöschte Versione}}",
        "passwordreset": "Passwort zurücksetze",
        "passwordreset-text-one": "Füll das Formular aus, um den Passwort zurückzusetze.",
        "passwordreset-text-many": "{{PLURAL:$1|Füll en von der Felder aus, um en temporäres Passwort por E-Mail zugesandt zu bekomme.}}",
-       "passwordreset-legend": "Passwort zurücksetze",
        "passwordreset-disabled": "Das Zurücksetze von Passwörter woard in dem Wiki deaktiviert.",
        "passwordreset-emaildisabled": "Die E-Mail-Funktione worre uff dem Wiki deaktiviert.",
        "passwordreset-username": "Benutzernoome:",
        "resettokens": "Tokens zurücksetze",
        "resettokens-text": "Du kannst Tokens zurücksetze, wo dir den Zugriff uff bestimmte private Date ermöchliche, wo mit deinem Benutzerkonto hier verknüpft sind.\n\nDu sollst das nuar mache, wenn du verguckt die Tokens versiehntlich mit jemandem geteilt host orrer dein Konto gefährdet ist.",
        "resettokens-no-tokens": "Do gebts ken Tokens zum Zurücksetze.",
-       "resettokens-legend": "Tokens zurücksetze",
        "resettokens-tokens": "Tokens:",
        "resettokens-token-label": "$1 (aktueller Weart: $2)",
        "resettokens-watchlist-token": "Token für den Webfeed (Atom/RSS) von der [[Special:Watchlist|Ännrunge an Seite uff deiner Beobachtungslist]]",
        "currentrev": "Aktuelle Version",
        "currentrev-asof": "Aktuelle Version vom $2, $3 Uhr",
        "revisionasof": "Version vom $2, $3 Uhr",
-       "revision-info": "Version vom $4, $5 Uhr von $2",
+       "revision-info": "Version vom $4, $5 Uhr von {{GENDER:$6|$2}}$7",
        "previousrevision": "← Nächstältre Version",
        "nextrevision": "Nächstjüngre Version →",
        "currentrevisionlink": "Aktuelle Version",
        "notextmatches": "Ken Üwereinstimmunge mit Inhalte",
        "prevn": "{{PLURAL:$1|voarhericher|vorheriche $1}}",
        "nextn": "{{PLURAL:$1|nächster|nächste $1}}",
+       "prev-page": "vorrich Seit",
+       "next-page": "nächste Seit",
        "prevn-title": "{{PLURAL:$1|Voarheriches Ergebnis|Vorherige $1 Ergebnisse}}",
        "nextn-title": "{{PLURAL:$1|Voarheriches Ergebnis|Vorherige $1 Ergebnisse}}",
        "shown-title": "Zeiche $1 {{PLURAL:$1|Ergebnis|Ergebnisse}} pro Seit",
        "search-result-category-size": "{{PLURAL:$1|1 Seit|$1 Seite}} ({{PLURAL:$2|1 Unnerkategorie|$2 Unnerkategorie}}, {{PLURAL:$3|1 Datei|$3 Dateie}})",
        "search-redirect": "(Weiterleitung von „$1“)",
        "search-section": "(Abschnitt $1)",
+       "search-category": "(Kategorie $1)",
        "search-file-match": "(treffende Dateiinhalte)",
        "search-suggest": "Host du gemeent „$1“?",
        "search-interwiki-caption": "Schwesterprojekte",
        "randomincategory": "Zufälliche Seit von en Kategorie",
        "randomincategory-invalidcategory": "\"$1\" ist ken gülticher Kategorieenoome.",
        "randomincategory-nopages": "Es gebt kene Seite in [[:Category:$1]].",
+       "randomincategory-category": "Kategorie:",
        "randomredirect": "Zufällich Weiterleitung",
        "randomredirect-nopages": "Im Noomeraum „$1“ sind ken Weiterleitunge voarhand.",
        "statistics": "Statistik",
        "nmembers": "{{PLURAL:$1|1 Eintrooch|$1 Einträche}}",
        "nmemberschanged": "$1 → {{PLURAL:$2|En Mitglied|$2 Mitglieder}}",
        "nrevisions": "{{PLURAL:$1|1 Beoorbeitung|$1 Beoorbeitunge}}",
-       "nviews": "{{PLURAL:$1|1 Abfroch|$1 Abfroche}}",
        "nimagelinks": "Verwendt uff {{PLURAL:$1|en Seit|$1 Seite}}",
        "ntransclusions": "Verwendt uff {{PLURAL:$1|en Seit|$1 Seite}}",
        "specialpage-empty": "Do sind aktuell ken zutreffende Einträche voarhand.",
        "querypage-disabled": "Die Spezialseit woard aus Gründe von der Leistungserhaltung deaktiviert.",
        "booksources": "ISBN-Suche",
        "booksources-search-legend": "Such noh Bezugsquelle für Bücher",
+       "booksources-search": "Suche",
        "booksources-text": "Dies ist en List mit Links zu Internetseite, wo neie und gebrauchte Bücher verkoofe. Dort kann das ooch weitre Informationen üwer die Bücher gebe. {{SITENAME}} ist mit kenem von der Oonbieter geschäftlich verbünd.",
        "booksources-invalid-isbn": "Vermutlich ist die ISBN ungültich.\nBittschön prüf, ob die korrekt von der Quell üwertroohr woard.",
        "specialloguserlabel": "Ausführender Benutzer:",
        "delete-warning-toobig": "Die Seit hot mit meahr wie $1 {{PLURAL:$1|Version|Versione}} en seahr lange Versionsgeschicht. Das Abwische kann zu Störunge im Datebankbetrieb führe.",
        "deleting-backlinks-warning": "'''Warnung:''' Es verweise noch [[Special:WhatLinksHere/{{FULLPAGENAME}}|annre Seite]] uff die zu abwischende Seit orrer die Seit ist noch in en anner Platz ingebund.",
        "rollback": "Zurücksetze von der Ännrunge",
-       "rollback_short": "Zurücksetze",
        "rollbacklink": "Zurücksetze",
        "rollbacklinkcount": "{{PLURAL:$1|En Version|$1 Versione}} zurücksetze",
        "rollbacklinkcount-morethan": "Meahr wie {{PLURAL:$1|en Version|$1 Versione}} zurücksetze",
        "import": "Seite importiere",
        "importinterwiki": "Transwiki-Import",
        "import-interwiki-text": "Wähl en Wiki und en Seit für se importiere.\nDie Versionsdate und Benutzernoome bleibe dabei erhalt.\nAll Transwiki-Import-Aktione werre im [[Special:Log/import|Import-Logbuch]] protokolliert.",
+       "import-interwiki-sourcewiki": "Quellwiki:",
        "import-interwiki-history": "Alle Versione von der Seit importiere",
        "import-interwiki-templates": "Alle Vorlooche einschliesse",
        "import-interwiki-submit": "Importiere",
-       "import-interwiki-namespace": "Zielnoomeraum:",
-       "import-interwiki-rootpage": "Zielstammseit (optional):",
        "import-upload-filename": "Dateinoome:",
        "import-comment": "Grund:",
        "importtext": "Bittschön die Datei üwer die Spezialseit [[Special:Export|Exportfunktion]] aus dem Quellwiki exportiere.\nDie uff dem lokale Rechner (Komputadoar) speichre und donoh hier hochloode.",
        "import-rootpage-nosubpage": "Im Noomeraum \"$1\" von der Stammseit sind ken Unnerseite erlaubt.",
        "importlogpage": "Import-Logbuch",
        "importlogpagetext": "Administrativer Import von Seite mit Versionsgeschicht von annre Wikis.",
-       "import-logentry-upload": "importierte \"[[$1]]\" von en Datei",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|Version|Versione}}",
-       "import-logentry-interwiki": "importierte \"$1\" (Transwiki)",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|Version|Versione}} von $2",
        "javascripttest": "JavaScript-Test",
-       "javascripttest-title": "$1-Tests werre doorrichgeführt",
        "javascripttest-pagetext-noframework": "Die Seit ist JavaSkript-Tests voarbehalt.",
        "javascripttest-pagetext-unknownframework": "Unbekanntes Framework \"$1\".",
        "javascripttest-pagetext-frameworks": "Bittschön wähl en von der follichende Prüfumgebunge aus: $1",
        "javascripttest-pagetext-skins": "Wähl en Benutzeroberfläch zur Doorrichführung von der Test aus:",
        "javascripttest-qunit-intro": "Sieh die [$1 Dokumentation zu Tests] uff mediawiki.org",
-       "javascripttest-qunit-heading": "MediaWiki-JavaSkript-QUnit-Tester",
        "tooltip-pt-userpage": "Dein Benutzerseit",
        "tooltip-pt-anonuserpage": "Benutzerseit von der IP-Adress von der aus du Ännrunge doorrichführst",
        "tooltip-pt-mytalk": "Dein Diskussionsseit",
        "watchlisttools-edit": "normal beoorbeite",
        "watchlisttools-raw": "im Listeformat beoorbeite (Import/Export)",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|Diskussion]])",
-       "unknown_extension_tag": "Unbekanntes Parser-Tag \"$1\"",
        "duplicate-defaultsort": "Achtung: Der Sortierungsschlüssel „$2“ üwerschreibt den voarher verwenndte Schlüssel „$1“.",
        "version": "Version",
        "version-extensions": "Installierte Erweitrunge",
        "version-entrypoints": "URLs von der Einstiechspunkt",
        "version-entrypoints-header-entrypoint": "Einstiechspunkt",
        "version-entrypoints-header-url": "URL",
+       "version-libraries-library": "Bibliothek",
+       "version-libraries-version": "Version",
+       "version-libraries-license": "Lizenz",
+       "version-libraries-description": "Beschreibung",
+       "version-libraries-authors": "Autore",
        "redirect": "Weiterleitung uff Benutzerseit, Seit, Seiteversion orrer Datei",
        "redirect-legend": "Weiterleitung uff en Benutzerseit, Seit, Seiteversion orrer Datei",
        "redirect-summary": "Die Spezialseit leitet uff en Benutzerseit (numerische Benutzerkennung oongeb), Seit (Seitekennung oongeb), Seiteversion (Versionskennung oongeb) orrer Datei (Dateinoome oongeb) weiter. Benutzung: [[{{#Special:Redirect}}/user/101]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] orrer [[{{#Special:Redirect}}/file/Example.jpg]].",
        "tags-description-header": "Vollständiche Beschreibung",
        "tags-active-header": "Aktiv?",
        "tags-hitcount-header": "Markierte Ännrunge",
+       "tags-actions-header": "Aktione",
        "tags-active-yes": "J",
        "tags-active-no": "Ne, nein",
        "tags-edit": "Beoorbeite",
        "tags-hitcount": "$1 {{PLURAL:$1|Ändrung|Ändrunge}}",
+       "tags-create-reason": "Grund:",
+       "tags-create-submit": "Erstelle",
+       "tags-delete-reason": "Grund:",
+       "tags-activate-reason": "Grund:",
+       "tags-deactivate-reason": "Grund:",
+       "tags-edit-reason": "Grund:",
        "comparepages": "Seite vergleiche",
        "compare-page1": "Seit 1",
        "compare-page2": "Seit 2",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|ännerte}} die Gruppezugehörigkeit für $3",
        "logentry-rights-autopromote": "$1 woard automatisch von $4 zu $5 {{GENDER:$2|zugeordnet}}",
        "rightsnone": "(ken)",
+       "feedback-adding": "Rückmeldung weard zur Seit hinzugefücht …",
+       "feedback-back": "Zurück",
+       "feedback-bugcheck": "Super! Bittschön üwerprüf noch, ob das sich hierbei net um en schon [$1 bekannte Fehler] handelt.",
+       "feedback-bugnew": "Ich honn das üwerprüft. Den neie Fehler melde.",
        "feedback-bugornote": "Soweit du ganz detalhiert en technisches Problem beschreiben möchst, meld bittschön [$1 en Fehler].\nAnnerfalls kannst du ooch das do unne stehende ganz enfache Formular benutze. Dein Kommentar weard, zusammer mit deinem Benutzernoome und der Version von der von dir verwenndt Webbrowsers sowie Betriebssystems, uff der Seit \"[$3 $2]\" hinzugefücht.",
-       "feedback-subject": "Betreff:",
-       "feedback-message": "Nachricht:",
        "feedback-cancel": "Abbreche",
-       "feedback-submit": "Rückmeldung schicke",
-       "feedback-adding": "Rückmeldung weard zur Seit hinzugefücht …",
+       "feedback-close": "Erledicht (fertich)",
+       "feedback-error-title": "Fehler",
        "feedback-error1": "Fehler: Unbekanntes Ergebnis von der API",
        "feedback-error2": "Fehler: Beoorbeitung gescheitert",
        "feedback-error3": "Fehler: Ken Antwort von der API",
+       "feedback-message": "Nachricht:",
+       "feedback-subject": "Betreff:",
+       "feedback-submit": "Rückmeldung schicke",
        "feedback-thanks": "Dankschön. Dein Rückmeldung woard uff der Seit \"[$2 $1]\" gespeichert.",
-       "feedback-close": "Erledicht (fertich)",
-       "feedback-bugcheck": "Super! Bittschön üwerprüf noch, ob das sich hierbei net um en schon [$1 bekannte Fehler] handelt.",
-       "feedback-bugnew": "Ich honn das üwerprüft. Den neie Fehler melde.",
        "searchsuggest-search": "Such",
        "searchsuggest-containing": "wo enthält …",
        "api-error-badaccess-groups": "Du host net die Berechtichung Dateie in des Wiki hochzuloode.",
        "expand_templates_remove_nowiki": "<nowiki>-Tags in der Ausgäb unnerdrücke",
        "expand_templates_generate_xml": "XML-Parser-Boom zeiche",
        "expand_templates_generate_rawhtml": "Rohes HTML oonzeiche",
-       "expand_templates_preview": "Voarschau"
+       "expand_templates_preview": "Voarschau",
+       "pagelang-name": "Seit",
+       "pagelang-language": "Sproch",
+       "mediastatistics-table-mimetype": "MIME-Typ",
+       "mediastatistics-header-unknown": "Unbekannt",
+       "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Videos",
+       "mediastatistics-header-office": "Office",
+       "special-characters-title-endash": "en dash",
+       "special-characters-title-emdash": "em dash"
 }
index a841c47..b67c507 100644 (file)
        "passwordreset": "Jelszó törlése",
        "passwordreset-text-one": "A jelszó átmeneti beállításához töltsd ki az űrlapot.",
        "passwordreset-text-many": "{{PLURAL:$1|Az átmeneti jelszó elküldéséhez töltsd ki az alábbi mezők egyikét.}}",
-       "passwordreset-legend": "Új jelszó kérése",
        "passwordreset-disabled": "Új jelszó kérése nem engedélyezett ezen a wikin.",
        "passwordreset-emaildisabled": "Az e-mail funkció le van tiltva ezen a wikin.",
        "passwordreset-username": "Felhasználónév:",
        "resettokens": "Tokenek törlése",
        "resettokens-text": "Újra generálhatod a tokeneket, amely a fiókodhoz rendelt bizonyos magánadatokhoz enged hozzáférést.\n\nEzt akkor érdemes használnod, hogy véletlenül megosztottad a tokeneket valakivel, vagy ha valaki feltörte a fiókodat.",
        "resettokens-no-tokens": "Nincs újragenerálható token.",
-       "resettokens-legend": "Tokenek újragenerálása",
        "resettokens-tokens": "Tokenek:",
        "resettokens-token-label": "$1 (jelenlegi érték: $2)",
        "resettokens-watchlist-token": "Kulcs egy hírcsatornához (Atom/RSS), ami a [[Special:Watchlist|figyelőlistádon lévő lapok változásaiból]] készül",
        "randomincategory-nopages": "Nincsenek lapok a [[:Category:$1|$1]] kategóriában.",
        "randomincategory-category": "Kategória:",
        "randomincategory-legend": "Véletlen lap a kategóriából",
+       "randomincategory-submit": "Menj",
        "randomredirect": "Átirányítás találomra",
        "randomredirect-nopages": "A(z) „$1” névtérben nincsenek átirányítások.",
        "statistics": "Statisztika",
        "rollback-success": "$1 szerkesztéseit visszaállítottam $2 utolsó változatára.",
        "sessionfailure-title": "Munkamenethiba",
        "sessionfailure": "Úgy látszik, hogy probléma van a bejelentkezési munkameneteddel;\nez a művelet a munkamenet eltérítése miatti óvatosságból megszakadt.\nKérjük, hogy nyomd meg a „vissza” gombot, és töltsd le újra az oldalt, ahonnan jöttél, majd próbáld újra.",
+       "changecontentmodel": "A lap tartalommodelljének megváltoztatása",
+       "changecontentmodel-legend": "Tartalommodell megváltoztatása",
+       "changecontentmodel-title-label": "Lapcím",
+       "changecontentmodel-model-label": "Új tartalommodell",
+       "changecontentmodel-reason-label": "Indoklás:",
+       "changecontentmodel-success-title": "A tartalommodell megváltozott",
+       "changecontentmodel-success-text": "A(z) [[:$1]] lap tartalommodellje sikeresen megváltoztatva.",
+       "changecontentmodel-cannot-convert": "A(z) [[:$1]] lap nem alakítható át $2 típusúvá.",
+       "changecontentmodel-title-cantexist": "Nem lehet oldal a(z) $1 helyen.",
+       "changecontentmodel-nodirectediting": "A(z) $1 tartalommodell nem támogatja a közvetlen szerkesztést",
+       "log-name-contentmodel": "Tartalommodell-változások naplója",
+       "log-description-contentmodel": "Egy lap tartalommodelljéhez kapcsolódó események",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|megváltoztatta}} a(z) $3 lap tartalommodeljét erről: „$4” erre: „$5”",
+       "logentry-contentmodel-change-revertlink": "visszaállítás",
+       "logentry-contentmodel-change-revert": "visszaállítás",
        "protectlogpage": "Lapvédelmi napló",
        "protectlogtext": "Alább látható a lapvédelemmel kapcsolatos változtatások listája.\nA [[Special:ProtectedPages|védett lapok listáján]] megtekintheted a jelenleg is érvényben lévő védelmeket.",
        "protectedarticle": "levédte a(z) [[$1]] lapot",
        "tooltip-pt-logout": "Kijelentkezés",
        "tooltip-pt-createaccount": "Arra bíztatunk, hogy hozz létre egy fiókot, és jelentkezz be, azonban ez nem kötelező",
        "tooltip-ca-talk": "Az oldal tartalmának megvitatása",
-       "tooltip-ca-edit": "Te is szerkesztheted ezt az oldalt. Mentés előtt használd az előnézet gombot.",
+       "tooltip-ca-edit": "A lap szerkesztése",
        "tooltip-ca-addsection": "Új szakasz nyitása",
        "tooltip-ca-viewsource": "Ez egy védett lap. Ide kattintva megnézheted a forrását.",
        "tooltip-ca-history": "A lap korábbi változatai",
        "pageinfo-robot-index": "Engedélyezett",
        "pageinfo-robot-noindex": "Nem engedélyezett",
        "pageinfo-watchers": "Figyelők száma",
+       "pageinfo-visiting-watchers": "A lapot figyelők száma, akik nézték a friss változtatásait",
        "pageinfo-few-watchers": "Kevesebb mint $1 szerkesztő figyeli",
        "pageinfo-redirects-name": "Átirányítások száma erre a lapra",
        "pageinfo-subpages-name": "A lap allapjai",
        "version-libraries": "Telepített könyvtárak",
        "version-libraries-library": "Könyvtár",
        "version-libraries-version": "Verzió",
+       "version-libraries-license": "Licenc",
+       "version-libraries-description": "Leírás",
+       "version-libraries-authors": "Szerzők",
        "redirect": "Átirányítás fájl, szerkesztő, oldal vagy oldalváltozat alapján",
        "redirect-legend": "Átirányítás egy fájlra vagy lapra",
        "redirect-summary": "Ez a speciális lap átirányít egy fájlra (megadott fájlnévvel), lapra (megadott lapváltozat- vagy lapazonosító számmal) vagy felhasználóra (felhasználó azonosítószáma alapján). Használat: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] vagy [[{{#Special:Redirect}}/user/101]].",
index 8754712..8a542a4 100644 (file)
        "no-null-revision": "Non ha potite crear un nove version vacue del le pagina \"$1\"",
        "badtitle": "Titulo invalide",
        "badtitletext": "Le titulo de pagina requestate es invalide, vacue, o un titulo interlingual o interwiki incorrectemente ligate.\nEs possibile que illo contine un o plure characteres que non pote esser usate in titulos.",
+       "title-invalid-empty": "Le titulo de pagina requestate es vacue o contine solmente le nomine de un spatio de nomines.",
+       "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.",
        "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.",
        "passwordreset": "Reinitialisar contrasigno",
        "passwordreset-text-one": "Completa iste formulario pro reinitialisar tu contrasigno.",
        "passwordreset-text-many": "{{PLURAL:$1|Completa un de iste campos pro reciper un contrasigno temporari in e-mail.}}",
-       "passwordreset-legend": "Reinitialisar contrasigno",
        "passwordreset-disabled": "Le reinitialisation de contrasignos ha essite disactivate in iste wiki.",
        "passwordreset-emaildisabled": "Le functionalitate de e-mail ha essite disactivate in iste wiki.",
        "passwordreset-username": "Nomine de usator:",
        "resettokens": "Reinitialisar indicios",
        "resettokens-text": "Hic tu pote reinitialisar le indicios que permitte le accesso a certe datos private associate a tu conto.\n\nTu deberea facer lo si tu los ha accidentalmente dividite con un altere persona o si tu conto ha essite compromittite.",
        "resettokens-no-tokens": "Il non ha indicios a reinitialisar.",
-       "resettokens-legend": "Reinitialisar indicios",
        "resettokens-tokens": "Indicios:",
        "resettokens-token-label": "$1 (valor actual: $2)",
        "resettokens-watchlist-token": "Indicio pro syndication web (Atom/RSS) de [[Special:Watchlist|modificationes a paginas in tu observatorio]]",
        "nmembers": "$1 {{PLURAL:$1|membro|membros}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|membro|membros}}",
        "nrevisions": "$1 {{PLURAL:$1|version|versiones}}",
-       "nviews": "$1 {{PLURAL:$1|visita|visitas}}",
        "nimagelinks": "Usate in $1 {{PLURAL:$1|pagina|paginas}}",
        "ntransclusions": "usate in $1 {{PLURAL:$1|pagina|paginas}}",
        "specialpage-empty": "Il non ha resultatos pro iste reporto.",
index fb03d47..77914a0 100644 (file)
        "disclaimers": "Penyangkalan",
        "disclaimerpage": "Project:Penyangkalan umum",
        "edithelp": "Bantuan penyuntingan",
-       "helppage-top-gethelp": "Tolong",
+       "helppage-top-gethelp": "Bantuan",
        "mainpage": "Halaman Utama",
        "mainpage-description": "Halaman Utama",
        "policy-url": "Project:Kebijakan",
        "passwordreset": "Ubah kata sandi",
        "passwordreset-text-one": "Lengkapi formulir ini untuk menyetel ulang kata sandi.",
        "passwordreset-text-many": "{{PLURAL:$1|Isi salah satu kotak di bawah ini untuk mendapatkan kata sandi sementara melalui surel.}}",
-       "passwordreset-legend": "Setel ulang kata sandi",
        "passwordreset-disabled": "Penyetelan ulang sandi telah dimatikan di wiki ini.",
        "passwordreset-emaildisabled": "Fitur surel telah dinonaktifkan pada wiki ini.",
        "passwordreset-username": "Nama pengguna:",
        "resettokens": "Ubah 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": "Tidak ada token untuk di-reset.",
-       "resettokens-legend": "Reset token",
        "resettokens-tokens": "Token:",
        "resettokens-token-label": "$1 (nilai saat ini: $2)",
        "resettokens-watchlist-token": "Token untuk sindikasi web (Atom/RSS) dari [[Special:Watchlist|perubahan di daftar pantauan Anda]]",
        "randomincategory-nopages": "Tidak ada halaman dalam [[:Category:$1]].",
        "randomincategory-category": "Kategori:",
        "randomincategory-legend": "Halaman sembarang di kategori",
+       "randomincategory-submit": "Tuju ke",
        "randomredirect": "Pengalihan sembarang",
        "randomredirect-nopages": "Tak terdapat pengalihan pada ruang nama \"$1\".",
        "statistics": "Statistik",
        "tooltip-pt-logout": "Keluar log",
        "tooltip-pt-createaccount": "Anda dianjurkan untuk membuat akun dan masuk log; meskipun, hal itu tidak diwajibkan",
        "tooltip-ca-talk": "Pembicaraan halaman isi",
-       "tooltip-ca-edit": "Anda dapat menyunting halaman ini. Gunakan tombol pratayang sebelum menyimpan",
+       "tooltip-ca-edit": "Sunting halaman ini",
        "tooltip-ca-addsection": "Mulai bagian baru",
        "tooltip-ca-viewsource": "Halaman ini dilindungi. Anda hanya dapat melihat sumbernya.",
        "tooltip-ca-history": "Revisi sebelumnya dari halaman ini.",
index b342d8b..a31224a 100644 (file)
        "passwordreset": "Isaad manen ti kontrasenias",
        "passwordreset-text-one": "Kompletuen daytoy a porma tapno makaawat iti temporario a kontrasenias babaen ti esurat.",
        "passwordreset-text-many": "{{PLURAL:$1|Agpunno ti maysa kadagiti pagikabilan tapno makaawat ti temporario a kontrasenias babaen ti esurat.}}",
-       "passwordreset-legend": "Isaad manen ti kontrasenias",
        "passwordreset-disabled": "Nabaldado dagiti panangisaad manen ti kontrasenias iti daytoy a wiki.",
        "passwordreset-emaildisabled": "Dagiti langa ti esurat ket nabaldado iti daytoy a wiki.",
        "passwordreset-username": "Nagan ti agar-aramat:",
        "resettokens": "Isaad manen dagiti tandaan",
        "resettokens-text": "Mabalinmo nga isaad manen dagiti tandaan a mangpalubos ti panagserrek ti naisangayan a pribado datos a mainaig ti pakabilangam ditoy.\n\nAramidem daytoy no aksidente nga inbingaymo dagitoy iti sabali wenno ti pakabilangam ket nakomprimiso.",
        "resettokens-no-tokens": "Awan dagiti maisaad manen a tandaan.",
-       "resettokens-legend": "Isaad manen dagiti tandaan",
        "resettokens-tokens": "Dagiti tandaan:",
        "resettokens-token-label": "$1 (agdama a pateg: $2)",
        "resettokens-watchlist-token": "Tandaan para iti pakan ti web (Atom/RSS) kadagiti [[Special:Watchlist|panagbalbaliw ti pampanid iti listaan ti bambantayam]]",
        "yourdiff": "Paggigiddiatan",
        "copyrightwarning": "Pangngaasi a laglagipen nga amin a kontribusion iti {{SITENAME}} ket naikeddeng a naipablaak babaen ti babaen ti $2 (kitaen ti $1 para kadagiti salaysay). \nNo dimo kayat a ti sinuratmo ket maurnos nga awanan-asi ken maiwaras nga awan sungsungbatan kenka, saanmon nga ited ditoy.<br />\nIkarkarim pay kadakami a bukodmo a sinurat daytoy, wenno kinopia manipud ti publiko a dominio wenno ti kapadpadana a nawaya a nagtaudan.\n<strong>Saan a mangited ti nakarbengan ti kopia nga obra no awan iti pammalubos!</strong>",
        "copyrightwarning2": "Pangngaasi a laglagipen nga amin a kontribusion iti {{SITENAME}} ket mabalin a maurnos, mabaliwan, wenno ikkaten dagiti sabali a kontributor.\nNo dimo kayat a ti sinuratmo ket maurnos nga awanan-asi ken maiwaras nga awan sungsungbatan kenka, saanmon nga ited ditoy.<br />\nIkarkarim pay kadakami a bukodmo a sinurat daytoy, wenno kinopia manipud ti publiko a dominio wenno ti kapadpadana a nawaya a nagtaudan. (kitaen ti $1 para kadagiti salaysay).\n<strong>Saan a mangited ti nakarbengan ti kopia nga obra no awan iti pammalubos!</strong>",
+       "editpage-cannot-use-custom-model": "Saan a mabaliwan ti modelo ti linaon iti daytoy a panid.",
        "longpageerror": "<strong>Biddut: Ti testo nga intedmo ket {{PLURAL:$1|maysa a kilobyte|$1 kilkilobyte}} ti katiddogna, nga at-atiddog ngem ti kangatuan iti  {{PLURAL:$2|maysa a kilobyte|$2 kilkilobyte}}.</strong>\nSaan a mabalin a maidulin.",
        "readonlywarning": "<strong>Ballaag: Narikepan ti database tapno mataripato, isu a saanmo a mabalin nga idulin dagita inurnosmo tattan.</strong>\nMabalinmo ti agkopia ken agipegket ti testom iti papeles ti testo ken idulinmo daytoy intono madamdama.\n\nTi administrador a nangrikep ket nangited iti daytoy a palawag: $1",
        "protectedpagewarning": "<strong>Ballaag: Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan iti gundaway nga administrador ti makaurnos ditoy.</strong>\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
        "stub-threshold-disabled": "Nabaldado",
        "recentchangesdays": "Al-aldaw nga ipakita iti kaudian a balbaliw:",
        "recentchangesdays-max": "Kapaut nga $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}}",
-       "recentchangescount": "Bilang dagiti inurnos nga ipakita babaen ti kinasigud:",
+       "recentchangescount": "Bilang dagiti inurnos nga ipakita babaen ti kasisigud:",
        "prefs-help-recentchangescount": "Daytoy ket mangiraman iti kaudian a balbaliw, dagiti pakasaritaan ti panid, ken dagiti listaan.",
        "prefs-help-watchlist-token2": "Daytoy ti sekreto a tulbek iti pakan ti web iti listaan ti bambantayam.\nTi sinoman a makaammo daytoy ket mabalinda a basaen ti listaan ti bambantayam, isu a saanmo nga ipabingay.\nNo masapulmo, [[Special:ResetTokens|mabalinmo nga isaad manen]].",
        "savedprefs": "Naidulinen dagiti kakaykayatam.",
        "prefs-files": "Dagiti papeles",
        "prefs-custom-css": "Naiduma a CSS",
        "prefs-custom-js": "Naiduma a JavaScript",
-       "prefs-common-css-js": "Bingay a CSS/JavaScript dagiti amin a kudil:",
+       "prefs-common-css-js": "Bingay a CSS/JavaScript para kadagiti amin a kudil:",
        "prefs-reset-intro": "Mabalinmo nga usaren daytoy a panid tapno maisublim dagita kakaykayatam iti kasisigud iti daytoy a wiki.\nNgem saanto a mabalinen nga ipasubli.",
        "prefs-emailconfirm-label": "Pammasingked ti esurat:",
        "youremail": "Esurat:",
        "randomincategory-nopages": "Awan ti pampanid iti kategoria ti [[:Category:$1]].",
        "randomincategory-category": "Kategoria:",
        "randomincategory-legend": "Pugto a panid iti kategoria",
+       "randomincategory-submit": "Inkan",
        "randomredirect": "Pugto a baw-ing",
        "randomredirect-nopages": "Awan dagiti baw-ing iti daytoy a nagan ti espasio ti \"$1\".",
        "statistics": "Estadistika",
        "booksources-search": "Biruken",
        "booksources-text": "Dita baba ket listaan dagiti silpo ti sabali a sitio nga aglaklako ti baro ken saan a nausar a liblibro, ken mabalin nga addaan pay iti adu a pakaammo a maipanggep kadagiti libro a birbirukem:",
        "booksources-invalid-isbn": "Ti naited nga ISBN ket kasla saan nga umisu; kitaen dagiti biddut ti panagtulad manipud ti kasisigud a taudan.",
-       "specialloguserlabel": "Perpormer:",
+       "specialloguserlabel": "Nangitungpal:",
        "speciallogtitlelabel": "Puntaan (titulo wenno agar-aramat):",
        "log": "Dagiti listaan",
        "all-logs-page": "Amin a listaan a publiko",
        "version-libraries": "Dagiti naisaad a biblioteka",
        "version-libraries-library": "Biblioteka",
        "version-libraries-version": "Bersion",
+       "version-libraries-license": "Lisensia",
+       "version-libraries-description": "Deskripsion",
+       "version-libraries-authors": "Dagiti mannurat",
        "redirect": "Baw-ing babaen ti papeles, agar-aramat, panid wenno ID ti rebision",
        "redirect-legend": "Ibaw-ing iti papeles wenno panid",
        "redirect-summary": "Daytoy nga espesial a panid ket maibaw-ing iti papeles (iti nagan ti papeles), ti panid (iti ID ti rebision wenno ID ti panid), wenno ti panid ti agar-aramat (iti numeriko nga ID ti agar-aramat). Panagusar:\n[[{{#Special:Redirect}}/file/Example.jpg]], \n[[{{#Special:Redirect}}/page/64308]], \n[[{{#Special:Redirect}}/revision/328429]], wenno\n[[{{#Special:Redirect}}/user/101]].",
        "tags-activate-reason": "Rason:",
        "tags-activate-not-found": "Awan ti etiketa ti \"$1\".",
        "tags-deactivate-reason": "Rason:",
+       "tags-apply-not-allowed-one": "Saan a maipalubos a manual a maipakat ti tiketa ti \"$1\".",
+       "tags-apply-not-allowed-multi": "Saan a maipalubos a manual a maipakat {{PLURAL:$2|ti sumaganad nga etiketa|dagiti sumagand nga etiketa}}: $1",
        "tags-update-remove-not-allowed-one": "Ti etiketa ti \"$1\" ket saan a maipalubos a maikkat.",
        "tags-update-remove-not-allowed-multi": "{{PLURAL:$2|Ti sumaganad nga etiketa|Dagiti sumaganad nga etiketa}} ket saan a maipalubos a manual a maikkat: $1",
        "tags-edit-title": "Urnosen dagiti etiketa",
        "htmlform-cloner-required": "Saan a basbassit ngem maysa a pateg ti masapul.",
        "sqlite-has-fts": "Ti $1 nga addaan iti suporta ti panagbiruk ti napno a testo",
        "sqlite-no-fts": "Ti $1 nga awan iti suporta ti panagbiruk ti napno a testo",
-       "logentry-delete-delete": "Ni $1 ket {{GENDER:$2|inikkatna}} ti panid ti $3",
+       "logentry-delete-delete": "{{GENDER:$2|Inikkat}} ni $1 ti panid ti $3",
        "logentry-delete-restore": "Ni $1 ket {{GENDER:$2|insublina}} ti panid ti $3",
        "logentry-delete-event": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti panagkita {{PLURAL:$5|iti listaan ti pasamak |dagiti $5 a listaan ti pasamak }} iti $3: $4",
        "logentry-delete-revision": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti panagkita  {{PLURAL:$5|iti panagbaliw |dagiti $5 a panagbaliw}} iti panid $3: $4",
        "revdelete-restricted": "naipakat dagiti panangigawid kadagiti administrador",
        "revdelete-unrestricted": "inikkat dagiti panangigawid para kadagiti administrador",
        "logentry-merge-merge": "Ni $1 ket {{GENDER:$2|intiponna}} ti $3 iti $4 (kadagiti rebision aginggana iti $5)",
-       "logentry-move-move": "Ni $1 ket {{GENDER:$2|inyalisna}} ti panid $3 iti $4",
-       "logentry-move-move-noredirect": "Ni $1 ket {{GENDER:$2|inyalisna}} ti panid ti $3 iti $4 a saan a nangibati ti baw-ing",
-       "logentry-move-move_redir": "Ni $1 ket {{GENDER:$2|inyalisna}} ti panid ti $3 iti $4 a nagtuon iti baw-ing",
+       "logentry-move-move": "{{GENDER:$2|Inyalis}} ni $1 ti panid ti $3 iti $4",
+       "logentry-move-move-noredirect": "{{GENDER:$2|Inyalis}} ni $1 ti panid ti $3 iti $4 a saan a nangibati ti baw-ing",
+       "logentry-move-move_redir": "{{GENDER:$2|Inyalis}} ni $1 ti panid ti $3 iti $4 a nagtuon iti baw-ing",
        "logentry-move-move_redir-noredirect": "Ni $1 ket {{GENDER:$2|inyalisna}} ti panid ti $3 iti $4 a nagtuon iti baw-ing a saan a nangibati ti baw-ing",
        "logentry-patrol-patrol": "Ni $1 ket {{GENDER:$2|minarkaanna}} ti rebision ti $4 iti panid ti $3 a napatruliaan",
-       "logentry-patrol-patrol-auto": "Ni $1 ket automatiko a {{GENDER:$2|minarkaanna}} ti rebision ti $4 iti panid ti $3 a napatruliaan",
+       "logentry-patrol-patrol-auto": "Automatiko a {{GENDER:$2|minarkaan}} ni $1 ti rebision ti $4 iti panid ti $3 a napatruliaan",
        "logentry-newusers-newusers": "Ti pakabilangan idi ni $1 ket {{GENDER:$2|napartuat}}",
-       "logentry-newusers-create": "Ti pakabilangan idi ni $1 ket {{GENDER:$2|napartuat}}",
+       "logentry-newusers-create": "{{GENDER:$2|Napartuat}} ti pakabilangan ni agar-aramat $1",
        "logentry-newusers-create2": "Ti pakabilangan ti agar-aramat $3 ket {{GENDER:$2|napartuat}} idi babaen ni $1",
        "logentry-newusers-byemail": "Ti pakabilangan a $3 ket {{GENDER:$2|pinartuat}} idi babaen ni $1 ken ti kontrasenias ket naipatulod idi babaen ti esurat",
-       "logentry-newusers-autocreate": "Ti pakabilangan ti agar-aramat ni $1 ket automatiko a {{GENDER:$2|napartuat}}",
+       "logentry-newusers-autocreate": "Automatiko a {{GENDER:$2|napartuat}} ti pakabilangan ni agar-aramat $1",
        "logentry-rights-rights": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti grupo a pannakaikameng para kenni $3 manipud ti $4 iti $5",
        "logentry-rights-rights-legacy": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti grupo a pannakaikameng para kenni $3",
        "logentry-rights-autopromote": "Ni $1 ket automatiko idi a {{GENDER:$2|naipangato}} manipud ti $4 iti $5",
index 5dc3e63..b9dbc03 100644 (file)
        "resetpass-abort-generic": "Breytingum á lykilorðum hefur verið hætt með viðbót.",
        "passwordreset": "Endurstilla lykilorð",
        "passwordreset-text-one": "Útfylltu þetta eyðublað til þess að endursetja lykilorðið.",
-       "passwordreset-legend": "Endurstilla lykilorð",
        "passwordreset-disabled": "Lokað hefur verið fyrir að endurstilla lykilorð á þessum wiki.",
        "passwordreset-emaildisabled": "Tölvupósteiginleikar hafa verið gerðir óvirkir á þessum wiki.",
        "passwordreset-username": "Notandanafn:",
        "resettokens": "Endurstilla lykla",
        "resettokens-text": "Hér getur þú endurstillt lykla sem veita þér aðgang að ákveðnum persónuupplýsingum um aðganginn þinn.\n\nÞú átt að gera það ef þú ert búin(n) að deila þeim með einhverjum öðrum óviljandi eða ef búið er að brjóta inn í aðganginn þinn.",
        "resettokens-no-tokens": "Það eru engir lyklar að endurstilla.",
-       "resettokens-legend": "Endurstilla lykla",
        "resettokens-tokens": "Lyklar:",
        "resettokens-token-label": "$1 (núverandi gildi: $2)",
        "resettokens-done": "Lyklarnir hafa verið endurstilltir.",
index bc123bb..7e51f3b 100644 (file)
@@ -84,7 +84,8 @@
                        "Purodha",
                        "TecnoMaster",
                        "Alexmar983",
-                       "Federico Mugnaini"
+                       "Federico Mugnaini",
+                       "Fpugliajno"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "passwordreset": "Reimposta password",
        "passwordreset-text-one": "Compila questo modulo per reimpostare la tua password.",
        "passwordreset-text-many": "{{PLURAL:$1|Compila uno dei campi per ricevere una password temporanea tramite email.}}",
-       "passwordreset-legend": "Reimposta password",
        "passwordreset-disabled": "La reimpostazione delle password è stata disabilitata su questa wiki",
        "passwordreset-emaildisabled": "Le funzionalità di posta elettronica sono state disabilitate su questa wiki.",
        "passwordreset-username": "Nome utente:",
        "resettokens": "Reimposta token",
        "resettokens-text": "Qui puoi reimpostare le chiavi che permettono l'accesso a determinati dati privati associati alla tua utenza.\n\nDovresti farlo se le hai accidentalmente condivise con qualcuno o se la tua utenza è stato compromessa.",
        "resettokens-no-tokens": "Non ci sono token da reimpostare.",
-       "resettokens-legend": "Reimposta token",
        "resettokens-tokens": "Token:",
        "resettokens-token-label": "$1 (valore attuale: $2)",
        "resettokens-watchlist-token": "Token per il feed web (Atom/RSS) delle [[Special:Watchlist|modifiche alle pagine nei tuoi osservati speciali]]",
        "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-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.",
        "randomincategory-nopages": "Non ci sono pagine in [[:Category:$1]].",
        "randomincategory-category": "Categoria:",
        "randomincategory-legend": "Pagina casuale in una categoria",
+       "randomincategory-submit": "Vai",
        "randomredirect": "Un redirect a caso",
        "randomredirect-nopages": "Non ci sono redirect nel namespace \"$1\".",
        "statistics": "Statistiche",
        "rollback-success": "Annullate le modifiche di $1; pagina riportata all'ultima versione di $2.",
        "sessionfailure-title": "Sessione fallita",
        "sessionfailure": "Si è verificato un problema nella sessione che identifica l'accesso; il sistema non ha eseguito il comando impartito per precauzione. Tornare alla pagina precedente con il tasto 'Indietro' del proprio browser, ricaricare la pagina e riprovare.",
+       "changecontentmodel": "Modifica il modello di contenuto di una pagina",
+       "changecontentmodel-legend": "Modifica il modello di contenuto",
+       "changecontentmodel-title-label": "Titolo della pagina",
+       "changecontentmodel-model-label": "Nuovo modello di contenuto",
+       "changecontentmodel-reason-label": "Motivo:",
+       "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.",
+       "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",
+       "logentry-contentmodel-change-revert": "ripristina",
        "protectlogpage": "Protezioni",
        "protectlogtext": "Di seguito sono elencate le modifiche alle protezioni delle pagine.\nVedi la [[Special:ProtectedPages|lista delle pagine protette]] per l'elenco delle protezioni di pagina attualmente attive.",
        "protectedarticle": "ha protetto \"[[$1]]\"",
        "tooltip-pt-logout": "Uscita (logout)",
        "tooltip-pt-createaccount": "Si consiglia di registrarsi e di effettuare l'accesso, anche se non è obbligatorio",
        "tooltip-ca-talk": "Vedi le discussioni relative a questa pagina",
-       "tooltip-ca-edit": "Puoi modificare questa pagina. Per favore usa il pulsante di anteprima prima di salvare",
+       "tooltip-ca-edit": "Modifica questa pagina",
        "tooltip-ca-addsection": "Inizia una nuova sezione",
        "tooltip-ca-viewsource": "Questa pagina è protetta, ma puoi vedere il suo codice sorgente",
        "tooltip-ca-history": "Versioni precedenti di questa pagina",
        "version-libraries": "Librerie installate",
        "version-libraries-library": "Libreria",
        "version-libraries-version": "Versione",
+       "version-libraries-license": "Licenza",
+       "version-libraries-description": "Descrizione",
+       "version-libraries-authors": "Autori",
        "redirect": "Reindirizzamento da file, utente, pagina o versione",
        "redirect-legend": "Reindirizza a un file o una pagina",
        "redirect-summary": "Questa pagina speciale reindirizza a un file (specificando il nome del file), a una pagina (specificando un ID di versione o un ID pagina) o a un utente (specificando un ID utente numerico).\nEsempi: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
        "special-characters-title-endash": "lineetta enne",
        "special-characters-title-emdash": "lineetta emme",
        "special-characters-title-minus": "segno meno",
-       "mw-widgets-titleinput-description-new-page": "Questa pagina non esiste ancora.",
+       "mw-widgets-titleinput-description-new-page": "questa pagina non esiste ancora",
        "mw-widgets-titleinput-description-redirect": "reindirizzamento a $1"
 }
index b6d4dba..b77811c 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) のトークン",
        "creating": "「$1」を作成中",
        "editingsection": "「$1」を編集中 (節単位)",
        "editingcomment": "「$1」を編集中 (新しい節)",
-       "editconflict": "編集競合: $1",
+       "editconflict": "編集競合: $1",
        "explainconflict": "このページを編集し始めた後に、他の誰かがこのページを変更しました。\n上側のテキスト領域は現在の最新の状態です。\n編集していた文章は下側のテキスト領域に示されています。\n編集していた文章を、上側のテキスト領域の、既存の文章に組み込んでください。\n上側のテキスト領域の内容<strong>だけ</strong>が、「{{int:savearticle}}」をクリックした時に実際に保存されます。",
        "yourtext": "編集中の文章",
        "storedversion": "保存された版",
        "badsig": "署名用のソースが正しくありません。\nHTMLタグを見直してください。",
        "badsiglength": "署名が長すぎます。\n$1 {{PLURAL:$1|文字}}以下である必要があります。",
        "yourgender": "表示に使用する性別",
-       "gender-unknown": "未指定",
+       "gender-unknown": "あなたに言及する時、ソフトウェアは可能な限り、性別が中性の単語を使おうとします。",
        "gender-male": "男",
        "gender-female": "女",
        "prefs-help-gender": "この項目の設定は省略できます。\nソフトウェアが利用者向けの画面表示であなたに言及する際に、適切な文法的性を選択するために使用されます。\nこの情報は公開されます。",
        "randomincategory-nopages": "カテゴリ [[:Category:$1|$1]] にはページがありません。",
        "randomincategory-category": "カテゴリ:",
        "randomincategory-legend": "カテゴリ内でおまかせ表示",
+       "randomincategory-submit": "表示",
        "randomredirect": "おまかせリダイレクト",
        "randomredirect-nopages": "「$1」名前空間に転送ページはありません。",
        "statistics": "統計",
        "rollback-success": "$1による編集を差し戻しました。\n$2による直前の版へ変更されました。",
        "sessionfailure-title": "セッションの失敗",
        "sessionfailure": "ログインのセッションに問題が発生しました。\nセッション乗っ取りを防ぐため、操作を取り消しました。\n前のページへ戻って再度読み込んだ後に、もう一度試してください。",
+       "changecontentmodel-title-label": "ページ タイトル",
+       "changecontentmodel-model-label": "新しい コンテンツ モデル",
+       "changecontentmodel-reason-label": "理由:",
        "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": "このページは保護されています。\nページのソースを閲覧できます。",
        "tooltip-ca-history": "このページの過去の版",
        "version-libraries": "インストールされているライブラリー",
        "version-libraries-library": "ライブラリー",
        "version-libraries-version": "バージョン",
+       "version-libraries-license": "ライセンス",
+       "version-libraries-description": "説明",
+       "version-libraries-authors": "作者",
        "redirect": "ファイル名、利用者ID、ページID、版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]]",
        "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": "いくつかのタグを選択",
        "tags-edit-chosen-no-results": "一致するタグが見つかりません",
        "tags-edit-reason": "理由:",
+       "tags-edit-revision-submit": "変更を {{PLURAL:$1|this revision|$1 revisions}} に適用",
+       "tags-edit-logentry-submit": "変更を {{PLURAL:$1|this log entry|$1 log entries}} に適用",
        "tags-edit-success": "変更が正常に適用されました。",
        "tags-edit-failure": "変更は適用できませんでした: $1",
        "tags-edit-nooldid-title": "無効な対象版",
        "log-name-pagelang": "言語変更記録",
        "log-description-pagelang": "これはページ言語の変更の記録です。",
        "logentry-pagelang-pagelang": "$1 がページ $3 の言語を $4 から $5 に{{GENDER:$2|変更しました}}",
-       "default-skin-not-found": "おっと! あなたのウィキの既定の外装「<code>$1</code>」 (<code>$wgDefaultSkin</code>)は利用できません。\n\nあなたのインストールには以下の外装が含まれています。外装の有効化と既定の選択については、[https://www.mediawiki.org/wiki/Manual:Skin_configuration マニュアル: 外装設定] をご覧ください。\n\n$2\n\n; MediaWikiをインストールしたばかりの場合:\n: gitからインストールしたか、その他の何らかの方法でソースコードから直接インストールした場合には、これは期待されたとおりの動作です。\n:* [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory] から外装をインストールしてみてください。\n:* [https://www.mediawiki.org/wiki/Download tarball installer] をダウンロードしてみてください。これにはいくつかの外装と拡張機能が含まれています。 <code>skins/</code> ディレクトリからコピー&ペーストできます。\n: あなたがMediaWiki開発者の場合、これを行うことであなたのgitリポジトリに干渉することはありません。\n\n; MediaWiki をアップグレードした場合:\n: MediaWiki 1.24 以降のバージョンでは、インストール済みの外装は自動的には有効になりません。 ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery マニュアル:外装の自動探索] をご覧ください)。<code>LocalSettings.php</code> に以下の行をペーストして、現在インストールされている外装を有効にできます。\n\n<pre>$3</pre>\n\n; <code>LocalSettings.php</code>を編集したばかりの場合:\n: 外装名に打ち間違いがないか再度確認してください。",
-       "default-skin-not-found-no-skins": "おっと! あなたのウィキの既定の外装「<code>$1</code>」 (<code>$wgDefaultSkin</code>)は利用できません。\n\n外装をインストールしていません。\n\n; MediaWikiをインストールしたばかりの場合:\n: gitからインストールしたか、その他の何らかの方法でソースコードから直接インストールした場合には、これは期待されたとおりの動作です。\n:* [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory] から外装をインストールしてみてください。\n:* [https://www.mediawiki.org/wiki/Download tarball installer] をダウンロードしてみてください。これには外装と拡張機能がいくつか含まれています。 <code>skins/</code> ディレクトリからコピー&ペーストできます。\n: あなたがMediaWiki開発者の場合、これを行うことであなたのgitリポジトリに干渉することはありません。外装の有効化と既定の選択についての情報は、[https://www.mediawiki.org/wiki/Manual:Skin_configuration マニュアル:外装設定] をご覧ください。",
+       "default-skin-not-found": "おっと! あなたのウィキの既定の外装 <code>$1</code> として定義されている <code>$wgDefaultSkin</code> は利用できません。\n\nあなたのインストールには以下の{{PLURAL:$4|skin|外装}}が含まれています。{{PLURAL:$4|it|外装の有効化と既定の選択}}については、[https://www.mediawiki.org/wiki/Manual:Skin_configuration マニュアル: 外装設定] をご覧ください。\n\n$2\n\n; MediaWikiをインストールしたばかりの場合:\n: gitからインストールしたか、その他の何らかの方法でソースコードから直接インストールした場合には、これは期待されたとおりの動作です。[https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory] から外装をインストールしてみてください。\n:* [https://www.mediawiki.org/wiki/Download tarball installer] をダウンロードしてみてください。これにはいくつかの外装と拡張機能が含まれています。 <code>skins/</code> ディレクトリからコピー&ペーストできます。\n:* Downloading individual skin tarballs from [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Using Git to download skins].\n: あなたがMediaWiki開発者の場合、これを行うことであなたのgitリポジトリに干渉することはありません。\n\n; MediaWiki をアップグレードした場合:\n: MediaWiki 1.24 以降のバージョンでは、インストール済みの外装は自動的には有効になりません。 ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery マニュアル:外装の自動探索] をご覧ください)。<code>LocalSettings.php</code> に以下の{{PLURAL:$5|line|行}}をペーストして、現在インストールされている{{PLURAL:$5|skin|外装}}を有効にできます。\n\n<pre dir=\"ltr\">$3</pre>\n\n; <code>LocalSettings.php</code>を編集したばかりの場合:\n: 外装名に打ち間違いがないか再度確認してください。",
+       "default-skin-not-found-no-skins": "おっと! <code>$1</code>で定義されている、あなたのウィキの既定の外装 (<code>$wgDefaultSkin</code>)は利用できません。\n\n外装をインストールしていません。\n\n; MediaWikiをインストールしたばかりか更新したばかりの場合:\n: gitからインストールしたか、その他の何らかの方法でソースコードから直接インストールした場合には、これは期待されたとおりの動作です。MediaWikiの1.24およびそれ以降は、メインのリポジトリ内には任意の外装が含まれていません。[https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory] から外装をインストールしてみてください。, by:\n:* 個々の外装 tarballs を[https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] ダウンロードすること。\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Using Git to download skins].\n: あなたがMediaWiki開発者の場合、これを行うことであなたのgitリポジトリに干渉することはありません。外装の有効化と既定の選択についての情報は、[https://www.mediawiki.org/wiki/Manual:Skin_configuration マニュアル:外装設定] をご覧ください。",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (有効)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''無効''')",
        "mediastatistics": "メディア統計",
        "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 a02df75..5b18c9b 100644 (file)
        "passwordreset": "កំណត់​ពាក្យសម្ងាត់​ឡើងវិញ",
        "passwordreset-text-one": "បំពេញសំណុំបែបបទនេះដើម្បីស្ដារពាក្យសម្ងាត់របស់អ្នក។",
        "passwordreset-text-many": "{{PLURAL:$1|សូមបំពេញក្នុងប្រអប់មួយក្នុងចំណោមប្រអប់ខាងក្រោមដើម្បីទទួលពាក្យសម្ងាត់បណ្ដោះអាសន្នមួយតាមរយៈអ៊ីមែល។}}",
-       "passwordreset-legend": "កំណត់​ពាក្យសម្ងាត់​ឡើងវិញ",
        "passwordreset-disabled": "មុខងារប្ដូរទៅពាក្យសម្ងាត់ដើមត្រូវបានបិទមិនអោយប្រើនៅលើវិគីនេះ។",
        "passwordreset-emaildisabled": "មុខងារអ៊ីមែលត្រូវបានបិទមិនអោយប្រើនៅលើវិគីនេះ។",
        "passwordreset-username": "អត្តនាម៖",
index 31a11c0..e39fd0e 100644 (file)
@@ -22,7 +22,9 @@
                        "The Evil IP address",
                        "VASANTH S.N.",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Pavanaja",
+                       "Ananth subray"
                ]
        },
        "tog-underline": "ಕೊಂಡಿಗಳ ಕೆಳಗೆ ಗೆರೆ ತೋರಿಸಿ",
        "pool-servererror": "ಪೂಲ್ ಕೌಂಟರ್ ಸೇವೆಯು ಲಭ್ಯವಿಲ್ಲ ($1).",
        "poolcounter-usage-error": "ಬಳಕೆಯ ದೋಷ: $1",
        "aboutsite": "ಕನ್ನಡ {{SITENAME}} ಬಗ್ಗೆ",
-       "aboutpage": "Project:ನಮà³\8dಮ à²¬à²\97à³\8dà²\97à³\86",
+       "aboutpage": "Project:ಬಗ್ಗೆ",
        "copyright": "ವಿಶೇಷವಾಗಿ ಹೇಳಲಲ್ಲಿದರೆ ಇದು \"$1\" ಕಾಪಿರೈಟ್ ಅಲ್ಲಿ ಲಭ್ಯ ಉಂಟು",
        "copyrightpage": "{{ns:project}}:ಕೃತಿಸ್ವಾಮ್ಯತೆಗಳು",
        "currentevents": "ಪ್ರಚಲಿತ ಸಂಗತಿಗಳು",
        "policy-url": "Project:ನಿಯಮಾವಳಿಗಳು",
        "portal": "ಸಮುದಾಯ ಪುಟ",
        "portal-url": "Project:ಸಮುದಾಯ ಪುಟ",
-       "privacy": "à²\96ಾಸà²\97ಿ à²®à²¾à²¹à²¿à²¤à²¿à²¯ à²¬à²\97à³\8dà²\97à³\86 à²¨à²¿à²²à³\81ವà³\81",
-       "privacypage": "Project:à²\96ಾಸà²\97ಿಮಾಹಿತಿ à²¨à²¿à²¯à²®",
+       "privacy": "à²\97à³\8cಪà³\8dಯತà³\86ಯ à²\95ಾರà³\8dಯನà³\80ತಿ",
+       "privacypage": "Project:à²\97à³\8cಪà³\8dಯತà³\86ಯ à²\95ಾರà³\8dಯನà³\80ತಿ",
        "badaccess": "ಅನುಮತಿ ದೋಷ",
        "badaccess-group0": "ನೀವು ಕೋರಿರುವ ಕ್ರಿಯೆಯನ್ನು ನಿರ್ವಹಿಲು ನಿಮಗೆ ಅನುಮತಿ ಇಲ್ಲ.",
        "badaccess-groups": "ನೀವು ಕೋರಿರುವ ಕ್ರಿಯೆಯು ಕೇವಲ ಈ {{PLURAL:$2|ಗುಂಪಿಗೆ|ಗುಂಪುಗಳಲ್ಲಿ ಒಂದಕ್ಕೆ}} ಸೇರಿರುವ ಬಳಕೆದಾರರಿಗೆ ಸೀಮಿತವಾಗಿದೆ: $1.",
        "mailerror": "ಅಂಚೆ ಕಳುಹಿಸುವಲ್ಲಿ ದೋಷ: $1",
        "acct_creation_throttle_hit": "ಕ್ಷಮಿಸಿ, ನೀವಾಗಲೇ{{PLURAL:$1|೧ ಖಾತೆಯನ್ನು|$1 ಖಾತೆಗಳನ್ನು}} ತೆರೆದಿದ್ದೀರಿ.\nಇನ್ನು ಹೆಚ್ಚಿನ ಖಾತೆಗಳನ್ನು ತೆರೆಯಲಾಗುವುದಿಲ್ಲ.",
        "emailauthenticated": "ನಿಮ್ಮ ಇ-ಅಂಚೆ ವಿಳಾಸವು ದಿನಾಂಕ $2 ಸಮಯ $3 ಅಂದು ಧೃಡೀಕೃತವಾಗಿದೆ.",
-       "emailnotauthenticated": "ನಿಮà³\8dಮ à²\87-à²\85à²\82à²\9aà³\86 à²µà²¿à²³à²¾à²¸ à²\87ನà³\8dನà³\82 à²§à³\83ಡà³\80à²\95à³\83ತವಾà²\97ಿಲà³\8dಲ.\nà²\88 à²\95à³\86ಳà²\97ಿನ à²µà³\88ಶಿಷà³\8dà²\9fತೆಗಳಿಗೆ ಇ-ಅಂಚೆಯನ್ನು ನಿಮಗೆ ಕಳುಹಿಸಲು ಆಗುವುದಿಲ್ಲ.",
+       "emailnotauthenticated": "ನಿಮà³\8dಮ à²\87-à²\85à²\82à²\9aà³\86 à²µà²¿à²³à²¾à²¸ à²\87ನà³\8dನà³\82 à²§à³\83ಡà³\80à²\95à³\83ತವಾà²\97ಿಲà³\8dಲ.\nà²\88 à²\95à³\86ಳà²\97ಿನ à²\86ಯà³\8dà²\95ೆಗಳಿಗೆ ಇ-ಅಂಚೆಯನ್ನು ನಿಮಗೆ ಕಳುಹಿಸಲು ಆಗುವುದಿಲ್ಲ.",
        "noemailprefs": "ಈ ಸೌಲಭ್ಯಗಳು ಕೆಲಸ ಮಾಡಬೇಕಾದರೆ ಒಂದು ಇ-ಅಂಚೆ ವಿಳಾಸವನ್ನು ನಮೂದಿಸಿ.",
        "emailconfirmlink": "ನಿಮ್ಮ ಇ-ಅಂಚೆ ವಿಳಾಸವನ್ನು ಧೃಡೀಕರಿಸಿ",
        "invalidemailaddress": "ಈ ಇ-ಅಂಚೆ ವಿಳಾಸವು ಸರಿಯಾದ ಪ್ರಕಾರದಲ್ಲಿ ಇಲ್ಲದಿರುವುದರಿಂದ ಇದನ್ನು ಸ್ವೀಕಾರ ಮಾಡಲಾಗುವುದಿಲ್ಲ.\nದಯವಿಟ್ಟು ಸರಿಯಾದ ಪ್ರಕಾರದ ವಿಳಾಸವನ್ನು ಸೇರಿಸಿ ಅಥವ ಆ ಚೌಕವನ್ನು ಖಾಲಿ ಬಿಡಿ.",
        "resetpass-recycled": "ದಯವಿಟ್ಟು ಈಗಿನ ಪ್ರವೇಶಪದದ ಬದಲು ಹೊಸಪ್ರವೇಶಪದ ಬದಲಾಯಿಸಿ ಮರುಚಾಲನೆ ನೀಡಿ.",
        "resetpass-temp-password": "ತಾತ್ಕಾಲಿಕ ಪ್ರವೇಶಪದ:",
        "passwordreset": "ಪ್ರವೇಶಪದವನ್ನು ಪುನಃಸ್ಥಾಪಿಸಿ.",
-       "passwordreset-legend": "ಪ್ರವೇಶಪದವನ್ನು ಪುನಃಸ್ಥಾಪಿಸಿ.",
        "passwordreset-username": "ಬಳಕೆದಾರ ಹೆಸರು:",
        "passwordreset-domain": "ಕ್ಷೇತ್ರ:",
        "passwordreset-email": "ಇ-ಮೇಲ್ ವಿಳಾಸ:",
        "changeemail-newemail": "ಹೊಸ  ಇ-ಅಂಚೆ ವಿಳಾಸ:",
        "changeemail-none": "(ಯಾವೂ ಇಲ್ಲ)",
        "changeemail-submit": "ಇಮೇಲ್ ಬದಲಾಯಿಸಿ",
+       "resettokens-tokens": "ಸಂಕೇತಗಳು:",
+       "resettokens-token-label": "$1(ಪ್ರಸ್ತುತ ಮೌಲ್ಯ:$2)",
        "bold_sample": "ದಪ್ಪಗಿನ ಅಚ್ಚು",
        "bold_tip": "ದಪ್ಪಗಿನ ಅಚ್ಚು",
        "italic_sample": "ಓರೆ ಅಕ್ಷರಗಳು",
        "edit-no-change": "ನಿಮ್ಮ ಸಂಪಾದನೆಯನ್ನು ಕಡೆಗಣಿಸಲಾಗಿದೆ ಏಕೆಂದರೆ ಪಠ್ಯದಲ್ಲಿ ಯಾವುದೇ ಬದಲಾವಣೆ ಮಾಡಲಾಗಿಲ್ಲ್ಲ",
        "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": "ಬದಲಾವಣೆಗಳ ಇತಿಹಾಸ",
        "revdelete-hide-text": "ಬದಲಾವಣೆಯ ಪಠ್ಯವನ್ನು ಅಡಗಿಸು",
        "revdelete-hide-image": "ಫೈಲಿನಲ್ಲಿರುವ ಮಾಹಿತಿಯನ್ನು ಅಡಗಿಸು",
        "revdelete-hide-name": "ಕಾರ್ಯ ಮತ್ತು ಗುರಿಗಳನ್ನು ಅಡಗಿಸು",
-       "revdelete-hide-comment": "ಸà²\82ಪಾದನà³\86 à²µà²¿à²µà²°à²£à³\86 à²\85ಡà²\97ಿಸà³\81",
+       "revdelete-hide-comment": "ಸಾರಾà²\82ಶವನà³\81 à²¬à²¦à²²à²¾à²¯à²¿à²¸à²¿",
        "revdelete-hide-user": "ಸಂಪಾದಕರ ಬಳಕೆಯ ಹೆಸರು/IP ಅಡಗಿಸು",
        "revdelete-hide-restricted": "ಈ ನಿಬಂಧನೆಗಳನ್ನು ನಿರ್ವಾಹಕರಿಗೂ ಅನ್ವಯಿಸು ಮತ್ತು ಈ interface ಗೆ ಬೀಗ ಹಾಕು",
        "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": "ಅಳಿಸಲ್ಪಟ್ಟ ಇತಿಹಾಸ",
        "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}} ತೋರಿಸು",
        "searchmenu-exists": "'''\"[[:$1]]\" ಹೆಸರಿನ ಪುಟ ಈ ವಿಕಿಯಲ್ಲಿದೆ.'''",
        "searchmenu-new": "'''''[[:$1]]'' ಪುಟವನ್ನು ಈ ವಿಕಿಯಲ್ಲಿ ಸೃಷ್ಟಿಸಿ!'''",
        "searchprofile-articles": "ಲೇಖನ ಪುಟ",
-       "searchprofile-images": "ಬಹà³\81ಮಾಧà³\8dಯಮ",
+       "searchprofile-images": "ಮಲà³\8dà²\9fಿಮà³\80ಡಿಯ",
        "searchprofile-everything": "ಪ್ರತಿಯೊಂದು",
        "searchprofile-advanced": "ಪರಿಣತ",
        "searchprofile-articles-tooltip": "$1 ನಲ್ಲಿ ಹುಡುಕಿ",
        "search-section": "(ವಿಭಾಗ $1)",
        "search-suggest": "ನೀವು ಇದನ್ನು ಹುಡುಕುತ್ತಿರುವಿರೆ: $1",
        "search-interwiki-caption": "ಬಳಗದ ಇತರ ಯೋಜನೆಗಳು",
-       "search-interwiki-default": "$1 ಫಲಿತಾಂಶಗಳು:",
+       "search-interwiki-default": "ಫಲಿತಾಂಶಗಳು $1:",
        "search-interwiki-more": "(ಹೆಚ್ಚು)",
        "search-relatedarticle": "ಸಂಬಂಧಿತ",
        "searchrelated": "ಸಂಬಂಧಿತ",
        "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": "ಸಹಿ:",
        "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}}:ಬಳಕೆದಾರರು",
        "listfiles-latestversion": "ಪ್ರಸಕ್ತ ಆವೃತ್ತಿ",
        "listfiles-latestversion-yes": "ಹೌದು",
        "listfiles-latestversion-no": "ಇಲ್ಲ",
-       "file-anchor-link": "à²\9aಿತà³\8dರ",
+       "file-anchor-link": "à²\95ಡತ",
        "filehist": "ಕಡತದ ಇತಿಹಾಸ",
        "filehist-help": "ದಿನ/ಕಾಲ ಒತ್ತಿದರೆ ಆ ಸಮಯದಲ್ಲಿ ಈ ಕಡತದ ವಸ್ತುಸ್ಥಿತಿ ತೋರುತ್ತದೆ.",
        "filehist-deleteall": "ಎಲ್ಲವನ್ನೂ ಅಳಿಸು",
        "unusedtemplateswlh": "ಇತರ ಕೊಂಡಿಗಳು",
        "randompage": "ಯಾದೃಚ್ಛಿಕ ಪುಟ",
        "randompage-nopages": "ಈ ಪುಟಪ್ರಬೇಧದಲ್ಲಿ ಯಾವ ಪುಟವೂ ಇಲ್ಲ.",
+       "randomincategory-submit": "ಹೋಗು",
        "randomredirect": "ಯದೃಚ್ಛಿಕ ಪುನರ್ನಿರ್ದೇಶಿತ ಪುಟ",
        "randomredirect-nopages": "ಈ ಪುಟಪ್ರಬೇಧದಲ್ಲಿ ಯಾವ ಪುನರ್ನಿರ್ದೇಶನಗಳೂ ಇಲ್ಲ.",
        "statistics": "ಅಂಕಿ ಅಂಶಗಳು",
        "nlinks": "$1 {{PLURAL:$1|ಸಂಪರ್ಕ|ಸಂಪರ್ಕಗಳು}}",
        "nmembers": "$1 {{PLURAL:$1|ಸದಸ್ಯ|ಸದಸ್ಯರು}}",
        "nrevisions": "$1 {{PLURAL:$1|ಬದಲಾವಣೆ|ಬದಲಾವಣೆಗಳು}}",
-       "nviews": "$1 {{PLURAL:$1|ನೋಟ|ನೋಟಗಳು}}",
        "lonelypages": "ಒಬ್ಬಂಟಿ ಪುಟಗಳು",
        "lonelypagestext": "ಈ ಕೆಳಗಿನ ಪುಟಗಳು {{SITENAME}} ಅಲ್ಲಿರುವ ಇತರ ಯಾವ ಪುಟದಿಂದಲೂ ಕೊಂಡಿಯನ್ನು ಹೊಂದಿಲ್ಲ.",
        "uncategorizedpages": "ಅವರ್ಗೀಕೃತ ಪುಟಗಳು",
        "pager-newer-n": "{{PLURAL:$1|ಹೊಸ ೧|ಹೊಸ $1}}",
        "pager-older-n": "{{PLURAL:$1|ಹಳೆ ೧|ಹಳೆ $1}}",
        "suppress": "ನಿಗಾ ಇಡುವವ",
-       "booksources": "ಪà³\81ಸà³\8dತà²\95à²\97ಳ à²®à³\82ಲ",
+       "booksources": "ಪà³\81ಸà³\8dತà²\95ದ à²®à³\82ಲà²\97ಳà³\81",
        "booksources-search-legend": "ಪುಸ್ತಕ ಮೂಲಗಳಿಗೆ ಹುಡುಕು",
        "booksources-search": "ಹುಡುಕು",
        "specialloguserlabel": "ಸದಸ್ಯ:",
index 3f5de68..c3a0e38 100644 (file)
@@ -49,7 +49,8 @@
                        "Banwol",
                        "Ysjbserver",
                        "LiteHell",
-                       "Lefion"
+                       "Lefion",
+                       "Leeheonjin"
                ]
        },
        "tog-underline": "링크에 밑줄:",
        "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-nopages": "[[:Category:$1]]에 문서가 없습니다.",
        "randomincategory-category": "분류:",
        "randomincategory-legend": "분류 안의 임의 문서",
+       "randomincategory-submit": "보기",
        "randomredirect": "임의 넘겨주기 문서로",
        "randomredirect-nopages": "\"$1\" 이름공간에서 해당하는 넘겨주기 문서가 없습니다.",
        "statistics": "통계",
        "rollback-success": "$1의 편집을 되돌렸습니다.\n$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]]\" 문서를 보호했습니다",
        "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": "문서의 과거 판",
        "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]].",
        "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\" 태그를 제거하는 것은 허용되지 않습니다.",
index bd52da0..453d189 100644 (file)
        "site-atom-feed": "$1 — Atom лентасы",
        "page-rss-feed": "«$1» — RSS-лентасы",
        "page-atom-feed": "«$1» — Atom-лентасы",
+       "feed-atom": "Atom",
        "red-link-title": "$1 (быллай бет джокъду)",
        "sort-descending": "Кем болуугъа кёре тиз",
        "sort-ascending": "Ёсюуге кёре тиз",
        "passwordreset": "Паролну джибериу",
        "passwordreset-text-one": "Паролугъуз джиберилир ючюн бу форманы толтуругъуз.",
        "passwordreset-text-many": "{{PLURAL:$1|Пароль ийилир ючюн билгилени бир бёлюмюн джазыгъыз.}}",
-       "passwordreset-legend": "Паролну атыу",
        "passwordreset-disabled": "Бу викиде паролла атыу амал джукъланыбды.",
        "passwordreset-emaildisabled": "Бу викиде электрон почтаны функциялары джукъланыбдыла.",
        "passwordreset-username": "Къошулуучуну аты:",
        "changeemail-password": "«{{SITENAME}}» проектде паролугъуз:",
        "changeemail-submit": "Адресни тюрлендир",
        "resettokens": "Токенлени джибер",
-       "resettokens-legend": "Токенлени джибер",
        "resettokens-tokens": "Токенле:",
        "resettokens-token-label": "$1 (бусагъатдагъы: $2)",
        "bold_sample": "Къалын джазыу",
        "headline_tip": "2-чи дараджалы башлыкъ",
        "nowiki_sample": "Формат этилинмеген текстни бери салыгъыз",
        "nowiki_tip": "Вики-формат этиуню игнор эт",
+       "image_sample": "Юлгю.jpg",
        "image_tip": "Эндирилген файл",
+       "media_sample": "Юлгю.ogg",
        "media_tip": "Медиа-файлгъа джибериу",
        "sig_tip": "Къол салыуугъуз эмда заман",
        "hr_tip": "Горизонтал сыз (кёб хайырландырмагъыз)",
        "uploadnewversion-linktext": "Бу файлны джангы версиясын джюклеу",
        "shared-repo-from": "$1-дан",
        "shared-repo": "Ортакъ сакълау джер",
+       "shared-repo-name-wikimediacommons": "Викигёзен",
        "upload-disallowed-here": "Бу файлны юсюню джазаргъа болмайды.",
        "filerevert": "$1 файлны эски халына къайтыу",
        "filerevert-legend": "Файлны эски халына къайтар",
        "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": "Сорма эсеб келтирмеди.",
        "tooltip-pt-logout": "Чыгъыу",
        "tooltip-pt-createaccount": "Ажымсыз керек болмагъанлыкъгъа, тергеу джазыу (аккаунт) къураб системагъа кирирге теджейбиз.",
        "tooltip-ca-talk": "Бетни ичиндегин сюзюу",
-       "tooltip-ca-edit": "Бу бетни тюрлендирирге болады. Сакълагъынчы ал къарауну хайырландырыгъыз.",
+       "tooltip-ca-edit": "Бу бетни тюрлендир",
        "tooltip-ca-addsection": "Джангы бёлюм къура",
        "tooltip-ca-viewsource": "Бу бет тюрлендириуден джакъланыбды. Алай а сиз къараб, текстин копия этерге боллукъсуз",
        "tooltip-ca-history": "Бетни алгъын версиялары",
        "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 ff06133..6372aa7 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": "Der Metmaacher_Nahme",
        "userlogin-yourname-ph": "Donn Dinge Metmaachername aanjevve",
        "createacct-another-username-ph": "Jivv ene Metmaacher_Nahme aan",
        "yourpassword": "Paßwoot:",
        "passwordreset": "Et Paßwoot zeröck säze",
        "passwordreset-text-one": "Föll dat Fommolaa uß, öm Ding Paßwoot ze ändere.",
        "passwordreset-text-many": "{{PLURAL:$1|Föll ei vun dä Fälder en heh däm Fommolaa uß, öm e Zwesche_Paßwoot ze krijje.}}",
-       "passwordreset-legend": "Et Paßwoot zeröck säze",
        "passwordreset-disabled": "Et Paßwoot zeröck ze säze es heh em Wiki afjeschalldt.",
        "passwordreset-emaildisabled": "Heh dat Wiki määt nix met <i lang=\"en\">e-mail</i>!",
        "passwordreset-username": "Metmaacher_Nahme:",
        "resettokens": "Neue Schlößel maache",
        "resettokens-text": "Do kanns neue Schlößel maache lohße för op beschtemmpte päsöhnlesche Daate uohjriife ze künne, di met Dingem Zohjang heh ze donn han.\n\nDonn dat op jeede Fall, wann se enem Andere bikannt jewoode sin, udder wann Dinge Zohjang jeknack woode es.",
        "resettokens-no-tokens": "Et sin kein Schlößele doh, för neu ze maache.",
-       "resettokens-legend": "Neue Schlößel maache",
        "resettokens-tokens": "Schlößele:",
        "resettokens-token-label": "$1 (Em Momang es et: $2)",
        "resettokens-watchlist-token": "ä schlößel för dä <i lang=\"en\" xml:lang=\"en\">Atom</i>- udder <i lang=\"en\" xml:lang=\"en\">RSS</i>-Kanaal met de [[Special:Watchlist|Änderonge aan Sigge en Dinger Oppaßleß]]",
        "randomincategory-nopages": "et sinn er kein Sigge en dä Saachjropp [[:Category:$1|$1]] dren.",
        "randomincategory-category": "Saachjropp:",
        "randomincategory-legend": "En zohfälleje Sigg us dä Saachjropp",
+       "randomincategory-submit": "Lohß Jonn!",
        "randomredirect": "Zofällije Ömleitung",
        "randomredirect-nopages": "En däm Appachtemang „$1“ sin ja kein Ömleidonge dren.",
        "statistics": "Schtatistike",
        "rollback-success": "De Änderungen vum $1 zeröckjenumme, un dobei de letzte Version vum $2 widder jehollt.",
        "sessionfailure-title": "Fähler met dä Daate vum Enlogge",
        "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",
        "protectlogtext": "Heh kütt et Logbooch met de Veränderonge aam Schotz vun Sigge.\nEn Leß met de [[Special:ProtectedPages|em Momang jeschözde Sigge]] ham_mer och.",
        "protectedarticle": "hät de Sigg „[[$1]]“ jeschötz",
        "tooltip-pt-logout": "Ußlogge",
        "tooltip-pt-createaccount": "mer schlonn vör, dat De Desch aanmällde deihs un ennloggs, ävver müüdesch es et nit.",
        "tooltip-ca-talk": "Donn di Sigg met däm Klaaf övver heh de Sigg aanzeije",
-       "tooltip-ca-edit": "De kanns di Sigg heh ändere — für em Avspeichere, donn eetß ens enen Bleck op de Vör-Aansich",
+       "tooltip-ca-edit": "Donn di Sigg heh ändere",
        "tooltip-ca-addsection": "Donn heh enne neue Afschnett opmaache.",
        "tooltip-ca-viewsource": "Di Sigg es jeschöz. Dä Wikkitäx kam_mer ävver belohre.",
        "tooltip-ca-history": "Ällder Versione vun dä Sigg",
        "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}}}} belohre",
        "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}})",
        "version-libraries": "Enschtallehrte Projrammsammlonge",
        "version-libraries-library": "Projrammsammlong",
        "version-libraries-version": "Väsjohn",
+       "version-libraries-license": "Lėzänz",
+       "version-libraries-authors": "Schrihver",
        "redirect": "Ömleide op en Dattei, ene Metmaacher udder de Väsjohn vun ener Sigg",
        "redirect-legend": "Ömleide ob_en Dattei udder Sigg",
        "redirect-summary": "Heh di {{int:specialpage}} leidt öm ob_en Dattei — doh mößd_Er ene Nahme aanjävve, för e Beischpell:[[{{#Special:Redirect}}/file/Example.jpg]] — udder en Sigg — doh mößd_Er en Kännong för, udder en Väsjuhn aanjävve, för e Beischpell esu: [[{{#Special:Redirect}}/page/64308]] udder [[{{#Special:Redirect}}/revision/328429]] — udder en Metmaachersigg — doh mößd_Er enem Metmaacher sing Kännong aanjävve, för e Beischpell: [[{{#Special:Redirect}}/user/101]].",
index 1ec83e4..3683d61 100644 (file)
        "resetpass-validity-soft": "Şîfreya te derbasdar nîne: $1\n\nJi kerema xwe re şîfreyek nû çêke an jî ji bo paşî çêkî li \"{{int:resetpass-submit-cancel}}\" bitikîne.",
        "passwordreset": "Şîfreyê nû bike",
        "passwordreset-text-one": "Ji bo ji nû ve sazkirina şîfreyê vê formê dagire.",
-       "passwordreset-legend": "Şîfreyê nû bike",
        "passwordreset-username": "Navê bikarhêner:",
        "passwordreset-domain": "Domain:",
        "passwordreset-email": "Navnîşana e-nameyê:",
        "changeemail-none": "(nîne)",
        "changeemail-submit": "Enameyê biguherîne",
        "resettokens": "Mifteya jê bibe",
-       "resettokens-legend": "Mifteya jê bibe",
        "bold_sample": "Nivîsa stûr",
        "bold_tip": "Nivîsa stûr",
        "italic_sample": "Nivîsa xwehr (îtalîk)",
        "search-file-match": "(bi naveroka dosye re lê te)",
        "search-suggest": "Gelo mebesta te ev bû: $1",
        "search-interwiki-caption": "Projeyên hevçeng",
-       "search-interwiki-default": "$1 encam:",
+       "search-interwiki-default": "Encamên ji $1:",
        "search-interwiki-more": "(bêhtir)",
        "search-relatedarticle": "Pêwendîdar",
        "searchrelated": "pêwendîdar",
        "recentchanges-label-newpage": "Rûpeleke nû hate çêkirin",
        "recentchanges-label-minor": "Ev guherîneke biçûk e",
        "recentchanges-label-bot": "Ev guherîn ji aliyê botekê ve hate çêkirin",
-       "recentchanges-label-unpatrolled": "Ev gotar hêj nehatiye sererastkirin",
+       "recentchanges-label-unpatrolled": "Ev gotar hêjî nehatiye sererastkirin",
        "recentchanges-label-plusminus": "Qebareya vê rûpelê bi ev qas biteyan hate guherandin",
        "recentchanges-legend-heading": "'''Ravekirina kurtenavan:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (here [[Special:NewPages|lîsteya rûpelên nû]])",
        "watchthisupload": "Vê rûpelê bişopîne",
        "filewasdeleted": "Data'yek bi vê navê hatibû barkirin û jêbirin. Xêra xwe li $1 seke ku barkirina te hêja ye ya na.",
        "filename-bad-prefix": "Nava wê data'yê, yê tu niha bardikê, bi '''\"$1\"''' destpêdike. Kamêrayên dîjîtal wan navan didin wêneyên xwe. Ji kerema xwe navekî baştir binivisîne ji bo mirov zûtir zanibin ku şayeşê vê wêneyê çî ye.",
-       "upload-success-subj": "Barkirin serkeftî",
+       "upload-success-subj": "Barkirina serkeftî",
        "upload-failure-subj": "Pirsgirêka barkirinê",
        "upload-warning-subj": "Hişyariya barkirinê",
        "upload-file-error": "Çewtiya navxweyî",
        "filedelete-submit": "Jê bibe",
        "filedelete-success": "<strong>$1</strong> hate jêbirin.",
        "filedelete-success-old": "<span class=\"plainlinks\">Verzyona $2 ji data'ya '''[[Media:$1|$1]]''' di saet $3 da hate jêbirin.</span>",
-       "filedelete-nofile": "'''$1''' nîne.",
+       "filedelete-nofile": "<strong>$1</strong> tune ye.",
        "filedelete-otherreason": "Sedemên din:",
        "filedelete-reason-otherlist": "Sedemên din",
        "filedelete-reason-dropdown": "*Sedemên jêbirina wêneyan\n** wêneyekî nebaş e\n** kopiyek e",
        "contributions": "Beşdariyên {{GENDER:$1|bikarhêner}}",
        "contributions-title": "Beşdariyên ji bo $1",
        "mycontris": "Beşdariyên min",
-       "contribsub2": "Ji bo $1 ($2)",
+       "contribsub2": "Bo {{GENDER:$3|$1}} ($2)",
        "uctop": "(rojane)",
        "month": "Ji meha (û zûtir):",
        "year": "Ji sala (û zûtir):",
        "sp-contributions-uploads": "yên barkirî",
        "sp-contributions-logs": "têketin",
        "sp-contributions-talk": "gotûbêj",
-       "sp-contributions-userrights": "îdarekirina mafên bikarhêneran",
+       "sp-contributions-userrights": "birêvebirina mafên bikarhêneran",
        "sp-contributions-search": "Li beşdariyan bigere",
        "sp-contributions-username": "Navnîşana IP'yê an jî navê bikarhêner:",
        "sp-contributions-submit": "Lêgerîn",
        "whatlinkshere-filters": "Parzûn",
        "block": "Bikarhêner asteng bike",
        "unblock": "Astengkirinê rake",
-       "blockip": "Bikarhêner asteng bike",
+       "blockip": "{{GENDER:$1|Bikarhêner}} asteng bike",
        "blockip-legend": "Bikarhêner asteng bike",
        "blockiptext": "Ji bo astengkirina nivîsandinê ya ji navnîşaneke IP'yê an jî ji bikarhênerekî/ê, vê formê bikarbîne.\nDivê ev tenê ji bo sekinandina vandalîzmê were bikaranîn, ku divê li gorî [[{{MediaWiki:Policy-url}}|rêgezê]] be.\n\nSedemekê binivîse!",
        "ipaddressorusername": "adresê IP'yekê ya navekî bikarhênerekî",
        "ipb-unblock-addr": "Astengkirinê $1 rake",
        "ipb-unblock": "Astengkirina bikarhênerekî ya adrêsa IP'yekê rake",
        "ipb-blocklist": "Astengkirinên niha bibîne",
-       "ipb-blocklist-contribs": "Beşdariyên ji bo $1",
+       "ipb-blocklist-contribs": "Beşdariyên ji bo {{GENDER:$1|}}",
        "unblockip": "Astengkirina bikarhêner rake",
        "unblockiptext": "Nivîsara jêr bikarwîne ji bo qebûlkirina nivîsandinê bikarhênerekî ya IP'yeka berê astengkirî.",
        "ipusubmit": "Vê astengkirinê rake",
        "unblocked-range": "$1 hat astengkirin.",
        "unblocked-id": "$1 dîsa vê astengkirinê ye",
        "blocklist": "Bikarhênerên astengkirî",
-       "ipblocklist": "Listek ji adresên IP'yan û bikarhêneran yê hatine astengkirin",
+       "ipblocklist": "Bikarhênerên astengkirî",
        "ipblocklist-legend": "Bikarhênerên astengkirî bibîne",
        "blocklist-userblocks": "Astengkirina hesaban veşêre",
        "blocklist-tempblocks": "Astengkirinên demkî veşêre",
        "tooltip-ca-viewsource": "Ev rûpel tê parastin.\nTu dikarî tenê li çavkaniyê binêrî.",
        "tooltip-ca-history": "Guhertoyên berê yên vê rûpelê",
        "tooltip-ca-protect": "Vê rûpelê biparêze",
-       "tooltip-ca-unprotect": "Parastina vê rûpelê rake",
+       "tooltip-ca-unprotect": "Parastina vê rûpelê biguherîne",
        "tooltip-ca-delete": "Vê rûpelê jê bibe",
        "tooltip-ca-move": "Navekî nû bide vê rûpelê",
        "tooltip-ca-watch": "Vê rûpelê têke nav lîsteya te ya şopandinê",
        "tooltip-watchlistedit-normal-submit": "Sernavan jê bibe",
        "tooltip-watchlistedit-raw-submit": "Lîsteya şopandinê rojane bike",
        "tooltip-upload": "Barkirinê destpêke",
+       "tooltip-summary": "Kurteyek kurt binivîse",
        "common.js": "/* Any JavaScript here will be loaded for all users on every page load. */",
        "anonymous": "Bikarhênera/ê nediyarkirî ya/yê {{SITENAME}}",
        "siteuser": "Bikarhênera $1 ê {{SITENAME}}",
        "version-software-product": "Berhem",
        "version-software-version": "Guherto",
        "version-entrypoints-header-url": "URL",
+       "version-libraries-description": "Danasîn",
        "fileduplicatesearch-filename": "Navê dosyeyê:",
        "fileduplicatesearch-submit": "Lê bigere",
        "specialpages": "Rûpelên taybet",
        "logentry-delete-delete": "$1 rûpela $3 {{GENDER:$2|jê bir}}",
        "revdelete-content-hid": "naverok veşartî ye",
        "revdelete-uname-hid": "navê bikarhêneriyê yê veşartî",
-       "logentry-move-move": "$1 rûpela $3 ji $4e re {{GENDER:$2|barkir}}",
+       "logentry-move-move": "$1 navê $3 weke $4 guherand",
        "logentry-move-move-noredirect": "$1 navê $3 guherand û kir $4",
        "logentry-move-move_redir": "$1 navê $3 guherand û kir $4",
-       "logentry-newusers-newusers": "$1 hesabekî bikarhêneriyê çêkir",
+       "logentry-newusers-newusers": "$1 wek hesabê bikarhêneriyê hate {{GENDER:$2|çêkirin}}",
        "logentry-newusers-create": "Hesabe bikarhêneriyê $1 {{GENDER:$2|hate çêkirin}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|hate barkirin}} $3",
        "rightsnone": "(tune)",
        "special-characters-group-thai": "Tay",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
-       "mw-widgets-titleinput-description-new-page": "Rûpel hê tune ye",
-       "mw-widgets-titleinput-description-redirect": "beralî bike ber bi $1"
+       "mw-widgets-titleinput-description-new-page": "rûpel hê tune ye",
+       "mw-widgets-titleinput-description-redirect": "beralî bike ber bi $1 ve"
 }
index 17cccc2..a40a73e 100644 (file)
@@ -50,7 +50,7 @@
        "sunday": "Dy'Sul",
        "monday": "Dy'Lun",
        "tuesday": "Dy'Meurth",
-       "wednesday": "Dy'Merher",
+       "wednesday": "Dy'Mergher",
        "thursday": "Dy'Yow",
        "friday": "Dy'Gwener",
        "saturday": "Dy'Sadorn",
        "category-empty": "''Nyns eus na folennow na media y'n class-ma.''",
        "hidden-categories": "{{PLURAL:$1|Klass kudhys|Klassys kudhys}}",
        "hidden-category-category": "Klassys kudhys",
-       "category-subcat-count": "{{PLURAL:$2|Ny'n jeves an klass-ma marnas an isglass a syw.|An klass-ma a'n jeves an {{PLURAL:$1|isglass|$1 isglass}} a syw, dhyworth somm a $2.}}",
+       "category-subcat-count": "{{PLURAL:$2|Nyns eus dhe'n klass ma marnas an isglass a syw.|Yma dhe'n klass ma an {{PLURAL:$1|isglass|$1 isglass}} a syw, dhyworth somm a $2.}}",
        "category-subcat-count-limited": "An klass-ma a'n jeves an {{PLURAL:$1|isglass|$1 isglass}} a syw.",
-       "category-article-count": "{{PLURAL:$2|Ny'n jeves an klass-ma marnas an folen a syw.|Yma an {{PLURAL:$1|folen|$1 folennow}} a syw y'n klass-ma, dhyworth somm a $2.}}",
+       "category-article-count": "{{PLURAL:$2|Nyns eus dhe'n klass ma marnas an folen a syw.|Yma an {{PLURAL:$1|folen|$1 folennow}} a syw y'n klass ma, dhyworth somm a $2.}}",
        "category-article-count-limited": "Yma an {{PLURAL:$1|folen|$1 folen}} a syw y'n klass-ma.",
-       "category-file-count": "{{PLURAL:$2|Ny'n jeves an klass-ma marnas an restren a syw.|Yma an {{PLURAL:$1|restren|$1 restren}} a syw y'n klass-ma, dhyworth somm a $2.}}",
+       "category-file-count": "{{PLURAL:$2|Nyns eus dhe'n klass ma marnas an restren a syw.|Yma an {{PLURAL:$1|restren|$1 restren}} a syw y'n klass ma, dhyworth somm a $2.}}",
        "category-file-count-limited": "Yma an {{PLURAL:$1|folen|$1 folen}} a syw y'n klass-ma.",
        "listingcontinuesabbrev": "pes.",
        "about": "A-dro dhe",
        "article": "Folen dhalgh",
-       "newwindow": "(ygeri yn fenester nowyth)",
+       "newwindow": "(ygeri yn fenester nowydh)",
        "cancel": "Hedhi",
        "moredotdotdot": "Moy...",
        "mypage": "Folen",
        "permalink": "Kevren fast",
        "print": "Pryntya",
        "view": "Gweles",
+       "view-foreign": "Gweles war $1",
        "edit": "Chanjya",
        "create": "Gwruthyl",
        "editthispage": "Chanjya an folen-ma",
        "protectthispage": "Difres an folen-ma",
        "unprotect": "Chanjya difresans",
        "unprotectthispage": "Chanjya difresans an folen-ma",
-       "newpage": "Folen nowyth",
+       "newpage": "Folen nowydh",
        "talkpage": "Dadhlow a'n folen-ma",
        "talkpagelinktext": "keskows",
        "specialpage": "Folen arbennek",
        "articlepage": "Gweles an folen",
        "talk": "Keskows",
        "views": "Gwelyansow",
-       "toolbox": "Toulgist",
+       "toolbox": "Toulys",
        "userpage": "Gweles an folen dhevnydhyer",
        "projectpage": "Gweles folen an ragdres",
        "imagepage": "Gweles folen an restren",
        "otherlanguages": "Yn yethow erel",
        "redirectedfrom": "(Daskedyes dhyworth $1)",
        "redirectpagesub": "Folen dhaskedya",
-       "lastmodifiedat": "Diwettha chanj an folen-ma o an $1, dhe $2.",
+       "lastmodifiedat": "Gwrys veu diwettha chanj an folen ma an $1, dhe $2.",
        "protectedpage": "Folen dhifresys",
        "jumpto": "Lamma dhe:",
        "jumptonavigation": "kevrennow lewya",
        "currentevents-url": "Project:Hwarvosow a-lemmyn",
        "disclaimers": "Avisyansow",
        "disclaimerpage": "Project:Avisyans ollgemmyn",
-       "edithelp": "Gweres gans chanjya",
+       "edithelp": "Gweres ow chanjya",
        "mainpage": "Dynnargh",
        "mainpage-description": "Dynnargh",
        "policy-url": "Project:Polici",
        "privacypage": "Project:Polici privetter",
        "badaccess": "Gwall kummyes",
        "ok": "Sur",
-       "retrievedfrom": "Daskevys dhyworth \"$1\"",
+       "retrievedfrom": "Dhyworth \"$1\"",
        "youhavenewmessages": "$1 a'gas beus ($2).",
        "youhavenewmessagesfromusers": "Hwi a'gas beus $1 dhyworth {{PLURAL:$3|devnydhyer aral|$3 devnydhyer}} ($2).",
        "youhavenewmessagesmanyusers": "Hwi a'gas beus $1 dhyworth lies devnydhyer ($2).",
        "exception-nologin-text": "An folen-ma po an gwrians-ma a wovyn mayth omgelmowgh war an wiki-ma.",
        "logouttext": "'''Digelmys owgh lemmyn.'''\n\nHwi a yll pesya devnydhya {{SITENAME}} yn tihanow, po hwi a yll <span class='plainlinks'>[$1 omgelmi arta]</span> avel an keth devnydhyer po avel devnydhyer aral.\nNotyewgh: Neb folennow a alsa bos diskwedhys kepar del owgh hwath omgelmys, erna glerhahowgh cache agas peurel.",
        "welcomeuser": "Dynnargh, $1!",
-       "welcomecreation-msg": "Gwruthys re beu agas akont.\nNa ankevewgh dhe janjya agas [[Special:Preferences|dewisyansow {{SITENAME}}]].",
+       "welcomecreation-msg": "Gwruthys re beu agas akont.\nNa ankevewgh dhe janjya agas [[Special:Preferences|dewisyow {{SITENAME}}]].",
        "yourname": "Hanow devnydhyer:",
        "userlogin-yourname": "Hanow devnydhyer",
        "userlogin-yourname-ph": "Entrewgh agas hanow devnydhyer",
        "logout": "Digelmi",
        "userlogout": "Digelmi",
        "notloggedin": "Digelmys",
-       "userlogin-noaccount": "A ny'gas beus akont?",
+       "userlogin-noaccount": "A nyns eus akont dhywgh?",
        "userlogin-joinproject": "Junya {{SITENAME}}",
        "nologin": "A ny'gas beus akont? '''$1'''.",
        "nologinlink": "Gwruthyl akont",
-       "createaccount": "Gwruthyl akont nowyth",
+       "createaccount": "Gwruthyl akont nowydh",
        "gotaccount": "Eus akont dhywgh seulabrys? '''$1'''.",
        "gotaccountlink": "Omgelmi",
        "userlogin-resetlink": "A ankevsowgh hwi agas manylyon omgelmi?",
-       "userlogin-resetpassword-link": "Dassettya agas ger tremena",
+       "userlogin-resetpassword-link": "Ankevys agas ger tremena genowgh?",
+       "userlogin-helplink2": "Gweres owth omgelmi",
        "createacct-emailrequired": "Trigva ebost",
        "createacct-emailoptional": "Trigva ebost (a-dhewis)",
        "createacct-email-ph": "Entrewgh agas trigva ebost",
        "createaccount-title": "Gwruthyl akont rag {{SITENAME}}",
        "createaccount-text": "Nebonan a wrug akont rag agas trigva ebost war {{SITENAME}} ($4) henwys \"$2\", \"$3\" y er tremena.\nY talvia dhywgh omgelmi ha chanjya agas ger tremena lemmyn.\n\nHwi a yll skonya aswon an messach-ma mar peu an akont-ma gwruthys yn gwall.",
        "loginlanguagelabel": "Yeth: $1",
+       "pt-login": "Omgelmi",
+       "pt-login-button": "Omgelmi",
+       "pt-createaccount": "Gwruthyl akont",
+       "pt-userlogout": "Digelmi",
        "changepassword": "Chanjya an ger-tremena",
        "resetpass_announce": "Hwi a omgelmis dre goden ebostyes anbarthus.\nRag gorfenna omgelmi, res yw dhywgh settya ger tremena nowyth omma:",
        "resetpass_header": "Chanjya ger tremena an akont",
        "passwordreset": "Dassettya an ger tremena",
        "passwordreset-text-one": "Lenwewgh an furvlen-ma rag dassettya agas ger tremena.",
        "passwordreset-text-many": "{{PLURAL:$1|Entrewgh onan a'n tymmyn a dhata a-woles rag dassettya agas ger tremena.}}",
-       "passwordreset-legend": "Dassettya an ger tremena",
        "passwordreset-disabled": "Dialosegys yw dassettya geryow tremena war an wiki-ma.",
        "passwordreset-username": "Hanow devnydhyer:",
        "passwordreset-domain": "Tiredh:",
        "nowiki_tip": "Skonya aswon furvyans wiki",
        "image_tip": "Restren neythys",
        "media_tip": "Kevren restren",
-       "sig_tip": "Agas sinans gans stampa-termyn",
+       "sig_tip": "Agas sinans ha stampa-termyn",
        "summary": "Berrskrif:",
        "subject": "Testen/Pennlinen:",
-       "minoredit": "Chanj byhan yw hemma",
-       "watchthis": "Golya an folen-ma",
+       "minoredit": "Chanj byghan yw hemma",
+       "watchthis": "Golya an folen ma",
        "savearticle": "Gwitha an folen",
        "preview": "Ragwel",
        "showpreview": "Diskwedhes ragwel",
        "showdiff": "Diskwedhes an chanjyow",
-       "anoneditwarning": "'''Gwarnyans:''' Nyns owgh omgelmys.\nRekordys vydh agas trigva IP yn istori an folen-ma.",
+       "anoneditwarning": "<strong>Gwarnyans:</strong> Nyns owgh hwi omgelmys. Gweladow yn foblek vydh agas trigva IP mar kwrewgh chanjyow. Mars <strong>[$1 omgelmowgh]</strong> po <strong>[$2 gwruthyl akont]</strong>, agas chanjyow a vydh askrifys dhe'gas hanow devnydher, keffrys ha lesow erel.",
        "anonpreviewwarning": "''Nyns owgh omgelmys. Dre witha, agas trigva IP a vydh rekordyes istori chanjya an folen-ma.''",
        "summary-preview": "Ragwel a'n berrskrif:",
        "loginreqtitle": "Res yw omgelmi",
        "loginreqlink": "omgelmi",
        "accmailtitle": "Ger-tremena danvenys.",
        "newarticle": "(Nowyth)",
-       "newarticletext": "Hwi re holyas kevren dhe folen nag yw gwruthys hwath.\nRag gwruthyl an folen, dalethewgh jynnskrifa y'n gist a-woles (gwelewgh an [$1 folen weres] rag moy kedhlow).\nMar teuthowgh omma yn kamm, klyckyewgh boton '''war-dhelergh''' agas peurel.",
-       "noarticletext": "Nyns eus tekst y'n folen-ma a-lemmyn.\nHwi a yll [[Special:Search/{{PAGENAME}}|hwilas titel an folen-ma]] yn folennow erel,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hwilas y'n kovnotennow kelmys],\npo [{{fullurl:{{FULLPAGENAME}}|action=edit}} chanjya an folen-ma]</span>.",
-       "noarticletext-nopermission": "Nyns eus tekst y'n folen-ma a-lemmyn.\nHwi a yll [[Special:Search/{{PAGENAME}}|hwilas titel an folen-ma]] yn folennow erel, po <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hwilas y'n kovnotennow kelmys]</span>, mes ny'gas beus kummyes dhe wruthyl an folen-ma.",
+       "newarticletext": "Hwi re holyas kevren dhe folen nag yw gwruthys hwath.\nRag gwruthyl an folen, dallethewgh jynnskrifa y'n gist a-woles (gwelewgh an [$1 folen weres] rag moy kedhlow).\nMar teuthowgh omma yn kamm, klyckyewgh boton '''war-dhelergh''' agas peurell.",
+       "noarticletext": "Nyns eus tekst y'n folen ma a-lemmyn.\nHwi a yll [[Special:Search/{{PAGENAME}}|hwilas titel an folen ma]] yn folennow erel,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hwilas y'n kovnotennow kelmys],\npo [{{fullurl:{{FULLPAGENAME}}|action=edit}} chanjya an folen ma]</span>.",
+       "noarticletext-nopermission": "Nyns eus tekst y'n folen ma a-lemmyn.\nHwi a yll [[Special:Search/{{PAGENAME}}|hwilas titel an folen ma]] yn folennow erel, po <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hwilas y'n kovnotennow kelmys]</span>, mes ny'gas beus kummyas dhe wruthyl an folen ma.",
        "userpage-userdoesnotexist": "Nyns yw kovskrifys an akont devnydhyer \"$1\".\nCheckyewgh mar pleg mara'gas beus hwans dhe wruthyl/dhe janjya an folen-ma.",
        "userpage-userdoesnotexist-view": "Nyns yw kovskrifys an akont devnydhyer \"$1\".",
        "updated": "(Nowedhys)",
        "yourtext": "Agas tekst",
        "yourdiff": "Dyffransow",
        "protectedpagewarning": "'''Gwarnyans: An folen-ma re beu difresys rag ma nag allo marnas devnydhyoryon gans gwiryow menystrer hy chanjya.'''\nRes yw an diwettha kovnoten a-woles rag godhvos:",
-       "templatesused": "{{PLURAL:$1|An skantlyn|Skantlyns}} devnydhys war an folen-ma:",
+       "templatesused": "{{PLURAL:$1|An skantlyn|Skantlyns}} devnydhys war an folen ma:",
        "templatesusedpreview": "{{PLURAL:$1|An skantlyn|Skantlyns}} devnydhys y'n ragwel-ma:",
        "template-protected": "(difresys)",
        "template-semiprotected": "(hanter-difresys)",
-       "hiddencategories": "Esel a {{PLURAL:$1|1 glass kudhys|$1 klass kudhys}} yw an folen-ma:",
-       "permissionserrorstext-withaction": "Ny'gas beus kummyes dhe $2, rag an {{PLURAL:$1|acheson|achesonys}} a syw:",
-       "moveddeleted-notice": "An folen-ma re beu diles.\nYma kovnoten dhilea ha gwaya an folen res a-woles.",
+       "hiddencategories": "Esel a {{PLURAL:$1|1 glass kudhys|$1 klass kudhys}} yw an folen ma:",
+       "permissionserrorstext-withaction": "Nyns eus kummyas dhywgh dhe $2, rag an {{PLURAL:$1|acheson|achesonys}} a syw:",
+       "moveddeleted-notice": "Diles veu an folen ma.\nA-woles yma kovnotennow dhilea ha gwaya an folen.",
        "log-fulllog": "Gweles an govnoten dhien",
-       "editwarning-warning": "Mar kasowgh an folen-ma, y halser kelli chanjyow gwrys genowgh.\nMars owgh omgelmys, hwi a yll dialosegi an gwarnyans-ma yn tregh \"Chanjya\" agas dewisyansow.",
+       "editwarning-warning": "Mar kesowgh an folen ma, hwi a allsa kelli chanjyow gwrys genowgh.\nMars owgh hwi omgelmys, hwi a yll diallosegi an gwarnyans ma yn tregh \"{{int:prefs-editing}}\" agas dewisyow.",
        "undo-success": "Y hyllir diswul an chanj-ma.\nCheckyewgh mar pleg an kehevelyans a-woles rag gwirya bos hemma an pyth a vynnowgh, hag ena gwithewgh an chanjyow a-woles rag gorfenna diswul an chanj.",
        "undo-summary": "Amendyans $1 gans [[Special:Contributions/$2|$2]] ([[User talk:$2|keskows]]) diswrys",
        "cantcreateaccounttitle": "Ny yllir gwruthyl an akont",
-       "viewpagelogs": "Gweles kovnotennow an folen-ma",
+       "viewpagelogs": "Gweles kovnotennow an folen ma",
        "currentrev": "Amendyans diwettha",
        "currentrev-asof": "An amendyans diwettha a-dhia $1",
        "revisionasof": "Versyon an folen a-dhia $1",
-       "revision-info": "Amendyans a-dhia $1 gans $2",
+       "revision-info": "Amendyans a-dhia $1 gans {{GENDER:$6|$2}}$7",
        "previousrevision": "← Amendyans kottha",
        "nextrevision": "Amendyans nowyttha →",
        "currentrevisionlink": "An amendyans diwettha",
        "shown-title": "Diskwedhes $1 {{PLURAL:$1|sewyans}} yn folen",
        "viewprevnext": "Gweles ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "''Yma folen henwys \"[[:$1]]\" war an wiki-ma'''",
-       "searchmenu-new": "'''Gwruthyl an folen \"[[:$1]]\" war an wiki-ma!'''",
+       "searchmenu-new": "<strong>Gwrewgh an folen \"[[:$1]]\" war an wiki ma!</strong> {{PLURAL:$2|0=|Gweler ynwegh an folen a veu kevys yn unn hwilas.|Gweler ynwedh an sewyans hwilas kevys.}}",
        "searchprofile-articles": "Folennow dalgh",
        "searchprofile-images": "Liesmedia",
        "searchprofile-everything": "Puptra",
        "search-result-category-size": "{{PLURAL:$1|1 esel|$1 esel}} ({{PLURAL:$2|1 isglass|$2 isglass}}, {{PLURAL:$3|1 restren|$3 restren}})",
        "search-redirect": "(daskedyans $1)",
        "search-section": "(tregh $1)",
-       "search-suggest": "A styrsowgh hwi: $1",
+       "search-suggest": "Esewgh hwi ow menya: $1",
        "search-interwiki-caption": "Ragdresow hwor",
        "search-interwiki-default": "$1 sewyansow:",
        "search-interwiki-more": "(moy)",
        "search-relatedarticle": "Kelmys",
        "searchrelated": "kelmys",
        "searchall": "oll",
+       "search-showingresults": "{{PLURAL:$4|Sewyans <strong>$1</strong> a <strong>$3</strong>|Sewyansow <strong>$1 - $2</strong> a <strong>$3</strong>}}",
        "search-nonefound": "Nyns esa sewyans vyth owth omdhesedha orth an govyn.",
        "powersearch-legend": "Hwilans avonsys",
        "powersearch-ns": "Hwilas yn spasys-hanow:",
        "powersearch-toggleall": "Oll",
        "powersearch-togglenone": "Nagonan",
        "search-external": "Hwilans a-ves",
-       "preferences": "Dewisyansow",
-       "mypreferences": "Dewisyansow",
+       "preferences": "Dewisyow",
+       "mypreferences": "Dewisyow",
        "prefs-edits": "Niver a janjyow:",
        "prefs-skin": "Krohen",
        "skin-preview": "Ragweles",
        "action-upload": "ughkarga an restren-ma",
        "action-delete": "dilea an folen-ma",
        "nchanges": "$1 {{PLURAL:$1|chanj|chanj}}",
+       "enhancedrc-history": "istori",
        "recentchanges": "Chanjyow a-dhiwedhes",
        "recentchanges-legend": "Etholyow an chanjyow a-dhiwedhes",
-       "recentchanges-summary": "Y hyllir helerhi an chanjyow diwettha gwrys dhe'n wiki war an folen-ma.",
+       "recentchanges-summary": "War an folen-ma y hyllir helerghi an chanjyow diwettha eus gwrys dhe'n wiki.",
        "recentchanges-noresult": "Nyns eus chanj vyth dres an termyn res a omdhesedh orth an etholyow-ma.",
        "recentchanges-feed-description": "Y hyllir helerhi an chanjyow diwettha gwrys dhe'n wiki y'n feed-ma.",
-       "recentchanges-label-newpage": "Y feu gwruthys folen nowyth gans an chanj-ma",
-       "recentchanges-label-minor": "Chanj byhan yw hemma",
-       "recentchanges-label-bot": "Gwrys veu an chanj-ma gans bott",
-       "recentchanges-label-unpatrolled": "Ny veu an chanj-ma patrolyes hwath",
-       "recentchanges-legend-newpage": "$1 - folen nowyth",
-       "rclistfrom": "Diskwedhes chanjyow nowyth yn unn dhalleth dhyworth $3 $2",
-       "rcshowhideminor": "$1 chanjyow byhan",
+       "recentchanges-label-newpage": "Gans an chanj ma y feu gwruthys folen nowydh",
+       "recentchanges-label-minor": "Chanj byghan yw hemma",
+       "recentchanges-label-bot": "Gwrys veu an chanj ma gans bott",
+       "recentchanges-label-unpatrolled": "Ny veu an chanj ma patrolyes hwath",
+       "recentchanges-legend-heading": "'''Alhwedh:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (gweler ynwedh an [[Special:NewPages|rol a folennow nowydh]])",
+       "rclistfrom": "Diskwedhes chanjyow nowydh yn unn dhalleth dhyworth $3 $2",
+       "rcshowhideminor": "$1 chanjyow byghan",
+       "rcshowhideminor-hide": "Kudha",
        "rcshowhidebots": "$1 bottow",
-       "rcshowhideliu": "$1 devnydhoryon omgelmys",
+       "rcshowhidebots-show": "Diskwedhes",
+       "rcshowhideliu": "$1 devnydhoryon govskrifys",
+       "rcshowhideliu-hide": "Kudha",
        "rcshowhideanons": "$1 devnydhyoryon dhihanow",
+       "rcshowhideanons-show": "Diskwedhes",
+       "rcshowhideanons-hide": "Kudha",
        "rcshowhidemine": "$1 ow chanjyow",
+       "rcshowhidemine-hide": "Kudha",
        "rclinks": "Diskwedhes an $1 chanj diwettha gwrys y'n $2 dydh diwettha<br />$3",
        "diff": "dyffrans",
        "hist": "istori",
        "minoreditletter": "B",
        "newpageletter": "N",
        "boteditletter": "bott",
+       "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} wosa an chanj",
        "newsectionsummary": "/* $1 */ tregh nowyth",
        "rc-enhanced-expand": "Diskwedhes an manylyon (res yw JavaScript)",
        "rc-enhanced-hide": "Kudha an manylyon",
        "listfiles_count": "Versyons",
        "file-anchor-link": "Restren",
        "filehist": "Istori an restren",
-       "filehist-help": "Klyckyewgh war dhedhyans/eur rag gweles an folen del omdhiskwedhas nena.",
+       "filehist-help": "Klyckyewgh war dhedhyans/eur rag gweles an folen dell omdhiskwedhas nena.",
        "filehist-deleteall": "dilea oll",
        "filehist-deleteone": "dilea",
        "filehist-revert": "gorthtreylya",
        "filehist-user": "Devnydhyer",
        "filehist-dimensions": "Mynsow",
        "filehist-filesize": "Mens an restren",
-       "filehist-comment": "Kampol",
+       "filehist-comment": "Kampoll",
        "imagelinks": "Devnydh an restren",
-       "linkstoimage": "Yma an {{PLURAL:$1|folen|$1 folen}} a syw ow kevrenna dhe'n restren-ma:",
+       "linkstoimage": "Yma an {{PLURAL:$1|folen|$1 folen}} a syw ow kevrenna dhe'n restren ma:",
        "linkstoimage-more": "Yma moy es $1 {{PLURAL:$1|folen}} ow kevrenna dhe'n restren-ma.\nNy dhiskwa an rol a syw marnas an {{PLURAL:$1|kynsa kevren folen|kynsa $1 kevren folen}} dhe'n restren-ma.\nYma [[Special:WhatLinksHere/$2|rol leun]] kavadow.",
        "nolinkstoimage": "Nyns eus folen vyth ow kevrenna dhe'n restren-ma.",
        "morelinkstoimage": "Gweles [[Special:WhatLinksHere/$1|moy kevrennow]] dhe'n restren-ma.",
        "sharedupload": "Yma an folen-ma ow tos dhyworth $1 ha hy a alsa bos yn-dann devnydh gans ragdresow erel.",
-       "sharedupload-desc-here": "Yma an restren-ma dhe $1 ha ragdresow erel a alsa bos orth hy devnydhya.\nDiskwedhys a-woles yw an deskrifans war hy [$2 folen dheskrifans] ena.",
+       "sharedupload-desc-here": "Yma an restren ma dhe $1 ha ragdresow erel a allsa bos orth hy devnydhya.\nDiskwedhys a-woles yw an deskrifans war hy [$2 folen dheskrifans] ena.",
        "uploadnewversion-linktext": "Ughkarga versyon nowyth a'n restren-ma",
        "filedelete": "Dilea $1",
        "filedelete-legend": "Dilea an restren",
        "listredirects": "Rol an daswedyansow",
        "unusedtemplates": "Skantlyns heb devnydh",
        "unusedtemplateswlh": "kevrennow erel",
-       "randompage": "Folen jonsus",
+       "randompage": "Folen dre happ",
        "statistics": "Statystygyon",
        "statistics-pages": "Folennow",
        "brokenredirects-edit": "chanjya",
        "protectedpages": "Folennow difresys",
        "protectedtitles": "Titlys difresys",
        "usercreated": "{{GENDER:$3|Gwruthys}} an $1 dhe $2",
-       "newpages": "Folennow nowyth",
+       "newpages": "Folennow nowydh",
        "newpages-username": "Hanow-usyer:",
        "ancientpages": "An kottha folennow",
        "move": "Gwaya",
        "allpagesfrom": "Diskwedhes folennow yn unn dhalleth orth:",
        "allpagesto": "Diskwedhes folennow yn unn dhiwedha orth:",
        "allarticles": "Keniver folen",
-       "allpagessubmit": "Mos",
+       "allpagessubmit": "Gweytha",
        "allpages-hide-redirects": "Kudha daskedyansow",
        "categories": "Klassys",
        "sp-deletedcontributions-contribs": "kevrohow",
        "import-noarticle": "Nyns eus folen vyth dhe ymperthi!",
        "tooltip-pt-userpage": "Agas folen dhevnydhyer",
        "tooltip-pt-mytalk": "Agas folen gows",
-       "tooltip-pt-preferences": "Agas dewisyansow",
+       "tooltip-pt-preferences": "Agas dewisyow",
        "tooltip-pt-watchlist": "Rol a folennow esowgh ow kolya rag chanjyow",
        "tooltip-pt-mycontris": "Rol a'gas kevrohow",
-       "tooltip-pt-login": "Ni a gomend mayth omgelmowgh, mes nyns yw besi",
+       "tooltip-pt-login": "Ni a gomend hwi dhe omgelmi, mes nyns yw besi",
        "tooltip-pt-logout": "Digelmi",
+       "tooltip-pt-createaccount": "Ni a gomend hwi dhe wruthyl akont hag omgelmi; byttegyns nyns yw besi",
        "tooltip-ca-talk": "Dadhlow a-dro dhe'n folen",
-       "tooltip-ca-edit": "Hwi a yll chanjya an folen-ma. Devnydhyewgh an boton 'ragweles' kyns gwitha mar pleg.",
-       "tooltip-ca-addsection": "Dalleth tregh nowyth",
-       "tooltip-ca-viewsource": "Difresys yw an folen-ma.\nHwi a yll gweles hy fennfenten.",
-       "tooltip-ca-history": "Amendyansow koth a'n folen-ma",
+       "tooltip-ca-edit": "Chanjya an folen ma",
+       "tooltip-ca-addsection": "Dalleth tregh nowydh",
+       "tooltip-ca-viewsource": "Difresys yw an folen ma.\nHwi a yll gweles hy fennfenten.",
+       "tooltip-ca-history": "Amendyansow koth a'n folen ma",
        "tooltip-ca-protect": "Difres an folen-ma",
        "tooltip-ca-delete": "Dilea an folen-ma",
-       "tooltip-ca-move": "Gwaya an folen-ma",
-       "tooltip-ca-watch": "Keworra an folen-ma dhe'gas rol wolya",
+       "tooltip-ca-move": "Gwaya an folen ma",
+       "tooltip-ca-watch": "Keworra an folen ma dhe'gas rol wolya",
        "tooltip-ca-unwatch": "Dilea an folen-ma dhyworth agas rol wolya",
        "tooltip-search": "Hwilas yn {{SITENAME}}",
-       "tooltip-search-go": "Mos dhe folen gans an keth hanow-ma, mars eus",
-       "tooltip-search-fulltext": "Hwilas an tekst-ma y'n folennow",
+       "tooltip-search-go": "Mos dhe folen dhedhi an keth hanow ma, mars eus",
+       "tooltip-search-fulltext": "Hwilas an tekst ma y'n folennow",
        "tooltip-p-logo": "Mos dhe'n folen dynnargh",
        "tooltip-n-mainpage": "Mos dhe'n folen dynnargh",
        "tooltip-n-mainpage-description": "Mos dhe'n folen dynnargh",
        "tooltip-n-portal": "A-dro dhe'n ragdres, an pyth a yllowgh gul, ple hyllir kavos taklow",
        "tooltip-n-currentevents": "Kavos kedhlow a-dro dhe hwarvosow a-lemmyn",
        "tooltip-n-recentchanges": "Rol a janjyow a-dhiwedhes y'n wiki",
-       "tooltip-n-randompage": "Karga folen jonsus",
+       "tooltip-n-randompage": "Karga folen dre happ",
        "tooltip-n-help": "Gweres",
        "tooltip-t-whatlinkshere": "Rol a bub folen wiki a gevren dhe omma",
-       "tooltip-t-recentchangeslinked": "Chanjyow a-dhiwedhes yn folennow a gevrennir dhyworth an folen-ma",
+       "tooltip-t-recentchangeslinked": "Chanjyow a-dhiwedhes yn folennow a gevren an folen ma dhedha",
        "tooltip-feed-rss": "Feed RSS rag an folen-ma",
-       "tooltip-feed-atom": "Feed Atom rag an folen-ma",
-       "tooltip-t-contributions": "Gweles rol a gevrohow an devnydhyer-ma",
+       "tooltip-feed-atom": "Feed Atom rag an folen ma",
+       "tooltip-t-contributions": "Gweles rol a gevrohow an devnydhyer ma",
        "tooltip-t-emailuser": "Danvon ebost dhe'n devnydhyer-ma",
        "tooltip-t-upload": "Ughkarga restrennow",
        "tooltip-t-specialpages": "Rol a geniver folen arbennek",
-       "tooltip-t-print": "Versyon pryntyadow a'n folen-ma",
-       "tooltip-t-permalink": "Kevren fast dhe'n amendyans-ma a'n folen",
+       "tooltip-t-print": "Versyon pryntyadow a'n folen ma",
+       "tooltip-t-permalink": "Kevren fast dhe'n amendyans ma a'n folen",
        "tooltip-ca-nstab-main": "Gweles an folen",
        "tooltip-ca-nstab-user": "Gweles an folen dhevnydhyer",
-       "tooltip-ca-nstab-special": "Folen arbennek yw homma; ny yllowgh chanjya an folen hy honen.",
+       "tooltip-ca-nstab-special": "Folen arbennek yw homma; ny yllowgh chanjya an folen hy honan.",
        "tooltip-ca-nstab-project": "Gweles folen an wiki",
        "tooltip-ca-nstab-image": "Gweles folen an restren",
        "tooltip-ca-nstab-template": "Gweles an skantlyn",
        "tooltip-ca-nstab-category": "Gweles folen an klass",
        "tooltip-minoredit": "Merkya hemma avel chanj byhan",
        "tooltip-save": "Gwitha agas chanjyow",
-       "tooltip-preview": "Ragweles agas chanjyow; devnydhyewgh hemma kyns gwitha mar pleg!",
+       "tooltip-preview": "Ragweles agas chanjyow; devnydhyewgh hemma kyns gwitha!",
        "tooltip-diff": "Diskwedhes an chanjyow a wrussowgh dhe'n tekst",
        "tooltip-compareselectedversions": "Gweles an dyffransow ynter dew amendyansow dewisyes an folen-ma",
        "tooltip-watch": "Keworra an folen-ma dhe'gas rol wolya",
-       "tooltip-rollback": "\"Revya war-dhelergh\" a worthtreyl chanjyow an diwettha devnydhyer yn unn glyck",
-       "tooltip-undo": "\"Diswul\" a worthtreyl an chanj-ma hag ygeri an furvlen janjya y'n modh ragweles. Y hyllir keworra acheson y'n berrskrif.",
+       "tooltip-rollback": "\"Revya war-dhelergh\" a worthtreyl chanjyow an diwettha devnydhyer der unn glyck",
+       "tooltip-undo": "\"Diswul\" a worthtreyl an chanj ma hag ygeri an furvlen janjya y'n modh ragweles. Y hyllir keworra acheson y'n berrskrif.",
        "tooltip-summary": "Entrewgh berrskrif",
        "siteuser": "devnydhyer {{SITENAME}} $1",
        "lastmodifiedatby": "Chanj diwettha an folen-ma o dhe $2, $1 gans $3.",
        "pageinfo-toolboxlink": "Kedhlow an folen",
        "previousdiff": "← Chanj kottha",
        "nextdiff": "Chanj nowyttha →",
-       "file-info-size": "$1 × $2 piksel, myns an restren: $3, ehen MIME: $4",
-       "file-nohires": "Nyns eus klerder uhella kavadow.",
+       "file-info-size": "$1 × $2 piksel, myns an restren: $3, eghen MIME: $4",
+       "file-nohires": "Nyns eus klerder ughella kavadow.",
        "svg-long-desc": "Restren SVG, $1 × $2 piksel yn hanow, myns an restren: $3",
-       "show-big-image": "Klerder leun",
+       "show-big-image": "Restren wreydhek",
+       "show-big-image-preview": "Myns an ragwel ma: $1.",
+       "show-big-image-other": "{{PLURAL:$2|Klerder aral|Klerderyow erel}}: $1.",
+       "show-big-image-size": "$1 × $2 piksel",
        "ilsubmit": "Hwilas",
        "metadata": "Metadata",
-       "metadata-help": "An restren-ma a's teves kedhlow keworansel, dres lycklod keworrys dhyworth an kamera bysyel po an skanyer devnydhys rag hy gwruthyl po hy bysya. Mars yw chanjys an restren dhyworth hy studh gwredhek, possybyl yw na veu nebes manylyon nowedhys.",
+       "metadata-help": "An restren ma a's teves kedhlow keworransel, dres lycklod keworrys dhyworth an kamera bysyel po an skanyer devnydhys rag hy gwruthyl po hy bysya. Mars yw chanjys an restren dhyworth hy studh gwredhek, possybyl yw na veu nebes manylyon nowedhys.",
        "metadata-expand": "Diskwedhes manylyon ystynnys",
        "metadata-collapse": "Kudha manylyon ystynnys",
        "exif-imagewidth": "Les",
        "namespacesall": "oll",
        "monthsall": "oll",
        "confirmemail": "Afydhya an drigva ebost",
-       "confirmemail_noemail": "Nyns eus trigva ebost da settyes y'gas [[Special:Preferences|dewisyansow devnydhyer]].",
+       "confirmemail_noemail": "Nyns eus trigva ebost da settyes y'gas [[Special:Preferences|dewisyow devnydhyer]].",
        "imgmultipageprev": "← folen gyns",
        "imgmultipagenext": "folen nessa →",
        "imgmultigo": "Mos",
        "specialpages-group-login": "Omgelmi / gwruthyl akont",
        "blankpage": "Folen wag",
        "tag-filter": "Sidhel [[Special:Tags|tagyow]]:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tagg|Taggys}}]]: $2)",
        "tags-edit": "chanjya",
        "dberr-problems": "Drog yw genen! An wiasva-ma a's teves kaletter teknogel.",
        "dberr-again": "Assayewgh gortos pols ha daskarga.",
        "logentry-move-move": "$1 {{GENDER:$2|a wayas}} an folen $3 dhe $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|a wayas}} an folen $3 dhe $4 heb gasa daskedyans",
        "logentry-move-move_redir": "$1 {{GENDER:$2|a wayas}} an folen $3 dhe $4 dres daskedyans",
+       "logentry-newusers-create": "{{GENDER:$2|Gwruthys}} veu an akont devnydhyer $1",
        "searchsuggest-search": "Hwilas",
        "searchsuggest-containing": "ynni...",
        "special-characters-group-latin": "Latin",
index 9011be4..a5e8183 100644 (file)
        "resetpass-submit-loggedin": "Kambiar kontrasenya",
        "resetpass-submit-cancel": "Anular",
        "passwordreset": "Restableser kontrasenya",
-       "passwordreset-legend": "Restableser kontrasenya",
        "passwordreset-username": "Nombre de usador:",
        "passwordreset-domain": "Dominio:",
        "passwordreset-email": "Adresso de letral:",
        "watchlisttools-edit": "Ver i trocar tu lista de escogidas",
        "watchlisttools-raw": "Troca tu lista de escogidas en crudo",
        "hebrew-calendar-m1": "Tishre",
-       "hebrew-calendar-m2": "Heshvan",
+       "hebrew-calendar-m2": "eshvan",
        "hebrew-calendar-m1-gen": "Tishre",
-       "hebrew-calendar-m2-gen": "Heshvan",
+       "hebrew-calendar-m2-gen": "eshvan",
        "duplicate-defaultsort": "'''Aviso:''' la klave primaria para ordenamiento \"$2\" anula la primera \"$1\"",
        "version": "Versión",
        "version-specialpages": "Pajinas espesiales",
index abf7fab..f560226 100644 (file)
        "passwordreset": "Passwuert zrécksetzen",
        "passwordreset-text-one": "Fëllt dëse Formulaire aus fir Äert Passwuert zréckzesetzen.",
        "passwordreset-text-many": "{{PLURAL:$1|Fëllt eent vun de Felder aus fir en temporäert Passwuert per E-Mail ze kréien.}}",
-       "passwordreset-legend": "Passwuert zrécksetzen",
        "passwordreset-disabled": "D'Zerécksetze vum Passwuert ass op dëser Wiki ausgeschalt.",
        "passwordreset-emaildisabled": "D'E-Mail-Funktioune goufen op dëser Wiki ausgeschalt.",
        "passwordreset-username": "Benotzernumm:",
        "changeemail-throttled": "Dir hutt zevill dacks versicht Iech anzeloggen.\nWaart w.e.g. $1 ier Dir et nach eng Kéier probéiert.",
        "resettokens": "Token zrécksetzen",
        "resettokens-no-tokens": "Et gëtt keng Tokens fir zréck ze setzen.",
-       "resettokens-legend": "Token zrécksetzen",
        "resettokens-tokens": "Token:",
        "resettokens-token-label": "$1 (aktuelle Wäert: $2)",
        "resettokens-watchlist-token": "Token fir de Webfeed (Atom/RSS) vun den [[Special:Watchlist|Ännerungen op Säite vun Ärer Iwwerwaachungslëscht]]",
        "content-model-css": "CSS",
        "content-json-empty-object": "Eidelen Objet",
        "content-json-empty-array": "Eidel Tabell",
+       "duplicate-args-warning": "<strong>Opgepasst:</strong> [[:$1]] rifft [[:$2]] mat méi wéi engem Wäert fir de Parameter \"$3\" op. Nëmmen de leschte Wäert gëtt benotzt.",
        "duplicate-args-category": "Säiten, déi duebel Argumenter a Schablounenopriff gebrauchen",
        "expensive-parserfunction-warning": "'''Opgepasst:'' Dës Säit huet ze vill Ufroe vu komplexe Parserfunktiounen.\n\nEt däerfen net méi wéi $2 {{PLURAL:$2|Ufro|Ufroe}} sinn, aktuell {{PLURAL:$2|ass et $1 Ufro|sinn et $1 Ufroe}}.",
        "expensive-parserfunction-category": "Säiten, déi komplex Parserfunktiounen ze dacks opruffen",
        "randomincategory-nopages": "Et gëtt keng Säiten an der [[:Category:$1]].",
        "randomincategory-category": "Kategorie:",
        "randomincategory-legend": "Zoufälleg Säit an der Kategorie",
+       "randomincategory-submit": "Lass",
        "randomredirect": "Zoufälleg Viruleedung",
        "randomredirect-nopages": "Am Nummraum $1 gëtt et keng Viruleedungen.",
        "statistics": "Statistik",
        "noindex-category-desc": "D'Säit gëtt net vu Botten indexéiert, well dat magescht Wuert <code><nowiki>__NOINDEX__</nowiki></code> dran ass a well se an engem Nummraum ass, an deem déi Markéierung erlaabt ass.",
        "index-category-desc": "D'Säit huet <code><nowiki>__INDEX__</nowiki></code> an ass an engem Nummraum, wou déi Markéierung erlaabt ass an dofir gëtt d'Säit vu Sichroboter indexéiert wou dat normalerweis net de Fall wier.",
        "post-expand-template-inclusion-category-desc": "D'Säit ass méi grouss wéi <code>$wgMaxArticleSize</code> nom expandéiere vun alle Schablounen, dofir goufen e puer Schablounen net expandéiert.",
+       "post-expand-template-argument-category-desc": "D'Säit ass méi grouss wéi <code>$wgMaxArticleSize</code> nom Expandéiere vun engem Argument vun enger Schabloun (eppes an dräifachen Akkoladen, wéi <code>{{{Foo}}}</code>).",
        "broken-file-category-desc": "D'Säit huet e futtise Link op e Fichier (e Link op en agebonnene Fichier wann et de Fichier net gëtt).",
        "hidden-category-category-desc": "D'Kategorie huet <code><nowiki>__HIDDENCAT__</nowiki></code> an hirer Säit drastoen, dat verhënnert datt se standardméisseg an der Këscht mat de Kategorielinken op der Säit gewise gëtt.",
        "trackingcategories-nodesc": "Keng Beschreiwung disponibel.",
        "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-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-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.",
        "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",
        "import-interwiki-history": "Importéier all d'Versioune vun dëser Säit",
        "import-interwiki-templates": "Mat alle Schablounen",
        "import-interwiki-submit": "Import",
+       "import-mapping-default": "Op déi Plazen importéieren déi als Standard definéiert sinn",
        "import-mapping-namespace": "Import an een Nummraum:",
        "import-mapping-subpage": "Als Ënnersäiten op dës Säit importéieren:",
        "import-upload-filename": "Numm vum Fichier:",
        "tooltip-pt-logout": "Ofmellen",
        "tooltip-pt-createaccount": "Et gëtt Iech geroden e Benotzerkont unzeleeën an Iech anzeloggen; dat ass awer net obligatoresch",
        "tooltip-ca-talk": "Diskussioun iwwer de Säiteninhalt",
-       "tooltip-ca-edit": "Dës Säit ka geännert ginn. Maacht vun der Méiglechkeet Gebrauch fir ze \"kucken ouni ofzespäicheren\" a kuckt ob alles an der Rei ass ier der ofspäichert.",
+       "tooltip-ca-edit": "Dës Säit änneren",
        "tooltip-ca-addsection": "En neien Abschnitt ufänken.",
        "tooltip-ca-viewsource": "Dës Säit ass gespaart. Nëmmen de Quelltext ka gewise ginn.",
        "tooltip-ca-history": "Vireg Versioune vun dëser Säit",
        "deletedwhileediting": "<strong>Opgepasst:</strong>Dës Säit gouf geläscht nodeem datt Dir ugefaang hutt se z'änneren!",
        "confirmrecreate": "De Benotzer [[User:$1|$1]] ([[User talk:$1|Diskussioun]]) huet dës Säit geläscht, nodeem s datt där ugefaangen hutt drun ze schaffen. D'Begrënnung war: ''$2'' Bestätegt w.e.g., datt Dir dës Säit wierklech erëm nei opmaache wëllt.",
        "confirmrecreate-noreason": "De Benotzer [[User:$1|$1]] ([[User talk:$1|Diskussioun]]) huet dës Säit geläscht, nodeem s datt Dir ugefaangen hutt drun ze schaffen. Confirméiert w.e.g., datt Dir dës Säit wierklech erëm nei opmaache wëllt.",
-       "recreate": "Erëm uleeën",
+       "recreate": "Nees uleeën",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Dës Säit aus dem Server-Cache läschen?",
        "confirm-purge-bottom": "Mécht de Cache vun enger Säit eidel a forcéiert d'Uweise vun der aktueller Versioun.",
        "version-libraries": "Installéiert Bibliothéiken",
        "version-libraries-library": "Bibliothéik",
        "version-libraries-version": "Versioun",
+       "version-libraries-license": "Lizenz",
+       "version-libraries-description": "Beschreiwung",
+       "version-libraries-authors": "Auteuren",
        "redirect": "Viruleedung duerch e Fichier, e Benotzer, eng Säit oder eng Versiouns-ID",
        "redirect-legend": "Viruleedung op ee Fichier oder eng Säit",
        "redirect-summary": "Dës Spezialsäit ass eng Viruleedung op e Fichier (Fichiersnumm uginn), eng Säit (Versiounsnummer uginn) oder eng Benotzersäit (numeresch Benotzeridentifikatioun uginn).\nGebrauch: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], oder [[{{#Special:Redirect}}/user/101]].",
        "tags-edit-revision-submit": "Ännerungen op {{PLURAL:$1|dës Versioun|$1 Versiounen}} uwennen",
        "tags-edit-success": "D'Ännerunge goufen applizéiert.",
        "tags-edit-failure": "D'Ännerunge konnten net applizéiert ginn: $1",
+       "tags-edit-none-selected": "Sicht mindestens eng Markéierung eraus déi dir dobäisetzen oder ewechhuele wëllt.",
        "comparepages": "Säite vergläichen",
        "compare-page1": "Säit 1",
        "compare-page2": "Säit 2",
        "special-characters-group-khmer": "Khmer",
        "special-characters-title-minus": "Minus-Zeechen",
        "mw-widgets-titleinput-description-new-page": "Säit gëtt et nach net",
-       "mw-widgets-titleinput-description-redirect": "Viruleedung op $1"
+       "mw-widgets-titleinput-description-redirect": "viruleeden op $1"
 }
index af04196..bf2e9d4 100644 (file)
        "tog-numberheadings": "سأربألگە خود شمارئشت کو",
        "tog-showtoolbar": "نأڤار أڤزار ڤیرایئشت نە نئشو بیە",
        "tog-editondblclick": "بألگە یا نە ڤا د نۊ پوٙرنیئن ڤیرایئشت بأکیت",
-       "tog-editsectiononrightclick": "بهرجا ویرایشت نه وا راس پورنین د بهرجا داسونیا کنشتگر کو",
-       "tog-watchcreations": "بلگیایی که مه راس کمه و جانیایایی که مه سوار کمه اضاف کو د سیل برگه مه",
-       "tog-watchdefault": "بلگیا و جانیایی که مه ویرایشت کمه اضاف کو د سیل برگم",
-       "tog-watchmoves": "بلگیاو جانیایی  که مه جاوه جا کمه د سیل برگم اضاف کو",
-       "tog-watchdeletion": "بلگیا و جانیایی که مه پاک کمه اضاف کو د سیل برگم",
-       "tog-watchrollback": "همه بلگه یا نه د جایی که مه د سیل برگم می کم اضاف کو.",
-       "tog-minordefault": "همه ویرایشتیا کؤچک نه وا پیش فرض بیئن نشو دار کو.",
-       "tog-previewontop": "پیش سیل نه دما جعوه ویرایشت نشو بیئه",
-       "tog-previewonfirst": "پیش سیل نه د اولی ویرایشت نشو بیئه",
-       "tog-enotifwatchlistpages": "اÙ\88سÙ\87 Ú©Ù\87 Û\8cÙ\87 Ú¯Ù\84 Ø¨Ù\84Ú¯Ù\87 Û\8cا Ø¬Ø§Ù\86Û\8cا Ø¯ Ø³Û\8cÙ\84 Ø¨Ø±Ú¯ Ù\85Ù\87 Ø¢Ù\84شت Ø¨Ù\88ئÙ\87 Ù\85Ù\86Ù\87 Ù\88ا Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87 Ø®Ù\88ر کو",
-       "tog-enotifusertalkpages": "د گاتی که بلگه گپسن کاریار آلشت پیدا کرد منه وا انجومانامه خور کو",
-       "tog-enotifminoredits": "همچنو اوسه که ویرایشتیا کؤچکی د بلگیا یا جانیایا انجوم بوئه منه خور کو",
-       "tog-enotifrevealaddr": "نشونی انجومانامه منه د انجومانامه اشگار نشو بیه",
-       "tog-shownumberswatching": "اÙ\86ازÙ\87 Ú©Ø§Ø±Û\8cارÛ\8cاÛ\8cÛ\8c Ú©Ù\87 Ø¯ Ø­Ø§Ù\84 Ù\88 Ø¨Ø§Ù\84 Ø¯Û\8cئÙ\86Ù\86 Ù\86Ø´Ù\88 Ø¨Û\8cÙ\87",
-       "tog-oldsig": "اÙ\85ضاÙ\8aÛ\8c Ù\87Ù\8aئش:",
-       "tog-fancysig": "وا امضا چی ویکی متن رفتار داشتو",
-       "tog-uselivepreview": "پیش سیل زنه وه کار بیئر",
-       "tog-forceeditsummary": "منه د گاتی که یه گل چکسه ویرایشت حالی وارد بوئه سریع خور کو",
-       "tog-watchlisthideown": "قام كو ويرايشت منه د",
-       "tog-watchlisthidebots": "ویرایشت یا بوت نه د سیل برگ قام کو",
-       "tog-watchlisthideminor": "قام كو ويرايشت کؤچک منه د",
-       "tog-watchlisthideliu": "ویرایشت یا کاریاریا وامئن سامونه نه د سیل برگ قام کو",
-       "tog-watchlisthideanons": "ویرایشت یا کاروریا نادیار نه د سیل برگ قام کو",
-       "tog-watchlisthidepatrolled": "ویرایش تیا د تی رس نه د سیل برگ قام کو",
-       "tog-ccmeonemails": "ورداشته انجومانامه یا منه که سی کاریاریا تر می فرسنم سیم کل کو",
-       "tog-diffonly": "بلگیایی که د ور گرته فرخیا هارن نشون نیه",
-       "tog-showhiddencats": "دسÙ\87 Ù\8aا Ù\82اÙ\85 Ø¨Ù\8aئÙ\86Ù\87 Ù\86Ø´Ù\88Ù\86 Ø¨Ù\8aÙ\87",
-       "tog-norollbackdiff": "Ù\81رخÛ\8cا Ù\86Ù\87 Ø¯ Ø¨Û\8cÙ\86 Ø¨Ù\88رÛ\8cت Ù\86Ù\87ا Û\8cÙ\87 Ú¯Ù\84 Ø¹Ù\82Ù\88 Ú¯Ø±Ø¯ Ú©Ø±Ø¯Ù\86",
-       "tog-useeditwarning": "د گاتی که آلشتیا اماییه نبیه د بلگه ویرایشت وه جا می نم خورم کو",
-       "tog-prefershttps": "همیشه د گاتی که مه وامئن هئم د ارتواط امن وه کار بیئر",
-       "underline-always": "هميشه",
-       "underline-never": "هيژوخت",
-       "underline-default": "پوسه یا دوارته نیئر پیش فرض",
-       "editfont-style": "راساگه فونت شلک نه ویرایشت کو",
-       "editfont-default": "دوارته نیئر پیش بینی بیه",
-       "editfont-monospace": "فونت تک بلگه ای",
-       "editfont-sansserif": "سان سریف فونت",
-       "editfont-serif": "فونت سريف",
-       "sunday": "يه شمه",
-       "monday": "دوشمه",
-       "tuesday": "سه شمه",
-       "wednesday": "چارشمه",
-       "thursday": "پن شمه",
-       "friday": "جÙ\85Ù\87",
-       "saturday": "شمه",
-       "sun": "يه شمه",
-       "mon": "دوشمه",
-       "tue": "سه شمه",
-       "wed": "چارشمه",
-       "thu": "پن شمه",
-       "fri": "جÙ\85Ù\87",
-       "sat": "شمه",
+       "tog-editsectiononrightclick": "بأرجا ڤیرایئشت نە ڤا راس پوٙرنییئن د بأرجا داسوٙنیا کونئشتگأر کو",
+       "tog-watchcreations": "بألگە یایی کئ مئ رأڤأندیاری کئمە و جانیایی کئ مئ سوڤار کئمە ئضاف کو د سئیل بأرگە مئ",
+       "tog-watchdefault": "بألگە یایی کئ مئ رأڤأندیاری کئمە و جانیایی کئ مئ سوڤار کئمە ئضاف کو د سئیل بأرگە مئ",
+       "tog-watchmoves": "بألگە یایی و جانیایی کئ مئ جا ڤئ جا کئمە ئضاف کو د سئیل بأرگە مئ",
+       "tog-watchdeletion": "بألگە یایی و جانیایی کئ مئ پاکسا کئمە ئضاف کو د سئیل بأرگە مئ",
+       "tog-watchrollback": "هأمە بألگە یا نە د جایی کئ مئ می رئم ڤأ دئماتأر د د سئیل بأرگئم ئضاف کو.",
+       "tog-minordefault": "هأمە ڤیرایئشتیا کوچئک نە ڤا حال و بار پیش فأرض بییئن نئشوٙ دار کو.",
+       "tog-previewontop": "پیش سئیل نە دئما جأڤە ڤیرایئشت نئشوٙ بییە",
+       "tog-previewonfirst": "پیش سئیل نە د أڤألی ڤیرایئشت نئشوٙ بییە",
+       "tog-enotifwatchlistpages": "ئÙ\88سئ Ú©Ø¦ Û\8cئ Ú¯Ø¦Ù\84 Ø¨Ø£Ù\84Ú¯Û\95 Û\8cا Ø¬Ø§Ù\86Û\8cا Ø¯ Ø³Ø¦Û\8cÙ\84 Ø¨Ø£Ø±Ú¯Ø¦ Ù\85ئ Ø¢Ù\84ئشت Ø¨Ù\88Ù\99Ù\87 Ù\85ئÙ\86Û\95 Ú¤Ø§ Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ø®Ø£Ú¤Ø£ر کو",
+       "tog-enotifusertalkpages": "د گاتی کئ بألگە گأپئسن کاریار آلشت کاری بی مئنە ڤا أنجومانامە خأڤأر کو",
+       "tog-enotifminoredits": "هأمچئنی ئوسئ کئ ڤیرایئشتیا کوچئکی د بألگە یا یا جانیایا أنجوم بوە مئنە ڤارئسیاری بأک",
+       "tog-enotifrevealaddr": "تیر نئشوٙن أنجومانامە مئنە د أنجومانامە دیارکو دیاری بأک",
+       "tog-shownumberswatching": "Ø£Ù\86ازÛ\95 Ú©Ø§Ø±Û\8cارÛ\8cاÛ\8cÛ\8c Ú©Ø¦ Ø¯ Ø­Ø§Ù\84 Ù\88 Ø¨Ø§Ù\84 Ø¯Û\8cئÙ\86 Ù\87ئÙ\86 Ø¯Û\8cارÛ\8c Ø¨Ø£Ú©",
+       "tog-oldsig": "ئÙ\85ضاÛ\8cÛ\8c Ù\87Û\8c:",
+       "tog-fancysig": "ڤا ئمضا چی یئ گئل ڤیکی نیسئسە رأفتار بأک",
+       "tog-uselivepreview": "پیش سئیل زئنە ڤئ کار بئیر",
+       "tog-forceeditsummary": "مئنە د گاتی کئ یئ گئل چئکئسە ڤیرایئشت حالی میا ڤامین ڤئ یە توف کونوٙ ڤارسیاری بأک",
+       "tog-watchlisthideown": "ڤیرایئشتیا مئنە د سئیل بأرگ نئهوٙ بأک",
+       "tog-watchlisthidebots": "ڤیرایئشتیا بوت نە د سئیل بأرگ نئهوٙ بأک",
+       "tog-watchlisthideminor": "ڤیرایئشیا کوچئک نە د سئیل بأرگ نئهوٙ بأک",
+       "tog-watchlisthideliu": "ڤبرایشتیایی نە کئ ڤئ دأس کاریاریا ڤامین ئوٙماە أنجوم گئرئتە د سئیل بأرگ نئهوٙ بأک",
+       "tog-watchlisthideanons": "ڤیرایئشتیا کاریاریایی کئ نادیارئن د سئیل بأرگ نئهوٙ بأک",
+       "tog-watchlisthidepatrolled": "ڤیرایشتیایی که هان د تیە رأس د سئیل بأرگ قام کو",
+       "tog-ccmeonemails": "ڤورداشتە یا أنجومانامه یا مئنە کئ سی کاریاریا هأنی کئل می کئم سیم کئل بأک",
+       "tog-diffonly": "بألگە یایی کئ د ڤأر گئرتە فأرخیا هارئن دیاریشوٙ بأک",
+       "tog-showhiddencats": "دأسÛ\95 Û\8cا Ù\86ئÙ\87Ù\88Ù\99 Ø¨Û\8cÛ\8cØ£Ù\86ئ Ø¯Û\8cارÛ\8c Ø¨Ø£Ú©",
+       "tog-norollbackdiff": "Ù\81أرخÛ\8cا Ù\86Û\95 Ø¯ Û\8cئ Ú¯Ø¦Ù\84 Ú¤Ø§Ø¯Ø¦Ù\85ا Ø±Ø£ØªØ¦Ù\86 Ø¯ Ø¨Ø¦Û\8cÙ\86 Ø¨Ù\88رÛ\8cت",
+       "tog-useeditwarning": "د گاتی کئ آلئشتیا ئمایە نأبینە د بألگە ڤیرایئشت ڤئ جا مئ نئم مئنە ڤارئسیاری بأک",
+       "tog-prefershttps": "هأمیشە د گاتی کئ مئ هام د ساموٙنە پئیڤأند أمن نە ڤئ کار بئیر",
+       "underline-always": "هأمیشە",
+       "underline-never": "هیژڤأخت",
+       "underline-default": "پوٙسە یا دوڤارتە نییأر پیش فأرض",
+       "editfont-style": "راساگه فونت شیڤات نە ڤیرایئشت کو",
+       "editfont-default": "دوڤارتە نییأر نئها بینی بییە",
+       "editfont-monospace": "فونت تأک بألگە یی",
+       "editfont-sansserif": "فونت سان سئریف",
+       "editfont-serif": "Ù\81Ù\88Ù\86ت Ø³Ø¦Ø±Ù\8aÙ\81",
+       "sunday": "يئ شأمە",
+       "monday": "دۊشأمە",
+       "tuesday": "سئ شأمە",
+       "wednesday": "چارشأمە",
+       "thursday": "پأن شأمە",
+       "friday": "جÙ\88Ù\85Û\95",
+       "saturday": "شأمە",
+       "sun": "یئ شأمە",
+       "mon": "دۊشأمە",
+       "tue": "سئ شأمە",
+       "wed": "چارشأمە",
+       "thu": "پأن شأمە",
+       "fri": "جÙ\88Ù\85Û\95",
+       "sat": "شأمە",
        "january": "جانڤیە",
        "february": "فئڤریە",
        "march": "مارس",
        "october": "ئوکتور",
        "november": "نوڤامر",
        "december": "دئسامر",
-       "january-gen": "جانويه",
-       "february-gen": "فوريه",
-       "march-gen": "Ù\85ارش",
-       "april-gen": "آوريل",
-       "may-gen": "Ù\85ا",
-       "june-gen": "جوئن",
-       "july-gen": "جولای",
-       "august-gen": "اگوست",
-       "september-gen": "سپتامر",
-       "october-gen": "اÙ\83تÙ\88ر",
-       "november-gen": "نوامر",
-       "december-gen": "دسامر",
+       "january-gen": "جانڤیە",
+       "february-gen": "فئڤریە",
+       "march-gen": "Ù\85ارس",
+       "april-gen": "آڤریل",
+       "may-gen": "Ù\85ئÛ\8c",
+       "june-gen": "جوٙأن",
+       "july-gen": "جÙ\88Ù\99Ù\84اÛ\8c",
+       "august-gen": "Ø¢گوست",
+       "september-gen": "سئپتامر",
+       "october-gen": "ئÙ\88کتÙ\88Ú¤ر",
+       "november-gen": "نوڤامر",
+       "december-gen": "دئساÙ\85ر",
        "jan": "جانڤیە",
        "feb": "فئڤریە",
        "mar": "مارس",
        "oct": "ئوکتوڤر",
        "nov": "نوڤامر",
        "dec": "دئسامر",
-       "january-date": "جانويه $1",
-       "february-date": "فوريه  $1",
+       "january-date": "جانڤیە $1",
+       "february-date": "فئڤریە $1",
        "march-date": "مارس  $1",
-       "april-date": "آوريل $1",
-       "may-date": "Ù\85ا $1",
-       "june-date": "جوئن $1",
-       "july-date": "جÙ\88Ù\84اÙ\8a  $1",
-       "august-date": "اÙ\88ت  $1",
-       "september-date": "سپتامر $1",
-       "october-date": "اÙ\83تÙ\88ر  $1",
-       "november-date": "نوامر  $1",
-       "december-date": "دسامر $1",
-       "pagecategories": "{{PLURAL:$1|دسه|دسه يا}}",
-       "category_header": "بلگيا مئن دسه \"$1\"",
-       "subcategories": "زÙ\8aردسÙ\87 Ù\8aا",
-       "category-media-header": "وارسگر د دسه \"$1\"",
-       "category-empty": "اÛ\8c Ø¯Ø³Ù\87 Ù\88اÙ\82عÙ\86 Ø¯Ù\87 Ù\88ر Ú¯Ø±ØªÙ\87 Ù\87Û\8cÚ\98 Ø¨Ù\84Ú¯Ù\87 Ø§Û\8c Û\8cا Ù\88ارسگر Ø§ی نی",
-       "hidden-categories": "{{PLURAL:$1|دستÙ\87 Ù\82اÙ\85 Ø¨Ù\8aÙ\87|دستÙ\87 Ù\8aا Ù\82اÙ\85 Ø¨Ù\8aÙ\87}}",
-       "hidden-category-category": "دسÙ\87 Û\8cا Ù\82اÙ\85 Ø¨Û\8cÙ\87",
-       "category-subcat-count": "{{PLURAL:$2|اÛ\8c Ø¯Ø³Ù\87 Ù\81Ù\82Ø· Ø²Û\8cر Ø¯Ø³Ù\87 Ø¯Û\8cÙ\86داگر Ù\87اÙ\86 Ø¯Ø´ .|اÛ\8c Ø¯Ø³Ù\87 {{جÙ\85Û\8c:$1| Ø²Û\8cردسÙ\87|$1 Ø²Û\8cردسÙ\87 Û\8cا}}Ù\87ئ , Ù\88Ù\87 Ø¯Ø± Ø¯ $2 Ú©ل.}}",
-       "category-subcat-count-limited": "اÛ\8c Ø¯Ø³Ù\87 Ù\88ا Ø¯Ù\85 {{PLURAL:$1|زÛ\8cردسÙ\87|$1زÛ\8cردسÙ\87 Û\8cا}} Ø¨Ù\88ئÙ\87",
-       "category-article-count": "{{PLURAL:$2|اÛ\8c Ø¯Ø³Ù\87 Ø¯Ù\87 Ù\88ر Ú¯Ø±ØªÙ\87 Ø¨Ù\84Ú¯Ù\87 Ù\86Ù\87اÛ\8cÛ\8cÙ\87 .| {{جÙ\85Û\8c:$1| Ø¨Ù\84Ú¯Ù\87 Ù\87ئ|$1 Ø¨Ù\84Ú¯Û\8cا Ù\87ئÙ\86}} Ø¯ Ø§Û\8c Ø¯Ø³Ù\87, Ù\88Ù\87 Ø¯Ø± $2 Ú©ل.}}",
-       "category-article-count-limited": "نها {{PLURAL:$1|بلگه هئ|$1بلگیا هئن}} د دسه ایسنی .",
-       "category-file-count": "{{PLURAL:$2|اÛ\8c Ø¯Ø³Ù\87 Ù\81Ù\82Ø· Ø¯ Ù\88ر Ú¯Ø±ØªÙ\87 Ø¬Ø§Ù\86Û\8cا Ù\86Ù\87اÛ\8cÛ\8c Ù\87ئ file.| Ù\86Ù\87اÛ\8cÛ\8c {{جÙ\85Û\8c:$1|جاÙ\86Û\8cا Ù\87ئ|$1 Ø¬Ø§Ù\86Û\8cاÛ\8cا Ù\87ئÙ\86}} Ø¯ Ø§Û\8c Ø¯Ø³Ù\87, Ù\88Ù\87 Ø¯Ø± Ø¯ Ú©ل $2 .}}",
-       "category-file-count-limited": " {{PLURAL:$1|[جانیا هئ|1$جانیایا هئن}}نهایی هان د دسه ایسنی.",
-       "listingcontinuesabbrev": "دÙ\85اÙ\84Ù\87",
-       "index-category": "بلگيا سيائه دار",
-       "noindex-category": "بلگيا بی سيائه",
-       "broken-file-category": "بلگیایی که هوم پیوند جانیایا اشکسه دارن",
+       "april-date": "آڤریل $1",
+       "may-date": "Ù\85ئÛ\8c $1",
+       "june-date": "جوٙأن $1",
+       "july-date": "جÙ\88Ù\99Ù\84اÛ\8c $1",
+       "august-date": "Ø¢Ú¯Ù\88ست $1",
+       "september-date": "سئپتامر $1",
+       "october-date": "ئÙ\88کتÙ\88ڤر $1",
+       "november-date": "نوڤامر $1",
+       "december-date": "دئساÙ\85ر $1",
+       "pagecategories": "{{PLURAL:$1|}}{{PLURAL:$1|دأسە|دأسە يا}}",
+       "category_header": "بألگە یا مین دأسە \"$1\"",
+       "subcategories": "زÙ\8aردأسÛ\95 Û\8cا",
+       "category-media-header": "ڤارئسگأر د دأسە \"$1\"",
+       "category-empty": "ئÛ\8c Ø¯Ø£Ø³Û\95 Ø¯ Ø±Ø§Ø³ØªØ£Ú©Û\8c Ø¯ Ú¤Ø£Ø± Ú¯Ø¦Ø±Ø¦ØªÛ\95 Ù\87Û\8cÚ\86 Ø¨Ø£Ù\84Ú¯Û\95 Û\8cا Ú¤Ø§Ø±Ø¦Ø³Ú¯Ø£Ø±ی نی",
+       "hidden-categories": "{{PLURAL:$1|دأسÛ\95 Ù\82اÙ\85 Ø¨Û\8cÛ\8cÛ\95|دأسÛ\95 Û\8cا Ù\82اÙ\85 Ø¨Û\8cÛ\8cÛ\95}}",
+       "hidden-category-category": "دأسÛ\95 Û\8cا Ù\82اÙ\85 Ø¨Û\8cÛ\8cÛ\95",
+       "category-subcat-count": "{{PLURAL:$2|ئÛ\8c Ø¯Ø£Ø³Û\95 Ù\81Ø£Ù\82أط Ø²Û\8cردأسÛ\95 Û\8cا Ø¯Ø¦Ù\85اگئر Ù\87اÙ\86 Ø¯Ø¦Ø´.|ئÛ\8c Ø¯Ø£Ø³Û\95 {{PLURAL:$1|زÛ\8cردأسÛ\95|$1 Ø²Û\8cردأسÛ\95 Û\8cا}}Ù\87ئ , Ú¤Ø¦ Ø¯Ø£Ø± Ø¯ $2 Ú©Ù\88ل.}}",
+       "category-subcat-count-limited": "ئÛ\8c Ø¯Ø£Ø³Û\95 Ù\87ا Ø¯ {{PLURAL:$1|زÛ\8cردأسÛ\95|$1 Ø²Û\8cردأسÛ\95 Û\8cا}} Û\8cÛ\8c Ú©Ø¦ Ù\87ا Ú¤Ø¦ Ø¯Ù\88Ù\85ئشÙ\88Ù\99",
+       "category-article-count": "{{PLURAL:$2|ئÛ\8c Ø¯Ø£Ø³Û\95 Ø¯ Ú¤Ø£Ø±Ú¯Ø¦Ø±Ø¦ØªÛ\95 Ø¨Ø£Ù\84Ú¯Û\95 Ù\86ئÙ\87اÛ\8cÛ\8cÛ\95.| {{PLURAL:$1| Ø¨Ø£Ù\84Ú¯Û\95 Ù\87Û\8c|$1 Ø¨Ø£Ù\84Ú¯Û\95 Û\8cا Ù\87ئÙ\86}} Ø¯ Ø¦Û\8c Ø¯Ø£Ø³Û\95Ø\8c Ú¤Ø¦ Ø¯Ø£Ø± Ø¯ $2 Ú©Ù\88ل.}}",
+       "category-article-count-limited": "نئها {{PLURAL:$1|بألگە هی|$1بألگە یا هئن}} د دأسە ئیسئنی.",
+       "category-file-count": "{{PLURAL:$2|ئÛ\8c Ø¯Ø£Ø³Û\95 Ù\81Ø£Ù\82أط Ø¯ Ú¤Ø£Ø±Ú¯Ø¦Ø±Ø¦ØªÛ\95 Ø¬Ø§Ù\86Û\8cا Ù\86ئÙ\87اÛ\8cÛ\8cÛ\95.| Ù\86ئÙ\87اÛ\8cÛ\8c {{PLURAL:$1|جاÙ\86Û\8cا Ù\87Û\8c|$1 Ø¬Ø§Ù\86Û\8cاÛ\8cا Ù\87Û\8cÙ\86}} Ø¯ Ø¦Û\8c Ø¯Ø£Ø³Û\95Ø\8c Ú¤Ø¦ Ø¯Ø£Ø± Ø¯ Ú©Ù\88ل $2 .}}",
+       "category-file-count-limited": " {{PLURAL:$1|[جانیا هی|1$جانیایا هین}} نئهایی هان د دأسە ئیسئنی.",
+       "listingcontinuesabbrev": "دÙ\88Ù\85اÙ\84Û\95",
+       "index-category": "بألگە یا سیاە دار",
+       "noindex-category": "بألگە یا بی سیاە",
+       "broken-file-category": "بألگە یایی کئ هوم پئیڤأند جانیایا ئشگئسئ نە دارئن",
        "categoryviewer-pagedlinks": "($1) ($2)",
-       "about": "دبارÙ\87",
-       "article": "Ù\85Û\8cÙ\86Ù\88Ù\86Ù\87 Ø¨Ù\84Ú¯Ù\87",
-       "newwindow": "(نيمدری  تازه وا کو)",
-       "cancel": "اÙ\86جÙ\88Ù\85 Ø´Û\8cÙ\88سن",
-       "moredotdotdot": "بيشتر",
-       "morenotlisted": "اÛ\8c Ù\86Ù\88Ù\85جا Ù\83اÙ\85Ù\84 Ù\86بÙ\8aÙ\87",
-       "mypage": "بلگه",
-       "mytalk": "چك چنه",
-       "anontalk": "دبارÙ\87 ØªÛ\8cرÙ\86Ø´Ù\88Ù\86 Ø§Û\8c Ø¢Û\8c Ù¾Û\8c Ù\82صÙ\87 Ø¨Ù\83Ù\8aد",
-       "navigation": "ناوجوری",
+       "about": "دئبارÛ\95",
+       "article": "Ù\85Û\8cÙ\86Ù\88Ù\99Ù\86Û\95 Û\8cا Ø¨Ø£Ù\84Ú¯Û\95",
+       "newwindow": "(د یئ گئل نیمدأری تازە ڤاش کو)",
+       "cancel": "Ø£Ù\86جÙ\88Ù\85 Ø´Û\8cڤئسئن",
+       "moredotdotdot": "بیشتئر",
+       "morenotlisted": "ئÛ\8c Ù\86Ù\88Ù\85Ú¯Û\95 Ú©Ø§Ù\85ئÙ\84 Ø¨Û\8cÛ\8cÛ\95.",
+       "mypage": "بألگە",
+       "mytalk": "چأک چئنە",
+       "anontalk": "دئبارÛ\95 ØªÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø¦Û\8c Ø¢Û\8c Ù¾Û\8c Ù\82ئسÛ\95 Ø¨Ø£Ú©Û\8cت",
+       "navigation": "ناڤجوری",
        "and": "&#32;و",
-       "qbfind": "فهمسن،جسن",
-       "qbbrowse": "Ù\82رض Ú¯Ø±Øªن",
-       "qbedit": "ويرايشت",
-       "qbpageoptions": "اÛ\8c Ø¨Ù\84Ú¯Ù\87",
-       "qbmyoptions": "بلگيا مه",
-       "faq": "اÙ\81 Ø§Û\8c Ù\83Ù\8aÙ\88",
-       "faqpage": "پروجه:اف اي كيو",
-       "actions": "جمشت",
-       "namespaces": "نوم ورگه یا",
-       "variants": "Ø¢Ù\84شتگریا",
-       "navigation-heading": "Ù\85Ù\86Ù\88 Ù\86اÙ\88گشتÙ\86",
-       "errorpagetitle": "غلط",
-       "returnto": "ورگشت وه $1.",
+       "qbfind": "ڤارئسدار بییئن",
+       "qbbrowse": "Ù\82أرض Ú¯Ø¦Ø±Ø¦ØªØ¦ن",
+       "qbedit": "ڤیرایئشت",
+       "qbpageoptions": "ئÛ\8c Ø¨Ø£Ù\84Ú¯Û\95",
+       "qbmyoptions": "بألگە یا مئ",
+       "faq": "ئÙ\81 Ø¦Û\8c Ú©Û\8cÙ\88Ù\99",
+       "faqpage": "پوروٙجە: ئف ئی کیوٙ",
+       "actions": "کونئشتکاریا",
+       "namespaces": "نوم ڤأرگە یا",
+       "variants": "Ø¢Ù\84ئشگأریا",
+       "navigation-heading": "Ù\86Ù\88Ù\85 Ø¬Ø§Ú¯Û\95 Ù\86اڤگأردÛ\8c",
+       "errorpagetitle": "غألأط",
+       "returnto": "ڤورگأشتئن د $1.",
        "tagline": "د {{SITENAME}}",
        "help": "هومياری",
        "search": "پئی جوٙری",
        "searchbutton": "پئی جوٙری",
        "go": "رو",
        "searcharticle": "رو",
-       "history": "ويرگار بلگه",
-       "history_short": "ويرگار",
-       "updatedmarker": "د Ø¢Ø®Ø±Û\8cÙ\86 Ø¯Û\8cئÙ\86 Ù\85Ù\87 Ù\88Ù\87 Ù\87Ù\86Ú¯Ù\88Ù\85 Ø³Ø§Ø²Û\8c کو",
+       "history": "ڤیرگار بألگە",
+       "history_short": "ڤیرگار",
+       "updatedmarker": "د Ø¢Ø®Ø¦Ø±Û\8c Ø¯Û\8cÛ\8cئÙ\86 Ù\85ئÙ\86Û\95 Ú¤Ø¦ Ù\87Ù\86Ú¯Ù\88Ù\85 کو",
        "printableversion": "نوسقە پئلا بیئنی",
-       "permalink": "هوم پیوند هميشئی",
-       "print": "پلا كردن",
+       "permalink": "هوم پئیڤأند هأمیشئ یی",
+       "print": "چاپ گئرئتئن",
        "view": "ديئن",
        "view-foreign": "د $1 نه بوینیت",
-       "edit": "ويرايشت",
-       "edit-local": "توضیح ولات نشینی نه ویرایشت بکیت",
-       "create": "راس Ù\83ردن",
-       "create-local": "یه گل توضیح ولات نشینی اضاف بکیتو",
-       "editthispage": "ويرايشت ای بلگه",
-       "create-this-page": "راس Ù\83ردÙ\86 Ø§Û\8c Ø¨Ù\84Ú¯Ù\87",
-       "delete": "پاکسا كردن",
-       "deletethispage": "اÛ\8c Ø¨Ù\84Ú¯Ù\87 Ù\86Ù\87 Ù¾Ø§Ú©Ø³Ø§ Ø¨Ù\83Ù\8aد",
-       "undeletethispage": "اÛ\8c Ø¨Ù\84Ú¯Ù\87 Ù\86Ù\87 Ù¾Ø§Ú©Ø³Ø§ Ù\86Ù\83Ù\8aد",
-       "undelete_short": "زنه کردن {{PLURAL:$1|یه گل ویرایشت|$1 ویرایشتیا}}",
-       "viewdeleted_short": "بوینیت {{[جمی:$1|یه گل ویرایشت پاکسا بیه|$1ویرایشتیا پاکسا بیه}}",
-       "protect": "پر Ù\88 Ù¾Û\8cÙ\85 Ø¨Ù\83Ù\8aد",
-       "protect_change": "Ø¢Ù\84شت Ø¨Ù\83Ù\8aد",
-       "protectthispage": "اÛ\8c Ø¨Ù\84Ú¯Ù\87 Ù\86Ù\87 Ù¾Ø± Ù\88 Ù¾Û\8cÙ\85 Ø¨Ù\83Ù\8aد",
-       "unprotect": "پر و پیم کردن نه آلشت بکیت",
-       "unprotectthispage": "پر Ù\88 Ù¾Û\8cÙ\85 Ú©Ø±Ø¯Ù\86 Ø¯ Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ù\86Ù\87 Ø¢Ù\84شت Ø¨Ù\83Ù\8aد",
-       "newpage": "بلگه نو",
-       "talkpage": "دبارÙ\87 Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ù\82صÙ\87 Ø¨Ù\83Ù\8aد",
+       "edit": "ڤیرایئشت",
+       "edit-local": "توضی ڤولات نئشینی نە ڤیرایئشت بأکیت",
+       "create": "راس Ù\83ئردئن",
+       "create-local": "بئ گئل توضی ڤولات نئشینی ئضاف بأکیت",
+       "editthispage": "ئی بألگە نە ڤیرایئشت بأکیت",
+       "create-this-page": "ئÛ\8c Ø¨Ø£Ù\84Ú¯Û\95 Ù\86Û\95 Ø±Ø§Ø³ Ø¨Ø£Ú©Û\8cت",
+       "delete": "پاکسا کئردئن",
+       "deletethispage": "ئÛ\8c Ø¨Ø£Ù\84Ú¯Û\95 Ù\86Û\95 Ù¾Ø§Ú©Ø³Ø§ Ø¨Ø£Ú©Û\8cت",
+       "undeletethispage": "ئÛ\8c Ø¨Ø£Ù\84Ú¯Û\95 Ù\86Û\95 Ù¾Ø§Ú©Ø³Ø§ Ù\86Ø£Ú©Û\8cت",
+       "undelete_short": "ناپاکسا کئردئن {{PLURAL:$1|یئ گئل ڤیرایئشت|$1 ڤیرایئشتیا}}",
+       "viewdeleted_short": "{{PLURAL:$1|}}سئیل بأکیت{{[PLURAL:$1|یئ گئل ڤیرایئشت پاکسا بییە|$1ڤیرایئشتیا پاکسا بیینە}}",
+       "protect": "پأر Ù\88 Ù¾Û\8cÙ\85 Ø¨Ø£Ú©Û\8cت",
+       "protect_change": "Ø¢Ù\84ئشت Ø¨Ø£Ú©Û\8cت",
+       "protectthispage": "ئÛ\8c Ø¨Ø£Ù\84Ú¯Û\95 Ù\86Û\95 Ù¾Ø£Ø± Ù\88 Ù¾Û\8cÙ\85 Ø¨Ø£Ú©Û\8cت",
+       "unprotect": "آلئشت دأئن پأر و پیم کاری",
+       "unprotectthispage": "پأر Ù\88 Ù¾Û\8cÙ\85 Ú©Ø§Ø±Û\8c Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ù\86Û\95 Ø¢Ù\84ئشتکارÛ\8c Ø¨Ø£Ú©Û\8cت",
+       "newpage": "بألگە نۊ",
+       "talkpage": "دئبارÛ\95 Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ù\82ئسÛ\95 Ø¨Ø£Ú©Û\8cت",
        "talkpagelinktext": "چأک چئنە",
-       "specialpage": "بلگه ويجه",
-       "personaltools": "اÙ\88زارÙ\8aا Ø´صقی",
-       "articlepage": "دÙ\8aئÙ\86 Ù\85Û\8cÙ\86Ù\88Ù\86Ù\87 Ø¨Ù\84Ú¯Ù\87",
-       "talk": "گپ",
+       "specialpage": "بألگە ڤیجە",
+       "personaltools": "أڤزارÛ\8cا Ø´Ø£صقی",
+       "articlepage": "دÙ\8aئÙ\86 Ù\85Û\8cÙ\86Ù\88Ù\99Ù\86Û\95 Ø¨Ø£Ù\84Ú¯Û\95",
+       "talk": "گأپ",
        "views": "ديئنيا",
-       "toolbox": "اÙ\88زارÙ\8aا",
-       "userpage": "ديئن بلگه کاریار",
-       "projectpage": "ديئن بلگه پروجه",
-       "imagepage": "ديئن بلگه جانیا",
-       "mediawikipage": "ديئن بلگه پيغوم",
-       "templatepage": "ديئن بلگه چوئه",
-       "viewhelppage": "ديئن بلگه هومياری",
-       "categorypage": "ديئن بلگه دسه بنی",
-       "viewtalkpage": "ديئن چك چنه يا",
-       "otherlanguages": "د Ø²Ù\88Ù\86ا Ù\87نی",
-       "redirectedfrom": "(ورگشتن د$1)",
-       "redirectpagesub": "بلگه واگردونی",
-       "redirectto": "واگردونی سی:",
-       "lastmodifiedat": "اÛ\8c Ø¨Ù\84Ú¯Ù\87 ØªØ§Ø²Ù\87 Ø§Ù\8aا Ù\88ضع Ø¢Ù\84شت Ø¨Ù\8aÙ\87 Ø¯ $1, د $2.",
-       "viewcount": "اÛ\8c Ø¨Ù\84Ú¯Ù\87 Ù\82اÙ\88Ù\84 Ø¯Ø³ØªØ±Ø³Û\8c Ø¨Ù\8aÙ\87 {{PLURAL:$1|once|$1 times}}.",
-       "protectedpage": "بلگه پر و پیم بيه",
-       "jumpto": "پئرستÙ\86 Ø¯",
-       "jumptonavigation": "ناوجوری",
-       "jumptosearch": "پی جوری",
-       "view-pool-error": "د Ø¨Ø¯Ø¨Ø®ØªÛ\8cØ\8cاÛ\8cسÙ\86Û\8c Ø³Ø±Ù\88رÛ\8cا Ù\81رÙ\87 Ø´Ù\84Ù\88غ.\nکارÛ\8cارÛ\8cا Ù\81رÙ\87 Ø²Û\8cادÛ\8c Ù\85Û\8cÙ\87اÙ\86 Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ù\86Ù\87 Ø¨Ù\88Û\8cÙ\86Ù\86.\nÛ\8cÙ\87 Ú¯Ø±Û\8c ØµØ¨ Ø¨Ú©Û\8cتÙ\88 Ø¯Ù\85ا Û\8cÙ\87 Ú©Ù\87 Ù\85Û\8cÙ\87ات Ø¯Ù\88Ù\88ارÙ\87 Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ù\86Ù\87 Ø¨Ù\88Û\8cÙ\86یت.",
-       "generic-pool-error": "د Ø¨Ø¯Ø¨Ø®ØªÛ\8cØ\8cاÛ\8cسÙ\86Û\8c Ø³Ø±Ù\88رÛ\8cا Ù\81رÙ\87 Ø´Ù\84Ù\88غ.\nکارÛ\8cارÛ\8cا Ù\81رÙ\87 Ø²Û\8cادÛ\8c Ù\85Û\8cÙ\87اÙ\86 Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ù\86Ù\87 Ø¨Ù\88Û\8cÙ\86Ù\86.\nÛ\8cÙ\87 Ú¯Ø±Û\8c ØµØ¨ Ø¨Ú©Û\8cتÙ\88 Ø¯Ù\85ا Û\8cÙ\87 Ú©Ù\87 Ù\85Û\8cÙ\87ات Ø¯Ù\88Ù\88ارÙ\87 Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ù\86Ù\87 Ø¨Ù\88Û\8cÙ\86یت.",
-       "pool-timeout": "گات Ø³Û\8c ØªÛ\8cÙ\87 Ù\88Ù\87 Ø±Ù\87 Ù\85Ù\86Ù\86 Ø³Û\8c Ù\82Ù\84Ù\81 Ø¨Û\8cئÙ\86 ØªÙ\85Ù\88Ù\85 Ø¨Û\8c",
-       "pool-queuefull": "اÙ\85اÛ\8cÛ\8cÙ\87 Ú©Ø§Ø±Û\8c Ú¯Û\8c Ú¯Ø±ØªÙ\86 Ù¾Ø± Ø¨Û\8cÙ\87",
-       "pool-errorunknown": "خطا نادیار",
-       "pool-servererror": "Ù¾Ù\88Ù\84 Ø³Ù\86تر Ø®Ø°Ù\85تگÙ\87 Ø¯ Ø¯Ø³Ø±Ø³ Ù\86ئ($1).",
-       "poolcounter-usage-error": "خطار Ù\88Ù\87 Ú©Ø§Ø± Ú¯Ø±Øªن:$1",
+       "toolbox": "أڤزارÛ\8cا",
+       "userpage": "ديئن بألگە کاریار",
+       "projectpage": "ديئن بألگە پوروجە",
+       "imagepage": "ديئن بألگە جانیا",
+       "mediawikipage": "ديئن بألگە پئيغوم",
+       "templatepage": "ديئن بألگە چوٙأ",
+       "viewhelppage": "ديئن بألگە هومیاری",
+       "categorypage": "ديئن بألگە دأسە بأنی",
+       "viewtalkpage": "دیئن چأک چئنە یا",
+       "otherlanguages": "د Ø²Ù\88Ù\99Ù\86ا Ù\87Ø£نی",
+       "redirectedfrom": "(ڤاگأردوٙنی د$1)",
+       "redirectpagesub": "بألگە ڤاگأردوٙنی",
+       "redirectto": "ڤاگأردوٙنی سی:",
+       "lastmodifiedat": "ئÛ\8c Ø¨Ø£Ù\84Ú¯Û\95 Ø¦Û\8cسئÙ\86Û\8cا Ú¤Ø£Ø¶ Ø¢Ù\84Û\8cشت Ø¨Û\8cÛ\8cÛ\95 Ø¯ $1Ø\8c د $2.",
+       "viewcount": "ئÛ\8c Ø¨Ø£Ù\84Ú¯Û\95 Ù\87ا Ø¯ Ø¯Ø£Ø³Ø±Ø¦Ø³Û\8c {{PLURAL:$1|Û\8cئ Ú¯Ø¦Ù\84|$1 Ú\86Ø£Ù\86 Ú¯Ø¦Ù\84}}.",
+       "protectedpage": "بألگە پأر و پیم کاری بییە",
+       "jumpto": "پئرئستئÙ\86 Ø¯:",
+       "jumptonavigation": "ناڤجوٙری",
+       "jumptosearch": "پئی جوٙری",
+       "view-pool-error": "د Ø¨Ø£Ø¯Ø¨Ø£Ø®ØªÛ\8cØ\8cئÛ\8cسئ Ø±Ø¦Ø³Û\8cÙ\86Û\95 Ø¬Ø§Û\8cا Ù\81ئرÛ\95 Ø´Ù\88Ù\84Ù\88Ù\99غÛ\95.\nکارÛ\8cارÛ\8cا Ù\81ئرÛ\95 Û\8cÛ\8c Ù\85Û\8cÙ\87اÙ\86 Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ù\86Û\95 Ø³Ø¦Û\8cÙ\84 Ø¨Ø£Ú©Ø£Ù\86.\nدئÙ\85ا Û\8cÛ\95 Ú©Ø¦ Ù\85Û\8cÙ\87اÛ\8cت Ø¯ Ù\86Û\8a Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ù\86Û\95 Ø³Ø¦Û\8cÙ\84 Ø¨Ø£Ú©Û\8cت Û\8cئ Ú¯Ù\88رÛ\8c Ø¢Ù\87ئرÛ\95 Ø¯Ø§Ø±Û\8c Ø¨Ø£Ú©یت.",
+       "generic-pool-error": "د Ø¨Ø£Ø¯Ø¨Ø£Ø®ØªÛ\8cØ\8cئÛ\8cسئ Ø±Ø¦Ø³Û\8cÙ\86Û\95 Ø¬Ø§Û\8cا Ù\81ئرÛ\95 Ø´Ù\88Ù\84Ù\88Ù\99غÛ\95.\nکارÛ\8cارÛ\8cا Ù\81ئرÛ\95 Û\8cÛ\8c Ù\85Û\8cÙ\87اÙ\86 Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ù\86Û\95 Ø³Ø¦Û\8cÙ\84 Ø¨Ø£Ú©Ø£Ù\86.\nدئÙ\85ا Û\8cÛ\95 Ú©Ø¦ Ù\85Û\8cÙ\87اÛ\8cت Ø¯ Ù\86Û\8a Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ù\86Û\95 Ø³Ø¦Û\8cÙ\84 Ø¨Ø£Ú©Û\8cت Û\8cئ Ú¯Ù\88رÛ\8c Ø¢Ù\87ئرÛ\95 Ø¯Ø§Ø±Û\8c Ø¨Ø£Ú©یت.",
+       "pool-timeout": "گات Ø¢Ù\87ئرÛ\95 Ø¯Ø§Ø±Û\8c Ø³Û\8c Ù\82Ù\88Ù\84Ù\81 Ú©Ø¦Ø±Ø¯Ø¦Ù\86 ØªØ£Ù\85Ù\88Ù\85 Ø¨Û\8cÛ\8cÛ\95",
+       "pool-queuefull": "ئÙ\85اÛ\8cÛ\95 Ú©Ø§Ø±Û\8c Ú¯Ø¦Û\8c Ú¯Ø¦Ø±Ø¦ØªØ¦Ù\86 Ù¾Ù\88ر Ø¨Û\8cÛ\8cÛ\95",
+       "pool-errorunknown": "خأطا Ù\86ادÛ\8cار",
+       "pool-servererror": "Ù¾Ù\88Ù\99Ù\84 Ø¦Ø´Ù\85ار Ø®Ø¦Ø°Ù\85أتگÛ\95 Ø¯ Ø¯Ø£Ø³Ø±Ø¦Ø³ Ù\86Û\8c($1).",
+       "poolcounter-usage-error": "خأطا Ú¤Ø¦ Ú©Ø§Ø± Ú¯Ø¦Ø±Ø¦ØªØ¦ن:$1",
        "aboutsite": "دئبارە {{SITENAME}}",
        "aboutpage": "پوروجە:دئبارە",
-       "copyright": "Ù\85Û\8cÙ\86Ù\88Ù\86Ù\87 Ø¯ Ø¯Ø³Ø±Ø³ Ù\87ئ Ø³Û\8c $1 Ù\85ر Ù\88Ù\87 Ø´Ù\84Ú© Ù\87Ù\86Û\8c Ù\86Ù\88شتÙ\87 Ø¨Ù\88ئÙ\87",
-       "copyrightpage": "{{ان اس:پروجه}}:کپی رایت",
-       "currentevents": "پيشومدل تازه باو",
-       "currentevents-url": "پروجه:پيشومدل تازه باو",
+       "copyright": "Ù\85Û\8cÙ\86Ù\88Ù\99Ù\86Û\95 Û\8cا Ù\87اÙ\86 Ø¯ Ø¯Ø£Ø³Ø±Ø¦Ø³ $1 Ù\85أر Û\8cÛ\95 Ú©Ø¦ Ú¤Ø¦ Û\8cئ Ú¯Ø¦Ù\84 Ø´Û\8cÚ¤Û\95 Ù\87Ø£Ù\86Û\8c Ù\86Û\8cسأÙ\86Û\95 Ø¨Ù\88Ù\99Û\95.",
+       "copyrightpage": "{{ns:project}}:کوپی رایت",
+       "currentevents": "روخ ڤأنیا ئیسئنی",
+       "currentevents-url": "پوروجە یا:روخ ڤأنیا ئیسئنی",
        "disclaimers": "تیە پوٙشکاریا",
        "disclaimerpage": "پوروجە: تیە پوٙشی کئردئن هأمە گئر",
-       "edithelp": "هومياری سی ويرايشت",
+       "edithelp": "هومياری سی ڤیرایئشت",
        "helppage-top-gethelp": "هومياری",
        "mainpage": "سأرآسوٙنە",
-       "mainpage-description": "سرآسÙ\88Ù\86Ù\87",
-       "policy-url": "پروجه:خط و مش",
-       "portal": "درآسÙ\88Ù\86Ù\87 Ú©Ù\88Ù\85Ù\84Ù\87 Û\8cکی",
-       "portal-url": "پروجه:سرآسونه کومله یکی",
+       "mainpage-description": "سأرآسÙ\88Ù\99Ù\86Û\95",
+       "policy-url": "پوروجە:رأدیارجوٙری",
+       "portal": "دأرآسÙ\88Ù\99Ù\86Û\95 Ú©Ù\88Ù\85Ù\88Ù\84Û\95 Û\8cØ£کی",
+       "portal-url": "پوروجە:دأرآسوٙنە کومولە یأکی",
        "privacy": "پوٙلتیک رازینە داری",
        "privacypage": "پوروجە: رأگڤاری رازینە کاری کئردئن",
-       "badaccess": "خطا :صÙ\84ادارÛ\8c Ú©Ù\88",
-       "badaccess-group0": "Ø´Ù\85ا ØµÙ\84ا Ø§Ù\86جÙ\88Ù\85 Ú©Ø§Ø±Û\8c Ú©Ù\87 Ø­Ø§Ø³ØªÛ\8cت Ù\86ارÛ\8cÙ\86",
-       "badaccess-groups": "اÛ\8c Ú©Ø§Ø±Û\8c Ú©Ù\87 Ø´Ù\85ا Ù\87استÛ\8cتÙ\87 Ø³Û\8c Ú©Ø§Ø±Û\8cارÛ\8cا Ø¯  {{PLURAL:$2|گرÙ\88\8cÚ©Û\8c Ø¯ Ú¯Ø±Ù\88Û\8cا}}: $1 Ú©Ù\85 Ø¨Û\8cÙ\87",
-       "versionrequired": "یه نسقه د حاستنیا ویکی وارسگر\n$1",
-       "versionrequiredtext": "نسقه $1 ویکی وارسگر سی وه کار گرتن د ای بلگه لازمه.\nوه نه بوینیت [[ویجه:نسقه|نسقه بلگه]].",
-       "ok": "خوئه",
+       "badaccess": "خأطا ØµØ¦Ù\84ا Ø¯Ø£Ø¦Ù\86",
+       "badaccess-group0": "Ø´Ù\88Ù\85ا ØµØ¦Ù\84ا Ø£Ù\86جÙ\88Ù\85 Ø¯Ø£Ø¦Ù\86 Ú©Ø§Ø±Û\8c Ù\86Û\95 Ú©Ø¦ Ù\85Û\8cÙ\87اÛ\8cت Ù\86ارÛ\8cت.",
+       "badaccess-groups": "ئÛ\8c Ú©Ø§Ø±Û\8c Ú©Ø¦ Ø´Ù\88Ù\85ا Ù\87استÛ\8cتÛ\95 Ø³Û\8c Ú©Ø§Ø±Û\8cارÛ\8cاÛ\8cÛ\8c Ú©Ø¦ Ù\87اÙ\86 Ø¯ {{PLURAL:$2|جأرغÛ\95\8cئ Ú¯Ø¦Ù\84 Ø¯ Ø¬Ø£Ø±ØºÛ\95 Û\8cا}}: $1 Ú©Ø£Ù\85 Ø¨Û\8cÛ\8cÛ\95.",
+       "versionrequired": "نوسقە $1 د مئدیاڤیکی هاستئنیە",
+       "versionrequiredtext": "نوسقە$1 مئدیاڤیکی سی ڤئ کار گئرئتئن د ئی بألگە هاستئنیە.\nسیئل ڤئ بأکیت[[Special:نوسقە|نوسقە بألگە]].",
+       "ok": "خوٙە",
        "pagetitle": "$1 - {{SITENAME}}",
        "pagetitle-view-mainpage": "{{SITENAME}}",
        "backlinksubtitle": "← $1",
        "retrievedfrom": "د نۊ زئنە بیە د\"$1\"",
-       "youhavenewmessages": "شما داريت $1($2)",
-       "youhavenewmessagesfromusers": "{{PLURAL:$4|Ø´Ù\85ا }} $1 Ø¯ {{PLURAL:$3|کارÛ\8cار Ù\87Ù\86Û\8c|$3 Ú©Ø§Ø±Û\8cارÛ\8cا}}دارÛ\8cتÙ\88($2).",
-       "youhavenewmessagesmanyusers": "Ø´Ù\85ا $1 Ø¯  Ù\81رÙ\87 Ú©Ø§Ø±Û\8cار Ø¯Ø§Ø±Ù\8aت ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|یه گل پیغوم تازه|999=پیغومیا تازه}}",
-       "newmessagesdifflinkplural": "آخر {{PLURAL:$1|Ø¢Ù\84شت|Ø¢Ù\84شتیا}}",
-       "youhavenewmessagesmulti": "Ø´Ù\85ا Û\8cÙ\87 Ú¯Ù\84 Ù¾Û\8cغÙ\88Ù\85 ØªØ§Ø²Ù\87 Ø¯ $1 Ø¯Ø§Ø±Û\8cتÙ\88",
+       "youhavenewmessages": "{{PLURAL:$3|شوما داریت}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Ø´Ù\88Ù\85ا}} $1 Ø¯ {{PLURAL:$3|کارÛ\8cار Ù\87Ø£Ù\86Û\8c|$3 Ú©Ø§Ø±Û\8cارÛ\8cا}}دارÛ\8cت($2).",
+       "youhavenewmessagesmanyusers": "Ø´Ù\88Ù\85ا Ø¯ $1 Ù\81ئرÛ\95 Ú©Ø§Ø±Û\8cار Ø¯Ø§Ø±Û\8cت($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|یئ گئل پئیغوم تازە|999=پئیغومیا تازە}}",
+       "newmessagesdifflinkplural": "آخئر {{PLURAL:$1|Ø¢Ù\84ئشت|Ø¢Ù\84ئشتیا}}",
+       "youhavenewmessagesmulti": "Ø´Ù\88Ù\85ا Û\8cئ Ú¯Ø¦Ù\84 Ù¾Ø¦Û\8cغÙ\88Ù\85 ØªØ§Ø²Û\95 Ø¯ $1 Ø¯Ø§Ø±Û\8cت",
        "editsection": "ڤیرایئشت",
-       "editold": "ويرايشت",
-       "viewsourceold": "سرÚ\86Ø´Ù\85Ù\87 Ù\86Ù\87 Ø¨Ù\88Ù\8aÙ\86Ù\8aت",
-       "editlink": "ويرايشت",
-       "viewsourcelink": "سرÚ\86Ø´Ù\85Ù\87 Ù\86Ù\87 Ø¨Ù\88Ù\8aÙ\86Ù\8aت",
+       "editold": "ڤیرایئشت",
+       "viewsourceold": "سئÛ\8cÙ\84 Ø¯ Ø³Ø£Ø±Ú\86ئشÙ\85Û\95 Ø¨Ø£Ú©Û\8cت",
+       "editlink": "ڤیرایئشت",
+       "viewsourcelink": "سئÛ\8cÙ\84 Ø¯ Ø³Ø£Ø±Ú\86ئشÙ\85Û\95 Ø¨Ø£Ú©Û\8cت",
        "editsectionhint": "ڤیرایئشت یئ گئل بأرجا:$1",
-       "toc": "Ù\85Û\8cÙ\86Ù\88Ù\86Ù\87 یا",
-       "showtoc": "Ù\86Ø´Ù\88 Ø¯ئن",
-       "hidetoc": "قام كردن",
-       "collapsible-collapse": "جم كردن",
-       "collapsible-expand": "وا كردن",
-       "confirmable-confirm": "{{GENDER:$1|Ø´Ù\85ا}} Ù\85طئÙ\85Ù\86یت?",
-       "confirmable-yes": "هری",
-       "confirmable-no": "نه",
-       "thisisdeleted": "دیئن یا ورگنين $1?",
+       "toc": "Ù\85Û\8cÙ\86Ù\88Ù\99Ù\86Û\95 یا",
+       "showtoc": "Ù\86ئشÙ\88Ù\99 Ø¯Ø£ئن",
+       "hidetoc": "قام کئردئن",
+       "collapsible-collapse": "جأم کئردئن",
+       "collapsible-expand": "گأپ کئلوٙن کئردئن",
+       "confirmable-confirm": "{{GENDER:$1|Ø´Ù\88Ù\85ا}} Ø¦Ø·Ù\85ئÙ\86Ù\88Ù\99Ù\86 Ø¯Ø§Ø±یت?",
+       "confirmable-yes": "Ù\87أرÛ\8c",
+       "confirmable-no": "نە",
+       "thisisdeleted": "دیئن یا ڤئرگأنییئن $1?",
        "viewdeleted": "دیئن$1?",
-       "restorelink": "{{PLURAL:$1|یه گل ویرایشت پاک بیه|$1 ویرایشتیا پاک بیه}}",
-       "feedlinks": "هوال حون:",
-       "feed-invalid": "نوع مشترک بین هوال حون نامعتور",
-       "feed-unavailable": "هوال حونیا د دسرس نئین",
-       "site-rss-feed": "هوال حون RSS سی $1",
+       "restorelink": "{{PLURAL:$1|یئ گئل ڤیرایئشت پاکسا بییە|$1 ڤیرایئشتیا پاکسا بییە}}",
+       "feedlinks": "هأڤال حوٙن:",
+       "feed-invalid": "جوٙر هومبأر بییە مینجا هأڤال حوٙن نادیار",
+       "feed-unavailable": "هأڤال حوٙنیا د دأسرئس نییئن",
+       "site-rss-feed": "هأڤال حوٙن RSS سی $1",
        "site-atom-feed": "هأڤال حوٙن Atom سی $1",
-       "page-rss-feed": "هوال حون RSS سی «$1»",
-       "page-atom-feed": "هوال حون Atom سی $1",
+       "page-rss-feed": "هأڤال حوٙن RSS سی «$1»",
+       "page-atom-feed": "هأڤال حوٙن Atom سی $1",
        "feed-atom": "اتم",
        "feed-rss": "آر اس اس",
        "red-link-title": "$1(بألگە ڤوجوٙد نارە)",
-       "sort-descending": "كم بيئن سرجاخود",
-       "sort-ascending": "زياد بيئن سرجاخود",
-       "nstab-main": "بلگه",
-       "nstab-user": "بلگه کاریار",
-       "nstab-media": "بلگه وارسگر",
-       "nstab-special": "بلگيا ويجه",
-       "nstab-project": "بلگه پروجه",
+       "sort-descending": "کأم بییئن سأرجاخود",
+       "sort-ascending": "زياد بيیئن سأرجادخود",
+       "nstab-main": "بألگە",
+       "nstab-user": "بألگە کاریار",
+       "nstab-media": "بألگە ڤارئسگأر",
+       "nstab-special": "بألگە ڤیجە",
+       "nstab-project": "بألگە پوروجە",
        "nstab-image": "جانیا",
-       "nstab-mediawiki": "پيغوم",
-       "nstab-template": "چوئه",
-       "nstab-help": "بلگه هومياری",
-       "nstab-category": "دسÙ\87",
-       "nosuchaction": "چنی کنشتگری وجود ناره",
-       "nosuchactiontext": "کاری که وا یو آر ال مشقص بیه معتور نئ.\nشایت شما یو آر ال نه دروس ننشتیته، یا یه گل هوم پیوند نادرست وارد بیه.\nوه شاید وه یه گل سیسریک د نرم افزار وه کار گرته بیه وا {{نوم مالگه}} هشاره داشتوه.",
-       "nosuchspecialpage": "چنی بلگه خاصی وجود ناره",
-       "nospecialpagetext": "<strong>Ø´Ù\85ا Ø³Û\8c Û\8cÙ\87 Ú¯Ù\84 Ø¨Ù\84Ú¯Ù\87 Ù\86اÙ\85عتÙ\88ر Ø¯Ø±Ø­Ø§Ø³Øª Ø¯Ø§Ø´ØªÛ\8cتÙ\87.</strong>\nÛ\8cÙ\87 Ú¯Ù\84 Ù\86Ù\88Ù\85 Ú¯Ù\87 Ø³Û\8c  Ø§Ø¹ØªÙ\88ار Ø¨Ù\84Ú¯Ù\87 Û\8cا Ø¨Ù\88ئÙ\87 Ø¯ [[Special:SpecialPages|{{int:specialpages}}]] Ù¾Û\8cدا Ø¨Ø§.",
-       "error": "خطا",
-       "databaseerror": "خطا Ø¯ Ø¬Ø§Ú¯Ù\87 Ø¯Ù\88Ù\86سÙ\85Ù\86Ù\8aا",
-       "databaseerror-text": "یه خطا جست کردن د رسینه جا پیش اوما.یه ممکنه یه در کار ونن د نرم اوزار پیش بیاره",
-       "databaseerror-textcl": "خطاجست گرتن رسینه جا دونسمنيا پيشومد كرده",
-       "databaseerror-query": "نوم گشتن: $1",
-       "databaseerror-function": "Ø¢Ù\84شت Ù\88ن:$1",
-       "databaseerror-error": "خطا: $1",
-       "laggedslavemode": "زنهار:بلگه شايت د ور گرینه وه هنگوم سازی تازه باو نبوئه",
-       "readonly": "جاگÙ\87 Ø¯Ù\88Ù\86سÙ\85Ù\86Ù\8aا Ø¨Ø³Ù\87 Ø¨Ù\8aÙ\87",
-       "enterlockreason": "دلیل قلف کردن نه بنیست،یه گاتی سی وا کردن قلف د ویر داشتویت.",
-       "readonlytext": "رسÛ\8cÙ\86Ù\87 Ø¬Ø§ Ø§Û\8cسÙ\87 Ø³Û\8c Ø¯Ø¦Ù\86 Ù\88رÙ\88دÛ\8c Û\8cا ØªØ§Ø²Ù\87 Û\8cا Ø¢Ù\84شتگرÛ\8cا Ù\87Ù\86Û\8c Ù\82Ù\84Ù\81 Ø¨Û\8cÙ\87Ø\8cشاÛ\8cت Ø³Û\8c Ù\85Ù\86Ù\86 Ù\85عÙ\85Ù\88Ù\84Û\8c Ø±Ø³Û\8cÙ\86Ù\87 Ø¬Ø§Ù\86Ù\87ا Ù\88Ù\87 Ú©Ù\87 Ù\88رئردÙ\87 Ù\88Ù\87 Ø­Ø§Ù\84 Ù\88 Ø¨Ø§Ù\84 Ø¹Ø§Ø¯Û\8cØ´.\nدÛ\8cÙ\88Ù\88Ù\86دارÛ\8c Ú©Ù\87 Ù\88Ù\86Ù\87 Ù\82Ù\84Ù\81 Ú©Ø±Ø¯Ù\87 Ù\88Ù\86Ù\87 Ú¯Ù\88تÙ\87:$1",
-       "missing-article": "رسÛ\8cÙ\86Ù\87 Ø¬Ø§ Ù\86تÙ\88Ù\86Ù\87 Ø¨Ù\84Ú¯Ù\87 Ø§Û\8c Ø¨Ø§ Ù¾Û\8cدا Ø¨Ú©Ù\87 Ø¨Ø¬Ù\88رÙ\87.Ú©Ù\87 Ù\86Ù\88Ù\85Ø´ $1 Ù\88 $2 Ù\87ئ.\nÙ\85عÙ\85Ù\88Ù\84Ù\86د Û\8cÙ\87 Ø³Û\8c Û\8cÙ\87 Ú©Ù\87 Ù\81رخ Ù\88Û\8cرگار Ø±Ø¦ØªÙ\87 Ø¯Ø´ Ø¨Û\8cÙ\87 Ù¾Ø§Ú© Ø¨Û\8cÙ\87.",
-       "missingarticle-rev": "(وانئری#: $1)",
-       "missingarticle-diff": "(فرخ: $1، $2)",
-       "readonly_lag": "اÛ\8c Ø±Ø³Û\8cÙ\86Ù\87 Ø¬Ø§ Ù\82Ù\84Ù\81 Ø¨Û\8cÙ\87 ØªØ§ Ø§Ù\88سÙ\87 Ú©Ù\87 Ø³Ø±Ù\88ر Ø±Ø³Û\8cÙ\86Ù\87 Ø¬Ø§ Ù\88Ù\87 Ù\85Û\8cÙ\86جاÙ\88Ù\86 Ø¨Ø±Ø³Ù\87.",
-       "internalerror": "خطا Ø¯Ø§Ø®Ù\84ی",
-       "internalerror_info": "خطا Ø¯Ø§Ø®Ù\84ی:$1",
-       "internalerror-fatal-exception": "تی داشتن مرگدار د جور \"$1\"",
-       "filecopyerror": "Ù\86بÙ\88ئÙ\87 Ø¬Ø§Ù\86Û\8cا $1 Ø¯ $2 Ù\88رداشتÙ\87 Ø¨Ù\88ئÙ\87",
-       "filerenameerror": "Ù\86بÙ\88ئÙ\87 Ø¬Ø§Ù\86Û\8cا $1 Ø¯ $2 Ù\86Ù\88Ù\85 Ø¢Ù\84شت Ø¨Ù\88ئÙ\87",
-       "filedeleteerror": "Ù\86بÙ\88ئÙ\87 Ø¬Ø§Ù\86Û\8cا $1 Ù¾Ø§Ú©Ø³Ø§ Ø¨Ù\88ئÙ\87",
-       "directorycreateerror": "Ù\86بÙ\88ئÙ\87 Ø³Ø±Ø¯Ø³Ù\87 $1 Ø±Ø§Ø³ Ø¨Ù\88ئÙ\87.",
-       "directoryreadonlyerror": "فقط موئه نشونگه \"$1\" بحونی.",
-       "directorynotreadableerror": "نشونگه \"$1\" حننی نئ.",
-       "filenotfound": "Ù\86تÙ\88Ù\86Û\8cت Ø¬Ø§Ù\86Û\8cا $1 Ù\86Ù\87 Ù¾Û\8cدا Ø¨Ú©Û\8cد",
-       "unexpected": "ارزاÛ\8cشت Ù\86احاستÙ\87: \"$1\"=\"$2\".",
-       "formerror": "خطا:Ù\86بÙ\88ئÙ\87 Ù\86Ù\88Ù\85 Ø¨Ù\84Ú¯Ù\87 Ù\88Ù\87 Ù\85Ù\88 Ø¨Ø¦Ù\8aت",
-       "badarticleerror": "اÛ\8c Ø§Ù\86جÙ\88Ù\85 Ø¯Ø¦Ù\86Û\8c Ø¯ Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ø§Ù\86جÙ\88Ù\85 Ù\86گرÙ\87.",
-       "cannotdelete": "بلگه یا جانیا $1 نبوئه پاکسا با.\nشایت یه ایسه وا کسی هنی پاکسابیه.",
-       "cannotdelete-title": "Ù\86بÙ\88ئÙ\87 Ø¨Ù\84Ú¯Ù\87 $1 Ù¾Ø§Ú©Ø³Ø§ Ø¨Ù\88",
-       "delete-hook-aborted": "پاکسا بیئن وا قلاو نهاگری بیه.\nهیچ توضیئ سیش نئ.",
-       "no-null-revision": "سی بلگه$1 وانئری خنثی نه راس بکید",
-       "badtitle": "داسÙ\88Ù\86 Ú¯ن",
-       "badtitletext": "داسÙ\88Ù\86 Ø¨Ù\84Ú¯Ù\87 Ø­Ø§Ø³ØªÙ\87 Ø¨Û\8cÙ\87 Ù\85عتÙ\88ر Ù\86Û\8cØ\8cÛ\8cا  Û\8cÙ\87 Ú¯Ù\84 Ù\85ئÙ\86 Ø²Ù\88Ù\86Û\8c Û\8cا Ù\85ئÙ\86 Ù\88Û\8cÚ©Û\8c Ø¯Ø§Ø³Ù\88Ù\86 ØºÙ\84Ø·Ù\87.\nÛ\8cÙ\87 Ø´Ø§Û\8cت Ø¯ Ù\88ر Ú¯Ø±ØªÙ\87 Û\8cÚ©Û\8c Ø¨Ø§ Û\8cا Ø¨Û\8cشتر Ú©Ø§Ø±Ø§Ú©ØªØ±Û\8cا Ù\86بÙ\88ئÙ\87 Ø³Û\8c Ø§Û\8c Ø¯Ø§Ø³Ù\88Ù\86Û\8cا Ù\88Ù\87 Ú©Ø§Ø± Ú¯Ø±ØªÙ\87 Ø¨Ù\88ئÙ\86",
-       "title-invalid-empty": "داسÙ\88Ù\86 Ø¨Ù\84Ú¯Ù\87 Ø­Ø§Ø³ØªÙ\86Û\8c Ø­Ø§Ù\84Û\8cÙ\87 Û\8cا Ù\81Ù\82Ø· Ù\85Û\8cÙ\86Ù\88Ù\86Ù\87 Ø¯Ø§Ø± Û\8cÙ\87 Ú¯Ù\84 Ù\86Ù\88Ù\85 Û\8cا Ù\86Ù\88Ù\85جائÙ\87.",
-       "title-invalid-utf8": "داسÙ\88Ù\86 Ø¨Ù\84Ú¯Ù\87 Ø­Ø§Ø³ØªÙ\86Û\8c Ù\85Û\8cÙ\86Ù\88Ù\86Ù\87 Ø¯Ø§Ø± Û\8cÙ\87 Ú¯Ù\84 Ù\86Ù\85اجا UTF-8 Ù\86اÙ\85عتÙ\88رÙ\87.",
-       "title-invalid-interwiki": "داسÙ\88Ù\86 Ù\85Û\8cÙ\86Ù\88Ù\86Ù\87 Ø¯Ø§Ø± Û\8cÙ\87 Ú¯Ù\84 Ù\87Ù\88Ù\85 Ù¾Û\8cÙ\88Ù\86د Ù\85Û\8cÙ\86جا Ù\88Û\8cÚ©Û\8cÙ\87",
-       "title-invalid-talk-namespace": "داسÙ\88Ù\86 Ø¨Ù\84Ú¯Ù\87 Ø­Ø§Ø³ØªÙ\86Û\8c Ù\88Ù\87 Û\8cÙ\87 Ú¯Ù\84 Ø¨Ù\84Ú¯Ù\87 Ú\86Ú© Ú\86Ù\86Ù\87 Ú©Ù\87 Ù\86ئÛ\8cØ´ Ù\87شارÙ\87 Ù\85Û\8cÚ©Ù\87.",
-       "title-invalid-characters": "داسÙ\88Ù\86 Ø¨Ù\84Ú¯Ù\87 Ø­Ø§Ø³ØªÙ\86Û\8c Ù\85Û\8cÙ\86Ù\88Ù\86Ù\87 Ø¯Ø§Ø± Û\8cÙ\87 Ú¯Ù\84 Ú©Ø§Ø±Ø§Ú©ØªØ± Ù\86اÙ\85عتÙ\88رÙ\87 \"1$\" Ù\87.",
-       "title-invalid-relative": "داسÙ\88Ù\86 Û\8cÙ\87 Ú¯Ù\84 Ù\85سÛ\8cر Ù\87Ù\88Ù\85 Ø¯Ù\86Ú¯ Ø¯Ø§Ø±Ù\87.داسÙ\88Ù\86 Ø¨Ù\84Ú¯Ù\87 Ù\87Ù\88Ù\85 Ø¯Ù\86Ú¯(./, ../) Ù\86اÙ\85عتÙ\88رÙ\87Ø\8c Ø³Û\8c Û\8cÙ\87 Ú©Ù\87 Ù\88Ù\86Ù\88 Ø¯ Ú¯Ø§ØªÛ\8c Ú©Ù\87 Ø¯Ù\88ارتÙ\87 Ù\86Û\8cئر Ú©Ø§Ø±Û\8cار Ù\88Ù\87 Ú©Ø§Ø± Ú¯Ø±ØªÙ\87 Ø¨Ù\88ئÙ\86 Ù\86Ù\85Û\8cاÙ\86 Ø¯ Ø¨Ù\84Ú¯Ù\87 Ù\86Ù\85اÛ\8cشت Ø¯Ù\88ارتÙ\87 Ù\86Û\8cئر.",
-       "title-invalid-magic-tilde": "داسÙ\88Ù\86 Ø¨Ù\84Ú¯Ù\87 Ø­Ø§Ø³ØªÙ\86Û\8c Ù\85Û\8cÙ\86Ù\88Ù\86Ù\87 Ø¯Ø§Ø± Û\8cÙ\87 Ú¯Ù\84 Ù\86Ù\85اجا Ø¬Ø§Ø¯Ù\88Û\8cÛ\8c Ù\86اÙ\85عتÙ\88رÙ\87(<nowiki>~~~</nowiki>).",
-       "title-invalid-too-long": "داسÙ\88Ù\86 Ø¨Ù\84Ú¯Ù\87 Ø­Ø§Ø³ØªÙ\86Û\8c Ù\81رÙ\87 Ú¯Ù¾Ù\87. Ø¯ Ø­Ø§Ù\84 Ù\88 Ø¨Ø§Ø± Ø±Ø§Ø²Û\8cÙ\86Ù\87 Ú©Ø§Ø±Û\8c UTF-8 Ø§Ù\86ازÙ\87 Ù\88Ù\87 Ù\86Ù\88اس Ø¯ $1 Ø¨Ø§Û\8cت Ú¯Ù¾ØªØ± Ø¨Ù\88ئÙ\87.",
-       "title-invalid-leading-colon": "داسÙ\88Ù\86 Ø¨Ù\84Ú¯Ù\87 Ø­Ø§Ø³ØªÙ\86Û\8c Ù\85Û\8cÙ\86Ù\88Ù\86Ù\87 Ø¯Ø§Ø± Û\8cÙ\87 Ú¯Ù\84 Ú©Ù\84Ù\88Ù\86 Ù\86اÙ\85عتÙ\88ر Ø¯ Ø´Ø±Ù\88 Ú©Ø§Ø±Ø´Ù\87.",
-       "perfcached": "رسÛ\8cÙ\86Ù\87 Û\8cا Ù\86Ù\87اÛ\8cÛ\8c Ø¯ Ù\88Û\8cرگÙ\87 Ù\86Ù\87Ù\88Ù\86Û\8c Ù\85Ù\88کشت Ø¨Û\8cÙ\86Ù\87 Ù\88 Ø´Ø§Û\8cت Ù\87Ù\86Û\8c Ù\88Ù\87 Ù\87Ù\86Ú¯Ù\88Ù\85 Ø³Ø§Ø²Û\8c Ù\86بÛ\8cÙ\86Ù\87.بÛ\8cشترÙ\88Ù\86Ù\87 {{PLURAL:$4|Û\8cÙ\87 Ú¯Ù\84 Ù\86تÛ\8cجÙ\87|$4 Û\8cÙ\87 Ú¯Ù\84 Ù\86تÛ\8cجÙ\87}} Ø¯ Ù\88Û\8cرگÙ\87 Ù\86Ù\87Ù\88Ù\86Û\8c Ù\87اÙ\86 Ø¯ Ø¯Ø³Ø±س.",
-       "perfcachedts": "رسÛ\8cÙ\86Ù\87 Û\8cا Ù\86Ù\87اÛ\8cÛ\8c Ø¯ Ù\88Û\8cرگÙ\87 Ù\86Ù\87Ù\88Ù\86Û\8c Ù\85Ù\88کشت Ø¨Û\8cÙ\86Ù\87 Ù\88 Ø´Ø§Û\8cت Ù\87Ù\86Û\8c Ù\88Ù\87 Ù\87Ù\86Ú¯Ù\88Ù\85 Ø³Ø§Ø²Û\8c Ù\86بÛ\8cÙ\86Ù\87.بÛ\8cشترÙ\88Ù\86Ù\87 {{PLURAL:$4|Û\8cÙ\87 Ú¯Ù\84 Ù\86تÛ\8cجÙ\87|$4 Û\8cÙ\87 Ú¯Ù\84 Ù\86تÛ\8cجÙ\87}} Ø¯ Ù\88Û\8cرگÙ\87 Ù\86Ù\87Ù\88Ù\86Û\8c Ù\87اÙ\86 Ø¯ Ø¯Ø³Ø±س.",
-       "querypage-no-updates": "Ù\86بÙ\88ئÙ\87 Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ù\88Ù\87 Ù\87Ù\86Ú¯Ù\88Ù\85 Ø³Ø§Ø²Û\8c Ø¨Ø§.\nرسÛ\8cÙ\86Ù\87 Û\8cا Ø§Û\8cÚ\86Ù\87 ØªØ§Ø²Ù\87 Ù\86بÛ\8cÙ\87.",
-       "viewsource": "سرÚ\86Ø´Ù\85Ù\87 Ù\86Ù\87 Ø¨Ù\88Ù\8aÙ\86Ù\8aت",
-       "viewsource-title": "سرÚ\86Ø´Ù\85Ù\87 $1 Ø¨Ù\88Ù\8aÙ\86Ù\8aت",
-       "actionthrottled": "Ú©Ù\86شت Ø¬Ù\84Ù\88گئرÛ\8c Ø¨Û\8cÙ\87",
-       "actionthrottledtext": "سی جلوگئری د درتیچ اسپم نبوئه که شما چنی کارینه د یه گات کؤچک چن گل انجوم بیئتو.\nلطفن مئن چن دیقه هنی تلاش بکیت.",
-       "protectedpagetext": "دای بلگه نبوئه ویرایشت یا کاریا هنی بکید",
-       "viewsourcetext": "Ø´Ù\85ا ØªÙ\88Ù\86Û\8cت Ø³Ø±Ú\86Ø´Ù\85Ù\87 Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ù\86Ù\87 Ø¨Ù\88Û\8cÙ\86Û\8cت Ù\88 Ø¯Ø´ Ù\88رداریت:",
-       "viewyourtext": "Ø´Ù\85ا ØªÙ\88Ù\86Û\8cت Ø³Ø±Ú\86Ø´Ù\85Ù\87 Ù\88Û\8cراÛ\8cشتÛ\8cا ØªÙ\88Ù\86Ù\87 Ø§Û\8c Ø¯ Ø¨Ù\84Ú¯Ù\87 Ø¨Ù\88Û\8cÙ\86Û\8cت Ù\88 Ø¯Ø´Ù\88 Ù\88ردارÛ\8cت",
-       "protectedinterface": "اÛ\8c Ø¨Ù\84Ú¯Ù\87 Ø³Û\8c Ù\86رÙ\85 Ø§Ù\81زار Ø¯ Ø§Û\8c Ù\88Û\8cÚ©Û\8c Ù\86Û\8cسسÙ\87 Ø¢Ù\85ادÙ\87 Ù\85Û\8c Ú©Ù\87Ø\8c Ù\88 Ø¯   .\nسÛ\8c Ø§Ø¶Ø§Ù\81 Ú©Ø±Ø¯Ù\86 Û\8cا Ø¢Ù\84شت Ø¯Ø¦Ù\86 Ø¯ Ù\87Ù\85Ù\87 Ù\88Û\8cÚ©Û\8c Û\8cا Ù\84Ø·Ù\81ا [//translatewiki.net/ translatewiki.net] Ù\86Ù\87 Ø¨Ù\87 Ú©Ø§Ø± Ø¨Ø¤Ø±Û\8cتØ\8c Ù\88Ù\84ات Ù\86Ø´Û\8cÙ\86 Ú©Ù\86Û\8c Ù¾Ø±Ù\88جÙ\87 Ù\88Û\8cÚ©Û\8c Ù\88ارسگر.",
-       "editinginterface": "<strong>زئنار دئن:</strong> شما داریت بلگه ای نه که سی      بیه ویرایشت می کید.",
-       "translateinterface": "سÛ\8c Ø§Ø¶Ø§Ù\81 Ú©Ø±Ø¯Ù\86 Û\8cا Ø¢Ù\84شت Ø¯Ø¦Ù\86 Ù\88اÙ\84رستÙ\87 Û\8cا Ø¯ Ù\87Ù\85Ù\87 Ù\88Û\8cÚ©Û\8c Û\8cاØ\8cÙ\84Ø·Ù\81 Ø¨Ú©Û\8cد[//translatewiki.net/ translatewiki.net] Ù\88Ù\87 Ú©Ø§Ø± Ø¨Ø¦Û\8cرÛ\8cتØ\8c Ù¾Ø±Ù\88جÙ\87 Ù\88Ù\84ات Ø¯Û\8cارÛ\8c Ú©Ø±Ø¯Ù\86 Ù\88Û\8cÚ©Û\8c Ù\88ارسگر",
-       "cascadeprotected": "اÛ\8c Ø¨Ù\84Ú¯Ù\87 Ø¯ Ù\88Û\8cراÛ\8cشت Ù¾Ø± Ù\88 Ù¾Û\8cÙ\85 Ø¨Û\8cÙ\87 Ø³Û\8c Û\8cÙ\87 Ú©Ù\87 {{PLURAL:$1|Ù\88Ù\87 Ø¨Ù\84Ú¯Ù\87 Û\8cÙ\87 |Ù\88Ù\86Ù\88 Ø¨Ù\84Ú¯Ù\87 Û\8cاÙ\86}} Ú©Ù\87 Ù\87ا Ø¯Ø´ Ø¯                 :\n$2",
-       "namespaceprotected": "Ø´Ù\85ا Ø­Ù\82Û\8c Ø³Û\8c Ù\88Û\8cراÛ\8cشت Ø¨Ù\84Ú¯Ù\87 Û\8cاÛ\8cÛ\8c Ú©Ù\87 Ù\87اÙ\86 Ø¯ Ù\86Ù\88Ù\85جا  <strong>$1</strong> ناریت.",
-       "customcssprotected": "Ø´Ù\85ا Ø³Û\8c Ù\88Û\8cراÛ\8cشت Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ø³Û\8c Ø§Ø³ Ø§Ø³ Ø§Ø¬Ø§Ø²Ù\87 Ù\86ارÛ\8cت Ø³Û\8c Û\8cÙ\87 Ú©Ù\87 Ù\85Û\8cزÙ\88Ù\86کارÛ\8c Ø¯Ù\88Ù\86سÙ\85Ù\86Û\8cا Ø´Ø®ØµÛ\8c Û\8cÙ\87 Ú©Ø§Ø±Û\8cار Ù\87Ù\86Û\8c Ù\87ا Ø¯ Ù\88Ù\87.",
-       "customjsprotected": "Ø´Ù\85ا Ø³Û\8c Ù\88Û\8cراÛ\8cشت Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ø¬Ø§Ù\88ا Ø§Ø³Ú©Ø±Û\8cپت ØµÙ\84ا Ù\86ارÛ\8cت Ø³Û\8c Û\8cÙ\87 Ú©Ù\87 Ù\85Û\8cزÙ\88Ù\86کارÛ\8c Ø¯Ù\88Ù\86سÙ\85Ù\86Û\8cا Ø´Ø®ØµÛ\8c Û\8cÙ\87 Ú©Ø§Ø±Û\8cار Ù\87Ù\86Û\8c Ù\87ا Ø¯ Ù\88Ù\87.",
-       "mycustomcssprotected": "Ø´Ù\85ا Ø­Ù\82 Ù\86ارÛ\8cت Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ø³Û\8c Ø§Ø³ Ø§Ø³ Ù\86Ù\87 Ù\88Û\8cراÛ\8cشت Ø¨Ú©Û\8cد",
-       "mycustomjsprotected": "Ø´Ù\85ا Ø­Ù\82 Ù\86ارÛ\8cت Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ø¬Ø§Ù\88ا Ø§Ø³Ú©Ø±Û\8cپت Ù\86Ù\87 Ù\88Û\8cراÛ\8cشت Ø¨Ú©Û\8cد",
-       "myprivateinfoprotected": "Ø´Ù\85ا Ø­Ù\82 Ù\86ارÛ\8cت Ø¯Ù\88Ù\86سÙ\85Ù\86Û\8cا Ø®ØµÙ\88صÛ\8c Ù\86Ù\87 Ù\88Û\8cراÛ\8cشت Ø¨Ú©Û\8cد",
-       "mypreferencesprotected": "Ø´Ù\85ا Ø­Ù\82 Ù\86ارÛ\8cت Ù\88Û\8cجگÛ\8c Û\8cا Ù\87Ù\86Û\8c ØªÙ\88Ù\86Ù\87 Ù\88Û\8cراÛ\8cشت Ø¨Ú©Û\8cد",
-       "ns-specialprotected": "بلگیا ویجه نتونن ویرایشت بوئن",
-       "titleprotected": "اÛ\8c Ø¯Û\8cارگر Ø¯ Ø¯Ø±Ù\88س Ø¨Û\8cئÙ\86 Ù\88Ù\87 Ø¯Ø³ [[کارÛ\8cار:$1|$1]].\n Ù\86Ù\87اگرÛ\8c Ø¨Û\8cÙ\87.\nدÙ\84Û\8cÙ\84Ø´ Ù\88Ù\86Ù\87\"<em>$2</em>\".",
-       "filereadonlyerror": "Ù\86بÙ\88ئÙ\87 Ø¬Ø§Ù\86Û\8cا \"$1\" Ø¢Ù\84شت Ø¨Ú©Û\8cتÙ\88 Ø³Û\8c Û\8cÙ\87 Ú©Ù\87 Ø§Ù\85اÛ\8cÛ\8cÙ\87 Ú¯Ù\87 \"$2\" Ù\81Ù\82Ø· Ø¯ Ø­Ø§Ù\84 Ù\88 Ø¨Ø§Ù\84 Ø­Ù\86Ù\86Û\8cÙ\87.\n\nدÛ\8cÙ\88Ù\88Ù\86دارÛ\8c Ú©Ù\87 Û\8cÙ\87 Ù\86Ù\87 Ù\82Ù\84Ù\81 Ú©Ø±Ø¯Ù\87 Ù\85Ù\88ئÙ\87 Ø¯ Ù\88اشکاÙ\81ت \"$3\" Ø¨Ú©Û\8cتÙ\88.",
-       "invalidtitle-knownnamespace": "نوم نامعتور سی نوم جا \"$2\" و نیسه \"$3\"",
-       "invalidtitle-unknownnamespace": "نوم نامعتور سی شماره نومجا ناشناس $1 و نیسه \"$2\"",
-       "exception-nologin": "نبوئه وارد بوئيد",
-       "exception-nologin-text": "شما وارد [[ویجه:وامین اومائن کاریار|وامین اومائن]] بوئیت سی یه تونستویت که د ای بلگه یا کنشت دسرسی داشتویت.",
-       "exception-nologin-text-manual": "دتو تقاضا میکیم که $1 تونسه بوئه د ای بلگه دسرسی داشتوه یا کاری انجوم بیئه.",
-       "virus-badscanner": "سازواره گن:ویروس نادیار:<em>$1</em>",
-       "virus-scanfailed": "زÙ\84 Ø¨Û\8cئÙ\86 Ø´Ú©Ø³Øª Ø­Ø±Ø¯($1)",
-       "virus-unknownscanner": "ويروس كش نادیار",
-       "logouttext": "<strong>Ø´Ù\85ا Ù\87Ù\86Û\8c Ù\86رÛ\8cتتÙ\87 Ù\88Ù\87 Ø¯Ø±.</strong>\n\nد Ù\88Û\8cرتÙ\88 Ø¨Ø§ Ú©Ù\87 Ù\88Û\8cرگÙ\87 Ù\86Ù\87Ù\88 Ø§Ù\86جÙ\88Ù\85Û\8cارتÙ\88 Ù\86Ù\87 Ù¾Ø§Ú©Ø³Ø§ Ù\86Ú©Û\8cتØ\8c Ø³Û\8c Û\8cÙ\87 Ù¾Ø§Ø±Ù\87 Ø§Û\8c Ø¯ Ø¨Ù\84Ú¯Ù\87 Û\8cا Ù\85Ù\85Ú©Ù\86Ù\87 Ø¬Ù\88رÛ\8c Ù\86Ø´Ù\88 Ø¯Ø¦Ù\87 Ø¨Ù\88ئÙ\86 Ú\86Û\8c Û\8cÙ\87 Ú©Ù\87 Ù\85Ù\86Û\8cستÛ\8c  Ø´Ù\85ا Ù\87Ù\86Û\8c Ù\87اÛ\8cÛ\8cÙ\86 Ù\88امین.",
-       "welcomeuser": "Ø®Ù\88Ø´ Ø§Ù\88Ù\85اÙ\8aت،$1!",
-       "welcomecreation-msg": "حساÙ\88تÙ\88 Ø¯Ø±Ù\88س Ø¨Û\8cÙ\87.\nد Ù\88Û\8cرتÙ\88 Ù\86رÙ\88ئÙ\87 Ú©Ù\87{{Ù\86Ù\88Ù\85 Ø¯Û\8cارگÙ\87}} [[Special:Preferences|preferences]]  Ø®Ù\88تÙ\88Ù\86Ù\87 Ø¢Ù\84شت Ø¨Ú©Û\8cت",
+       "nstab-mediawiki": "پئیغوٙم",
+       "nstab-template": "چوٙأ",
+       "nstab-help": "بألگە هومیاری",
+       "nstab-category": "دأسÛ\95",
+       "nosuchaction": "چئنی کونئشتگأری نییئش",
+       "nosuchactiontext": "کاری کئ ڤا یوٙ آر ئل تیار بییە نادیارە.\nگاسی شوما یوٙ آر ئل نە دوروس نأنیسأنیتە، یا یئ گئل هوم پئیڤأند ئشتئڤا ڤارئد بییە.\nڤئ گاسی یئ گئل سیسئریک د نأرم أفزاز ڤئ کار گئرئتە بییە ڤا {{SITENAME}} ئشارە بأکە.",
+       "nosuchspecialpage": "چئنی بألگە ڤیجە یی نییئش",
+       "nospecialpagetext": "<strong>Ø´Ù\88Ù\85ا Û\8cئ Ú¯Ø¦Ù\84 Ø¨Ø£Ù\84Ú¯Û\95 Ù\86ادÛ\8cار Ù\86Û\95 Ù\87استÛ\8cتÛ\95.</strong>\nگاسÛ\8c Û\8cئ Ú¯Ø¦Ù\84 Ù\86Ù\88Ù\85Ú¯Û\95 Ø³Û\8c Ø¯Û\8cارÛ\8c Ø¯Ø£Ø¦Ù\86 Ø¯ Ø¨Ø£Ù\84Ú¯Û\95 Û\8cا Ø¨Ø§Û\8cأد Ø¯ [[Special:SpecialPages|{{int:specialpages}}]] Ø¯Û\8cارÛ\8c Ø¨Ø£Ú©Û\95.",
+       "error": "خأطا",
+       "databaseerror": "خأطا Ø¯ Ø±Ø¦Ø³Û\8cÙ\86Û\95 Ú¯ا",
+       "databaseerror-text": "یئ گئل خأطا جوست کاری د رئسینە گا دیاری کئردە.گاسی یە یئ گل سیسئریک د کار گئرئتئن نأرم أفزار راس بأکە.",
+       "databaseerror-textcl": "یئ گئل خأطا جوست کاری د رئسینە گا دیاری کئردە.",
+       "databaseerror-query": "جوستکاری: $1",
+       "databaseerror-function": "Ø¢Ù\84ئشت Ú¤Ø£ن:$1",
+       "databaseerror-error": "خأطا: $1",
+       "laggedslavemode": "ڤارئسدار بوٙییت:گاسی بألگە د ڤأر گئرئتە ڤئ هئنگوم سازیا ئیسئنی نبوٙە",
+       "readonly": "رئسÛ\8cÙ\86Û\95 Ú¯Ø§ Ù\82Ù\88Ù\84Ù\81 Ø¨Û\8cÛ\8cÛ\95",
+       "enterlockreason": "دألیل قولف کئردئن نە بأنیسیت، کئ ڤە د ڤأرگئرئتە گات ڤا کئردئن قولف با",
+       "readonlytext": "رئسÛ\8cÙ\86Û\95 Ú¯Ø§ Ø¦Û\8cسئ Ø³Û\8c Ø¯Ø£Ø¦Ù\86 Ú¤Ù\88رÙ\88Ù\99دÛ\8c Û\8cا Ù\87Ø£Ù\86Û\8c Û\8cا Ø¢Ù\84ئشتگئرÛ\8cا Ù\87Ø£Ù\86Û\8c Ù\82Ù\88Ù\84Ù\81 Ø¨Û\8cÛ\8cÛ\95Ø\8c Ú¯Ø§Ø³Û\8c Ø³Û\8c Ø¨Û\8cÛ\8cئÙ\86 Ù\85Ø£Ù\85Ù\88Ù\99Ù\84Û\8c Ø±Ø¦Ø³Û\8cÙ\86Û\95 Ú¯Ø§Û\8cا Ú¤Ø§Ú¯Ø£Ø±Ø¯Ù\88Ù\99Ù\86Û\8c Ø¨Ù\88Ù\99Û\95 Ú¤Ø¦ Ø­Ø§Ù\84 Ù\88 Ø¨Ø§Ù\84 Ø£Ú¤Ø¦Ù\84Û\8c Ø®Ù\88Ø´.\nدÛ\8cÚ¤Ù\88Ù\99Ù\86دارÛ\8c Ú©Ø¦ Ú¤Ø¦Ù\86Û\95 Ù\82Ù\88Ù\84Ù\81 Ú©Ø¦Ø±Ø¯Û\95 Ú¤Ø¦Ù\86Û\95 Ú¯Ù\88تÛ\95:$1",
+       "missing-article": "رئسÛ\8cÙ\86Û\95 Ú¯Ø§ Ù\86ئÙ\85Û\8c ØªÙ\88Ù\99Ù\86Û\95 Ø¨Ø£Ù\84Ú¯Û\95 Û\8cÛ\8c Ù\86Û\95 Ø¨Ø§Ø³ Ø¨Ù\88Ù\99أش Ù\88 Ù\86Ù\88Ù\99Ù\85ئش $1Ù\88 $2 Ø¨Ø§ Ø¨Ø£Ø¬Ù\88Ù\99رÛ\95.\n\nÙ\85Ø£Ù\85Ù\88Ù\99Ù\84Ø£Ù\86د Ø³Û\8c Û\8cÛ\95 Ú©Ø¦ Ù\81أرخ Ù\87Ù\88Ù\85 Ù¾Ø¦Û\8cڤأÙ\86د Ú¤Û\8cرگار Ø¯ Ø¦Ù\88 Ø¨Ø£Ù\84Ú¯Û\95 Ù¾Ø§Ú©Ø³Û\8cا Ø¨Û\8cÛ\8cÛ\95 Ø¯Û\8cارÛ\8c Ù\86ئÙ\85Û\8c Ú©Û\95.\n\nأر Û\8cÛ\95 Ú\86Û\8c Ù\85Ù\88Ù\87ئÙ\85Û\8c Ø³Û\8cتÙ\88Ù\99 Ù\86Û\8cØ\8c Ú¯Ø§Ø³Û\8c Ø´Ù\88Ù\85ا Û\8cئ Ú¯Ø¦Ù\84 Ø³Û\8cسئرÛ\8cÚ© Ø¯ Ù\86أرÙ\85 Ø£Ù\81زار Ø®Ù\88تÙ\88Ù\99 Ø¯Ø§Ø±Û\8cت.\nÙ\84Ù\88Ø·Ù\81 Ø¨Ø£Ú©Û\8cت Ú¤Ø¦Ù\86Û\95 Ø³Û\8c Ú¤Ø¦Ù\86Ù\88Ù\99 [[Special:Ù\86Ù\88Ù\99Ù\85Ú¯Û\95 Ú©Ø§Ø±Û\8cارÛ\8cا/سÛ\8c Û\8cÙ\88Ù\99سÙ\88Ù\99Ù¾|دÛ\8cÚ¤Ù\88Ù\99Ù\86کارÛ\8cا]]کئÙ\84 Ø¨Ø£Ú©Û\8cت Ù\88 Ø¯Ø´ Ø¯Ø¦Ø¨Ø§Ø±Ù\87 ØªÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø¢Û\8c Ù¾Û\8cتÙ\88Ù\99 Ú¤Ø¦Ø´Ù\88Ù\99 Ø¨Ù\88Ù\99Û\8cÛ\8cت.",
+       "missingarticle-rev": "(ڤانیأری#: $1)",
+       "missingarticle-diff": "(Ù\81أرخ: $1Ø\8c $2)",
+       "readonly_lag": "ئÛ\8c Ø±Ø¦Ø³Û\8cÙ\86Û\95 Ú¯Ø§ Ù\82Ù\88Ù\84Ù\81 Ø¨Û\8cÛ\8cÛ\95 ØªØ§ Ú¯Ø§ØªÛ\8c Ú©Ø¦ Ø³Ø¦Ø±Ú¤Ø¦Ø± Ø±Ø¦Ø³Û\8cÙ\86Û\95 Ú¯Ø§ Ø¨Ø£Ø±Ø£Ø³Û\95 Ú¤Ø¦ Û\8cئ Ú¯Ø¦Ù\84 Ù\85Û\8cÙ\86جاڤأÙ\86.",
+       "internalerror": "خأطا Ù\85Û\8cÙ\86جاÛ\8cی",
+       "internalerror_info": "خأطا Ù\85Û\8cÙ\86جاÛ\8cی:$1",
+       "internalerror-fatal-exception": "تیە داشتئن مأرگبار جوٙر \"$1\"",
+       "filecopyerror": "Ù\86أبÙ\88Ù\99Û\95 Ø¬Ø§Ù\86Û\8cا $1 Ø¯ $2 Ú¤Ù\88رداشتÛ\95 Ø¨Ù\88Ù\99Û\95",
+       "filerenameerror": "Ù\86أبÙ\88Ù\99Û\95 Ù\86Ù\88Ù\85 Ø¬Ø§Ù\86Û\8cا $1 Ø¯ $2 Ø¢Ù\84ئشت Ú©Ø§Ø±Û\8c Ø¨Ù\88Ù\99Û\95.",
+       "filedeleteerror": "Ù\86أبÙ\88Ù\99Û\95 Ø¬Ø§Ù\86Û\8cا $1 Ù¾Ø§Ú©Ø³Ø§ Ø¨Ù\88Ù\99Û\95.",
+       "directorycreateerror": "Ù\86أبÙ\88Ù\99Û\95 ØªÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86Ú¯Û\95 $1 Ø±Ø§Ø³ Ø¨Ù\88Ù\99Û\95.",
+       "directoryreadonlyerror": "فأقأط بوٙە تیرنئشوٙنگە \"$1\" نە بوٙحوٙنی.",
+       "directorynotreadableerror": "تیرنئشوٙنگە \"$1\" حأنئنی نی.",
+       "filenotfound": "Ù\86أتÙ\88Ù\99Ù\86Û\8cت Ø¬Ø§Ù\86Û\8cا $1 Ù\86Û\95 Ø¨Ø£Ø¬Ù\88Ù\99رÛ\8cت.",
+       "unexpected": "أرزاÛ\8cئت Ù\86اÙ\87استÛ\95: \"$1\"=\"$2\".",
+       "formerror": "خأطا:Ù\86أبÙ\88Ù\99Û\95 Ù\86Ù\88Ù\85 Ø¨Ø£Ù\84Ú¯Û\95 Ù\86Û\95 Ú¤Ø¦ Ù\85Ù\88Ù\99 Ø¨Ù\88Ù\99Û\8cÛ\8cت.",
+       "badarticleerror": "ئÛ\8c Ú©Ù\88Ù\86ئشتکارÛ\8c Ø¯ Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ø£Ù\86جÙ\88Ù\85 Ù\86أبÙ\88Ù\99Û\95.",
+       "cannotdelete": "نأبوٙە بألگە یا جانیا $1 پاکسا با.\nگاسی د ئیسئنی کئسی تئر ڤئ نە پاکسا کئردە.",
+       "cannotdelete-title": "Ù\86أبÙ\88Ù\99Û\95 Ø¨Ø£Ù\84Ú¯Û\95 $1 Ù¾Ø§Ú©Ø³Ø§ Ø¨Ø§",
+       "delete-hook-aborted": "پاکسا کاری ڤا قولاڤ نئها گئری بیە.\nهیچ توضیی سیش نی.",
+       "no-null-revision": "سی بألگە $1 ڤانیأری خومثا نە راس بأکیت",
+       "badtitle": "داسÙ\88Ù\99Ù\86 Ú¯Ø£ن",
+       "badtitletext": "داسÙ\88Ù\99Ù\86 Ø¨Ø£Ù\84Ú¯Û\95 Ù\87استئÙ\86Û\8c Ù\86ادÛ\8cارÛ\95Ø\8c Û\8cا Û\8cئ Ú¯Ø¦Ù\84 Û\8cئ Ú¯Ø¦Ù\84 Ø¯Ø§Ø³Ù\88Ù\99Ù\86 Ù\85Û\8cÙ\86جا Ø²Ù\88Ù\99Ù\86Û\8c Û\8cا Ù\85Û\8cÙ\86جا Ú¤Û\8cÚ©Û\8c Ø¦Ø´ØªØ¦Ú¤Ø§Û\95.\nگاسÛ\8c Û\8cÛ\95 Ø¯ Ú¤Ø£Ø± Ú¯Ø¦Ø±Ø¦ØªÛ\95 Û\8cئ Ú¯Ø¦Ù\84 Ú©Ø§Ø±Ø§Ú©ØªØ¦Ø± Û\8cا Ú\86Ø£Ù\86 Ú¯Ø¦Ù\84 Ú©Ø§Ø±Ø§Ú©ØªØ¦Ø± Ø¨Ø§ Ú©Ø¦ Ù\86أبÙ\88Ù\99Û\95 Ø¯ Ø¯Ø§Ø³Ù\88Ù\99Ù\86Û\8cا Ú¤Ø¦ Ú©Ø§Ø±Ø¦Ø´Ù\88Ù\99 Ú¯Ø¦Ø±Ø¦Øª.",
+       "title-invalid-empty": "داسÙ\88Ù\99Ù\86 Ø¨Ø£Ù\84Ú¯Û\95 Ù\87استئÙ\86Û\8c Ø­Ø§Ù\84Û\8cÛ\95 Û\8cا Ù\81Ø£Ù\82أط Ù\85Û\8cÙ\86Ù\88Ù\99Ù\86Û\95 Ø¯Ø§Ø± Û\8cئ Ú¯Ø¦Ù\84 Ù\86Ù\88Ù\99Ù\85 Û\8cا Ù\86Ù\88Ù\99Ù\85 Ø¬Ø§Û\95.",
+       "title-invalid-utf8": "داسÙ\88Ù\99Ù\86 Ø¨Ø£Ù\84Ú¯Û\95 Ù\87استئÙ\86Û\8c Ù\85Û\8cÙ\86Ù\88Ù\99Ù\86Û\95 Ø¯Ø§Ø± Û\8cئ Ú¯Ø¦Ù\84 Ù\86ئÙ\85اجا UTF-8 Ù\86ادÛ\8cارÛ\95.",
+       "title-invalid-interwiki": "داسÙ\88Ù\99Ù\86 Ø¨Ø£Ù\84Ú¯Û\95 Ù\87استئÙ\86Û\8c Ù\85Û\8cÙ\86Ù\88Ù\99Ù\86Û\95 Ø¯Ø§Ø± Û\8cئ Ú¯Ø¦Ù\84 Ù\87Ù\88Ù\85 Ù¾Ø¦Û\8cڤأÙ\86دÛ\95 Ú©Ø¦ Ù\86أبÙ\88Ù\99Û\95 Ø¯ Ø¯Ø§Ø³Ù\88Ù\99Ù\86Û\8cا Ú¤Ø¦ Ú©Ø§Ø± Ú¯Ø¦Ø±Ø¦ØªÛ\95 Ø¨Ù\88Ù\99Û\95.",
+       "title-invalid-talk-namespace": "داسÙ\88Ù\99Ù\86 Ø¨Ø£Ù\84Ú¯Û\95 Ù\87استئÙ\86Û\8c Ú¤Ø¦ Û\8cئ Ú¯Ø¦Ù\84 Ø¨Ø£Ù\84Ú¯Û\95 Ú\86Ø£Ú© Ú\86ئÙ\86Û\95 Ú©Ø¦ Ù\86Û\8cÛ\8cئش Ø¦Ø´Ø§Ø±Û\95 Ù\85Û\8cÚ©Û\95.",
+       "title-invalid-characters": "داسÙ\88Ù\99Ù\86 Ø¨Ø£Ù\84Ú¯Û\95 Ù\87استئÙ\86Û\8c Ù\85Û\8cÙ\86Ù\88Ù\99Ù\86Û\95 Ø¯Ø§Ø± Û\8cئ Ú¯Ø¦Ù\84 Ú©Ø§Ø±Ø§Ú©ØªØ±Ù\87:$1 Ù\86ادÛ\8cارÛ\95.",
+       "title-invalid-relative": "داسÙ\88Ù\99Ù\86 Û\8cئ Ú¯Ø¦Ù\84 Ù\84ا Ù\87Ù\88Ù\85 Ø¯Ø£Ù\86Ú¯ Ø¯Ø§Ø±Û\95.داسÙ\88Ù\99Ù\86 Ø¨Ø£Ù\84Ú¯Û\95 Ù\87Ù\88Ù\85 Ø¯Ø£Ù\86Ú¯(./, ../) Ù\86ادÛ\8cارÛ\95Ø\8c Ø³Û\8c Û\8cÛ\95 Ú©Ø¦ Ú¤Ø¦Ù\86Ù\88Ù\99 Ø£Ú©Ø«Ø£Ø±Ø£Ù\86 Ø¯ Ú¯Ø§ØªÛ\8c Ú©Ø¦ Ø¯Ù\88ڤارتÛ\95 Ù\86Û\8cأر Ú¤Ø¦ Ø¯Ø£Ø³ Ú©Ø§Ø±Û\8cار Ø¯Ø£Ø³Û\8c Ø³Ø§Ø²Û\8c Ø¨Ù\88Ù\99Û\95 Ø¯Û\8cارÛ\8c Ù\86ئÙ\85Û\8cÚ©Ø£Ù\86.",
+       "title-invalid-magic-tilde": "داسÙ\88Ù\99Ù\86 Ø¨Ø£Ù\84Ú¯Û\95 Ø­Ø§Ø³ØªØ¦Ù\86Û\8c Ù\85Û\8cÙ\86Ù\88Ù\99Ù\86Û\95 Ø¯Ø§Ø± Û\8cئ Ú¯Ø¦Ù\84 Ù\86ئÙ\85اجا Ø¬Ø§Ø¯Ù\88Ù\99Û\8cÛ\8c Ù\86ادÛ\8cارÛ\95(<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "داسÙ\88Ù\99Ù\86 Ø¨Ø£Ù\84Ú¯Û\95 Ø­Ø§Ø³ØªØ¦Ù\86Û\8c Ù\81ئرÛ\95 Ú¯Ø£Ù¾Û\95. Ø¯ Ø­Ø§Ù\84 Ù\88 Ø¨Ø§Ø± Ø±Ø§Ø²Û\8cÙ\86Û\95 Ú©Ø§Ø±Û\8c UTF-8 Ø£Ù\86ازÛ\95 Ú¤Ø¦ Ù\86أباس Ø¯ $1 Ø¨Ø§Û\8cت Ú¯Ø£Ù¾ØªØ£Ø± Ø¨Ù\88Ù\99Û\95.",
+       "title-invalid-leading-colon": "داسÙ\88Ù\99Ù\86 Ø¨Ø£Ù\84Ú¯Û\95 Ø­Ø§Ø³ØªØ¦Ù\86Û\8c Ù\85Û\8cÙ\86Ù\88Ù\99Ù\86Û\95 Ø¯Ø§Ø± Û\8cئ Ú¯Ø¦Ù\84 Ú©Ù\88Ù\84Ù\88Ù\99Ù\86 Ù\86ادÛ\8cار Ø¯ Ø£Ú¤Ø£Ù\84 Ú©Ø§Ø±Ø¦Ø´Û\95.",
+       "perfcached": "رئسÛ\8cÙ\86Û\95 Û\8cا Ù\86ئÙ\87اÛ\8cÛ\8c Ø¯ Ú¤Û\8cرگÛ\95 Ù\82اÙ\85 Ø¨Û\8cÛ\8cÛ\95 Ù\85Ù\88Ù\99Ú©Û\8cس Ø¨Û\8cÙ\86Û\95 Ù\88 Ú¯Ø§Ø³Û\8c Ù\87Ø£Ù\86Û\8c Ú¤Ø¦ Ù\87ئÙ\86Ú¯Ù\88Ù\85 Ø³Ø§Ø²Û\8c Ù\86أبÛ\8cÙ\86Û\95.بÛ\8cشتئرÙ\88Ù\99Ù\86Û\95 {{PLURAL:$4|Û\8cئ Ú¯Ø¦Ù\84 Ù\86أتÛ\8cجÛ\95|$4 Û\8cئ Ú¯Ø¦Ù\84 Ù\86أتÛ\8cجÛ\95}} Ø¯ Ú¤Û\8cرگÛ\95 Ù\82اÙ\85 Ø¨Û\8cÛ\8cÛ\95 Ù\87اÙ\86 Ø¯ Ø¯Ø£Ø³Ø±Ø¦س.",
+       "perfcachedts": "رئسÛ\8cÙ\86Û\95 Û\8cا Ù\86ئÙ\87اÛ\8cÛ\8c Ø¯ Ú¤Û\8cرگÛ\95 Ù\82اÙ\85 Ø¨Û\8cÛ\8cÛ\95 Ù\85Ù\88Ù\99Ú©Û\8cس Ø¨Û\8cÙ\86Û\95 Ù\88 Ú¯Ø§Ø³Û\8c Ù\87Ø£Ù\86Û\8c Ú¤Ø¦ Ù\87ئÙ\86Ú¯Ù\88Ù\85 Ø³Ø§Ø²Û\8c Ù\86أبÛ\8cÙ\86Û\95.بÛ\8cشتئرÙ\88Ù\99Ù\86Û\95 {{PLURAL:$4|Û\8cئ Ú¯Ø¦Ù\84 Ù\86أتÛ\8cجÛ\95|$4 Û\8cئ Ú¯Ø¦Ù\84 Ù\86أتÛ\8cجÛ\95}} Ø¯ Ú¤Û\8cرگÛ\95 Ù\82اÙ\85 Ø¨Û\8cÛ\8cÛ\95 Ù\87اÙ\86 Ø¯ Ø¯Ø£Ø³Ø±Ø¦س.",
+       "querypage-no-updates": "Ù\86أبÙ\88Ù\99Û\95 Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ú¤Ø¦ Ù\87ئÙ\86Ú¯Ù\88Ù\85 Ø³Ø§Ø²Û\8c Ø¨Ø§.\nرئسÛ\8cÙ\86Û\95 Û\8cا Ø¦Û\8cÚ\86ئ ØªØ§Ø²Û\95 Ú©Ø§Ø±Û\8c Ù\86أبÛ\8cÙ\86Û\95.",
+       "viewsource": "سئÛ\8cÙ\84 Ø¯ Ø³Ø£Ø±Ú\86ئشÙ\85Û\95 Ø¨Ø£Ú©Û\8cت",
+       "viewsource-title": "سئÛ\8cÙ\84 Ø¯ Ø³Ø£Ø±Ú\86ئشÙ\85Û\95 $1 Ø¨Ø£Ú©Û\8cت",
+       "actionthrottled": "Ú©Ù\88Ù\86ئشتکارÛ\8c Ù\86ئÙ\87اگئرÛ\8c Ø¨Û\8cÛ\8cÛ\95",
+       "actionthrottledtext": "سی نئهاگئری د دأرتیچ بییئن ئسپأم نأبوٙە کئ شوما چئنی کاری نە د یئ گاتی کوٙتا چأن گئل أنجوم بئییت.\nلوطف بأکیت د چأن دئیقە هأنی د نۊ تئلاش بأکیت.",
+       "protectedpagetext": "نأبوٙە د ئی بألگە ڤیرایئشت کاریا کاریاریا هأنی نە سئیل بأکیت.",
+       "viewsourcetext": "Ø´Ù\88Ù\85ا Ù\85Û\8c ØªÙ\88Ù\99Ù\86Û\8cد Ø³Ø£Ø±Ú\86ئشÙ\85Û\95 Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ù\86Û\95 Ø³Ø¦Û\8cÙ\84 Ø¨Ø£Ú©Û\8cت Ù\88 Ø¯Ø¦Ø´ Ú¤Ø¦رداریت:",
+       "viewyourtext": "Ø´Ù\88Ù\85ا Ù\85Û\8c ØªÙ\88Ù\99Ù\86Û\8cت Ø³Ø£Ø±Ú\86ئشÙ\85Û\95 Ú¤Û\8cراÛ\8cئشتÛ\8cا ØªÙ\88Ù\99Ù\86Û\95 Ø¯ Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ø³Ø¦Û\8cÙ\84 Ø¨Ø£Ú©Û\8cت Ù\88 Ø¯Ø¦Ø´Ù\88Ù\99 Ú¤Ø¦Ø±Ø¯Ø§Ø±Û\8cت:",
+       "protectedinterface": "ئÛ\8c Ø¨Ø£Ù\84Ú¯Û\95 Ø³Û\8c Ù\86أرÙ\85 Ø£Ù\81زار Ú©Ø¦ Ù\87ا Ø¯ Ø¦Û\8c Ú¤Û\8cÚ©Û\8c Ù\86Û\8cسئسÛ\95 Ø¢Ù\85ادÛ\95 Ù\85Û\8cÚ©Û\95Ø\8cÙ\88 Ú¤Ø¦ Ø¯ Ù\85Ù\88زاحئÙ\85Û\95 Øª Ú©Ø§Ø±Û\8c Ù¾Ø£Ø± Ù\88 Ù¾Û\8cÙ\85 Ú©Ø§Ø±Û\8c Ø¨Û\8cÛ\95\nسÛ\8c Ø¦Ø¶Ø§Ù\81 Ú©Ø¦Ø±Ø¯Ø¦Ù\86 Û\8cا Ø¢Ù\84ئشت Ø¯Ø£Ø¦Ù\86 Ø¯ Ù\87Ø£Ù\85Û\95 Ú¤Û\8cÚ©Û\8c Û\8cا Ù\84Ù\88Ø·Ù\81 Ø¨Ø£Ú©Û\8cت [//translatewiki.net/ translatewiki.net] Ù\86Û\95 Ú¤Ø¦ Ú©Ø§Ø± Ø¨Ø¦Û\8cرÛ\8cتØ\8c Ù¾Ù\88رÙ\88جÛ\95 Ú¤Ù\88Ù\84ات Ù\86ئشÛ\8cÙ\86 Ø³Ø§Ø²Û\8c Ú¤Û\8cÚ©Û\8cÙ\85ئدÛ\8cا.",
+       "editinginterface": "<strong>ڤارئسکاری کئردئن:</strong> شوما داریت یئ گئل بألگە نە کئ سی یئ گئل نیسئسە یا نأرم أفزار پئیڤأندکار ڤئ کار گئرئتە بیە ڤیرایئشت میکیت.\nآلئشت دأئن ئی بألگە ری رئخت و بارت پئیڤأندکاری کئ کاریاری هأنی ڤئ نە ڤئ کار مئیرئن کارگئرایی دارە.",
+       "translateinterface": "سÛ\8c Ø¦Ø¶Ø§Ù\81 Ú©Ø¦Ø±Ø¯Ø¦Ù\86 Û\8cا Ø¢Ù\84ئشت Ø¯Ø£Ø¦Ù\86 Ú¤Ø§Ù\84ئرئسÛ\95 Û\8cا Ø¯ ØªØ£Ù\85Ù\88Ù\99Ù\85 Ú¤Û\8cÚ©Û\8c Û\8cاØ\8cÙ\84Ù\88Ø·Ù\81 Ø¨Ø£Ú©Û\8cت [//translatewiki.net/ translatewiki.net] Ù\86Û\95 Ú¤Ø¦ Ú©Ø§Ø± Ø¨Ø¦Û\8cرÛ\8cتØ\8c Ù¾Ù\88رÙ\88جÛ\95 Ú¤Ù\88Ù\84ات Ù\86ئشÛ\8cÙ\86 Ø³Ø§Ø²Û\8c Ú¤Û\8cÚ©Û\8c Ù\85ئدÛ\8cا.",
+       "cascadeprotected": "ئÛ\8c Ø¨Ø£Ù\84Ú¯Û\95 Ø¯ Ú¤Û\8cراÛ\8cئشت Ù¾Ø£Ø± Ù\88 Ù¾Û\8cÙ\85 Ú©Ø§Ø±Û\8c Ø¨Û\8cÛ\8cÛ\95 Ø³Û\8c Û\8cÛ\95 Ú©Ø¦ Ø¯ Ú¤Ø£Ø± Ú¯Ø¦Ø±Ø¦ØªÛ\95 Ø¨Ø£Ù\84Ú¯Û\95 {{PLURAL:$1|ڤئ Ø¨Ø£Ù\84Ú¯Û\95 Û\8cÛ\95|ڤئÙ\86Ù\88Ù\99 Ø¨Ø£Ù\84Ú¯Û\95 Ù\86}} Û\95 Ú©Ø¦ Ú¤Ø¦ Ø®Ù\88Ø´ Ú¤Ø§ Ù\86ئÙ\85اجا ØªØ§Ù\81 Ù\86ئÙ\85اÛ\8cÛ\8c Ù¾Ø£Ø± Ù\88 Ù¾Û\8cÙ\85 Ú©Ø§Ø±Û\8c Ø¨Û\8cÛ\95 Ù\88 Ú\86Û\8cا Ù\87Ø£Ù\86Û\8c Ø¯ Ø¦Û\8cÚ\86ئ Ø±Ø£Ú¤Ø§Ù\86دÛ\8cارÛ\8c Ø¨Û\8cÙ\86Û\95:\n$2",
+       "namespaceprotected": "Ø´Ù\88Ù\85ا ØµØ¦Ù\84ا Ú¤Û\8cراÛ\8cئشت Ø¨Ø£Ù\84Ú¯Û\95 Û\8cاÛ\8cÛ\8c Ú©Ø¦ Ù\87اÙ\86 Ø¯ Ù\86Ù\88Ù\85جا <strong>$1</strong> ناریت.",
+       "customcssprotected": "Ø´Ù\88Ù\85ا ØµØ¦Ù\84ا Ú¤Û\8cراÛ\8cئشت Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ø³Û\8c Ø¦Ø³ Ø¦Ø³ Ù\86Û\95 Ù\86ارÛ\8cت Ø³Û\8c Û\8cÛ\95 Ú©Ø¦ Ù\85Û\8cزÙ\88Ù\99Ù\86کارÛ\8c Ø¯Ù\88Ù\99Ù\86ئسÙ\85Ø£Ù\86Û\8cا Ø´Ø£ØµÙ\82Û\8c Û\8cئ Ú¯Ø¦Ù\84 Ú©Ø§Ø±Û\8cار Ù\87Ø£Ù\86Û\8c Ù\87ا Ø¯Ø¦Ø´.",
+       "customjsprotected": "Ø´Ù\88Ù\85ا ØµØ¦Ù\84ا Ú¤Û\8cراÛ\8cئشت Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ø¬Ø§Ú¤Ø§ Ø¦Ø³Ú©Ø±Û\8cپت Ù\86Û\95 Ù\86ارÛ\8cت Ø³Û\8c Û\8cÛ\95 Ú©Ø¦ Ù\85Û\8cزÙ\88Ù\99Ù\86کارÛ\8c Ø¯Ù\88Ù\99Ù\86ئسÙ\85Ø£Ù\86Û\8cا Ø´Ø£ØµÙ\82Û\8c Û\8cئ Ú¯Ø¦Ù\84 Ú©Ø§Ø±Û\8cار Ù\87Ø£Ù\86Û\8c Ù\87ا Ø¯Ø¦Ø´.",
+       "mycustomcssprotected": "Ø´Ù\88Ù\85ا ØµØ¦Ù\84ا Ú¤Û\8cراÛ\8cئشت Ú©Ø¦Ø±Ø¯Ø¦Ù\86 Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ø³Û\8c Ø¦Ø³ Ø¦Ø³ Ù\86Û\95 Ù\86ارÛ\8cت.",
+       "mycustomjsprotected": "Ø´Ù\88Ù\85ا ØµØ¦Ù\84ا Ú¤Û\8cراÛ\8cئشت Ú©Ø¦Ø±Ø¯Ø¦Ù\86 Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ø¬Ø§Ú¤Ø§ Ø¦Ø³Ú©Ø¦Ø±Û\8cپت Ù\86Û\95 Ù\86ارÛ\8cت.",
+       "myprivateinfoprotected": "Ø´Ù\88Ù\85ا ØµØ¦Ù\84ا Ú¤Û\8cراÛ\8cئشت Ú©Ø§Ø±Û\8c Ø¯Ù\88Ù\86ئسÙ\85Ø£Ù\86Û\8cا Ø´Ø£ØµÙ\82Û\8c Ø®Ù\88تÙ\88Ù\99Ù\86Û\95 Ù\86ارÛ\8cت.",
+       "mypreferencesprotected": "Ø´Ù\88Ù\85ا ØµØ¦Ù\84ا Ú¤Û\8cراÛ\8cئشت Ú©Ø§Ø±Û\8c Ú¤Û\8cجÛ\95 Û\8cÛ\8c Û\8cا Ù\87Ø£Ù\86Û\8c Ø®Ù\88تÙ\88Ù\99Ù\86Û\95 Ù\86ارÛ\8cت.",
+       "ns-specialprotected": "نبوٙە بألگە یا ڤئجە نع ڤیرایئشت کئرد.",
+       "titleprotected": "ئÛ\8c Ø¯Ø§Ø³Ù\88Ù\99Ù\86 Ø¯ Ø±Ø£Ú¤Ø£Ù\86دÛ\8cارÛ\8c Ú¤Ø¦ Ø¯Ø£Ø³ [[کارÛ\8cار:$1|$1]] Ù\86ئÙ\87اگئرÛ\8c Ø¨Û\8cÛ\8cÛ\95.\nدأÙ\84Û\8cÙ\84ئش Ú¤Ø¦ Ù\86Û\95\"<em>$2</em>\".",
+       "filereadonlyerror": "Ù\86أبÙ\88Ù\99Û\95 Ø¬Ø§Ù\86Û\8cا \"$1\" Ù\86Û\95 Ø¢Ù\84ئشت Ú©Ø§Ø±Û\8c Ø¨Ø£Ú©Û\8cت Ø³Û\8c Û\8cÛ\95 Ú©Ø¦ Ø¦Ù\85اÛ\8cÛ\95 Ø¬Ø§ \"$2\" Ø¦Û\8cسئ Ù\87ا Ø¯ Ø­Ø§Ù\84 Ù\88 Ø¨Ø§Ù\84 Ø­Ø£Ù\86ئÙ\86.\n\nدÛ\8cÚ¤Ù\88Ù\99Ù\86دارÛ\8c Ú©Ø¦ Ú¤Ø¦ Ù\86Û\95 Ù\82Ù\88Ù\84Ù\81 Ú©Ø¦Ø±Ø¯Û\95 Ù\87ا Ø¯ Ø­Ø§Ù\84 Ù\88 Ø¨Ø§Ù\84 Ú¯Ù\88تÛ\95 Ø¯Û\8cارÛ\8c \"$3\" .",
+       "invalidtitle-knownnamespace": "داسوٙن نادیار سی نوم جا \"$2\" و نیسئسە \"$3\"",
+       "invalidtitle-unknownnamespace": "داسوٙن نادیار سی شومارە نادیار نوم جا \"$2\" و نیسئسە \"$3\"",
+       "exception-nologin": "ڤامین نیوٙماە",
+       "exception-nologin-text": "لوطف بأکیت بیایت ڤامین سی یە کئ د ئی بألگە یا کونئشتکاری دأسرئسی داشتوٙییت.",
+       "exception-nologin-text-manual": "لوطف بأکیت ڤئ $1 صئلا بئیتوٙ کئ د ئی بألگە یا کونئشتکاری دأسرئسی داشتوٙە.",
+       "virus-badscanner": "سازڤارە گأن:ڤیروٙس نادیار:<em>$1</em>",
+       "virus-scanfailed": "زÙ\88Ù\84 Ø¨Û\8cÛ\8cئÙ\86 Ø´Ø¦Ú©Ø£Ø³ Ø­Ø£Ø±Ø¯(رازÛ\8cÙ\86Û\95 $1)",
+       "virus-unknownscanner": "ڤیروٙس کوش نادیار",
+       "logouttext": "<strong>Ø´Ù\88Ù\85ا Ù\87Ø£Ù\86Û\8c Ù\86أرÛ\8cتÛ\95 Ú¤Ø¦ Ø¯Ø£Ø±.</strong>\n\nد Ú¤Û\8cرئتÙ\88Ù\99 Ø¨Ø§ Ú©Ø¦ Ú¤Û\8cرگÛ\95 Ù\86ئÙ\87Ù\88Ù\99 Ø£Ù\86جÙ\88Ù\85Û\8cارئتÙ\88Ù\99 Ù\86Û\95 Ù¾Ø§Ú©Ø³Ø§ Ù\86Ø£Ú©Û\8cتØ\8c Ø³Û\8c Û\8cÛ\95 Ú©Ø¦ Ú¯Ø§Ø³Û\8c Ù¾Ø§Ø±Ø¦ Û\8cÛ\8c Ø¯ Ø¨Ø£Ù\84Ú¯Û\95 Û\8cا Ø¬Ù\88Ù\99رÛ\8c Ø¯Û\8cارÛ\8c Ù\85Û\8c Ú©Ø£Ù\86 Ú\86Û\8c Û\8cÛ\95 Ú©Ø¦ Ù\85Ø£Ù\86Û\8cستÛ\8c Ø´Ù\88Ù\85ا Ù\87Ø£Ù\86Û\8c Ù\87اÛ\8cÛ\8cت Ú¤Ø£مین.",
+       "welcomeuser": "Ø®Ù\88Ø´ Ø¦Ù\88Ù\99Ù\85اÛ\8cÛ\8cت،$1!",
+       "welcomecreation-msg": "حئساڤتÙ\88Ù\99 Ø¯Ù\88رÙ\88س Ø¨Û\8cÛ\8cÛ\95.\nد Ú¤Û\8cرئتÙ\88Ù\99 Ù\86أرÙ\88Û\95 Ú©Ø¦ {{Ù\86Ù\88Ù\85 Ø¯Û\8cارگÛ\95}} [[Special:Preferences|preferences]]  Ø®Ù\88تÙ\88Ù\99Ù\86Û\95 Ø¢Ù\84ئشت Ø¨Ø£Ú©Û\8cت.",
        "yourname": "نوم کاریاری:",
        "userlogin-yourname": "نوم کاریاری",
-       "userlogin-yourname-ph": "نوم کاریاری تو نه وارد بكيد",
-       "createacct-another-username-ph": "Ù\86Ù\88Ù\85 Ú©Ø§Ø±Û\8cارÛ\8c ØªÙ\87 Ù\88ارد Ù\83Ù\88",
-       "yourpassword": "رازینه گواردن:",
-       "userlogin-yourpassword": "رازینه گواردن",
-       "userlogin-yourpassword-ph": "رازینه گواردن نه بزه",
-       "createacct-yourpassword-ph": "رازینه گواردن نه بزه",
-       "yourpasswordagain": "دوواره رازینه گواردن نه بزه",
-       "createacct-yourpasswordagain": "رازینه گواردن نه پشت راس كو",
-       "createacct-yourpasswordagain-ph": "دوواره رازینه گواردن نه بزه",
-       "remembermypassword": "اÙ\88Ù\85ائÙ\86 Ù\88ا Ù\85Û\8cÙ\86 Ù\85Ù\86Ù\87 Ø¯ Ø§Û\8c Ø¯Ù\88ارتÙ\87 Ù\86Û\8cئر Ø¯ Ù\88Û\8cر Ø¯Ø§Ø´ØªÙ\88(سÛ\8c Ø¨Û\8cشترÙ\88Ù\86Ù\87$1{{PLURAL:$1|رÙ\88ز|رÙ\88زیا}})",
-       "userlogin-remembermypassword": "منه مین سامونه وادار",
-       "userlogin-signwithsecure": "د وصل بيئن امن وه کار بیئر",
-       "yourdomainname": "پوشگیر شما:",
-       "password-change-forbidden": "Ø´Ù\85ا Ù\86تÙ\88Ù\86Û\8cد Ø±Ø§Ø²Û\8cÙ\86Ù\87 Ú¯Ù\88اردتÙ\88Ù\86 Ø®Ù\88تÙ\88Ù\86Ù\87 Ø¯ Ø§Û\8c Ù\88Û\8cÚ©Û\8c Ø¢Ù\84شت Ø¨Ú©Û\8cد",
-       "externaldberror": "اشتÙ\88اÛ\8cÛ\8c Ø¯ Ø§Ø±ØªÙ\88اط Ù\88ا Ø±Ø³Û\8cÙ\86Ù\87 Ú¯Ø§ Ù¾Û\8cØ´ Ø§Ù\88Ù\85ائÙ\87 Û\8cا Û\8cÙ\86Ù\87 Ú©Ù\87 Ø´Ù\85ا ØµÙ\84ا Ù\88Ù\87 Ù\87Ù\86Ú¯Ù\88Ù\85 Ø³Ø§Ø²Û\8c Ø­Ø³Ø§Ù\88 Ø®Ø§Ø±Ø¬Û\8c ØªÙ\88Ù\86Ù\87 ناریت.",
-       "login": "وا مین اومائن",
-       "nav-login-createaccount": " اومائن د سيستم/راس كردن حساو",
-       "userlogin": " اومائن د سيستم/راس كردن حساو",
-       "userloginnocreate": "وا مین اومائن",
-       "logout": "د Ø³Ø§Ù\85Ù\88Ù\86Ù\87 Ø¯Ø±Ø§Ù\88مائن",
-       "userlogout": "د Ø³Ø§Ù\85Ù\88Ù\86Ù\87 Ø¯Ø±Ø§Ù\88مائن",
-       "notloggedin": "نبوئه بیاییت وامین",
-       "userlogin-noaccount": "یه گل حساو ناریت؟",
-       "userlogin-joinproject": "وصل بوييت {{SITENAME}}",
-       "nologin": "حساو کاریاری ناريت؟$1",
-       "nologinlink": "يه گل حساو راست بكيد",
-       "createaccount": "حساÙ\88 Ø±Ø§Ø³Øª Ø¨Ù\83Ù\8aد",
-       "gotaccount": "اÛ\8cسÙ\86Û\8c Ø­Ø³Ø§Ù\88 Ú©Ø§Ø±Ù\88رÛ\8c Ø¯Ø§Ø±Û\8cتÙ\88؟$1",
-       "gotaccountlink": "وا مین اومائن",
-       "userlogin-resetlink": "جزییات وامین اومائن تونه د ویر بردیته",
-       "userlogin-resetpassword-link": "رازینه گواردن د ویرتو رئته؟",
-       "userlogin-helplink2": "هومیاری وا مین اومائن",
-       "userlogin-loggedin": "Ø´Ù\85ا Ø§Û\8cسÙ\87 Ú\86Û\8c {{GENDER:$1|$1}} Ø§Ù\88Ù\85اÛ\8cتÙ\87 Ù\88ا Ù\85Û\8cÙ\86.\nد Ù\86Ù\88Ù\85 Ø¨Ù\84Ú¯Ù\87 Ù\87ارÛ\8c Ø³Û\8c Ù\88ا Ù\85Û\8cÙ\86 Ø§Ù\88Ù\85ائÙ\86 Ú\86Û\8c Û\8cÙ\87 Ú¯Ù\84 Ú©Ø§Ø±Û\8cار Ù\87Ù\86Û\8c Ù\88Ù\87 Ú©Ø§Ø± Ø¨Û\8cئرتÙ\88.",
-       "userlogin-createanother": "يه گل حساوهنی راست بكيد",
-       "createacct-emailrequired": "تÛ\8cرÙ\86Ø´Ù\88Ù\86 Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87",
-       "createacct-emailoptional": "تÛ\8cرÙ\86Ø´Ù\88Ù\86 Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87",
+       "userlogin-yourname-ph": "نوم کاریاری توٙنە بأزئنیت",
+       "createacct-another-username-ph": "Ù\86Ù\88Ù\85 Ú©Ø§Ø±Û\8cارÛ\8c ØªÙ\88Ù\99Ù\86Û\95 Ø¨Ø£Ø²Ø¦Ù\86Û\8cت",
+       "yourpassword": "رازینە گوڤاردئن:",
+       "userlogin-yourpassword": "رازینە گوڤاردئن",
+       "userlogin-yourpassword-ph": "رازینە گوڤاردئن نە بأزە",
+       "createacct-yourpassword-ph": "رازینە گوڤاردئن نە بأزە",
+       "yourpasswordagain": "یئ گئل هأنی رازینە گوڤاردئن نە بأزە",
+       "createacct-yourpasswordagain": "رازینە گوڤاردئن نە پوشت راس کو",
+       "createacct-yourpasswordagain-ph": "یئ گئل هأنی رازینە گوڤاردئن نە بأزە",
+       "remembermypassword": "ئÙ\88Ù\99Ù\85ائÙ\86 Ú¤Ø§Ù\85Û\8cÙ\86 Ù\85ئÙ\86Û\95 Ø¯ Ø¦Û\8c Ø¯Ù\88ڤارتÛ\95 Ù\86Û\8cأر Ø¯ Ú¤Û\8cر Ø¯Ø§Ø´ØªÙ\88Ù\99 (سÛ\8c Ø¨Û\8cشتئرÙ\88Ù\99Ù\86Û\95 $1{{PLURAL:$1|رÙ\88Ù\99ز|رÙ\88Ù\99زیا}})",
+       "userlogin-remembermypassword": "مئنە د ساموٙنە ڤادار",
+       "userlogin-signwithsecure": "ڤأصل بییئن أمن نە ڤئ کار بئیر",
+       "yourdomainname": "پوشگئر شوما:",
+       "password-change-forbidden": "Ø´Ù\88Ù\85ا Ù\86ئÙ\85Û\8c ØªÙ\88Ù\99Ù\86Û\8cت Ø±Ø§Ø²Û\8cÙ\86Û\95 Ú¯Ù\88ڤاردئÙ\86 Ø®Ù\88تÙ\88Ù\99Ù\86Û\95 Ø¯ Ø¦Û\8c Ú¤Û\8cÚ©Û\8c Ø¢Ù\84ئشت Ø¨Ø£Ú©Û\8cت.",
+       "externaldberror": "ئشتئڤاÛ\8cÛ\8c Ø¯ Ø¦Ø±ØªØ¦Ú¤Ø§Ø· Ú¤Ø§ Ø±Ø¦Ø³Û\8cÙ\86Û\95 Ú¯Ø§ Ù¾Û\8cØ´ Ø¦Ù\88Ù\99Ù\85اÛ\95 Û\8cا Ø´Ù\88Ù\85ا ØµØ¦Ù\84ا Û\8cØ£Ù\86Û\95 Ú©Ø¦ Û\8cئ Ú¯Ø¦Ù\84 Ø­Ø¦Ø³Ø§Ú¤ Ø®Ø§Ø±Ø¬Û\8c Ø®Ù\88تÙ\88Ù\99Ù\86Û\95 Ú¤Ø¦ Ù\87ئÙ\86Ú¯Ù\88Ù\85 Ø³Ø§Ø²Û\8c Ø¨Ø£Ú©Û\8cت ناریت.",
+       "login": "ڤامین ئوٙمائن",
+       "nav-login-createaccount": " ڤامین ئوٙمائن/راس کئردئن حئساڤ",
+       "userlogin": " ڤامین ئوٙمائن/راس کئردئن حئساڤ",
+       "userloginnocreate": "ڤامین ئوٙمائن",
+       "logout": "د Ø³Ø§Ù\85Ù\88Ù\99Ù\86Û\95 Ø¯Ø¦Ø±Ø¦Ù\88Ù\99مائن",
+       "userlogout": "د Ø³Ø§Ù\85Ù\88Ù\99Ù\86Û\95 Ø¯Ø¦Ø±Ø¦Ù\88Ù\99مائن",
+       "notloggedin": "نبوٙە بیاییت ڤامین",
+       "userlogin-noaccount": "یئ گئل حئساڤ ناریت؟",
+       "userlogin-joinproject": "ڤأصل بوٙییت {{SITENAME}}",
+       "nologin": "یئ گئل حئساڤ کاریاری ناريت؟$1",
+       "nologinlink": "یئ گئل حئساڤ راس بأکیت",
+       "createaccount": "حئساڤ Ø±Ø§Ø³ Ø¨Ø£Ú©Û\8cت",
+       "gotaccount": "ئÛ\8cسئÙ\86Û\8c Ø­Ø¦Ø³Ø§Ú¤ Ú©Ø§Ø±Û\8cارÛ\8c Ø¯Ø§Ø±Û\8cت؟$1",
+       "gotaccountlink": "ڤامین ئوٙمائن",
+       "userlogin-resetlink": "جوزییات ڤامین ئوٙمائنئ توٙنە د ڤیر بوردیتە؟",
+       "userlogin-resetpassword-link": "رازینە گوڤاردئنتوٙ د ڤیرئتوٙ رأتە؟",
+       "userlogin-helplink2": "هومیاری کئردئن د طأریق ڤامین ئوٙمائن",
+       "userlogin-loggedin": "Ø´Ù\88Ù\85ا Ø¦Û\8cسئ Ú\86Û\8c Û\8cئ Ú¯Ø¦Ù\84 {{GENDER:$1|$1}} Ø¦Ù\88Ù\99Ù\85اÛ\8cتÛ\95 Ú¤Ø§Ù\85Û\8cÙ\86\86Ù\88Ù\85 Ø¨Ø£Ù\84Ú¯Û\95 Ù\87ارÛ\8c Ù\86Û\95 Ø³Û\8c Ú¤Ø§Ù\85Û\8cÙ\86 Ø¦Ù\88Ù\99Ù\85ائÙ\86 Ú\86Û\8c Û\8cئ Ú¯Ø¦Ù\84 Ú©Ø§Ø±Û\8cار Ù\87Ø£Ù\86Û\8c Ø¨Ù\84Ú¯Ù\87 Ù\87ارÛ\8c Ø³Û\8c Ù\88ا Ù\85Û\8cÙ\86 Ø§Ù\88Ù\85ائÙ\86 Ú\86Û\8c Û\8cÙ\87 Ú¯Ù\84 Ú©Ø§Ø±Û\8cار Ù\87Ù\86Û\8c Ú¤Ø¦ Ú©Ø§Ø± Ø¨Ø¦Û\8cرÛ\8cت.",
+       "userlogin-createanother": "یئ گئل حئساڤ هأنی راس بأکیت",
+       "createacct-emailrequired": "تÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95",
+       "createacct-emailoptional": "تÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95",
        "createacct-email-ph": "تیرنشون انجومانامه تونه وارد بكيت",
-       "createacct-another-email-ph": "يه گل انجومانامه وارد بكيت",
-       "createaccountmail": "د یه گل رازینه گواردن موقتیه بختکی وه کار بیئریت و ونه سی یه گل نشونی انجومانامه ویجه کل بکیت",
-       "createacct-realname": "نوم راستكی(مژبوری نيئ)",
-       "createaccountreason": "دليل",
-       "createacct-reason": "دليل",
-       "createacct-reason-ph": "سÛ\8c Ú\86Û\8c Ø´Ù\85ا Ø¯Ø§Ø±Ù\8aتÙ\88 Ù\8aÙ\87 Ú¯Ù\84 Ø­Ø³Ø§Ù\88 Ù\87Ù\86Û\8c Ø±Ø§Ø³ Ù\85Û\8c Ù\83Ù\8aد",
-       "createacct-captcha": "وارسی امنيت دار بين",
-       "createacct-imgcaptcha-ph": "Ù\86Û\8cسسÙ\87 Ù\86Ù\87 Ù\83Ù\87 Ø¯ Ù\88ارÙ\88 Ù\85Ù\8aئÙ\86Ù\8aت Ù\88ارد Ø¨Ù\83Ù\8aد",
-       "createacct-submit": "حساÙ\88 Ø®Ù\88تÙ\88Ù\86Ù\87 Ø±Ø§Ø³ Ø¨Ù\83Ù\8aد",
-       "createacct-another-submit": "يه گل حساوهنی راست بكيد",
-       "createacct-benefit-heading": "{{نوم مالگه}} وه دس خلکی چی شما راس بیه.",
-       "createacct-benefit-body1": "{{PLURAL:$1|ویرایشت|ویرایشتیا}}",
-       "createacct-benefit-body2": "{{PLURAL:$1|بلگه|بلگه یا}}",
-       "createacct-benefit-body3": "تازه{{PLURAL:$1|هومیار|هومیارا}}",
-       "badretype": "رازینه گواردنی که شما دئیته مطاوقت ناره",
-       "userexists": "کاریارنوم که وارد بیه د ایسه وه کار گرته بوئه.\nلطف بکید یه گل نوم هنی انتخاو بکید",
-       "loginerror": "خطا Ø§Ù\88Ù\85ائÙ\86 Ø¯ Ø³Ù\8aستÙ\85",
-       "createacct-error": "خطا Ø±Ø§Ø³ Ù\83ردÙ\86 Ø­Ø³Ø§Ù\88",
-       "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د.",
+       "createacct-another-email-ph": "تیرنئشوٙن أنجومانامە توٙنە بأزأنیت",
+       "createaccountmail": "یئ گئل رازینە گوڤاردئن موڤأقأتینە ڤئ کار بئیریت و ڤئ نەسی یئ گئل تیرنئشوٙن أنجومانامە تیار بییە کئل بأکیت.",
+       "createacct-realname": "نوم راستأکی(مأژبوٙری نی)",
+       "createaccountreason": "دألیل:",
+       "createacct-reason": "دألیل",
+       "createacct-reason-ph": "سÛ\8c Ú\86Û\8c Ø´Ù\88Ù\85ا Ø¯Ø§Ø±Û\8cت Û\8cئ Ú¯Ø¦Ù\84 Ø­Ø¦Ø³Ø§Ú¤ Ù\87Ø£Ù\86Û\8c Ø±Ø§Ø³ Ù\85Û\8cÚ©Û\8cد",
+       "createacct-captcha": "ڤارئسی أمنیأت دار بییئن",
+       "createacct-imgcaptcha-ph": "Ù\86Û\8cسئسÛ\95 Û\8cÛ\8c Ù\86Û\95 Ú©Ø¦ Ø¯ Ú¤Ø§Ø±Ù\88 Ù\85ئÛ\8cÙ\86Û\8cت Ú¤Ø§Ø±Ø¦Ø¯ Ø¨Ø£Ú©Û\8cت",
+       "createacct-submit": "حئسأڤ Ø®Ù\88تÙ\88Ù\99Ù\86Û\95 Ø±Ø§Ø³ Ø¨Ø£Ú©Û\8cت",
+       "createacct-another-submit": "یئ گئل حئساڤ هأنی راس بأکیت",
+       "createacct-benefit-heading": "{{SITENAME}}  ڤئ دأس خألکی چی شوما رأڤأندیاری بییە.",
+       "createacct-benefit-body1": "{{PLURAL:$1|ڤیرایئشت|ڤیرایئشتیا}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|بألگە|بألگە یا}}",
+       "createacct-benefit-body3": "تازە{{PLURAL:$1|هومیار|هومیارا}}",
+       "badretype": "رازینە گوڤاردئنی کئ شمأ دأییتە هومدأنگی نارە.",
+       "userexists": "نوم کاریاری دە بییە ئیسئنی ڤئ کار گئرئتە بییە.\nلوطف بأکیت یئ گئل نوم هأنی نە ڤئرداریت.",
+       "loginerror": "خأطا Ú¤Ø§Ù\85Û\8cÙ\86 Ø¦Ù\88Ù\99Ù\85ائÙ\86",
+       "createacct-error": "خأطا Ø±Ø§Ø³ Ú©Ø¦Ø±Ø¯Ø¦Ù\86 Ø­Ø¦Ø³Ø§Ú¤",
+       "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ار یه نفر هنی یه حاست داشتوئه،یا ار رازینه گورادن تونه د ویرتو اوما، و ار نحاستیت ونه آلشت بکیت، شما شایت د ای پیغوم تیه پوش بکیت و بحایت د وه کار بسن رازینه گواردن دماترتو دماداری بکیت.",
+       "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": "هیچ تیرنشون انجومانامه ای سی کاریار $1 ضفط نبیه.",
        "noemailcreate": "شما باید یه تیرنشون انجومانامه خو فراهم بکید",
        "passwordsent": "یه گل رازینه گواردن هنی سی تیرنشون انجومانامه ای که \"$1\" واش ثوت نام کرده بی کل بیه.\nخواهش میکیم هنی رویئت وامین و اوسه بئریتش.",
        "login-throttled": "شما ایسنی فره سی وامین اومائن تلاش کردیته.\n$1 لطفن سی تلاش هنی صبر بکید",
        "login-abort-generic": "اومائن وامین تو شکست حرد-شکست حرده",
        "login-migrated-generic": "حساو کاریاری شما جا وه جا بیه، و نوم کاریاری شما دیه د ای ویکی نیئش.",
-       "loginlanguagelabel": "زون:$1",
+       "loginlanguagelabel": "زÙ\88Ù\99Ù\86:$1",
        "suspicious-userlogout": "درحاست وه در رئتن شما انکار بیه سی یه کل وه نظر میا که د یه گل دووارته نیئر گن یا یه گل پروکسی که ها د ویرگه نهو کل بیه",
        "createacct-another-realname-tip": "نوم راستکی دل به حائه.\nار شما وه نه نهااماییه بکیت، یه سی هوم نسبت دئن وه کاریار   سی کاریاش وه کار گرته بوئه.",
-       "pt-login": "وا مین اومائن",
-       "pt-login-button": "وا مین اومائن",
+       "pt-login": "ڤامین ئوٙمائن",
+       "pt-login-button": "ڤامین ئوٙمائن",
        "pt-createaccount": "يه گل حساو راس بكيد",
        "pt-userlogout": "د سامونه دراومائن",
        "php-mail-error-unknown": "خطا نادیار مین آلشت ون PHP's mail()",
        "resetpass_forbidden": "رازینه گواردناتون نتونن آلشت بوئن",
        "resetpass-no-info": "شما با بیایت د سامونه تا د ای بلگه دسرسی داشتویت",
        "resetpass-submit-loggedin": "رازینه گواردن نه آلشت بكيت",
-       "resetpass-submit-cancel": "اÙ\86جÙ\88Ù\85 Ø´Û\8cÙ\88سن",
+       "resetpass-submit-cancel": "Ø£Ù\86جÙ\88Ù\85 Ø´Û\8cڤئستئن",
        "resetpass-wrong-oldpass": "رازینه گواردن تازه یا موقتی نامعتور.\nشات شما ایسنی یا رازینه گواردن خوتونه د خوئی آلشت دئیته یا یه گل رازینه گواردن موقت هنی درحاست دئیته.",
        "resetpass-recycled": "لطفن رازینه گواردن خوتونه سی چیا تر د رازینه گواردن ایسنی د نو زنه بکیت",
        "resetpass-temp-emailed": "شما وا یه گل رازینه موقتی که انجوما گر بیه  اومایته وامین.\nسی تموم کردن اومائن وامین، یه گل رازینه گواردن هنی د ایچه  جاگر بکیت.",
        "passwordreset": "د نۈ وارد كردن رازینه گواردن",
        "passwordreset-text-one": "ای نوم بلگه نه سی گرتن یه گل رازینه گواردن موقتی وا انجومانامه پر بکیت.",
        "passwordreset-text-many": "{{PLURAL:$1|یه گل د رشنه گه یا نه سی یه که رازینه گواردن موقتی وا انجومانامه گرته بوئه پر بکیت}}",
-       "passwordreset-legend": "د نۈ وارد كردن رازینه گواردن",
        "passwordreset-disabled": "نو کرد رازینه گواردن د ای ویکی ناکشتگر بیه.",
        "passwordreset-emaildisabled": "چی یا هنی انجومانامه د ای ویکی ناکشتگر بیه.",
        "passwordreset-username": "نوم کاریاری:",
-       "passwordreset-domain": "پوشگیر",
+       "passwordreset-domain": "پوشگئر",
        "passwordreset-capture": "انجومانامه نتیجه نه بوینیتو؟",
        "passwordreset-capture-help": "ار شما ای جعوه نه وارسی بکید. انجومانامه و خوئی اوسه که سی کاریار کل بیه بوئه بوینیتش.",
-       "passwordreset-email": "تÛ\8cرÙ\86Ø´Ù\88Ù\86 Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87",
+       "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ار کس هنی چنی درحاستی کرده یا یه که شما رازینه گواردن دمایی خوتونه د ویر اوردیت و تر نمیهایت ونه آلشت بیئت، می تونیت د ای پیغوم تیه پوشی بکیت و همو رازینه گواردن دمایی نه وه کار به ونیت.",
        "resettokens": "تازه کردن نشونه یا",
        "resettokens-text": "شما سی صلا دئن دسرسی وه رسینه یا خصوصی که ها د حساو ایچنی تو می تونیت دیارگریا نه د نو زنه بکیت.\n\nشما اوسنی واس ای کار بکیت که رسینه یا شما سی یه کسی تر بئر بیه یا د حساو شما چل بیه.",
        "resettokens-no-tokens": "هیژ نشونه ای سی تازه کردن نئ.",
-       "resettokens-legend": "تازه کردن نشونه یا",
        "resettokens-tokens": "نشونه یا:",
        "resettokens-token-label": "$1 (ارزشت تازه: $2)",
        "resettokens-watchlist-token": "دیارگر سی حردنی تورگه(اتم/آر اس اس) سی [[ویجه:سیل برگ|آلشت دئن بلگه یا د سیل برگتو]]",
index 64439a1..9c6bc6f 100644 (file)
@@ -30,7 +30,8 @@
                        "Vogone",
                        "아라",
                        "Aswanas",
-                       "Pofka"
+                       "Pofka",
+                       "Albertas"
                ]
        },
        "tog-underline": "Pabraukti nuorodas:",
        "badtitletext": "Nurodytas puslapio pavadinimas buvo neleistinas, tuščias arba neteisingai sujungtas tarpkalbinis arba tarpprojektinis pavadinimas. Jame gali būti vienas ar daugiau simbolių, neleistinų pavadinimuose.",
        "title-invalid-empty": "Prašomas puslapio pavadinimas yra tuščias arba jame yra tik tarpo simbolis.",
        "title-invalid-utf8": "Prašomo puslapio pavadinimas turi negalimą UTF-8 seką.",
-       "title-invalid-interwiki": "Pavadinimas turi interwiki nuorodą",
+       "title-invalid-interwiki": "Prašomo puslapio pavadinime yra vidinė viki nuoroda, kuri negali būti naudojama pavadinimuose.",
        "title-invalid-talk-namespace": "Prašomo puslapio pavadinimas nurodo į diskusijų puslapį, kuris negali egzistuoti.",
        "title-invalid-characters": "Prašomo puslapio pavadinimas turi negalimų simbolių: „$1“.",
        "title-invalid-relative": "Pavadinimas turi reliatyvų taką. Reliatyvūs puslapių pavadinimai (./, ../) yra negalimi, nes jie dažnai bus nepasiekiami vartotojo naršykle.",
        "title-invalid-magic-tilde": "Prašomo puslapio pavadinimas turi negalima magiška tildės seką (<nowiki>~~~</nowiki>).",
-       "title-invalid-too-long": "Prašomo puslapio pavadinimas yra per ilgas. Jis turi būti ne ilgesnis nei $1 bitai UTF-8 koduotėje.",
+       "title-invalid-too-long": "Prašomo puslapio pavadinimas yra per ilgas. Jis turi būti ne ilgesnis nei {{PLURAL:$1|baitas|baitai}} UTF-8 koduotėje.",
        "title-invalid-leading-colon": "Prašomo puslapio pavadinimas turi neleistiną dvitaškį pradžioje.",
        "perfcached": "Rodoma išsaugota duomenų kopija, todėl duomenys gali būti ne patys naujausi. Maksimaliai $1 {{PLURAL:$1|rezultatas|rezultatai|rezultatų}} yra saugoma.",
        "perfcachedts": "Rodoma išsaugota duomenų kopija, kuri buvo atnaujinta $2 $3. Maksimaliai $4 {{PLURAL:$4|rezultatas|rezultatai|rezultatų}} yra saugoma.",
        "passwordreset": "Atstatyti slaptažodį",
        "passwordreset-text-one": "Užpildykite šią formą, norėdami atkurti savo slaptažodį.",
        "passwordreset-text-many": "{{PLURAL:$1|Užpildykite vieną iš laukų slaptažodžio atkūrimui.}}",
-       "passwordreset-legend": "Atstatyti slaptažodį",
        "passwordreset-disabled": "Slaptažodžių atstatymai šiame wikyje išjungti.",
        "passwordreset-emaildisabled": "El. pašto funkcijos uždraustos šiame wiki.",
        "passwordreset-username": "Naudotojo vardas:",
        "resettokens": "Atnaujinti žetonus",
        "resettokens-text": "Jūs galite atnaujinti žetonus, kurie suteikia prieigą prie tam tikros privačios informacijos susijusios su jūsų paskyra čia.\n\nJūs turėtumėte tai padaryti jei netyčia jais pasidalinote su kuo nors arba jei jūsų paskyra buvo pavojuje.",
        "resettokens-no-tokens": "Nėra žetonų, kuriuos galima atnaujinti.",
-       "resettokens-legend": "Atnaujinti žetonus",
        "resettokens-tokens": "Žetonai:",
        "resettokens-token-label": "$1 (dabartinė reikšmė: $2)",
        "resettokens-watchlist-token": "Žetonas skirtas interneto pateikčiai (Atom/RSS) [[Special:Watchlist|pakeitimai puslapiuose, kuriuose jūs stebite]]",
        "creating": "Kuriama $1",
        "editingsection": "Taisomas $1 (skyrelis)",
        "editingcomment": "Taisomas $1 (naujas skyrius)",
-       "editconflict": "Išpręskite konfliktą: $1",
+       "editconflict": "Jūsų pakeitimai negali būti įrašyti dėl redagavimo konflikto. Ar norite išspręsti konfliktą rankiniu būdu?",
        "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",
        "yourdiff": "Skirtumai",
        "copyrightwarning": "Primename, kad viskas, kas patenka į {{SITENAME}}, yra laikoma paskelbtu pagal $2 (detaliau - $1). Jei nenorite, kad jūsų indėlis būtų be gailesčio redaguojamas ir platinamas, čia nerašykite.<br />\nJūs taip pat pasižadate, kad tai jūsų pačių rašytas turinys arba kopijuotas iš viešų ar panašių nemokamų šaltinių.\n'''NEKOPIJUOKITE AUTORINĖMIS TEISĖMIS APSAUGOTŲ DARBŲ BE LEIDIMO!'''",
        "copyrightwarning2": "Primename, kad viskas, kas patenka į {{SITENAME}} gali būti redaguojama, perdaroma, ar pašalinama kitų naudotojų. Jei nenorite, kad jūsų indėlis būtų be gailesčio redaguojamas, čia nerašykite.<br />\nTaip pat jūs pasižadate, kad tai jūsų pačių rašytas tekstas arba kopijuotas\niš viešų ar panašių nemokamų šaltinių (detaliau - $1).\n'''NEKOPIJUOKITE AUTORINĖMIS TEISĖMIS APSAUGOTŲ DARBŲ BE LEIDIMO!'''",
+       "editpage-cannot-use-custom-model": "Šio puslapio turinio modelis negali būti pakeistas.",
        "longpageerror": "'''KLAIDA: Tekstas, kurį pateikėte, yra $1 {{PLURAL:$1|kilobaito|kilobaitų|kilobaitų}} ilgio, tai yra didesnis nei yra leistina. Yra leidžiami tiktai $2 {{PLURAL:$2|kilobaitas|kilobaitai|kilobaitų}}.''' Jis nebus išsaugotas.",
        "readonlywarning": "'''Į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:",
        "content-model-css": "CSS",
        "content-json-empty-object": "Tuščias objektas",
        "content-json-empty-array": "Tuščias masyvas",
+       "duplicate-args-warning": "<strong>Pastaba:</strong>[[:$1]] kviečia [[:$2]] su daugiau nei viena $3 parametro reikšme. Bus naudojama tik paskutinė pateiktoji reikšmė.",
        "duplicate-args-category": "Puslapiai, naudojantys pasikartojančias skiltis iššaukiant šablonus",
        "duplicate-args-category-desc": "Puslapiai, turintys šablonų, naudojančių pasikartojančias skiltis, iššaukimus, pavyzdžiui <nowiki>{{foo|bar=1|bar=2}}</nowiki></code> arba <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Įspėjimas: Šiame puslapyje yra per daug užtrunkančių analizatoriaus funkcijų šaukinių.\n\nTai turėtų būti mažiau nei $2 {{PLURAL:$2|šaukinys|šaukiniai|šaukinių}}, tačiau dabar yra $1 {{PLURAL:$1|šaukinys|šaukiniai|šaukinių}}.",
        "badsig": "Neteisingas parašas; patikrinkite HTML žymes.",
        "badsiglength": "Jūsų parašas per ilgas.\nJį turi sudaryti ne daugiau kaip $1 {{PLURAL:$1|simbolis|simboliai|simbolių}}.",
        "yourgender": "Lytis:",
-       "gender-unknown": "Aš nenoriu pasakyti",
+       "gender-unknown": "Jus minėdama programinė įranga naudos kuo neutralesnės giminės žodžius",
        "gender-male": "Vyras",
        "gender-female": "Moteris",
        "prefs-help-gender": "Pasirinktinai: naudojama teisingam sistemos kreipimuisi į jus.\nŠi informacija yra vieša.",
        "userrights-lookup-user": "Tvarkyti naudotojo grupes",
        "userrights-user-editname": "Įveskite naudotojo vardą:",
        "editusergroup": "Redaguoti naudotojo grupes",
-       "editinguser": "Taisomos naudotojo '''[[User:$1|$1]]''' $2\nteisės",
+       "editinguser": "Redaguojamos {{GENDER:$1|naudotojo}} <strong>[[User:$1|$1]]</strong> $2 teisės",
        "userrights-editusergroup": "Redaguoti naudotojų grupes",
        "saveusergroups": "Saugoti naudotojų grupes",
        "userrights-groupsmember": "Narys:",
        "uploaddisabledtext": "Failų įkėlimai yra uždrausti.",
        "php-uploaddisabledtext": "Failų įkėlimai uždrausti PHP nustatymuose.\nPatikrinkite ''file_uploads'' nustatą.",
        "uploadscripted": "Šis failas turi HTML arba programinį kodą, kuris gali būti klaidingai suprastas interneto naršyklės.",
+       "upload-scripted-pi-callback": "Negalima įkelti failo, kuriame yra XML-stilių failo apdorojimo instrukcijos.",
+       "uploaded-script-svg": "Įkeltame SVG faile rastas programuojamas elementas \"$1\".",
+       "uploaded-hostile-svg": "Įkelto SVG failo stiliaus elemente rastas nesaugus CSS.",
+       "uploaded-event-handler-on-svg": "SVG failuose neleidžiamas event-handler atributų nustatymas <code>$1=\"$2\"</code>.",
+       "uploaded-href-attribute-svg": "SVG failuose neleidžiami nuorodos atributai <code>&lt;$1 $2=\"$3\"&gt;</code> su ne lokalia nukreiptimi (pvz. http://, javascript:, ir kt.).",
+       "uploaded-href-unsafe-target-svg": "Įkeltame SVG faile rasta nesaugi nukreiptis <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-animate-svg": "Įkeltame SVG faile rasta \"animate\" žymė, kuri gali keisti nuorodas, panaudodama \"from\" atributą <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-setting-event-handler-svg": "event-handler atributų nustatymas yra draudžiamas, įkeltame SVG faile rasta <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-setting-href-svg": "\"set\" žymės naudojimas \"href\" atributo pridėjimui prie tėvinio elemento yra užblokuotas.",
+       "uploaded-wrong-setting-svg": "\"set\" žymės naudojimas remote/data/script tikslui pridėti prie bet kurio atributo yra užblokuotas. Įkeltame SVG faile rasta <code>&lt;set to=\"$1\"&gt;</code>.",
+       "uploaded-setting-handler-svg": "SVG, kurie nustato \"handler\" atributą naudodami remote/data/script, yra užblokuoti. Įkeltame SVG faile rasta <code>$1=\"$2\"</code>.",
+       "uploaded-remote-url-svg": "Užblokuoti SVG, kurie nustato style atributą naudodami nuotolinį URL. Įkeltame SVG faile rasta <code>$1=\"$2\"</code>.",
+       "uploaded-image-filter-svg": "Įkeltame SVG faile rastas paveikslėlio filtras su URL: <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploadscriptednamespace": "Šis SVG failas turi neteisėtą vietą vardui '$1'",
        "uploadinvalidxml": "XML įkeltoje rinkmenoje negali būti išnagrinėtas.",
        "uploadvirus": "Šiame faile yra virusas! Smulkiau: $1",
        "randomincategory-nopages": "[[:Category:$1|$1]] kategorijoje nėra puslapių.",
        "randomincategory-category": "Kategorija:",
        "randomincategory-legend": "Atsitiktinis puslapis kategorijoje",
+       "randomincategory-submit": "Eiti",
        "randomredirect": "Atsitiktinis peradresavimas",
        "randomredirect-nopages": "Vardų srityje „$1“ nėra jokių peradresavimų.",
        "statistics": "Statistika",
        "nmembers": "$1 {{PLURAL:$1|narys|nariai|narių}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|narys|nariai|narių}}",
        "nrevisions": "$1 {{PLURAL:$1|keitimas|keitimai|keitimų}}",
-       "nviews": "$1 {{PLURAL:$1|parodymas|parodymai|parodymų}}",
        "nimagelinks": "Naudojama $1 {{PLURAL:$1|puslapyje|puslapiuose|puslapių}}",
        "ntransclusions": "naudojama $1 {{PLURAL:$1|puslapyje|puslapiuose|puslapių}}",
        "specialpage-empty": "Šiai ataskaitai nėra rezultatų.",
        "unusedimages": "Nenaudojami failai",
        "wantedcategories": "Geidžiamiausios kategorijos",
        "wantedpages": "Geidžiamiausi puslapiai",
-       "wantedpages-summary": "Sąrašas neegzistuojančių puslapių su daugiausią nuorodų į juos, išskyrus puslapius, kurie turi tik nukreipimus į juos. Jei norite pamatyti sąrašą neegzistuojančių puslapių, su nukreipimais į juos,  žiūrėkite [[{{#special:BrokenRedirects}}]].",
+       "wantedpages-summary": "Sąrašas neegzistuojančių puslapių su daugiausią nuorodų į juos, išskyrus puslapius, kurie turi tik nukreipimus į juos. Jei norite pamatyti sąrašą neegzistuojančių puslapių, su nukreipimais į juos, žiūrėkite [[{{#special:BrokenRedirects}}|neveikiančių nuorodų sąrašą]].",
        "wantedpages-badtitle": "Neleistinas pavadinimas rezultatų rinkinyje: $1",
        "wantedfiles": "Trokštami failai",
        "wantedfiletext-cat": "Sekantys failai yra naudojami, bet neegzistuoja. Čia failai iš išorinių saugyklų gali būti išvardinti, nors jie jose ir egzistuoja. Failai netenkinantys šių sąlygų gali būti <del>perbraukti</del>. Papildomai peržiūrėkite [[:$1|puslapius]], kuriuose yra naudojami čia išvardinti neegzistuojantys failai.",
        "rollback-success": "Atmesti $1 pakeitimai;\ngrąžinta prieš tai buvusi $2 versija.",
        "sessionfailure-title": "Sesijos klaida",
        "sessionfailure": "Atrodo yra problemų su jūsų prisijungimo sesija; šis veiksmas buvo atšauktas kaip atsargumo priemonė prieš sesijos vogimą.\nPrašome paspausti „atgal“ ir perkraukite puslapį iš kurio atėjote, ir pamėginkite vėl.",
+       "changecontentmodel": "Keisti puslapio turinio modelį",
+       "changecontentmodel-legend": "Keisti turinio modelį",
+       "changecontentmodel-title-label": "Puslapio pavadinimas",
+       "changecontentmodel-model-label": "Naujas turinio modelis",
+       "changecontentmodel-reason-label": "Priežastis:",
+       "changecontentmodel-success-title": "Turinio modelis buvo atnaujintas",
+       "changecontentmodel-success-text": "Turinys, kurio tipas [[:$1]], buvo atnaujintas.",
+       "changecontentmodel-cannot-convert": "Turinys [[:$1]] negali būti konvertuotas į $2 tipą.",
+       "changecontentmodel-title-cantexist": "Negalima turėti puslapio $1.",
+       "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-revertlink": "atšaukti",
+       "logentry-contentmodel-change-revert": "atšaukti",
        "protectlogpage": "Rakinimų sąrašas",
        "protectlogtext": "Žemiau yra puslapių užrakinimų bei atrakinimų sąrašas.\nDabar veikiančių puslapių apsaugų sąrašą rasite [[Special:ProtectedPages|apsaugotų puslapių sąraše]].",
        "protectedarticle": "užrakino „[[$1]]“",
        "tooltip-pt-logout": "Atsijungti",
        "tooltip-pt-createaccount": "Skatiname susikurti paskyrą ir prisijungti, tačiau, tai nėra privaloma",
        "tooltip-ca-talk": "Puslapio turinio aptarimas",
-       "tooltip-ca-edit": "Jūs galite redaguoti šį puslapį. Nepamirškite paspausti peržiūros mygtuką prieš išsaugodami.",
+       "tooltip-ca-edit": "Redaguoti šį puslapį",
        "tooltip-ca-addsection": "Pradėti naują aptariamą temą",
        "tooltip-ca-viewsource": "Puslapis yra užrakintas. Galite pažiūrėti turinį.",
        "tooltip-ca-history": "Ankstesnės puslapio versijos",
        "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-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į",
        "pageinfo-subpages-name": "Šio puslapio papuslapiai",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|peradresavimas|peradresavimai}}; $3 {{PLURAL:$3|neperadresavimas|peradresavimai}})",
        "version-libraries": "Įdiegtos bibliotekos",
        "version-libraries-library": "Biblioteka",
        "version-libraries-version": "Versija",
+       "version-libraries-license": "Licenzija",
+       "version-libraries-description": "Aprašymas",
+       "version-libraries-authors": "Autoriai",
        "redirect": "Nukreiptas iš failo, naudotojo arba versijos ID",
        "redirect-legend": "Nukreipti į failą ar puslapį",
        "redirect-summary": "Šis specialus puslapis peradresuoją į failą (nurodant failo pavadinimą), puslapį (nurodant versijos ID ar puslapio ID), arba vartotojo puslapį (nurodant skaitinį vartotojo ID).\nNaudojimas: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
        "log-name-pagelang": "Keisti kalbos žurnalą",
        "log-description-pagelang": "Tai pakeitimų žurnalas puslapio kalbomis.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|pakeitė}} puslapio kalbą $3 iš $4 į $5.",
-       "default-skin-not-found": "Ups! Numatytoji išvaizda jūsų viki, nustatyta <code dir=\"ltr\">$wgDefaultSkin</code> kaip <code>$1</code>, yra negalima.\n\nPanašu, kad jūsų instaliacija turi {{PLURAL:$4|šią išvaizdą|šias išvaizdas}}. Žiūrėkite [https://www.mediawiki.org/wiki/Manual:Skin_configuration Instrukcija: Išvaizdos konfiguracija] dėl informacijos kaip įgalinti {{PLURAL:$4|ją|jas ir pasirinkti numatytuosius}}.\n\n$2\n\n; Jei ką tik instaliavote MediaWiki:\n: Jūs tikriausiai instaliavote iš git arba tiesiai iš kodo naudojant kitą metodą. Tai tikėtina. Pabandykite įdiegti išvaizdas iš [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org išvaizdų katalogo]:\n:* Persisiunčiant  [https://www.mediawiki.org/wiki/Download tvarkyklę], kuri turi kelius išvaizdas ir plėtinius. Jūs galite nukopijuoti ir įklijuoti <code>skins/</code> kataloge.\n:* Persiųsti individualias išvaizdas iš [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Klonuojant vieną iš <code>mediawiki/skins/*</code> saugyklas per git į <code dir=\"ltr\">skins/</code> kataloge jūsų MediaWiki instaliacijoje.\n: Tai neturėtų trukdyti jūsų git saugyklai jei jūs esate MediaWiki kūrėjas.\n\n; Jei jūs ką tik atnaujinote MediaWiki:\n: MediaWiki 1.24 ir naujesnės versijos daugiau automatiškai neįgalina įdiegtas versijas (žiūrėkite [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Instrukcija: Išvaizdų automatinis aptikimas]). Jūs galite įklijuoti {{PLURAL:$5|šią eilutę|šias eilutes}} į <code>LocalSettings.php</code>, kad įgalintumėte {{PLURAL:$5| |visus}} šiuo metu {{PLURAL:$5|įdiegtą išvaizdą|įdiegtas išvaizdas}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Jei jūs ką tik pakeitėte <code>LocalSettings.php</code>:\n: Dar kartą patikrinkite išvaizdą dėl galimų klaidų.",
-       "default-skin-not-found-no-skins": "Ups! Jūsų viki numatytoji išvaizdą, nurodyta <code>$wgDefaultSkin</code> <code>$1</code>, yra negalima.\n\nJūs neturi įdiegtų išvaizdų.\n\n; Jei ką tik instaliavote MediaWiki:\n: Jūs tikriausiai instaliavote iš git arba tiesiai iš kodo naudojant kitą metodą. Tai tikėtina. Pabandykite įdiegti išvaizdas iš [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org išvaizdų katalogo]:\n:* Persisiunčiant  [https://www.mediawiki.org/wiki/Download tvarkyklę], kuri turi kelius išvaizdas ir plėtinius. Jūs galite nukopijuoti ir įklijuoti <code>skins/</code> kataloge.\n:* Persiųsti individualias išvaizdas iš [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Klonuojant vieną iš <code>mediawiki/skins/*</code> saugyklas per git į <code dir=\"ltr\">skins/</code> kataloge jūsų MediaWiki instaliacijoje.\n: Tai neturėtų trukdyti jūsų git saugyklai jei jūs esate MediaWiki kūrėjas. Žiūrėkite [https://www.mediawiki.org/wiki/Manual:Skin_configuration Instrukcija: Išvaizdos konfigūracija] dėl informacijos kaip įgalinti išvaizdas ir pasirinkti numatytuosius.",
+       "default-skin-not-found": "Ups! Jūsų viki numatytoji išvaizda, nustatyta <code dir=\"ltr\">$wgDefaultSkin</code> kaip <code>$1</code>, yra negalima.\n\nPanašu, kad Jūsų instaliacija turi {{PLURAL:$4|šią išvaizdą|šias išvaizdas}}. Žiūrėkite [https://www.mediawiki.org/wiki/Manual:Skin_configuration Instrukcija: Išvaizdos konfigūracija] dėl informacijos kaip įgalinti {{PLURAL:$4|ją|jas ir pasirinkti numatytąją}}.\n\n$2\n\n; Jei ką tik įsidiegėte MediaWiki:\n: Jūs tikriausiai įsidiegėte iš git arba tiesiai iš kodo naudodami kitą metodą. To ir buvo tikimasi. Pabandykite įdiegti išvaizdų iš [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org išvaizdų katalogo]:\n:* Atsisiųsti [https://www.mediawiki.org/wiki/Download tvarkyklę], kuri turi keletą išvaizdų ir plėtinių. Jūs galėsite nukopijuoti ir įklijuoti <code>skins/</code> katalogą iš jo.\n:* Atsisiųsti individualias išvaizdas iš [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Naudoti Git išvaizdoms atsisiųsti].\n: Tai neturėtų trukdyti jūsų git saugyklai jei Jūs esate MediaWiki kūrėjas.\n\n; Jei Jūs ką tik atnaujinote MediaWiki:\n: MediaWiki 1.24 ir naujesnės versijos daugiau automatiškai nebeįgalina įdiegtų išvaizdų (žiūrėkite [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Instrukcija: Išvaizdų automatinis aptikimas]). Jūs galite įklijuoti {{PLURAL:$5|šią eilutę|šias eilutes}} į <code>LocalSettings.php</code>, kad įgalintumėte {{PLURAL:$5||visus}} šiuo metu {{PLURAL:$5|įdiegtą išvaizdą|įdiegtas išvaizdas}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Jei Jūs ką tik pakeitėte <code>LocalSettings.php</code>:\n: Dar kartą patikrinkite išvaizdos pavadinimą ar nepadarėte spausdinimo klaidos.",
+       "default-skin-not-found-no-skins": "Ups! Jūsų viki numatytoji išvaizdą, nurodyta <code>$wgDefaultSkin</code> <code>$1</code>, yra negalima.\n\nJūs neturite įdiegtų išvaizdų.\n\n; Jei ką tik įsidiegėte MediaWiki:\n: Jūs tikriausiai įsidiegėte iš git arba tiesiai iš kodo naudodami kitą metodą. To buvo tikimasi. Pabandykite įsidiegti išvaizdų iš [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org išvaizdų katalogo] taip:\n:* Parsisiųsdami  [https://www.mediawiki.org/wiki/Download tvarkyklę], kuri turi kelias išvaizdas ir plėtinius. Jūs galite nukopijuoti ir įklijuoti <code>skins/</code> katalogą iš jos.\n:* Persiųsdami individualias išvaizdas iš [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Naudodami Git išvaizdų parsisiuntimui].\n: Tai neturėtų trukdyti Jūsų git saugyklai jei Jūs esate MediaWiki kūrėjas. Žiūrėkite [https://www.mediawiki.org/wiki/Manual:Skin_configuration Instrukcija: Išvaizdos konfigūracija] dėl informacijos kaip įgalinti išvaizdas ir pasirinkti numatytąją.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (įgalinta)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''išjungtas''')",
        "mediastatistics": "Medios statistika",
        "special-characters-group-khmer": "Khmerų",
        "special-characters-title-endash": "en brūkšnys",
        "special-characters-title-emdash": "em brūkšnys",
-       "special-characters-title-minus": "minuso ženklas"
+       "special-characters-title-minus": "minuso ženklas",
+       "mw-widgets-titleinput-description-new-page": "puslapis dar neegzistuoja",
+       "mw-widgets-titleinput-description-redirect": "nukreipti į $1"
 }
index 7a0c7ae..bd21c65 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": "سه‌شمه",
+       "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-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_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",
+       "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": "رتن زھ سیستم",
        "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تخاب Ø¨Ø±Ø¹کس بوھ",
+       "namespace": "هۉمدیرأنگل:",
+       "invert": "ئÛ\8cÙ\86تخاب Ø¨Ø£Ø±Ø¹Ø£کس بوھ",
        "tooltip-invert": "انتخاب کۉ ای جعبنه سی قائم کردن تغییرل بلگلی که همدرنگلشۉ انتخاب ۉابین(ۉ همدرنگل مرتبط ار انتخاب ۉابین)",
        "namespace_association": "همدرنگل مرتبط",
        "tooltip-namespace_association": "انتخاب کو ای جعبنه سیکه گپ یا مۉضۉع همدرنگ مرتبط ۉا همدرنگل انتخاب ۉابینه قرار بنی.",
-       "blanknamespace": "(اصلی)",
+       "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 f0b3079..09d4ecd 100644 (file)
        "resetpass-abort-generic": "Paroles nomaiņu pārtrauca paplašinājums.",
        "passwordreset": "Paroles atiestatīšana",
        "passwordreset-text-one": "Aizpildiet šo veidlapu, lai atiestatītu savu paroli.",
-       "passwordreset-legend": "Atiestatīt paroli",
        "passwordreset-disabled": "Paroles atiestates šajā viki ir atspējotas.",
        "passwordreset-emaildisabled": "Šajā viki ir atspējotas e-pasta iespējas.",
        "passwordreset-username": "Lietotājvārds:",
index b2f59bc..5629515 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": "Шифра за каналот (Атом/RSS) на [[Special:Watchlist|измени во набљудуваните страници]]",
        "creating": "Создавање на $1",
        "editingsection": "Уредување на $1 (пасус)",
        "editingcomment": "Уредување на $1 (ново заглавие)",
-       "editconflict": "СпÑ\80оÑ\82иÑ\81Ñ\82авени Ñ\83Ñ\80едÑ\83ваÑ\9aа: $1",
+       "editconflict": "СпÑ\80оÑ\82иÑ\81Ñ\82авеноÑ\81Ñ\82 Ð²Ð¾ Ñ\83Ñ\80едÑ\83ваÑ\9aеÑ\82о: $1",
        "explainconflict": "Некој друг ја променил страницата откако почнавте да ја уредувате.\nГорниот дел за текст ја содржи страницата како што сега постои.\nВашите промени се прикажани во долниот дел.\nЌе морате да ги внесете вашите промени со постоечкиот текст.\n'''Само''' текстот во горниот дел ќе биде зачуван кога ќе притиснете на „{{int:savearticle}}“.",
        "yourtext": "Вашиот текст",
        "storedversion": "Зачувана преработка",
        "randomincategory-nopages": "Нема страници во [[:Category:$1]].",
        "randomincategory-category": "Категорија:",
        "randomincategory-legend": "Случајна страница во категорија",
+       "randomincategory-submit": "Оди",
        "randomredirect": "Случајно пренасочување",
        "randomredirect-nopages": "Нема пренасочувања во именскиот простор „$1“.",
        "statistics": "Статистики",
        "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]]“",
        "tooltip-pt-logout": "Одјавување",
        "tooltip-pt-createaccount": "Ви препорачуваме да направите сметка и да се најавите, иако тоа не е задолжително",
        "tooltip-ca-talk": "Разговор за страницата",
-       "tooltip-ca-edit": "Ð\9cожеÑ\82е Ð´Ð° Ñ\98а Ñ\83Ñ\80едиÑ\82е Ð¾Ð²Ð°Ð° Ñ\81Ñ\82Ñ\80аниÑ\86а. Ð\92е Ð¼Ð¾Ð»Ð¸Ð¼Ðµ ÐºÐ¾Ñ\80иÑ\81Ñ\82еÑ\82е Ð³Ð¾ ÐºÐ¾Ð¿Ñ\87еÑ\82о Ð·Ð° Ð¿Ñ\80еглед Ð¿Ñ\80ед Ð·Ð°Ñ\87Ñ\83вÑ\83ваÑ\9aе.",
+       "tooltip-ca-edit": "УÑ\80едеÑ\82е Ñ\98а Ñ\81Ñ\82Ñ\80аниÑ\86ава",
        "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-redirects-value": "$1",
        "pageinfo-subpages-name": "Потстраници на страницата",
        "deletedwhileediting": "'''Предупредување''': Оваа страница беше избришана откако почнавте со нејзино уредување!",
        "confirmrecreate": "Корисникот [[User:$1|$1]] ([[User talk:$1|разговор]]) ја избриша оваа страница откако вие почнавте со уредување заради:\n: ''$2''\nПотврдете дека навистина сакате повторно да ја создадете оваа страница.",
        "confirmrecreate-noreason": "Корисникот [[User:$1|$1]] ([[User talk:$1|разговор]]) ја избриша страницава откако почнавте да ја уредувате.  Потврдете деак навистина сакате да ја пресоздадете страницата.",
-       "recreate": "Повторно создај",
+       "recreate": "Пресоздај",
        "unit-pixel": "п",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Да го исчистам меѓускладот на страницава?",
        "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/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]] или [[{{#Special:Redirect}}/user/101]].",
index c21c33e..610119b 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|താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകളിലുണ്ടാകുന്ന മാറ്റങ്ങളുടെ]] വെബ് ഫീഡ് (ആറ്റം/ആർ.എസ്.എസ്.) ചീട്ട്",
        "creating": "$1 സൃഷ്ടിക്കുന്നു",
        "editingsection": "തിരുത്തുന്ന താൾ:- $1 (ഉപവിഭാഗം)",
        "editingcomment": "തിരുത്തുന്ന താൾ:- $1 (പുതിയ ഉപവിഭാഗം)",
-       "editconflict": "തിരàµ\81à´¤àµ\8dà´¤àµ\8d à´¸à´®à´°à´¸à´ªàµ\8dà´ªàµ\86à´\9fായàµ\8dà´\95: $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?",
        "explainconflict": "താങ്കൾ തിരുത്താൻ തുടങ്ങിയതിനു ശേഷം ഈ താൾ മറ്റാരോ തിരുത്തി സേവ് ചെയ്തിരിക്കുന്നു.\nമുകളിലുള്ള ടെക്സ്റ്റ് ഏരിയയിൽ നിലവിലുള്ള ഉള്ളടക്കം കാണിക്കുന്നു.\nതാങ്കൾ ഉള്ളടക്കത്തിൽ വരുത്തിയ മാറ്റങ്ങൾ താഴെയുള്ള ടെക്സ്റ്റ് ഏരിയയിൽ കാണിക്കുന്നു.\nതാങ്കളുടെ മാറ്റങ്ങൾ മുകളിലെ ടെക്സ്റ്റ് ഏരിയയിലേക്ക് സം‌യോജിപ്പിക്കുക.\nതാങ്കൾ '''സേവ് ചെയ്യുക''' എന്ന ബട്ടൺ അമർത്തുമ്പോൾ '''മുകളിലെ ടെക്സ്റ്റ് ഏരിയയിലുള്ള എഴുത്തുകൾ മാത്രമേ''' സേവ് ആവുകയുള്ളൂ.",
        "yourtext": "താങ്കൾ എഴുതി ചേർത്തത്",
        "storedversion": "മുമ്പേയുള്ള നാൾപതിപ്പ്",
        "uploadscripted": "ഈ പ്രമാണത്തിൽ വെബ് ബ്രൗസർ തെറ്റായി വ്യാഖ്യാനിച്ചേക്കാവുന്ന എച്ച്.റ്റി.എം.എൽ. അല്ലെങ്കിൽ സ്ക്രിപ്റ്റ് കോഡ് ഉണ്ട്.",
        "uploaded-script-svg": "അപ്‌ലോഡ് ചെയ്ത എസ്.വി.ജി. പ്രമാണത്തിൽ സ്ക്രിപ്റ്റ് ചെയ്യാവുന്ന ഭാഗമായ \"$1\" കണ്ടെത്തി.",
        "uploaded-hostile-svg": "അപ്‌ലോഡ് ചെയ്ത എസ്.വി.ജി. പ്രമാണത്തിൽ സുരക്ഷിതമല്ലാത്ത സി.എസ്.എസ്. സ്റ്റൈൽ ഭാഗം കണ്ടെത്താനായി.",
+       "uploaded-image-filter-svg": "യു.ആർ.എൽ. ഉൾപ്പെടെയുള്ള ചിത്ര അരിപ്പ : <code>&lt;$1 $2=\"$3\"&gt;</code>, അപ്‌ലോഡ് ചെയ്ത എസ്.വി.ജി. ചിത്രത്തിൽ കണ്ടെത്തി.",
        "uploadscriptednamespace": "ഈ എസ്.വി.ജി. പ്രമാണത്തിൽ ഉപയോഗിക്കാൻ പാടില്ലാത്ത നാമമേഖലയായ \"$1\" ഉണ്ട്",
        "uploadinvalidxml": "അപ്‌ലോഡ് ചെയ്ത പ്രമാണത്തിലെ എക്സ്.എം.എൽ. പാഴ്സ് ചെയ്യാൻ കഴിയില്ല.",
        "uploadvirus": "പ്രമാണത്തിൽ വൈറസുണ്ട്! വിശദാംശങ്ങൾ: $1",
        "randomincategory-nopages": "[[:Category:$1|വർഗ്ഗം:$1]] എന്നതിൽ താളുകളൊന്നുമില്ല.",
        "randomincategory-category": "വർഗ്ഗം:",
        "randomincategory-legend": "വർഗ്ഗത്തിൽ നിന്ന് ക്രമരഹിതമായി എടുക്കുന്ന താൾ",
+       "randomincategory-submit": "പോകൂ",
        "randomredirect": "ക്രമരഹിതമായ തിരിച്ചുവിടൽ",
        "randomredirect-nopages": "\"$1\" എന്ന നാമമേഖലയിൽ തിരിച്ചുവിടൽ താളുകളൊന്നുമില്ല.",
        "statistics": "സ്ഥിതിവിവരക്കണക്കുകൾ",
        "wlheader-enotif": "ഇമെയിൽ അറിയിപ്പുകൾ സജ്ജമാക്കിയിരിക്കുന്നു.",
        "wlheader-showupdated": "താങ്കളുടെ അവസാന സന്ദർശനത്തിനു ശേഷം മാറ്റം വന്ന താളുകൾ  '''കടുപ്പിച്ച്''' കാണിച്ചിരിക്കുന്നു",
        "wlnote": "$3, $4-നു കഴിഞ്ഞ {{PLURAL:$2|മണിക്കൂറിൽ|<strong>$2</strong> മണിക്കൂറിൽ}} നടന്ന {{PLURAL:$1|ഒരു പുതിയ മാറ്റം|<strong>$1</strong> പുതിയ മാറ്റങ്ങൾ}} താഴെ പ്രദർശിപ്പിച്ചിരിക്കുന്നു.",
-       "wlshowlast": "ഒടുവിലത്തെ $1 മണിക്കൂറുകൾ $2 ദിനങ്ങൾ പ്രദർശിപ്പിക്കുക",
+       "wlshowlast": "ഒടുവിലത്തെ $1 മണിക്കൂറുകൾ $2 ദിനങ്ങൾ പ്രദർശിപ്പിക്കുക",
        "watchlist-options": "ശ്രദ്ധിക്കുന്ന താളുകളുടെ സജ്ജീകരണങ്ങൾ",
        "watching": "ശ്രദ്ധിക്കുന്നു...",
        "unwatching": "അവഗണിക്കുന്നു...",
        "rollback-success": "$1 ചെയ്ത തിരുത്ത് തിരസ്ക്കരിച്ചിരിക്കുന്നു; $2 ചെയ്ത തൊട്ടു മുൻപത്തെ പതിപ്പിലേക്ക് സേവ് ചെയ്യുന്നു.",
        "sessionfailure-title": "സെഷൻ പരാജയപ്പെട്ടിരിക്കുന്നു",
        "sessionfailure": "താങ്കളുടെ ലോഗിൻ സെഷനിൽ പ്രശ്നങ്ങളുള്ളതായി കാണുന്നു;\nസെഷൻ തട്ടിയെടുക്കൽ ഒഴിവാക്കാനുള്ള മുൻകരുതലായി ഈ പ്രവൃത്തി റദ്ദാക്കിയിരിക്കുന്നു.\nദയവായി പിന്നോട്ട് പോയി താങ്കൾ വന്ന താളിൽ ചെന്ന്, വീണ്ടും ശ്രമിക്കുക.",
+       "changecontentmodel-title-label": "താളിന്റെ തലക്കെട്ട്",
+       "changecontentmodel-model-label": "പുതിയ ഉള്ളടക്ക രീതി",
+       "changecontentmodel-reason-label": "കാരണം:",
+       "changecontentmodel-success-title": "ഉള്ളടക്കരീതി മാറിയിരിക്കുന്നു",
+       "changecontentmodel-success-text": "[[:$1]] എന്നതിന്റെ ഉള്ളടക്കരീതി മാറിയിട്ടുണ്ട്.",
+       "logentry-contentmodel-change-revertlink": "പൂർവ്വസ്ഥിതിയിലാക്കുക",
+       "logentry-contentmodel-change-revert": "പൂർവ്വസ്ഥിതിയിലാക്കുക",
        "protectlogpage": "സംരക്ഷണ പ്രവർത്തനരേഖ",
        "protectlogtext": "താഴെ താളുകൾ സംരക്ഷിച്ചതിന്റേയും സംരക്ഷണം നീക്കിയതിന്റേയും പട്ടിക നൽകിയിരിക്കുന്നു.\nനിലവിലുള്ള [[Special:ProtectedPages|സംരക്ഷിത താളുകളുടെ പട്ടിക]] കാണുക.",
        "protectedarticle": "\"[[$1]]\" സം‌രക്ഷിച്ചിരിക്കുന്നു",
        "sp-contributions-search": "ചെയ്ത സേവനങ്ങൾ",
        "sp-contributions-username": "ഐ.പി. വിലാസം അഥവാ ഉപയോക്തൃനാമം:",
        "sp-contributions-toponly": "ഒടുവിലത്തെ നാൾപ്പതിപ്പുകൾ മാത്രം പ്രദർശിപ്പിക്കുക",
-       "sp-contributions-newonly": "താൾ à´¸àµ\83à´·àµ\8dà´\9fà´¿à´\95àµ\8dà´\95ാനàµ\81à´³àµ\8dà´³ തിരുത്തുകൾ മാത്രം പ്രദർശിപ്പിക്കുക",
+       "sp-contributions-newonly": "താളàµ\81à´\95ൾ à´¸àµ\83à´·àµ\8dà´\9fà´¿à´\9aàµ\8dà´\9a തിരുത്തുകൾ മാത്രം പ്രദർശിപ്പിക്കുക",
        "sp-contributions-submit": "തിരയൂ",
        "whatlinkshere": "ഈ താളിലേക്കുള്ള കണ്ണികൾ",
        "whatlinkshere-title": "\"$1\" എന്ന താളിലേക്കുള്ള കണ്ണികൾ",
        "tooltip-pt-logout": "ലോഗൗട്ട് ചെയ്യാനുള്ള കണ്ണി",
        "tooltip-pt-createaccount": "നിർബന്ധമില്ലെങ്കിലും, താങ്കൾ ഒരു അംഗത്വമെടുക്കണമെന്നും പ്രവേശിക്കണമെന്നും താത്പര്യപ്പെടുന്നു",
        "tooltip-ca-talk": "വിവരദായക താളിനെക്കുറിച്ചുള്ള ചർച്ച",
-       "tooltip-ca-edit": "താà´\99àµ\8dà´\95ൾà´\95àµ\8dà´\95àµ\8d à´\88 à´¤à´¾àµ¾ à´¤à´¿à´°àµ\81à´¤àµ\8dതാവàµ\81à´¨àµ\8dനതാണàµ\8d. à´¤à´¿à´°àµ\81à´¤àµ\8dതിയ à´¤à´¾àµ¾ à´¸àµ\87à´µàµ\8d à´\9aàµ\86à´¯àµ\8dà´¯àµ\82à´¨àµ\8dനതിനàµ\81 à´®àµ\81ൻപàµ\8d à´ªàµ\8dà´°à´¿à´µàµ\8dà´¯àµ\82 à´\95ാണàµ\81à´\95.",
+       "tooltip-ca-edit": "à´\88 à´¤à´¾àµ¾ à´¤à´¿à´°àµ\81à´¤àµ\8dà´¤àµ\81à´\95",
        "tooltip-ca-addsection": "പുതിയ വിഭാഗം തുടങ്ങുക",
        "tooltip-ca-viewsource": "ഈ താൾ സം‌രക്ഷിക്കപ്പെട്ടിരിക്കുന്നു. താങ്കൾക്ക് ഈ താളിന്റെ മൂലരൂപം കാണാവുന്നതാണ്‌.",
        "tooltip-ca-history": "ഈ താളിന്റെ പഴയ പതിപ്പുകൾ.",
        "pageinfo-robot-index": "അനുവദിച്ചിരിക്കുന്നു",
        "pageinfo-robot-noindex": "അനുവദിച്ചിട്ടില്ല",
        "pageinfo-watchers": "താൾ ശ്രദ്ധിക്കുന്നവരുടെ എണ്ണം",
+       "pageinfo-visiting-watchers": "സമീപകാല തിരുത്തുകൾ എടുത്തുനോക്കുന്ന, താൾ ശ്രദ്ധിക്കുന്നവരുടെ എണ്ണം",
        "pageinfo-few-watchers": "{{PLURAL:$1|ശ്രദ്ധിക്കുന്നയാളുടെ|ശ്രദ്ധിക്കുന്നവരുടെ}} എണ്ണം $1 എണ്ണത്തിലും കുറവാണ്",
+       "pageinfo-few-visiting-watchers": "സമീപകാല തിരുത്തുകൾ എടുത്തുനോക്കുന്ന, താൾ ശ്രദ്ധിക്കുന്നവർ ഉണ്ടാകാനും ഉണ്ടാകാതിരിക്കാനുമിടയുണ്ട്",
        "pageinfo-redirects-name": "ഈ താളിലേക്കുള്ള തിരിച്ചുവിടലുകളുടെ എണ്ണം",
        "pageinfo-subpages-name": "ഈ താളിന്റെ ഉപതാളുകൾ",
        "pageinfo-subpages-value": "$1 ({{PLURAL:$2|ഒരു തിരിച്ചുവിടൽ|$2 തിരിച്ചുവിടലുകൾ}}; {{PLURAL:$3|തിരിച്ചുവിടലല്ലാത്ത ഒരെണ്ണം|തിരിച്ചുവിടലല്ലാത്ത $3}})",
        "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/Example.jpg]], [[{{#Special:Redirect}}/page/64308]],  [[{{#Special:Redirect}}/revision/328429]], അല്ലെങ്കിൽ [[{{#Special:Redirect}}/user/101]].",
        "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 e028891..0572e0d 100644 (file)
@@ -47,7 +47,8 @@
                        "Darshan kandolkar",
                        "Steinsplitter",
                        "Macofe",
-                       "Nemo bis"
+                       "Nemo bis",
+                       "Suyog"
                ]
        },
        "tog-underline": "दुव्यांचे अधोरेखन:",
        "hidetoc": "लपवा",
        "collapsible-collapse": "निपात करा",
        "collapsible-expand": "विस्तार",
+       "confirmable-yes": "होय",
+       "confirmable-no": "नाही",
        "thisisdeleted": "$1चे अवलोकन किंवा पुनर्स्थापन करायचे ?",
        "viewdeleted": " $1चे अवलोकन करायचे?",
        "restorelink": "{{PLURAL:$1|एक वगळलेले संपादन|$1 वगळलेली संपादने}}",
        "passwordreset": "परवलीचा शब्द पूर्ववत करा",
        "passwordreset-text-one": "आपला परवलीचा शब्द बदलण्यास हे आवेदन भरा.",
        "passwordreset-text-many": "{{PLURAL:$1|आपला तात्पुरता परवलीचा शब्द विपत्रामार्फत प्राप्त करण्यास खालील क्षेत्रातील एखादे भरा.}}",
-       "passwordreset-legend": "परवलीचा शब्द पूर्ववत करा",
        "passwordreset-disabled": "या विकिवर परवलीचा शब्द पुनर्स्थापित करता येत नाही.",
        "passwordreset-emaildisabled": "या विकिवर विपत्र पाठविणे 'अशक्य' करण्यात आलेले आहे.",
        "passwordreset-username": "सदस्यनाव:",
        "resettokens": "ओळखचिन्ह(टोकन) पुनर्स्थापित करा",
        "resettokens-text": "येथे आपल्या खात्यात असलेला व्यक्तिगत मजकूरापर्यंत पोचण्यासाठी आपण ओळखचिन्ह(टोकन) पुनर्स्थापित करू शकता.\nआपण जर तो अपघाताने कोणासमवेत सहभागीला असेल किंवा आपले खात्याची आपण तडजोड केली असल्यास, हे करावयास हवे.",
        "resettokens-no-tokens": "पुनर्स्थापित करण्यासाठी कोणतीही ओळखचिन्हे नाहीत.",
-       "resettokens-legend": "ओळखचिन्ह(टोकन) पुनर्स्थापित करा",
        "resettokens-tokens": "ओळखचिन्हे:",
        "resettokens-token-label": "$1 (सद्य मुल्य: $2)",
        "resettokens-watchlist-token": "[[Special:Watchlist|आपल्या निरीक्षणसूचीतील पानांमधील बदलाचा]] वेब रसद बिल्ला (ॲटम/आरएसएस)",
        "randomincategory": "वर्गातील अनियत पान",
        "randomincategory-invalidcategory": "\"$1\" हे अधिकृत वर्गाचे नाव नाही.",
        "randomincategory-nopages": "[[:Category:$1]] यात काहीच पाने नाहीत.",
+       "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": "या अहवालाकरिता(रिपोर्ट)कोणताही निकाल नाही.",
index d208e07..e401bd9 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.",
        "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 19e6916..e625bfc 100644 (file)
        "cancel": "ول هاکردن",
        "moredotdotdot": "ویـشـتـه...",
        "mypage": "مه صفحه",
-       "mytalk": "مه گپ",
+       "mytalk": "گپ",
        "anontalk": "گپ بزوئن اینتا آی‌پی وسّه",
        "navigation": "بگردستن",
        "and": "&#32;و",
        "actions": "عملکاردون",
        "namespaces": "ایسم فضائون",
        "variants": "گویش‌ئون",
+       "navigation-heading": "ناوبری منو",
        "errorpagetitle": "خطا!",
        "returnto": "بردگستن تا $1",
        "tagline": "{{SITENAME}} جه",
        "permalink": "بموندستنی لینک",
        "print": "پرینت",
        "view": "نمایش",
+       "view-foreign": "هارشی‌ین $1 دله",
        "edit": "دچی‌ین",
        "create": "بساتن",
+       "create-local": "مَله‌یی توضیحات ره بی‌یشتن",
        "editthispage": "این صفحه ره دچی‌ین",
        "create-this-page": "این صفحه ره شِما بساجین",
        "delete": "پاک هاکردن",
        "articlepage": "نمایش صفحه",
        "talk": "گپ",
        "views": "هارشی‌ئون",
-       "toolbox": "اَبزارِ جا",
+       "toolbox": "ابزارون",
        "userpage": "کارور صفحه ره سِراق هدائن",
        "projectpage": "بدی‌ین پروژه‌ی ِصفحه",
        "imagepage": "بدی‌ین ِعکس ِصفحه",
        "otherlanguages": "بقیه زوون‌ئون",
        "redirectedfrom": "($1 جه بموئه)",
        "redirectpagesub": "گجگی‌بَیتـِن",
+       "redirectto": "دکشی‌بیّه به:",
        "lastmodifiedat": "این صفحه ره آخرین بار این گادر دچینه:\n$2، $1",
        "viewcount": "این صفحه {{PLURAL:$1|ات|$1}} بار بدی‌یه بیّه",
        "protectedpage": "صفحه محافظت‌بَیی",
        "viewyourtext": "بتونّی '''شه بنویشته چیون''' مبدأ ره این صفحه دله هارشین و کپی هاکنین:",
        "protectedinterface": "این صفحه ارائه‌دهندهٔ متنی واسط کارور این نرم‌افزار هسته و به منظور پیشگیری از خرابکاری زلفین بزه‌بیّه.",
        "yourname": "شمه کاروری‌نوم:",
+       "userlogin-yourname": "کاروری نوم",
+       "userlogin-yourname-ph": "شه کاروری نوم ره بنویسین",
        "yourpassword": "شمه پسورد",
+       "userlogin-yourpassword": "رمز",
+       "userlogin-yourpassword-ph": "اتا پسورد باوّین",
+       "createacct-yourpassword-ph": "اتا پسورد باوّین",
        "yourpasswordagain": "پسورد ره دِباره بنویس",
+       "createacct-yourpasswordagain": "پسورد ره دِباره باوّین",
+       "createacct-yourpasswordagain-ph": "پسورد ره دِباره باوّین",
        "remembermypassword": "مه رمز ره (تا حداکثر $1 {{PLURAL:$1|روز|روز}}) این مرورگر سر یاد نکان",
+       "userlogin-remembermypassword": "مه ره سایت دله دار",
        "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": "دله نشی‌یه",
        "mailmypassword": "اتا نو پسورد بساز و برسِن",
        "accountcreated": "کاروری نوم دِرِس بیّه",
        "accountcreatedtext": "کاروری نوم، $1 بساته بیّه.",
+       "loginlanguagelabel": "زوون: $1",
+       "pt-login": "دله بموئن",
+       "pt-login-button": "دله بموئن",
+       "pt-createaccount": "عضو بواشین",
+       "pt-userlogout": "دربوردن",
        "newpassword": "نو پسورد:",
+       "passwordreset": "پسورد ِتغییر",
        "passwordreset-username": "کاروری نوم:",
        "passwordreset-domain": "دامنه:",
        "passwordreset-capture": "گت ایمیل سِراق هدائه بَواشه؟",
        "preview": "پیش‌پیش سِراق هدائن",
        "showpreview": "پیش‌پیش سِراق هدائن",
        "showdiff": "تغییرات ِسراق هدائن",
-       "anoneditwarning": "'''هشدار:''' شِما هنتا عضو نَیینی.\nشمه آی‌پی آدرِس تاریخچه دله موندنه.",
+       "anoneditwarning": "<strong>هشدار:</strong> شما هَنتا لاگین نَیی. اگه اتا تغییر انجام هادی، بقیه تونّه ته آی‌پی ره هارشِن. اگه <strong>[$1 لاگین بَواشی (دله بئی)]</strong> یا <strong>[$2 اتا کاروری حیساب بسازی]</strong>، شمه دَچی‌‎یه‌ئون شمه نوم جه ثبت وانه و اتسری مزایا شمه وسّه دانّه.",
        "anonpreviewwarning": "''شما هنتا عضو نَیینی، اگه اتچی بنویسین، شمه آی‌پی ِلینگِ‌رج اینجه موندنه.''",
        "missingcommenttext": "ات‌چی اینجه بنویسین که شمه توضیح بوو",
        "summary-preview": "خلاصه‌ی پیش‌پیش سِراق هدائن:",
        "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": "شمه بنویشته",
        "copyrightwarning": "خـاهش بونه شمه یاد دواشه که همه چیزایی که {{SITENAME}} دله وانه، تحت $2 حیساب وونه. (ویشتر بخوندستن وسه $1 ره هارشین)<br />\nاگه نخانّی شمه بنویشته‌ئون اینجه دس بزه یا ات نفر دیگه شمه بنویشته ره کوپی نکانه، اصلأ شه بنویشته ره اینجه نی‌یلین.",
        "templatesused": "{{PLURAL:$1|شابلون|شابلونای}} استفاده بَیی این صفحه دله:",
        "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}}",
        "nextn": "تا پَس‌تر {{PLURAL:$1|$1}}",
+       "nextn-title": "$1 بعدی {{PLURAL:$1|نتیجه|نتیجه}}",
+       "shown-title": "$1 ِ{{PLURAL:$1|نتیجه|نتیجه}} سِراق هِدائن هر صفحه دله",
        "viewprevnext": "هارشائن ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-new": "'''« [[:$1]] » ِ صفحه ره این ویکی دله بساجین!'''",
+       "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-interwiki-caption": "خاخر پروژه‌ئون",
        "search-interwiki-more": "(ویشتر)",
+       "searchall": "همه",
+       "search-showingresults": "{{PLURAL:$4|نتایج <strong>$1</strong> از <strong>$3</strong>|نتایج <strong>$1 - $2</strong> از <strong>$3</strong>}}",
+       "search-nonefound": "اونچی بخاستنی پیدا نیّه.",
        "powersearch-legend": "ململ بَیی دور هایتن",
        "powersearch-ns": "بچرخستن اینان دله:",
-       "mypreferences": "مه خاستنی‌ئون",
+       "mypreferences": "ترجیحات",
        "prefs-edits": "تعداد دچی‌یه‌ئون:",
        "prefs-rc": "تازه دگاردسته‌ئون",
        "youremail": "شه مه Email:",
        "group-sysop": "مدیرون",
        "group-all": "(همه)",
        "grouppage-sysop": "{{ns:project}}:مدیرون",
+       "right-writeapi": "بنویشتن API جه استفاده هاکردن",
+       "newuserlogpage": "کارور بساتن سیاهه",
        "rightslog": "سیاهه اختیارای کاروری",
        "rightslogtext": "اینتا سیاهه تغییرای اختیارای کاروری هسته.",
        "action-edit": "این صفحه ره دچی‌ین",
        "action-move": "دکشی‌ین اینتا صفحه",
        "action-move-subpages": "دکشی‌ین اینتا صفحه و ونه زیر رج‌ئون",
        "action-move-rootuserpages": "دکشی‌ین صفحه‌ئون کاروری سرچله",
+       "enhancedrc-history": "تاریخچه",
        "recentchanges": "تازه دگاردسته‌ئون",
        "recentchanges-legend": "تازه دگاردسته‌ئون گوزینه‌ها",
        "recentchanges-summary": "ویکی تازه دگاردسته‌ئون ره اینتا صفحه دله دمبال هاکنین.",
        "recentchanges-label-newpage": "اینتا ویرایش اته نو صفحه ایجاد هاکرده",
        "recentchanges-label-minor": "اینتا ویرایش خله جزئی بیه",
        "recentchanges-label-bot": "اینتا ویرایش‌ره اته ربات انجام هدائه",
+       "recentchanges-label-unpatrolled": "این دَچی‌یه ره هَنتا بررسی نَکاردنه.",
+       "recentchanges-label-plusminus": "صفحه‌ی ِقایده انده بایت تغییر هاکرده",
+       "recentchanges-legend-heading": "'''اختصارون:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|تازه بساته صفحه‌ئون]] ره هم هارشین)",
        "rclistfrom": "نِمایش تازه‌دگاردسته‌ئون با شروع از $3 $2",
        "rcshowhideminor": "پچیک دچی‌یه‌ئون $1",
+       "rcshowhideminor-hide": "پنهون هاکن",
        "rcshowhidebots": "ربوت‌ئون $1",
+       "rcshowhidebots-show": "سِراق هاده",
        "rcshowhideliu": "ثبت‌نوم هاکرده کارورون $1",
+       "rcshowhideliu-hide": "پنهون هاکن",
        "rcshowhideanons": "ناشناس ِکارورون $1",
+       "rcshowhideanons-hide": "پنهون هاکن",
        "rcshowhidepatr": "گشت‌بخارد ِدچی‌یه‌ئون $1",
        "rcshowhidemine": "مه دچی‌یه‌ئون $1",
+       "rcshowhidemine-hide": "پنهون هاکن",
        "rclinks": "نـِشون هـِدائن  $1 پایانی دَچی‌‌یه‌ئون، $2 اِسـا روز ره دلـه؛ $3",
        "diff": "فرق",
        "hist": "تاریخچه",
        "minoreditletter": "جز",
        "newpageletter": "نو",
        "boteditletter": "ربات",
+       "rc-change-size-new": "$1 {{PLURAL:$1|بایت}} پس از تغییر",
        "newsectionsummary": "/* $1 */ نو تیکه",
        "recentchangeslinked": "واری دأچیـه‌ن‌ئون",
        "recentchangeslinked-feed": "واری دچی‌یه‌ئون",
        "recentchangeslinked-toolbox": "واری دچی‌یه‌ئون",
+       "recentchangeslinked-title": "مرتبط تغییرات $1 جه",
        "recentchangeslinked-page": "صفحه ایسم:",
+       "recentchangeslinked-to": "تغییرات صفحه‌ئونی که این صفحه جه ربط دارنه ره سِراق هِدائن",
        "upload": "باربی‌یشتن فـایـل",
        "uploadbtn": "باربی‌یشتن فایل",
        "uploadtext": "فرم زیر جه باربی‌یشتن نو پرونده‌ئون وسّه استفاده هاکنین.\nبدی‌ین پرونده‌ئونی که قبلاً باربی‌یشته بَینه به [[Special:FileList|فهرست پرونده‌ها]] بورین. باربی‌یشتن مجدد [[Special:Log/upload|سیاههٔ بارگذاری‌ها]] و حذف پرونده‌ئون [[Special:Log/delete|deletion log]] دله ثبت وانه.\n\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>''' استفاده از اتا نسخه ۲۰۰ پیکسلی از پرونده که اتا جعبه سمت چپ متن دله دره و عبارت alt text ونه دله به عنوان توضیح استفاده بیّه وسّه\n*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' بساتن اتا پیوند مستقیم به پرونده بدون نمایش پرونده",
        "uploadlogpage": "باربی‌یشتن گزارش",
+       "filedesc": "کار ِگزارش",
+       "license-header": "اجازه‌نومه",
        "imgfile": "فایل",
        "listfiles": "هارشی ئون ره لیست",
        "listfiles_name": "نـوم",
        "listfiles_size": "قایده",
        "file-anchor-link": "فایل",
        "filehist": "فایل تاریخچه",
+       "filehist-help": "تاریخ/زمون‌ها سَر کلیک هاکنین تا اون گادِر ِنسخه ره هارشین.",
        "filehist-current": "إسا",
        "filehist-datetime": "تاریخ/زمون",
        "filehist-thumb": "انگوس گتی",
+       "filehist-thumbtext": "انگوس‌گتی عکس $1 نسخه جه",
        "filehist-user": "کارور",
+       "filehist-dimensions": "ابعاد",
        "filehist-comment": "هارشا",
-       "imagelinks": "Ù\84Û\8cÙ\86Ú©â\80\8cئÙ\88ن",
+       "imagelinks": "پرÙ\88Ù\86دÙ\87â\80\8cÛ\8c Ø§Ø³ØªÙ\81ادÙ\87 Ø¨Û\8cÙ\91ن",
        "linkstoimage": "این {{PLURAL:$1|صفحه|$1 صفحه‌ئون}} لینک هِدانه این فایل ره:",
+       "nolinkstoimage": "این عکس ره هیچ جا نی‌یشتنه",
+       "sharedupload-desc-here": "این پرونده $1 دله دَره و ممکن هسته دیگه پروژه‌ئون دله هم استفاده بواشه.\nتوضیحات موجود [$2 پرونده توضیحات صفحه میون اونجه]، سِراق هِدا وونّه.",
+       "upload-disallowed-here": "متأسفانه شما نتوندی این پرونده ره بازنویس هاکنی.",
        "randompage": "شانسی صفحه",
        "statistics": "آمار",
        "nbytes": "$1 {{PLURAL:$1|بایت|بایت}}",
        "move": "دکش هاکردن",
        "pager-newer-n": "{{PLURAL:$1|أتـا نـه‌ته‌ر|$1 تـا نـه‌ته‌ر}}",
        "pager-older-n": "{{PLURAL:$1|أتـا کـوهـنـه‌ته‌ر|$1 تـا کوهـنـه‌ته‌ر}}",
+       "booksources": "کتابی منابع",
        "booksources-search-legend": "بگردستن منابع کتاب",
+       "booksources-search": "چرخه‌تو",
        "booksources-text": "زیر فهرستی از لینکا به وبگاه‌ئون دیگه دره که کتاب‌ئون نو و دست دوم روشنّه و ممکنه اطلاعات ویشتری راجع به کتاب مورد نظر دارِن:",
        "specialloguserlabel": "کارور:",
+       "log": "سیاهه‌ها",
        "allpages": "همه صفحه‌ئون",
        "prevpage": "پیشین صفحه ($1)",
        "allarticles": "همه صفحه‌ئون",
        "emailuser": "این کارور وسّه ایمیل بَرسِن",
        "emailpage": "ئـی-مه‌یـل ای کـارور وه‌سه",
        "watchlist": "مه دمبال‌هاکرده‌‌ئون ِلیست",
-       "mywatchlist": "مه دمبال‌هاکرده‌‌ئون ِلیست",
+       "mywatchlist": "دمبال‌هاکرده‌ئون فهرست",
        "watchnologin": "سیستم ره دله نی ئه موئین",
        "addedwatchtext": "«[[:$1]]» شمه [[Special:Watchlist|دمبال هاکردئون لیست]] دله اضافه بیه.\nاینتا صفحه دگاردسته‌ئون و ونه گپ آینده دله اینتا لیست دله شمه وسه فهرست بوننه؛ یان شه بماند، اینتا صفحه، [[Special:RecentChanges|تازه دگاردسته‌ئون]] فهرست دله شمه وسه '''پررنگ‌تر''' نمایش هدا بونه تا وره راحت تر بوینین.",
        "watch": "دمبال هاکردن",
        "undeletelink": "بـأویـنـه‌ن / ده‌واره جـا بـیـه‌شـتـه‌ن",
        "namespace": "نوم‌جا:",
        "invert": "برعکس انتخاب هاکن",
+       "tooltip-invert": "این جعبه ره علامت بزنین تا صفحه‌ئون ِتغییرات انتخاب‌بَیی فضائون (و دیگه فضائون علامت‌بَزه دله) مخفی بَوون",
+       "namespace_association": "مرتبط فضائون",
+       "tooltip-namespace_association": "این جعبه ره علامت بزنین تا گپ یا دیگه مرتبط فضائون هم انتخاب بواشِن",
        "blanknamespace": "(مـار)",
-       "contributions": "کارور کایری‌ئون",
+       "contributions": "{{GENDER:$1|کارور}} کایری‌ئون",
        "contributions-title": "$1 کایری‌ئون",
        "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": "← لـیـنـک‌ئون",
+       "whatlinkshere-hideredirs": "$1 دکشی‌یه",
+       "whatlinkshere-hidetrans": "$1 تراگنجانشون",
+       "whatlinkshere-hidelinks": "$1 لینک",
+       "whatlinkshere-filters": "فیلترون",
        "blockip": "کارور ره دَوستن",
        "blockip-legend": "کارور ره دَوستن",
        "ipbsubmit": "ای کارور دأبه‌س بأوه",
        "newtitle": "ترنه نوم:",
        "movepage-moved": "'''ای «$1» ولـگ،  بورده «$2» ره.'''",
        "movetalk": "«گپ» صفحه هم، اگه وانه، بوره.",
+       "movelogpage": "دکشی‌ین ِسیاهه",
        "revertmove": "واچـیـه‌ن",
        "delete_and_move_confirm": "أره، پاک هاکه‌ن وه ره",
        "export": "دأیابأبه‌رده‌ن ولـگ‌ئون",
        "tooltip-pt-mycontris": "مه کایری‌ئون لیست",
        "tooltip-pt-login": "شه‌ما به‌ته‌ر هـأسـه که سـیـسـتـه‌م ده‌لـه بـیـه‌ئی، هـرچـأن زوری نـیـه",
        "tooltip-pt-logout": "سیستم جه دأیابـوری",
+       "tooltip-pt-createaccount": "شِما ره پیشنهاد کامبی که اتا کاروری حیساب بسازین و لاگین بَواشین؛ البته این کار اختیاری هسته.",
        "tooltip-ca-talk": "این صفحه خَوری گپ بَزوئن",
        "tooltip-ca-edit": "شِما بتوندی این صفحه ره دَچینی.",
        "tooltip-ca-addsection": "أتـا نـه گـب را دأکـه‌تـه‌ن",
        "tooltip-ca-viewsource": "این صفحه ره نتوندی دَچینی.\nشِما بِتوندی ونه منبع ره هارشی.",
        "tooltip-ca-history": "کهنه دگاردسته‌ئونی که این صفحه دله دکته",
        "tooltip-ca-delete": "این صفحه ره پاک هاکردن",
+       "tooltip-ca-move": "دکشی‌ین اینتا صفحه",
        "tooltip-ca-watch": "این صفحه ره شه دمبال‌هاکردن لیست دله بی‌یشتن",
        "tooltip-search": "{{SITENAME}} ره چرخه‌تو",
        "tooltip-search-go": "بـور اتـا ولـگـی کـه وه‌نـه نـوم هـأمـیـنـتـا بـوئـه",
        "tooltip-t-recentchangeslinked": "اِسایی دِگاردسته‌ئون ِصفحه‌ئون که این صفحه جه لینک دارنه",
        "tooltip-feed-rss": "RSS خوراک این صفحه وسّه",
        "tooltip-feed-atom": "Atom خوراک این صفحه وسّه",
+       "tooltip-t-contributions": "این کارور ِکایریون ِفهرست",
        "tooltip-t-emailuser": "ای کـارور ره اتـا ئـه‌لـه‌کـتـه‌رونـیـکـی‌نـومـه راهـی هـه‌کـارده‌ن",
        "tooltip-t-upload": "بـاربـیـه‌شـتـه‌ن فـایـل‌ئون",
        "tooltip-t-specialpages": "همه شا صفحه‌ئون ِلیسـت",
        "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": "رج ره بدی‌ین",
+       "tooltip-save": "شه تغییرات ره ذخیره هاکنین",
        "tooltip-preview": "شـه ده‌گـه‌ره‌سـه‌ئون ره پـیـشـاپـیـش بـأویـنـه‌ن،\n خـا‌هـه‌ش بـونـه، شـه کـارئون ره جـا دأکـه‌تـه‌ن پـیـش، ای ره کـار بـأزه‌نـی.",
+       "tooltip-diff": "تغییراتی که ته هِدایی ره سِراق هِدائن",
+       "tooltip-rollback": "«دِگاردنی‌ین» اون دچی‌یه(ئون) که آخرین نفر انجام هِدائه ره اتا کلیک جه وَرگِردنانده.",
+       "tooltip-summary": "خلاصه بنویسین",
        "siteusers": "$1، {{PLURAL:$2|کارور|کارورون}} {{SITENAME}}",
+       "simpleantispam-label": "!آنتی‌اسپم ِچک‌هاکردن.\nاین قسمت ره پـِر <strong>نکان!</strong>",
+       "pageinfo-toolboxlink": "صفحه‌ی ِاطلاعات",
        "previousdiff": "کوهنه‌تر دچی‌ین ←",
        "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.",
+       "show-big-image-size": "<span dir=\"ltr\">$1 × $2</span> پیکسل",
        "file-info-png-frames": "$1 {{PLURAL:$1|قاب|قاب}}",
        "newimages": "گالری نو عکس‌ئون",
        "imagelisttext": "فهرست بن $1 {{PLURAL:$1|عکسی|عکسی}} که $2 مرتب بیی‌یه بموئه.",
        "bydate": "تاریخ رو جه",
        "sp-newimages-showfrom": "نشون‌هدائن عکسای نو $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": "عمودی رزولویشن",
+       "exif-datetime": "پرونده‌ی ِتاریخ و زمون ره تغییر هدائن",
+       "exif-make": "دوربین ِسازنده‌ئون ِکمپانی",
+       "exif-model": "دوربین ِمدل",
+       "exif-software": "استفاده‌بیی نرم‌افزار",
+       "exif-exifversion": "Exif نسخه",
+       "exif-colorspace": "رنگی فضا",
+       "exif-datetimeoriginal": "دیتای ِتولید ِتاریخ و زمون",
+       "exif-datetimedigitized": "دیجیتالی بیّن ِزمون و تاریخ",
        "exif-gpsareainformation": "جی پی اس ناحیه نوم",
        "exif-gpsdatestamp": "جی پی اس روز",
        "exif-gpsdifferential": "جی پی اس په‌چه‌ک درس هأکه‌ردن",
        "autosumm-blank": "صفحه ره اسپه هاکرده",
        "autosumm-replace": "صفحه ره اینتا جه عوض هاکرد: '$1'",
        "autoredircomment": "به [[$1]] مسیر ره تغییر هدائه",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|گپ]])",
        "version-specialpages": "شا صفحه‌ئون",
        "specialpages": "شا صفحه‌ئون",
        "specialpages-group-maintenance": "چله‌بندی صفحه‌ئون",
+       "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  بساتن اتا حساب کاروری",
+       "logentry-newusers-create": "$1 کاروری حساب {{GENDER:$2|بساته بیّه}}",
        "rightsnone": "(هچّی)",
        "feedback-adding": "بی‌یشتن پیشنهادات و انتقادات...",
        "feedback-cancel": "ول هاکردن",
        "feedback-message": "پیغوم:",
        "feedback-subject": "موضوع:",
        "feedback-submit": "ارسال پیشنهادات و انتقادات",
+       "searchsuggest-search": "چرخه‌تو",
        "api-error-badaccess-groups": "شما اجازهٔ باربی‌یشتن پرونده‌ها ره این ویکی دله ندارنی.",
        "api-error-badtoken": "خطای داخلی: کد امنیتی اشتبائه (Bad token).",
        "api-error-copyuploaddisabled": "باربی‌یشتن با استفاده از نشونی اینترنتی این کارساز دله غیرفعاله.",
index e848ea5..0edacdb 100644 (file)
@@ -44,7 +44,7 @@
        "tog-diffonly": "Diff ē-pêng bián hián-sī ia̍h ê loē-iông",
        "tog-showhiddencats": "Hián-sī chhàng khí--lâi ê lūi-pia̍t",
        "tog-norollbackdiff": "ká tńg-khí liáu bián-koán cheng-chha goā-chē",
-       "tog-useeditwarning": "我若猶未保存修改的頁就跳開,愛共我講。",
+       "tog-useeditwarning": "Goá nā iáu-boē pó-chûn siu-kái--ê ia̍h tō thiàu khai, ài kā goá kóng.",
        "tog-prefershttps": "我登入的時陣愛用安全連線",
        "underline-always": "Tiāⁿ-tio̍h",
        "underline-never": "Tiāⁿ-tio̍h mà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í.",
        "changepassword": "Oāⁿ bi̍t-bé",
        "resetpass_header": "Kái káu-chō ê bi̍t-bé.",
        "resetpass-submit-cancel": "Chhú-siau",
        "resetpass-temp-password": "Lîm-sî ê bi̍t-bé:",
        "passwordreset": "Têng siat bi̍t-bé",
-       "passwordreset-legend": "Têng siat bi̍t-bé",
        "passwordreset-username": "Lí ê iōng-chiá miâ-chheng:",
        "passwordreset-email": "Tiān-chú-phoe tē-chí:",
        "passwordreset-emailelement": "Iōng-chiá: $1\nLîm-sî ê bi̍t-bé: $2",
        "preview": "Seng khoàⁿ-māi",
        "showpreview": "Seng khoàⁿ-māi",
        "showdiff": "Khòaⁿ kái-piàn ê pō·-hūn",
-       "anoneditwarning": "'''Kéng-kò:''' Lí bô teng-ji̍p. Lí ê IP chū-chí ē kì tī pún ia̍h ê pian-chi̍p le̍k-sú lāi-bīn.",
+       "anoneditwarning": "'''thê-chhíⁿ:''' Lí bô teng-ji̍p. Lí nā ū kái mi̍h-kiāⁿ, lí ê IP ē hô͘ lâng khoàⁿ tio̍h. Lí nā <strong>[$1 teng-ji̍p]</strong> iah-sī <strong>[$2 khui chi̍t-ê kháu-chō]</strong>; lí kái ê mi̍h-kiāⁿ ē kái kì lí ê kháu-chō-miâ. Mā ū kî-thaⁿ ê hó-chhù.",
        "summary-preview": "Khài-iàu ê preview:",
        "subject-preview": "Ū-lám tê-bo̍k/piau-tê:",
        "blockednoreason": "無寫理由",
        "yourdiff": "Chha-pia̍t",
        "readonlywarning": "'''CHÙ-Ì: Chu-liāu-khò· taⁿ só tiâu leh thang pān î-siu khang-khòe, só·-í lí hiān-chú-sî bô thang pó-chûn jīn-hô phian-chi̍p hāng-bo̍k. Lí ē-sái kā siong-koan pō·-hūn tah--ji̍p-khì 1-ê bûn-jī tóng-àn pó-chûn, āu-chhiú chiah koh kè-sio̍k.'''",
        "protectedpagewarning": "'''KÉNG-KÒ: Pún ia̍h só tiâu leh. Kan-taⁿ ū hêng-chèng te̍k-koân ê iōng-chiá (sysop) ē-sái siu-kái.'''",
-       "templatesused": "Chit ia̍h iōng {{PLURAL:$1| ê pang-bô·| ê pang-bô·}} :",
+       "templatesused": "Chit ia̍h iōng {{PLURAL:$1| ê pang-bô·}} :",
        "templatesusedpreview": "Chit ê preview iōng chia ê pang-bô͘:",
        "templatesusedsection": "Chit ê section iōng chia ê pang-bô͘:",
        "template-protected": "(pó-hō͘)",
        "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",
        "searchprofile-advanced": "chìn-chi̍t-pō͘",
        "searchprofile-articles-tooltip": "Tī $1 chhoé",
        "searchprofile-images-tooltip": "Chhoé tóng-àn",
-       "searchprofile-everything-tooltip": "揣全部(包括討論頁)",
+       "searchprofile-everything-tooltip": "Chhiau choân-pō͘ (pau-koat thó-lūn-ia̍h)",
        "searchprofile-advanced-tooltip": "佇你家己設的名空間內底揣",
        "search-result-size": "$1 ({{PLURAL:$2|1 jī-goân|$2 jī-goân}})",
        "search-redirect": "(轉去 $1)",
        "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.",
        "action-edit": "Siu-kái chit ia̍h",
        "nchanges": "$1 {{PLURAL:$1|kái|kái}}",
        "recentchanges": "Chòe-kīn ê kái-piàn",
+       "recentchanges-summary": "Tī chiah wiki ia̍h tui-cha chòe-kīn ê kái-piàn.",
        "recentchanges-label-newpage": "Chit ê siu-kái ē sán-seng sin ia̍h",
        "recentchanges-label-minor": "Che sī sió siu-kái",
+       "recentchanges-label-bot": "Che sī ki-khì-lâng kái--ê",
        "rcnotefrom": "Ē-kha sī <b>$2</b> kàu taⁿ ê kái-piàn (ke̍k-ke hián-sī <b>$1</b> hāng).",
        "rclistfrom": "Hián-sī tùi $3 $2 kàu taⁿ ê sin kái-piàn",
        "rcshowhideminor": "$1 sió siu-kái",
+       "rcshowhidebots": "$1 機器儂",
        "rcshowhideliu": "$1 teng-ji̍p ê iōng-chiá",
        "rcshowhideanons": "$1 bû-bêng-sī",
        "rcshowhidemine": "$1 góa ê pian-chi̍p",
        "recentchangeslinked": "Siong-koan ê kái-piàn",
        "recentchangeslinked-feed": "Siong-koan ê kái-piàn",
        "recentchangeslinked-toolbox": "Siong-koan ê kái-piàn",
+       "recentchangeslinked-summary": "這是有相接到指定頁(抑是指定分類的所有成員),而且最近家己頁的內容有改過的清單。\n遐的頁[[Special:Watchlist|佇你的監視清單]]會用<strong>粗體</strong> 標示。",
        "recentchangeslinked-page": "Ia̍h ê miâ:",
        "upload": "Kā tóng-àn chiūⁿ-bāng",
        "uploadbtn": "Kā tóng-àn chiūⁿ-bāng",
        "listfiles_count": "版本",
        "file-anchor-link": "Tóng-àn",
        "filehist": "Tóng-àn ê le̍k-sú",
+       "filehist-help": "揤 日期/時間;看彼時陣的檔案",
        "filehist-current": "hiān-chāi",
        "filehist-datetime": "Ji̍t-kî/ Sî-kan",
        "filehist-thumb": "細張圖",
+       "filehist-thumbtext": "$1版本的細圖",
        "filehist-user": "Iōng-chiá",
+       "filehist-dimensions": "寸尺",
+       "filehist-comment": "說明",
        "imagelinks": "tóng-àn sù-iōng ê chōng-hòng",
-       "linkstoimage": "ē-kha $1 ê ia̍h ū iōng tio̍h chit ê iáⁿ-siō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檔案說明]。",
        "mimesearch": "MIME chhiau-chhoē",
        "unwatchedpages": "Bô lâng kàm-sī ê ia̍h",
        "listredirects": "Lia̍t-chhut choán-ia̍h",
        "nbytes": "$1 {{PLURAL:$1|jī-goân|jī-goân}}",
        "ncategories": "$1 {{PLURAL:$1|ê lūi-pia̍t |ê lūi-pia̍t}}",
        "nlinks": "$1 ê liân-kiat",
-       "nmembers": "$1{{PLURAL:$1|ê sêng-oân|ê sêng-oân}}",
+       "nmembers": "$1{{PLURAL:$1|ê sêng-oân}}",
        "nrevisions": "$1 ê siu-tēng-pún",
        "lonelypages": "Ko·-ia̍h",
        "uncategorizedpages": "Bô lūi-pia̍t ê 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": "目地(標題抑是用者)",
        "undeleteviewlink": "Khoàⁿ",
        "namespace": "Miâ-khong-kan:",
        "invert": "Soán-hāng í-gōa",
+       "tooltip-invert": "勾起來的框;相關的名空間會先藏起來。",
+       "namespace_association": "相關的名空間",
+       "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": "建議你先開一个口座(無一定愛);才閣登入。",
+       "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": "Lí ē-sái kái chit ia̍h. Beh chhûn chìn-chiân, chhiáⁿ chhi̍h  sing-khoàⁿ-māi ê liú-á",
+       "tooltip-ca-edit": "Kái chit-ia̍h",
+       "tooltip-ca-addsection": "加新的一段",
        "tooltip-ca-viewsource": "Chit ia̍h pó-hō͘ tiâu leh.\nLí ē-sái khoàⁿ i ê goân-sú-bé.",
        "tooltip-ca-history": "Chit ia̍h ê chá-chêng pán-pún",
        "tooltip-ca-delete": "Thâi chit ia̍h",
        "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",
        "tooltip-t-permalink": "Chi̍t ia̍h kái--koè pán-pún ê éng-kiú liân-kiat",
        "tooltip-ca-nstab-main": "khoàⁿ ia̍h ê loē-iông",
        "tooltip-ca-nstab-user": "Khoàⁿ iōng-chiá ê Ia̍h",
+       "tooltip-ca-nstab-special": "這是一个特殊頁,你袂使改這頁。",
        "tooltip-ca-nstab-image": "Khoàⁿ tóng-àn ia̍h",
        "tooltip-ca-nstab-category": "Khoàⁿ lūi-pia̍t ia̍h",
        "tooltip-minoredit": "記這是一个小改",
        "siteuser": "{{SITENAME}} iōng-chiá $1",
        "othercontribs": "Kin-kù $1 ê kòng-hiàn.",
        "siteusers": "{{SITENAME}} iōng-chiá $1",
-       "pageinfo-toolboxlink": "頁的資訊",
+       "pageinfo-toolboxlink": "Ia̍h ê chu-sìn",
        "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": "← Khì chêng 1 ê diff",
-       "nextdiff": "Khì āu 1 ê diff →",
+       "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-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 像素",
        "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",
        "bydate": "chiàu ji̍t-kî",
+       "metadata": "元資料",
        "metadata-expand": "Hián-sī iù-chiat",
        "metadata-collapse": "Am iù-chiat",
+       "metadata-fields": "佇顯示圖片的頁,若掀開元資料,下跤的EXIF資料會儂看著。其他的元資料是先看無。\n* 廠商\n* 機型\n* 翕像的時陣\n* 曝光\n* 光圈\n* ISO 速率\n* 焦距\n* 作者\n* 版權\n* 說明\n* 緯度(GPS)\n* 經度(GPS)\n* 海拔(GPS)",
        "namespacesall": "choân-pō·",
        "monthsall": "choân-pō͘",
        "confirmemail": "Khak-jīn e-mail chū-chí",
        "table_pager_limit_submit": "Lâi-khì",
        "autosumm-blank": "Kā ia̍h ê loē-iông the̍h tiāu",
        "autoredircomment": "Choán khì [[$1]]",
-       "autosumm-new": "Sin ia̍h: $1",
+       "autosumm-new": "$1 ê ia̍h í-keng kiàn-li̍p",
        "watchlistedit-normal-submit": "Mài kàm-sī",
-       "watchlistedit-normal-done": "Í-keng ū $1 ia̍h ùi lí ê kám-sī-toaⁿ soá cháu:",
+       "watchlistedit-normal-done": "Í-keng uì lí ê kám-sī-toaⁿ soá {{PLURAL:$1|ia̍h}} cháu:",
        "watchlisttools-edit": "Khoàⁿ koh kái kàm-sī-toaⁿ",
        "watchlisttools-raw": "Kái chhiⁿ ê kàm-sī-toaⁿ",
        "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|Piau-chhiam]] chhoē mi̍h:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|个標籤}}]]:$2)",
-       "searchsuggest-search": "揣",
+       "logentry-newusers-create": "已經{{GENDER:$2|開好}}用者口座 $1",
+       "searchsuggest-search": "Chhiau",
        "expandtemplates": "Khok-chhiong pang-bô͘",
        "expand_templates_input": "Su-ji̍p bûn-jī:",
        "expand_templates_output": "Kiat-kó:",
index db816b4..295f11f 100644 (file)
        "passwordreset": "Riabbìa 'a password",
        "passwordreset-text-one": "Ghienche stu modulo pe' ricevere na mmasciata e-mail c' 'a password temporanea.",
        "passwordreset-text-many": "{{PLURAL:$1|Ghienche uno d' 'e campe pe' ricevere na password temporanea cu na mmasciata e-mail.}}",
-       "passwordreset-legend": "Riabbìa 'a password",
        "passwordreset-disabled": "'A funzione 'e riabbìo d' 'e password è stata stutata dint'a sta wiki.",
        "passwordreset-emaildisabled": "'E funzione e-mail songo state stutate dint'a sta wiki.",
        "passwordreset-username": "Nomme utente:",
        "resettokens": "Riabbìa 'e token",
        "resettokens-text": "Ccà se ponno riabbià 'e chiave ca permetessero l'acciesso a determinate date private associate a 'o cunto vuosto.\n\nL'aviste 'e ffà quanno l'avete spartuto pe' sbaglio cu cocche perzona o pure quanno 'o cunto d' 'o vuosto è stato compromesso.",
        "resettokens-no-tokens": "Nun ce stanno token 'a riabbià.",
-       "resettokens-legend": "Riabbìa 'e token",
        "resettokens-tokens": "Token:",
        "resettokens-token-label": "$1 (valore 'e mmò: $2)",
        "resettokens-watchlist-token": "Token p' 'o feed web (Atom/RSS) d' 'e [[Special:Watchlist|cagnamiente a 'e paggene dint'a l'osservate spiciale tuoje]]",
        "yourdiff": "Differenze",
        "copyrightwarning": "Pe' piacere tenite a mmente ca tutte 'e contribbute a {{SITENAME}} songo cunziderate pubbrecate dint'e térmene d'uso d' 'a licienza $2 (vedite $1 pe n'avé cchiù dettaglie).\nSi nun vulite ca 'e testi vuoste fossero cagnate e distribuite 'a uno qualunque senza lémmeto, nun 'e mannate ccà.<br />\nMannanno stu testo dichiarate pùre, sott'a responsabilità vuosta, ch'è stato scritto 'a vuje perzunalmente o pure ca è stato copiato 'a na fonte n pubblico dominio o similarmente libbera.\n'''Nun mannate materiale prutetto 'a copyright senz'avé autorizzaziona!'''",
        "copyrightwarning2": "Pe' piacere tenite a mmente ca tutte 'e contribbute a {{SITENAME}} se ponno cagnà, alterà, o distribbuì pe l'ati cuntribbuttòre.\n\nSi nun vulite ca 'e teste vuoste fossero cagnàte spenzieratamente, nun 'e mannate ccà.<br />\nMannanno stu testo dichiarate pùre, sott'a responsabilità vosta, ch'è stato scritto 'a vuje perzunalmente o pure ca è stato copiato 'a na fonte n pubblico dominio o similarmente libbera (vedete $1 pe' n'avé dettaglie).\n'''Nun mannate materiale prutetto 'a copyright senza n'avé autorizzaziona!'''",
+       "editpage-cannot-use-custom-model": "'O modello 'e cuntenute 'e sta paggena nun se pò cagnà.",
        "longpageerror": "'''Errore: 'o testo mannato è luongo {{PLURAL:$1|1|$1}} kilobyte, ch'è cchiù grosso d' 'a diminziona massima cunzentita ({{PLURAL:$2|1|$2}} kilobyte).'''\n'O testo nun se pò sarvà.",
        "readonlywarning": "<strong>Attenziò</strong>: 'o database è bloccato pe se ffà 'a manutenzione. P' 'o mumento nun se ponno sarvà 'e cagnamiente fatte.\nPe' nun 'e sperdere, copia sti cuntenute dint'a nu file 'e testo e sarvatillo pe' tramente c'aspiette 'o sblocco d' 'o database.\n\nL'ammenistratore ca mpustaje 'o blocco ave scritto sta spiegazione: $1.",
        "protectedpagewarning": "'''Attenziò: sta paggena è stata bloccata 'n modo tale ca sulamente l'utente ch' 'e privilegge d'ammenistratore 'a ponno cagnà.'''\nL'urdemo elemento d' 'o riggistro è scritto ccà abbascio pe' n'avé riferimento:",
        "badsig": "Errore 'e firma nun standard, cuntrullate 'e tag HTML.",
        "badsiglength": "'A firma c'avite scigliuto è troppo luonga, chesta nun avesse 'a superà $1 {{PLURAL:$1|carattere|carattere}}.",
        "yourgender": "Comme nce referimmo a vvuje?",
-       "gender-unknown": "Preferisco 'e nun 'o ddicere",
+       "gender-unknown": "Quanno se stà a parlà 'e vuje, 'o software ausarrà sempe parole 'e genero neutrale pe ffà 'o nomme vuosto",
        "gender-male": "È riggistrato ncopp' 'a {{SITENAME}}",
        "gender-female": "È riggistrata ncopp' 'a {{SITENAME}}",
        "prefs-help-gender": "Mpizzà sta preferenza è ozzionale.\n'O software aúsa stu valore pe' se vutà a vuje e v'anummenà a l'ati utente ausanno 'o gennere grammatecale buono.\nCheste nfurmaziune sarranno pubbreche.",
        "rollback-success": "Cagnamiente annullate 'a $1;\ns'è turnat arreto a l'urdema verzione 'e $2.",
        "sessionfailure-title": "Sessione fallita",
        "sessionfailure": "Pare ca stanno probbleme cu 'a sessiona toja;\nst'azione è stata fermata pe' precauzione annanz' 'e cavall' 'e troia;\nPe' piacere turnate arreto, carrecate n'ata vota 'a paggena pe pruvate n'ata vota.",
+       "changecontentmodel": "Cagna 'o mudello 'e cuntenute 'e na paggena",
+       "changecontentmodel-legend": "Cagna 'o mudello 'e cuntenute",
+       "changecontentmodel-title-label": "Titulo d\"a paggena",
+       "changecontentmodel-model-label": "Mudello 'e cuntenute nuovo",
+       "changecontentmodel-reason-label": "Mutivo:",
+       "changecontentmodel-success-title": "'O mudello 'e cuntenuto fuje cagnato",
+       "changecontentmodel-success-text": "'O tipo 'e cuntenut 'e [[:$1]] è stato cagnato.",
+       "changecontentmodel-cannot-convert": "'E cuntenute dint'a [[:$1]] nun se ponno scagnà a nu tipo 'e $2.",
+       "changecontentmodel-title-cantexist": "Nun è pussibbele 'e n'avé na paggena dint'a $1.",
+       "changecontentmodel-nodirectediting": "'O mudello 'e cuntenute $1 nun suppurtasse 'o cagnamiento diretto",
+       "log-name-contentmodel": "Riggistro 'e cagnamiente d' 'o mudello 'e cuntenute",
+       "log-description-contentmodel": "Evvente azzeccate c' 'o mudello 'e cuntenute 'e na paggena",
+       "logentry-contentmodel-change": "$1 cagnaje 'o mudello 'e cuntenute 'e na paggena $3 'a \"$4\" a \"$5\"",
+       "logentry-contentmodel-change-revertlink": "arrepiglia",
+       "logentry-contentmodel-change-revert": "arrepiglia",
        "protectlogpage": "Riggistro 'e prutezzione",
        "protectlogtext": "Ccà abbascio sta na lista 'e cagnamiente 'e pruteziune d' 'e paggene.\nVedite 'a [[Special:ProtectedPages|liste d' 'e paggene prutette]] pe n'avé na lista 'e l'operaziune 'e mo ncopp' 'a prutezzione d' 'e paggene.",
        "protectedarticle": "ha prutetto \"[[$1]]\"",
        "tooltip-pt-logout": "Jésce (logout)",
        "tooltip-pt-createaccount": "Pigliateve curaggio e criate n'utente e trasìte; ancora ca chisto nun s'avesse 'a ffà pe' fforza",
        "tooltip-ca-talk": "Vede e discussione rilative a chista paggena",
-       "tooltip-ca-edit": "Puo modifica chista paggena. Ppe favore usa 'o pulsante 'e anteprimma primma 'e salva",
+       "tooltip-ca-edit": "Cagna sta paggena",
        "tooltip-ca-addsection": "Cummincia 'na nova sezzione",
        "tooltip-ca-viewsource": "Chista paggena è prutetta, ma puo vere 'o codice sorgente",
        "tooltip-ca-history": "Vversione precedente 'e chista paggena",
        "pageinfo-robot-index": "Permesso",
        "pageinfo-robot-noindex": "Nun permesso",
        "pageinfo-watchers": "Nummero 'e visite â paggena",
+       "pageinfo-visiting-watchers": "Nummero 'e utente ca stanno a vedè 'e cagnamiente cchiù nuove",
        "pageinfo-few-watchers": "Meno 'e $1 {{PLURAL:$1|visita|visite}}",
+       "pageinfo-few-visiting-watchers": "Esistesse o forse nun esistesse n'utente ca stesse a vedé 'e cagnamiente cchiù ricente",
        "pageinfo-redirects-name": "Nummero 'e redirect a sta paggena",
        "pageinfo-subpages-name": "Nummero 'e sottopaggene 'e sta paggena",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirect}}; $3 {{PLURAL:$3|nun redirect}})",
        "version-libraries": "Bibblioteche installate",
        "version-libraries-library": "Bibblioteca",
        "version-libraries-version": "Verziona",
+       "version-libraries-license": "Licienza",
+       "version-libraries-description": "Descrizzione",
+       "version-libraries-authors": "Auture",
        "redirect": "Rediretto 'a nu file, n'utente, na paggena o n'ID 'e na verziona",
        "redirect-legend": "Rediretto ca spuntasse a nu file o na paggena",
        "redirect-summary": "Sta pàggena speciale redireziona a nu file (dato 'o nomme d' 'o file), na pàggene (dato n'ID 'e verziona), o 'na pàggene utente (dato n'ID nummereca 'e l'utende). Ause: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], o [[{{#Special:Redirect}}/user/101]].",
        "log-description-pagelang": "Chest'è nu riggistro 'e cagnamiente 'e lengua d' 'e paggene.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|ave cagnato}} 'a lengua d' 'a paggena $3 'a $4 a $5.",
        "default-skin-not-found": "Oops! 'A skin predefinta ' 'o wiki vuosto, definita 'n <code dir=\"ltr\">$wgDefaultSkin</code> comme <code>$1</code>, nun se tròva.\n\n'A installazione pare ca tenesse {{PLURAL:$4|'a skin|'e skin}} ccà abbascio. Vedite [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manuale: configurazione skin] pe' n'avè cchiù nfurmaziune ncopp' 'a manera {{PLURAL:$4|'e ll'abbià}} o scegliere chilla predefinita.\n\n$2\n\n; Si avite installato MediaWiki mò mò:\n: Probabbilmente l'avite installato 'a git, o direttamente 'a 'o codece sorgente ausanno cocch'atu metodo. Chesto era permesso. Verite 'e installà cocche skin 'a [https://www.mediawiki.org/wiki/Category:All_skins directory ncoppa mediawiki.org], tramite:\n:* Scarrecanno 'o [https://www.mediawiki.org/wiki/Download programma 'e installazione tarball], ca venesse fornito ch' 'e diverze skin ed estenziune. Putite fare copia-azzecca d' 'a directory <code dir=\"ltr\">skins/</code>.\n:* Scarrecanne 'e tarballs individuale 'e skin 'a [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Ausanno Git pe' scarrecà skin].\n: Facenno accussì nun se mmescasse 'o repository git vuosto si site sviluppatore MediaWiki.\n\n; Si avite MediaWiki agghiurnato MediaWiki mò mò:\n: MediaWiki 1.24 e verziune appriesso nun abbìa automatecamente 'e skin installate (vedite [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manuale: rilevamento automateco skin]). Putite copià {{PLURAL:$5|'a linea|'e linee}} ccà abbascio dint' 'o <code>LocalSettings.php</code> pe' putè appiccià {{PLURAL:$5|'o|tutt' 'e}} {{PLURAL:$5|skin}} installate mò mò:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si avite cagnato mò mò <code>LocalSettings.php</code>:\n: Cuntrullate 'e nomme d' 'e skin n'ata vota pe' ve sparagnà cocch'errore 'e battitura.",
-       "default-skin-not-found-no-skins": "Oops! 'A skin predefinita p' 'o wiki vuosto, definita 'n <code dir=\"ltr\">$wgDefaultSkin</code> comme <code>$1</code>, nun se tròva.\n\nNun avite installato nisciuno skin.\n\n; Si avite installato MediaWiki mò mò:\n: Probabbilmente l'avite installato 'a git, o direttamente 'a 'o codece sorgente ausanno cocch'atu metodo. Chesto era permesso. Verite 'e installà cocche skin 'a [https://www.mediawiki.org/wiki/Category:All_skins directory ncoppa mediawiki.org], tramite:\n:* Scarrecanne 'e tarballs individuale 'e skin 'a [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Ausanno Git pe' scarrecà skin].\n: Facenno accussì nun se mmescasse 'o repository git vuosto si site sviluppatore MediaWiki. Vedite [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manuale: rilevamento automateco skin]) pe n'avè nfurmaziune ncopp' 'a maniera d'appiccià e scegliere chella predefinita.",
+       "default-skin-not-found-no-skins": "Oops! 'A skin predefinita p' 'o wiki vuosto, definita 'n <code dir=\"ltr\">$wgDefaultSkin</code> comme <code>$1</code>, nun se tròva.\n\nNun avite installato nisciuno skin.\n\n; Si avite installato MediaWiki mò mò:\n: Probabbilmente l'avite installato 'a git, o direttamente 'a 'o codece sorgente ausanno cocch'atu metodo. Chesto era permesso. Verite 'e installà cocche skin 'a [https://www.mediawiki.org/wiki/Category:All_skins directory ncoppa mediawiki.org], tramite:\n:* Scarrecanne 'e tarballs individuale 'e skin 'a [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Ausanno Git pe' ve ffà 'a scarreca 'e skin].\n: Facenno accussì nun se mmescasse 'o repository git vuosto si site sviluppatore MediaWiki. Vedite [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manuale: rilevamento automateco skin]) pe n'avè nfurmaziune ncopp' 'a maniera d'appiccià e scegliere chella predefinita.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (funzione appicciata)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''funzione stutata''')",
        "mediastatistics": "Statistiche d' 'e media",
        "special-characters-group-khmer": "Khmer",
        "special-characters-title-endash": "trattino enne",
        "special-characters-title-emdash": "trattino emme",
-       "special-characters-title-minus": "segno meno"
+       "special-characters-title-minus": "segno meno",
+       "mw-widgets-titleinput-description-new-page": "'a pàggene nun esiste ancore",
+       "mw-widgets-titleinput-description-redirect": "redirezionate ncopp' a $1"
 }
index 61ce1ca..9543827 100644 (file)
        "passwordreset": "Tilbakestilling av passord",
        "passwordreset-text-one": "Fyll ut skjemaet for å tilbakestille passordet",
        "passwordreset-text-many": "{{PLURAL:$1|Fyll inn ett av datafeltene for å tilbakestille passordet ditt via epost.}}",
-       "passwordreset-legend": "Nullstill passord",
        "passwordreset-disabled": "Nullstilling av passord er deaktivert på denne wikien.",
        "passwordreset-emaildisabled": "E-posttjenester er slått av på denne wikien.",
        "passwordreset-username": "Brukernavn:",
        "resettokens": "Nullstill merker",
        "resettokens-text": "Du kan nullstille nøklene som gir adgang til visse private data knyttet til din konto.\n\nOg du burde gjøre det hvis du har avslørt nøklene for noen.",
        "resettokens-no-tokens": "Det finnes ingen merker å nullstille.",
-       "resettokens-legend": "Nullstill merker",
        "resettokens-tokens": "Merker:",
        "resettokens-token-label": "$1 (aktuell verdi: $2)",
        "resettokens-watchlist-token": "Webmatenøkkel (Atom/RSS) for [[Special:Watchlist|endringer av sider på din overvåkningsliste]]",
        "creating": "Oppretter $1",
        "editingsection": "Redigerer $1 (avsnitt)",
        "editingcomment": "Redigerer $1 (ny seksjon)",
-       "editconflict": "Redigeringskonflikt: $1",
+       "editconflict": "Endringene dine kunne ikke lagres på grunn av en redigeringskonflikt. Vil {{GENDER:|du}} løse konflikten manuelt?",
        "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",
        "randomincategory-nopages": "Det finnes ingen sider i [[:Category:$1|$1]]-kategorien.",
        "randomincategory-category": "Kategori:",
        "randomincategory-legend": "Tilfeldig side i kategori",
+       "randomincategory-submit": "{{int:Go}}",
        "randomredirect": "Tilfeldig omdirigering",
        "randomredirect-nopages": "Det er ingen omdirigeringer i navnerommet $1.",
        "statistics": "Statistikk",
        "deletedwhileediting": "'''Advarsel:''' Denne siden har blitt slettet etter at du begynte å redigere den!",
        "confirmrecreate": "«[[User:$1|$1]]» ([[User talk:$1|diskusjon]]) slettet siden etter at du begynte å redigere den, med begrunnelsen «$2». Vennligst bekreft at du vil gjenopprette siden.",
        "confirmrecreate-noreason": "Brukeren [[User:$1|$1]] ([[User talk:$1|diskusjon]]) slettet denne siden etter at du begynte å redigere. Bekreft at du virkelig ønsker å gjenopprette denne siden.",
-       "recreate": "Gjenopprett",
+       "recreate": "Siden har blitt slettet etter at du begynte å redigere. Trykk \"$1\" for å gjenopprette den.",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Vil du slette tjenerens mellomlagrede versjon (''cache'') av denne siden?",
        "confirm-purge-bottom": "Rensing av en side sletter mellomlageret og tvinger frem den nyeste versjonen.",
index f6025d8..8d2ef07 100644 (file)
        "hidetoc": "लुकाउनुहोस्",
        "collapsible-collapse": "खुम्च्याउने",
        "collapsible-expand": "फैलाउ",
-       "confirmable-confirm": "तपाà¤\88à¤\82 {{GENDER:$1|लिà¤\99à¥\8dà¤\97}} à¤¹à¥\8b?",
+       "confirmable-confirm": "à¤\95à¥\87 {{GENDER:$1|तपाà¤\88à¤\82}} à¤¸à¥\81निशà¥\8dà¤\9aित à¤¹à¥\81नà¥\81हà¥\81नà¥\8dà¤\9b ?",
        "confirmable-yes": "हो",
        "confirmable-no": "होइन",
        "thisisdeleted": "$1 हेर्ने या पूर्वरुपमा फर्काउने हो?",
        "laggedslavemode": "<strong>चेतावनी:</strong> पृष्ठमा हालका अद्यतनहरू नहुनसक्छन् ।",
        "readonly": "डेटाबेस बन्द गरिएको छ",
        "enterlockreason": "ताल्चा मार्नुको कारण दिनुहोस्, साथै ताल्चा हटाउने समयको अवधि अनुमान लगाउनुहोस्।",
-       "readonlytext": "समà¥\8dभवतà¤\83 à¤¨à¤¿à¤¯à¤®à¤¿à¤¤ à¤¡à¥\87à¤\9fाबà¥\87स à¤°à¤\96-रà¤\96ाà¤\89à¤\95à¥\8b à¤\95ारण à¤\85हिलà¥\87लाà¤\88 à¤¨à¤¯à¤¾à¤\81 à¤¡à¥\87à¤\9fाबà¥\87स à¤ªà¥\8dरविषà¥\8dà¤\9fà¥\80 à¤° à¤\85नà¥\8dय à¤¸à¤\82शà¥\8bधनहरà¥\81  बन्द राखिएकोछ,, जसलाई पछिबाट सामान्य गरिनेछ। \nप्रबन्धक जसले यो बन्द गरेकाछन्, यो स्पष्टीकरण दिएकाछन्: $1",
+       "readonlytext": "समà¥\8dभवतà¤\83 à¤¨à¤¿à¤¯à¤®à¤¿à¤¤ à¤¡à¥\87à¤\9fाबà¥\87स à¤°à¤\96-रà¤\96ाà¤\89à¤\95à¥\8b à¤\95ारण à¤\85हिलà¥\87लाà¤\88 à¤¨à¤¯à¤¾à¤\81 à¤¡à¥\87à¤\9fाबà¥\87स à¤ªà¥\8dरविषà¥\8dà¤\9fà¥\80 à¤° à¤\85नà¥\8dय à¤¸à¤\82शà¥\8bधनहरà¥\82  बन्द राखिएकोछ,, जसलाई पछिबाट सामान्य गरिनेछ। \nप्रबन्धक जसले यो बन्द गरेकाछन्, यो स्पष्टीकरण दिएकाछन्: $1",
        "missing-article": "नाम \"$1\" $2 भएको भेटिनु पर्ने पृष्ठको पाठ डेटाबेसले  भेटाइएन, \n\nयस्तो प्राय: मिति नाघिसकेको भिन्न वा इतिहास वा कुनै मेटिसकेको पानाको लिंक पहिल्याउनाले हुन्छ ।\n\nयदि यस्तो भएको होइन भने सफ्टवेयरको त्रुटि पनि हुनसक्छ ।\nकृपया यसको url खुलाइ [[Special:ListUsers/sysop|प्रबन्धक]]लाई उजुरी गर्नुहोस्",
        "missingarticle-rev": "(संशोधन #: $1)",
        "missingarticle-diff": "(परि: $1, $2)",
        "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|तपाईंको ध्यानसूचीमा रहेका पृष्ठहरूमा भएको परिवर्तनहरू]]को वेब फिड (एटम/आरयसयस) निमित्त टोकन",
        "yourtext": "तपाईंका पाठहरु",
        "storedversion": "संग्रहित पुनरावलोकन",
        "nonunicodebrowser": "<strong>चेतावनी: तपाईंको ब्राउजर युनिकोडलाई स्वीकार गर्दैन।</strong> \nतपाईंद्वारा सहि रुपले पृष्ठ सम्पादनको लागि: गैर-एयससिआइआइ क्यारेक्टर हेक्जाडेसिमल कोड (hexadecimal) मा देखाइनेछ।",
-       "editingold": "<strong>चेतावनी: तपाईं यस पृष्ठको अति पुरनो अप्रचलित संशोधनलाई सम्पादन गर्नुहुँदैछ।<strong>\nयदि तपाईंले यस परिवर्तनलाई सङ्ग्रह गर्नु भयो भने यस पछिका संशोधनहरू नष्ट हुनेछन्।",
+       "editingold": "<strong>à¤\9aà¥\87तावनà¥\80: à¤¤à¤ªà¤¾à¤\88à¤\82 à¤¯à¤¸ à¤ªà¥\83षà¥\8dठà¤\95à¥\8b à¤\85ति à¤ªà¥\81रानà¥\8b à¤\85पà¥\8dरà¤\9aलित à¤¸à¤\82शà¥\8bधनलाà¤\88 à¤¸à¤®à¥\8dपादन à¤\97रà¥\8dनà¥\81हà¥\81à¤\81दà¥\88à¤\9b।<strong>\nयदि à¤¤à¤ªà¤¾à¤\88à¤\82लà¥\87 à¤¯à¤¸ à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनलाà¤\88 à¤¸à¤\99à¥\8dà¤\97à¥\8dरह à¤\97रà¥\8dनà¥\81 à¤­à¤¯à¥\8b à¤­à¤¨à¥\87 à¤¯à¤¸ à¤ªà¤\9bिà¤\95ा à¤¸à¤\82शà¥\8bधनहरà¥\82 à¤¨à¤·à¥\8dà¤\9f à¤¹à¥\81नà¥\87à¤\9bनà¥\8d।",
        "yourdiff": "भिन्नताहरु",
        "copyrightwarning": "कृपया ध्यान दिनुहोस् यस {{SITENAME}}मा दिइएका योगदानहरू $2को अनुसार सम्पादन र पुनर्वितरणकोलागि खुला मानिनेछ (विवरणकोलागि $1 हेर्नुहोस्) । यदि तपाईंको लेखलाई सम्पादन अथवा पुनः वितरण गराउन चाहनुहुन्न भने कृपया यहाँ तपाईंको लेख प्रस्तुत नगर्नुहोस् ।<br />       \nयदि तपाईं किटानसाथ भन्नुहुन्छ कि कुनै लेख मैले लेखेको हो अथवा सार्वजनिक ज्ञानक्षेत्र अथवा मुक्त संसाधनबाट लिइएको हो, '''यस्तो लेख कपिराइटबिना यहाँ नराख्नुहोस्!'''",
-       "copyrightwarning2": "à¤\95à¥\83पया à¤§à¥\8dयान à¤¦à¤¿à¤¨à¥\81हà¥\8bसà¥\8d à¤¯à¤¸ {{SITENAME}}मा à¤¦à¤¿à¤\87à¤\8fà¤\95ा à¤¯à¥\8bà¤\97दानहरà¥\81लाà¤\88 à¤\85नà¥\8dय à¤¯à¥\8bà¤\97दाताहरà¥\81दà¥\8dवारा à¤¸à¤®à¥\8dपादन à¤\97रिनà¥\87à¤\9b, à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रिनà¥\87à¤\9b à¤\85थवा à¤¹à¤\9fाà¤\87नà¥\87à¤\9b। à¤¯à¤¦à¤¿  à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95à¥\8b à¤²à¥\87à¤\96लाà¤\88 à¤¨à¤¿à¤°à¥\8dदयता à¤ªà¥\82रà¥\8dवà¤\95 à¤¸à¤®à¥\8dपादन à¤\97रà¥\87à¤\95à¥\8b à¤\9aाहनà¥\81हà¥\81नà¥\8dन à¤­à¤¨à¥\87à¤\82 à¤¤à¥\8dयà¥\8b à¤¯à¤¹à¤¾à¤\81 à¤¨à¤¦à¤¿à¤¨à¥\81हà¥\8bसà¥\8d।<br />\nयदि à¤¤à¤ªà¤¾à¤\88à¤\82 à¤\95िà¤\9fानसाथ à¤­à¤¨à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b à¤\95ि à¤¯à¥\8b à¤²à¥\87à¤\96 à¤¤à¤ªà¤¾à¤\88à¤\82 à¤\86फà¥\88 लेखेको हो अथवा सार्वजनिक ज्ञानक्षेत्र अथवा मुक्त संसाधनबाट लिइएको हो (विवरणकोलागि हेर्नुहोस् $1 ). \n'''कपीराइट भएको रचना अनुमति बिना  यहाँ नदिनुहोस्!'''",
+       "copyrightwarning2": "à¤\95à¥\83पया à¤§à¥\8dयान à¤¦à¤¿à¤¨à¥\81हà¥\8bसà¥\8d à¤¯à¤¸ {{SITENAME}}मा à¤¦à¤¿à¤\87à¤\8fà¤\95ा à¤¯à¥\8bà¤\97दानहरà¥\82लाà¤\88 à¤\85नà¥\8dय à¤¯à¥\8bà¤\97दानà¤\95रà¥\8dताहरà¥\82दà¥\8dवारा à¤¸à¤®à¥\8dपादन à¤\97रिनà¥\87à¤\9b, à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रिनà¥\87à¤\9b à¤\85थवा à¤¹à¤\9fाà¤\87नà¥\87à¤\9b। à¤¯à¤¦à¤¿ à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95à¥\8b à¤²à¥\87à¤\96लाà¤\88 à¤¨à¤¿à¤°à¥\8dदयता à¤ªà¥\82रà¥\8dवà¤\95 à¤¸à¤®à¥\8dपादन à¤\97रà¥\87à¤\95à¥\8b à¤\9aाहनà¥\81हà¥\81नà¥\8dन à¤­à¤¨à¥\87 à¤¤à¥\8dयà¥\8b à¤¯à¤¹à¤¾à¤\81 à¤¨à¤¦à¤¿à¤¨à¥\81हà¥\8bसà¥\8d।<br />\nयदि à¤¤à¤ªà¤¾à¤\88à¤\82 à¤\95िà¤\9fानसाथ à¤­à¤¨à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b à¤\95ि à¤¯à¥\8b à¤²à¥\87à¤\96 à¤¤à¤ªà¤¾à¤\88à¤\82 à¤\86फà¥\88लà¥\87 लेखेको हो अथवा सार्वजनिक ज्ञानक्षेत्र अथवा मुक्त संसाधनबाट लिइएको हो (विवरणकोलागि हेर्नुहोस् $1 ). \n'''कपीराइट भएको रचना अनुमति बिना  यहाँ नदिनुहोस्!'''",
        "longpageerror": "'''त्रुटि: तपाईंले बुझाएको पाठ {{PLURAL:$1|one किलोबाइट|$1 किलोबाइट}} लामो छ, जो अधिकतम {{PLURAL:$2|one किलोबाइट|$2 किलोबाइट}} भन्दा लामो छ।'''\nयो संग्रहित हुन सक्तैन।",
-       "readonlywarning": "<strong>चेतावनी: तथ्याक मर्मतको निम्ति बन्द गरिएकोछ, यस कारण तपाईं आफ्नो सम्पादन अहिले सङ्ग्रह गर्न सक्नुहुन्न।</strong>\n\nयदि तपाईं चाहनुहुन्छ भने अहिले यहाँ भएका पाठलाई कट गरि कतै टेक्स्ट फाइलमा पेस्ट गरेर सङ्ग्रह गर्न सक्नुहुन्छ।\n\nप्रवन्धक जसले यो बन्द गरेको छ उसले यस्तो विवरण दिएको छ: $1",
+       "readonlywarning": "<strong>à¤\9aà¥\87तावनà¥\80: à¤¤à¤¥à¥\8dयाà¤\99à¥\8dà¤\95 à¤®à¤°à¥\8dमतà¤\95à¥\8b à¤¨à¤¿à¤®à¥\8dति à¤¬à¤¨à¥\8dद à¤\97रिà¤\8fà¤\95à¥\8bà¤\9b, à¤¯à¤¸ à¤\95ारण à¤¤à¤ªà¤¾à¤\88à¤\82 à¤\86फà¥\8dनà¥\8b à¤¸à¤®à¥\8dपादन à¤\85हिलà¥\87 à¤¸à¤\99à¥\8dà¤\97à¥\8dरह à¤\97रà¥\8dन à¤¸à¤\95à¥\8dनà¥\81हà¥\81नà¥\8dन।</strong>\n\nयदि à¤¤à¤ªà¤¾à¤\88à¤\82 à¤\9aाहनà¥\81हà¥\81नà¥\8dà¤\9b à¤­à¤¨à¥\87 à¤\85हिलà¥\87 à¤¯à¤¹à¤¾à¤\81 à¤­à¤\8fà¤\95ा à¤ªà¤¾à¤ à¤²à¤¾à¤\88 à¤\95à¤\9f à¤\97रि à¤\95तà¥\88 à¤\9fà¥\87à¤\95à¥\8dसà¥\8dà¤\9f à¤«à¤¾à¤\87लमा à¤ªà¥\87सà¥\8dà¤\9f à¤\97रà¥\87र à¤¸à¤\99à¥\8dà¤\97à¥\8dरह à¤\97रà¥\8dन à¤¸à¤\95à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b।\n\nपà¥\8dरवनà¥\8dधà¤\95 à¤\9cसलà¥\87 à¤¯à¥\8b à¤¬à¤¨à¥\8dद à¤\97रà¥\87à¤\95à¥\8b à¤\9b à¤\89सलà¥\87 à¤¯à¤¸à¥\8dतà¥\8b à¤µà¤¿à¤µà¤°à¤£ à¤¦à¤¿à¤\8fà¤\95à¥\8b à¤\9b: $1",
        "protectedpagewarning": "<strong>सूचना: यस पृष्ठलाई सुरक्षित गरिएको छ यसकारण प्रवन्धकको विशेषाधिकार प्राप्त प्रयोगकर्ताहरूले मात्र यसलाई सम्पादन गर्न सक्छन् ।</strong>\nसन्दर्भको लागि नविनतम लग प्रविष्टि तल दिइएको छ:",
        "semiprotectedpagewarning": "<strong>सूचना:</strong> यो पृष्ठलाई सुरक्षित गरिएको हुँदा दर्ता भएका प्रयोगकर्ताहरूले मात्र यसलाई सम्पादन गर्न सक्छन् ।\nसन्दर्भको लागि नविनतम लग प्रविष्टि तल दिइएको छ:",
        "cascadeprotectedwarning": "<strong>चेतावनी:</strong> यस पृष्ठलाई सुरक्षित गरिएको छ यसकारण संशोधन प्रवन्धनको विशेषाधिकार प्राप्त प्रयोगकर्ताले मात्र सम्पादन गर्न सक्नेछन् किन भने यो {{PLURAL:$1|पृष्ठ|पृष्ठहरू}}को सुरक्षित निम्न सूचीमा सुरक्षित छ:",
        "titleprotectedwarning": "<strong>चेतावनी: यो पृष्ठलाई सुरक्षित गरिएको छ र यसलाई सृजना गर्न  [[Special:ListGroupRights|विशेषाधिकार]] चाहिन्छ।</strong>\nसन्दर्भको लागि नवीनतम लग प्रविष्टि तल दिइएको छ:",
        "templatesused": "यस पृष्ठमा प्रयोग भएका {{PLURAL:$1|Template|ढाँचाहरू}} :",
        "templatesusedpreview": "यस पृष्ठमा प्रयोग भएका {{PLURAL:$1|Template|ढाँचाहरू}} :",
-       "templatesusedsection": "{{PLURAL:$1|ढाँचा प्रयोग गरिएको छ|ढाँचाहरु प्रयोग गरिएका छन्}} यस खण्डमा:",
+       "templatesusedsection": "यस खण्डमा {{PLURAL:$1|ढाँचा प्रयोग गरिएको छ|ढाँचाहरू प्रयोग गरिएका छन्}}",
        "template-protected": "(सुरक्षित)",
        "template-semiprotected": "(अर्ध-सुरक्षित)",
        "hiddencategories": "यो पृष्ठ निम्न {{PLURAL:$1|1 लुकाइएको श्रेणी|$1 लुकाइएका श्रेणीहरू}}को सदस्य हो :",
        "content-failed-to-parse": "$1 को लागि $2 सामग्रीलाई पार्स गर्न विफल, त्रुटि: $3",
        "invalid-content-data": "अमान्य सामग्री डेटा",
        "content-not-allowed-here": "सामग्री \"$1\"  [[$2]] पृष्ठमा राख्न अनुमती छैन ।",
-       "editwarning-warning": "यस à¤ªà¥\83षà¥\8dठबाà¤\9f à¤¬à¤¾à¤¹à¤¿à¤° à¤\9cाà¤\81दा à¤¤à¤ªà¤¾à¤\88à¤\82 à¤¦à¥\8dवारा à¤\97रिà¤\8fà¤\95à¥\8b à¤\95à¥\81नà¥\88 à¤\95à¥\8bà¤\88 à¤ªà¤¨à¤¿ à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¹à¤°à¤¾à¤\89नà¥\87à¤\9b।\nयदि à¤¤à¤ªà¤¾à¤\88à¤\82लà¥\87 à¤²à¤\97 à¤\87न à¤\97रà¥\8dनà¥\81भà¤\8fà¤\95à¥\8b à¤\9b à¤­à¤¨à¥\87 à¤¤à¤ªà¤¾à¤\88à¤\82 à¤¯à¤¸ à¤¸à¥\82à¤\9aनालाà¤\88 à¤¦à¥\87à¤\96ाà¤\89न à¤\86फà¥\8dनà¥\8b à¤\85भिरà¥\82à¤\9aà¥\80हरà¥\82à¤\95à¥\8b \"{{int:prefs-editing}}\" à¤­à¤¾à¤\97मा à¤\97à¤\8fर à¤¬à¤¨à¥\8dद à¤\97रà¥\8dन à¤¸à¤\95à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b।",
+       "editwarning-warning": "यà¥\8b à¤ªà¥\83षà¥\8dठबाà¤\9f à¤¬à¤¾à¤¹à¤¿à¤° à¤\9cाà¤\81दा à¤¤à¤ªà¤¾à¤\88à¤\82 à¤¦à¥\8dवारा à¤\97रिà¤\8fà¤\95à¥\8b à¤\95à¥\81नà¥\88 à¤ªà¤¨à¤¿ à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¹à¤°à¤¾à¤\89नà¥\87à¤\9b।\nयदि à¤¤à¤ªà¤¾à¤\88à¤\82लà¥\87 à¤²à¤\97 à¤\87न à¤\97रà¥\8dनà¥\81भà¤\8fà¤\95à¥\8b à¤\9b à¤­à¤¨à¥\87 à¤¤à¤ªà¤¾à¤\88à¤\82 à¤¯à¤¸ à¤¸à¥\82à¤\9aनालाà¤\88 à¤¦à¥\87à¤\96ाà¤\89न à¤\86फà¥\8dनà¥\8b à¤\85भिरà¥\82à¤\9aà¥\80हरà¥\82à¤\95à¥\8b \"{{int:prefs-editing}}\" à¤­à¤¾à¤\97मा à¤\97à¤\8fर à¤¬à¤¨à¥\8dद à¤\97रà¥\8dन à¤¸à¤\95à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b।",
        "editpage-notsupportedcontentformat-title": "सामग्री प्रकार समर्थित छैन",
        "editpage-notsupportedcontentformat-text": "$1 सामग्री स्वरूप $2 सामग्री मोडलद्वारा समर्थित छैन।",
        "content-model-wikitext": "विकिपाठ",
        "content-model-javascript": "जाभास्क्रिप्ट",
        "content-json-empty-object": "खाली वस्तु",
        "content-json-empty-array": "खाली एरे",
-       "duplicate-args-category": "ढाँचाको यस खण्डमा पृष्ठहरू दोहो तर्कहरू प्रयोग गरि रहेका छन्",
+       "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": "'''चेतावनी:''' यस पृष्टका अति धेरै संख्याका महँगा पार्सर फंक्सन कल्स (expensive parser function calls)  छन्।\nयसमा $2 भन्दा कम {{PLURAL:$2|कल|कल्स}} हुनुपर्छ,  यहाँ {{PLURAL:$1|अहिले $1 कल छ|अहिले $1 कल्स छ्न्}}.",
        "expensive-parserfunction-category": "अति धेरै मेहनत पर्ने '''पार्सर फङ्सन कल'''हरू भएका पृष्ठहरू",
        "last": "अघिल्लो",
        "page_first": "पहिलो",
        "page_last": "अन्तिम",
-       "histlegend": "à¤\85à¤\82तर à¤\9aयन:सà¤\82शà¥\8bधनहरà¥\81à¤\95à¥\8b à¤¤à¥\81लनाà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤°à¥\87डियà¥\8b à¤¬à¤\95à¥\8dसमा à¤\95à¥\8dलिà¤\95 à¤\97रà¥\87र à¤\8fणà¥\8dà¤\9fर à¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d à¤\85थवा à¤¤à¤² à¤¦à¤¿à¤\8fà¤\95à¥\8b à¤¬à¤\9fनमा à¤¥à¤¿à¤\9aà¥\8dनà¥\81हà¥\8bसà¥\8d <br />\nलिà¤\9cà¥\87à¤\82ड: (à¤\9aालà¥\82): '''({{int:cur}})''' = à¤\85वतरणà¤\95à¥\8b à¤¬à¥\80à¤\9aमा à¤\85à¤\82तर, '''({{int:last}})''' = à¤ªà¤¹à¤¿à¤²à¤¾à¤\95ा à¤\85वतरणà¤\95à¥\8b à¤¬à¥\80à¤\9aमा à¤\85à¤\82तर, '''{{int:minoreditletter}}''' = सानो परिवर्तन।",
+       "histlegend": "à¤\85नà¥\8dतर à¤\9aयन:सà¤\82शà¥\8bधनहरà¥\82à¤\95à¥\8b à¤¤à¥\81लनाà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤°à¥\87डियà¥\8b à¤¬à¤¾à¤\95समा à¤\95à¥\8dलिà¤\95 à¤\97रà¥\87र à¤\87णà¥\8dà¤\9fर à¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d à¤\85थवा à¤¤à¤² à¤¦à¤¿à¤\8fà¤\95à¥\8b à¤¬à¤\9fनमा à¤¥à¤¿à¤\9aà¥\8dनà¥\81हà¥\8bसà¥\8d <br />\nलिà¤\9cà¥\87à¤\82ड: (à¤\9aालà¥\82): '''({{int:cur}})''' = à¤\85वतरणà¤\95à¥\8b à¤¬à¥\80à¤\9aमा à¤\85नà¥\8dतर, '''({{int:last}})''' = à¤ªà¤¹à¤¿à¤²à¤¾à¤\95ा à¤\85वतरणà¤\95à¥\8b à¤¬à¥\80à¤\9aमा à¤\85नà¥\8dतर, '''{{int:minoreditletter}}''' = सानो परिवर्तन।",
        "history-fieldset-title": "इतिहासको विचरण गर्ने",
        "history-show-deleted": "मेटिएका मात्र",
        "histfirst": "पुरानो",
        "histlast": "नयाँ",
-       "historysize": "({{PLURAL:$1|१ à¤¬à¤¾à¤\87à¤\9f |$1 à¤¬à¤¾à¤\87à¤\9fहरà¥\81}})",
+       "historysize": "({{PLURAL:$1|१ à¤¬à¤¾à¤\87à¤\9f |$1 à¤¬à¤¾à¤\87à¤\9fहरà¥\82}})",
        "historyempty": "(खाली)",
        "history-feed-title": "पुनरावलोकन इतिहास",
        "history-feed-description": "विकीमा यो पृष्ठको पुनरावलोकन इतिहास",
        "rev-deleted-text-permission": "यस पृष्ठको पुनरावलोकन '''मेटिएकोछ'''।\nयसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को मेटिएको लगमा पाउन सकिन्छ]।",
        "rev-suppressed-text-permission": "यो पृष्ठ संशोधनलाई <strong>दमन</strong> गरिएको छ । \nविस्तृत जानकारी [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} दमन लग]मा पाउन सकिन्छ ।",
        "rev-deleted-text-unhide": "यस पृष्ठको संशोधन '''मेटिएकोछ'''।\nयसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}} को मेटिएको लगमा पाउन सकिन्छ].\nयदि चाहनु भयो भनें [$1 संशोधन हेर्न] सक्नुहुन्छ।",
-       "rev-suppressed-text-unhide": "यस पृष्ठको पुनरावलोकन '''दमन''' गरिएको छ ।\nविस्तृत जानकारी [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}} दमन लग] पाउन सकिन्छ ।\nयदि तपाई अगाडि बढ्न चाहनु हुन्छ भने पनि तपाईले  [$1 यि संशोधनहरु हेर्न] पाउनु हुनेछ ।",
+       "rev-suppressed-text-unhide": "यस पृष्ठको पुनरावलोकन '''दमन''' गरिएको छ ।\nविस्तृत जानकारी [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}} दमन लग] पाउन सकिन्छ ।\nयदि तपाईं अगाडि बढ्न चाहनु हुन्छ भने पनि तपाईंले  [$1 यि संशोधनहरू हेर्न] पाउनु हुनेछ ।",
        "rev-deleted-text-view": "यस पृष्ठको संशोधन '''मेटिएकोछ'''।\nतपाईंले हेर्न सक्नुहुन्छ; [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} मेटिएको लगमा विवरण पाउन सकिन्छ]।",
        "rev-suppressed-text-view": "यस पृष्ठको पुनरावलोकन <strong>थिचिएको छ</strong>।\nप्रबन्धकको हैसियतले हेर्न सक्नुहुन्छ; [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को थिचिएको लगमा विवरण पाउन सकिन्छ]",
        "rev-deleted-no-diff": "तपाईंले यसको भिन्नता पाउन सक्नुहुन्न किनभने यस पृष्ठको पुनरावलोकन <strong>मेटाइएको छ</strong>'।\nयसको विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को मेटाइएको लगमा पाउन सक्नुहुन्छ]।",
        "diff-empty": "(कुनै भिन्नता छैन)",
        "diff-multi-sameuser": "(यस प्रयोगकर्ताद्वारा {{PLURAL:$1|गरिएको बीचको एउटा अवतरण देखाइएन|गरिएको बीचको $1 अवतरण देखाइएन}})",
        "diff-multi-otherusers": "({{PLURAL:$2|एक अन्य प्रयोगकर्ता|$2 प्रयोगकर्ताहरू}} द्वारा {{PLURAL:$1|गरिएको बीचको एक अवतरण देखाइएन|गरिएको बीचको $1 अवतरण देखाइएन}})",
-       "diff-multi-manyusers": "($2 {{PLURAL:$2|भनà¥\8dदा à¤\85धिà¤\95 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता|भनà¥\8dदा à¤\85धिà¤\95 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताहरà¥\81}}दà¥\8dवारा {{PLURAL:$1|à¤\8fà¤\89à¤\9fा à¤®à¤§à¥\8dयवरà¥\8dतà¥\80 à¤¸à¤\82शà¥\8bधन|$1 à¤®à¤§à¥\8dयवरà¥\8dतà¥\80 à¤¸à¤\82शà¥\8bधनहरà¥\81}} नदेखाइएको)",
+       "diff-multi-manyusers": "($2 {{PLURAL:$2|भनà¥\8dदा à¤\85धिà¤\95 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता|भनà¥\8dदा à¤\85धिà¤\95 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताहरà¥\82}}दà¥\8dवारा {{PLURAL:$1|à¤\8fà¤\89à¤\9fा à¤®à¤§à¥\8dयवरà¥\8dतà¥\80 à¤¸à¤\82शà¥\8bधन|$1 à¤®à¤§à¥\8dयवरà¥\8dतà¥\80 à¤¸à¤\82शà¥\8bधनहरà¥\82}} नदेखाइएको)",
        "difference-missing-revision": "यस अन्तर {{PLURAL:$2|को एक अवतरण|को $2 अवतरण}} ($1)  {{PLURAL:$2|भेटिएन|खोज्न सकिएन}}।\n\nयो सामान्य रूपमा एउटा हताइएको पृष्ठको अवतरणहरूमा अन्तर खोज्दा हुन्छ । अधिक जानकारी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटाइएको लग]मा हेर्न सकिन्छ।",
        "searchresults": "खोज नतिजाहरू",
        "searchresults-title": " \"$1\"को लागि खोज नतिजाहरु",
        "largefileserver": "उर्ध्वभरण गरिएको फाइल सर्भरमा निर्धारित सीमा भन्दा ठूलो छ।",
        "emptyfile": "तपाईले उर्ध्वभरण गर्नुभएको फाइल रित्तो छ।\nयो फाइलनाम गलत राखिएको कारणले भएको हुनसक्छ\nयो फाइल साच्चै उर्ध्वभरण गर्नेकुरामा निश्चित हुनुहोस् ।",
        "windows-nonascii-filename": "विशेष वर्ण सहितका फाइलनामहरु यस विकिद्वारा समर्थित छैनन् ।",
-       "fileexists": "यो नामको फाइल पहिले नैं छ, यदि तपाईं परिवर्तन गर्ने कुरामा सुनिश्चित हुनुहुन्न भने कृपया <strong>[[:$1]]</strong> जाँच गर्नुहोस्।\n[[$1|thumb]]",
+       "fileexists": "यो नामको फाइल पहिले नैं छ, यदि तपाईं परिवर्तन गर्ने कुरामा सुनिश्चित हुनुहुन्न भने कृपया <strong>[[:$1]]</strong> जाँच गर्नुहोस्।\n[[$1|thumb]]",
        "filepageexists": "यस फाइलको लागि विवरण पृष्ठ पहिले नै <strong>[[:$1]]</strong> बनाइ सकिएको छ, तर यस नामको कुनै फाइल अहिले उपस्थित छैन। \nतपाईं जुन विवरण दिनुहुन्छ त्यो विवरण पृष्ठमा देखिंदैन। \nतपाईंको आफ्नो विवरणलाई त्यहाँ राख्न म्यानुअली सम्पादन गर्नु पर्नेछ।\n[[$1|thumb]]",
        "fileexists-extension": "यहि नामको एउटा फाइल पहिलेदेखि नैं छ: [[$2|thumb]]\n* उर्ध्वभरण हुँदै गरेको फाइलको नाम: <strong>[[:$1]]</strong>\n* पहिलेदेखि नैं भएको फाइलको नाम: <strong>[[:$2]]</strong>\nकृपया अर्कै नाम रोज्नुहोस्।",
        "fileexists-thumbnail-yes": "यो फाइल ठुलो चित्रको सानो आकार ''(थम्बनेल)'' जस्तो देखिन्छ। [[$1|thumb]]\n<strong>[[:$1]]</strong> फाइललाई हेर्ने।\nयदि जाँच गरिएको फाइल यसै आकारको छ भने सानो आकारको फाइल अपलोड गर्ने आवश्यकता छैन।",
        "upload-description": "फाइल वर्णन",
        "upload-options": "उर्ध्वभरण विकल्पहरु",
        "watchthisupload": "यो पृष्ठ निगरानी गर्नुहोस्",
-       "filewasdeleted": "यस नामको एक फाइल पहिले पनि अपलोड गरे पछि हटाई सकिएको छ।\nपुन अपलोड गर्नु पूर्व तपाईं $1 लाई राम्रो सँग जाँच गर्नुहोला।",
+       "filewasdeleted": "यस नामको एक फाइल पहिले पनि अपलोड गरे पछि हटाई सकिएको छ।\nपुनः अपलोड गर्नु पूर्व तपाईं $1 लाई राम्रोसँग जाँच गर्नुहोला।",
        "filename-bad-prefix": "तपाईं जुन फाइल अपलोड गर्दै हुनुहुन्छ त्यसको नाम <strong>\"$1\"</strong>बाट शुरू हुन्छ, जुन डिजिटल क्यामराद्वारा दिइएको नाम हो।\nकृपया यस फाइलको लागि कुनै दोश्रो अधिक जानकारीयुक्त नाम छान्नुहोस्।",
        "upload-success-subj": "उर्ध्वभरण सफल",
        "upload-success-msg": "[$2]बाट त्पाईंको उर्ध्वभरण सफल भयो। त्यो यहाँ पाउन सकिनेछ: [[:{{ns:file}}:$1]]",
        "randomincategory-nopages": "यस [[:Category:$1|$1]] श्रेणीमा कुनै पनि पृष्ठ छैन् ।",
        "randomincategory-category": "श्रेणी:",
        "randomincategory-legend": "श्रेणीमा अनियमित पृष्ठ",
+       "randomincategory-submit": "जाउ",
        "randomredirect": "कुनै एउटा अनुप्रेषितमा जाने",
        "randomredirect-nopages": "\"$1\" नामस्थानमा अनुप्रेषित छैन।",
        "statistics": "तथ्यांक",
        "emailuser-title-target": "{{GENDER:$1|प्रयोगकर्ता}}लाई इमेल गर्ने",
        "emailuser-title-notarget": "प्रयोगकर्तालाई इमेल गर्नुहोस्",
        "emailpage": "प्रयोगकर्तालाई इमेल गर्नुहोस्",
-       "emailpagetext": "तल दिइएको फर्मले तपाईं यस {{GENDER:$1|प्रयोगकर्ता}}लाई इमेल पठाउन सक्नुहुन्छ। तपाईं जुन ठेगाना [[Special:Preferences|आफ्नो प्रयोगकर्ता अभिरूचीहरू]]मा दिनुभएको थियो त्यो यस इमेललाई \"पठाउने\" को रूपमा आउनेछ, अतः प्राप्तकर्ता तपाईंलाई सिधै जवाफ दिनसक्छ।",
+       "emailpagetext": "तल दिइएको फर्मले तपाईं यस {{GENDER:$1|प्रयोगकर्ता}}लाई इमेल पठाउन सक्नुहुन्छ। तपाईंले जुन ठेगाना [[Special:Preferences|आफ्नो प्रयोगकर्ता अभिरूचीहरू]]मा दिनुभएको थियो त्यो यस इमेललाई \"पठाउने\" को रूपमा आउनेछ, अतः प्राप्तकर्ता तपाईंलाई सिधै जवाफ दिनसक्छ।",
        "defemailsubject": "{{SITENAME}} प्रयपोगकर्ता \"$1\" बाट इमेल",
        "usermaildisabled": "प्रयोगकर्ता इमेल निरस्त गरिएको",
        "usermaildisabledtext": "यस विकिमा तपाईं अरु प्रयोगकर्तालाई ई-मेल पठाउन सक्नुहुन्न",
        "restriction-level": "प्रतिबन्ध स्तरः",
        "minimum-size": "न्यूनतम आकार",
        "maximum-size": "अधिकतम आकार:",
-       "pagesize": "(बाà¤\87à¤\9fहरà¥\81)",
+       "pagesize": "(बाà¤\87à¤\9fहरà¥\82)",
        "restriction-edit": "सम्पादन गर्ने",
        "restriction-move": "सार्ने",
        "restriction-create": "सृजना गर्ने",
        "undeletepagetext": "निम्नलिखित {{PLURAL:$1|पृष्ठ मेटिएकोछ तर पूरालेखभित्रै छ|$1 पृष्ठ मेटिएकाछन् तर पूरालेखभित्रै छन्}} र पुनर्स्थापित गर्न सकिन्छ।\nपूरालेखको समय-समयमा सफाई गर्न सकिन्छ।",
        "undelete-fieldset-title": "पुनरावलोकनहरु  पूर्वावस्थामा ल्याउनुहोस्",
        "undeleteextrahelp": "यस पृष्ठक पुरै इतिहास पूर्वरुपमा फर्काउनको लागि  छनोट सन्दुकहरुलाई नछानी '''''{{int:undeletebtn}}''''' मा क्लिक गर्नुहोस।\nअनुकुल पूर्वरुपमा फर्काउने कार्य गर्न छनौट चाहिएका संस्करणक सन्दुकहरुलाई छानेर '''''{{int:undeletebtn}}'''''मा क्लिक गर्नुहोस।",
-       "undeleterevisions": "$1 {{PLURAL:$1|सà¤\82शà¥\8bधन|सà¤\82शà¥\8bधनहरà¥\81}} संग्रहित",
+       "undeleterevisions": "$1 {{PLURAL:$1|सà¤\82शà¥\8bधन|सà¤\82शà¥\8bधनहरà¥\82}} संग्रहित",
        "undeletehistory": "यदि कुनै पृष्टलाई पुन: स्थापन गराउनु भयो भने सम्पूर्ण संस्करणहरू इतिहासमा पुन:स्थापन हुनेछन् ।\nयदि यसै नामबाट  नयाँ पृष्ठ निर्माण भैसकेको छ भने पुन: स्थापित संस्करणहरू पूर्व इतिहासको रुपमा स्थापित हुनेछन् ।",
        "undeleterevdel": "यदि यो माथिल्लो पृष्ठ बन्छ  या फाइल संस्करणहरू आंशिक मेटिएका छन् भने मेट्ने काम रद्द गरिने छैन।\nत्यस अवस्थामा तपाईंले छनौटमा अन्तिम मेटिएको नयाँ संस्करण नलुकाउनेमा चिनो लगाउनु पर्छ ।",
        "undeletehistorynoadmin": "यस पृष्ठ मेटिएको छ।\nमेटिनाको कारण निम्न जानकारीहरुमा खुलाइएको छ र मेटिनु अगिका योगदानकर्ताहरुको नाम पनि \nमेटिएका पृष्ठको पूरा पाठ प्रवन्धकहरुलाई मात्र उपलब्ध हुन्छ ।",
-       "undelete-revision": "Deleted revision of $1 (as of $4, at $5) by $3:\n\n$3द्वारा $1को ($4को  समय $5 मा) मेटाइएका संशोधनहरु :",
+       "undelete-revision": "$3द्वारा $1को ($4को  समय $5 मा) मेटाइएका संशोधनहरू :",
        "undeleterevision-missing": "अमान्य या मेटिएको संस्करण ।\nखराब लिन्क पनि सक्छ  या संस्करण पुन: स्थापना गरिएको या अभिलेखबाट हटाइएको हुनसक्छ ।",
        "undelete-nodiff": "कुनै पनि पुरानो पुनरावलोकनहरु भेटिएन ।",
        "undeletebtn": "पूर्वावस्थामा ल्याउनुहोस्",
        "undeleteviewlink": "अवलोकन",
        "undeleteinvert": " चयन उल्ट्याउने",
        "undeletecomment": "कारण :",
-       "undeletedrevisions": "{{PLURAL:$1|à¤\8fà¤\89à¤\9fा à¤¸à¤\82शà¥\8bधन|$1 à¤¸à¤\82शà¥\8bधनहरà¥\81}} पुनर्स्थापित गरियो",
+       "undeletedrevisions": "{{PLURAL:$1|à¤\8fà¤\89à¤\9fा à¤¸à¤\82शà¥\8bधन|$1 à¤¸à¤\82शà¥\8bधनहरà¥\82}} पुनर्स्थापित गरियो",
        "undeletedrevisions-files": "{{PLURAL:$1|एउटा संशोधन|$1 संशोधनहरू}} र {{PLURAL:$2|एउटा फाइल|$2 फाइलहरू}} पुनर्स्थापित गरियो",
        "undeletedfiles": "{{PLURAL:$1|१ फाइल|$1 फाइलहरू }} पूर्वस्थितिमा ल्याइयो",
        "cannotundelete": "मेटाएको रद्द गर्ने काम असफल भयो:\n$1",
        "badipaddress": "अमान्य IP ठेगाना",
        "blockipsuccesssub": "निषेधकार्य सफल भयो",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] निषेध गरिएको छ।<br />\nपुनरावलकोनको लागि [[Special:BlockList|आइपी निषेध सूची]] हेर्नहोस्।",
-       "ipb-blockingself": "तपाईंले आफैंलाई रोक लगाउन गइरहनु भएको छ! के तपाईं पक्का यसो गर्न चाहनुहुन्छ?",
+       "ipb-blockingself": "तपाईं आफैलाई रोक लगाउन गइरहनु भएको छ! के तपाईं पक्का यसो गर्न चाहनुहुन्छ?",
        "ipb-confirmhideuser": "तपाईंले त्यस्तो प्रयोगकर्तालाई रोक लगाउन गइरहनु भएको छ जसको  \"प्रयोगकर्ता लुकाउने\" सक्रिय बनाइएको छ। यसो गर्दा सबै लग सूचीहरुबाट प्रयोगकर्ताको नाम गायब हुनेछ। के तपाईं पक्का यसो गर्न चाहनुहुन्छ?",
        "ipb-confirmaction": "यदि तपाईं विश्वासपूर्ण रूपले यहि गर्न चाहनुहुन्छ, भने कृपया \"{{int:ipb-confirm}}\" लाई क्षेत्रबाट छान्नुहोस्।",
        "ipb-edit-dropdown": "निषेध कारण सम्पादन गर्नुहोस्",
        "ipbnounblockself": "तपाई आफैले आफैलाई रोक खुलाउन सक्नुहुन्न ।",
        "lockdb": "डेटाबेस ताल्चामार्ने",
        "unlockdb": "डेटाबेसको ताल्चा खोल्ने",
-       "lockdbtext": "डेटाबेसमा ताला लगाउनाले सबै प्रयोगकर्ता पृष्ठ सम्पादन, आफ्नो अभिरूचीमा परिवर्तन, आफ्नो ध्यानसूचीमा सम्पादन, र अन्य वस्तु जसको लागि डेटाबेसमा परिवर्तन गरें हुन्छ, त्यसबाट वन्चित हुनेछ। कृपया यो सुनिश्चित गर्नुहोस कि तपाईं यो गर्न चाहनुहुन्छ, र तपाईं रक्षण पश्चात ताला खोल्नुहुन्छ।",
+       "lockdbtext": "डेटाबेसमा ताला लगाउनाले सबै प्रयोगकर्ता पृष्ठ सम्पादन, आफ्नो अभिरूचीमा परिवर्तन, आफ्नो ध्यानसूचीमा सम्पादन, र अन्य वस्तु जसको लागि डेटाबेसमा परिवर्तन गरें हुन्छ, त्यसबाट वन्चित हुनेछ। कृपया यो सुनिश्चित गर्नुहोस् कि तपाईं यो गर्न चाहनुहुन्छ, र तपाईं रक्षण पश्चात ताला खोल्नुहुन्छ ।",
        "unlockdbtext": "डेटाबेसको ताला खोल्नका लागि सबै प्रयोगकर्ता पृष्ठ सम्पादन, आफ्नो अभिरूचीहरूमा परिवर्तन, आफ्नो ध्यानसूचीमा सम्पादन, र अन्य वस्तु जसको लागि डेटाबेसमा परिवर्तन गर्नु पर्छ, को सक्षमतालाई पुनर्स्थापित गर्नछ। कृपया यो सुनिश्चित गर्नुस कि तपाईं यो गर्न चाहनुहुन्छ।",
        "lockconfirm": "हो, म साँच्चिकै डेटाबेस थुन्न चाहन्छु।",
        "unlockconfirm": "हो , म साँच्चै  डेटाबेसको ताल्चा खोल्न चाहन्छु ।",
        "move-page": " $1 लाई सार्ने",
        "move-page-legend": "पृष्ठ सार्नुहोस्",
        "movepagetext": "तल दिएको फारमको उपयोगले पृष्ठ नाम परिवर्तन हुनेछ र पृष्ठको सम्पूर्ण इतिहास नयाँ नामको साथमा जानेछ।\nपुरानो शीर्षक नयाँ शीर्षककोलागि अनुप्रेषित पृष्ठ बनिनेछ।\nतपाईंले यो स्वचालित रूपले अनुप्रेषित पृष्ठलाई अपडेट गर्न सक्नुहुनेछ।\nयदि तपाईं हुँदैन चुन्नुहुन्छ भनें जाँचेर सुनिश्चित गर्नुहोस् कि [[Special:DoubleRedirects|दोहोरो]] अथवा [[Special:BrokenRedirects|टुटेको अनुप्रेषण]]।\nतपाईंमाथि यो सुनिश्चित गर्ने उत्तरदायित्व रहन्छ कि लिङ्क कुन विन्दुमा जानु पर्ने हो ।\n\nध्यान दिनुहोस् नयाँ नामको पृष्ठ पहिलेबाट नैं छ भनें पृष्ठ सारिने <strong>छैन</strong>। नयाँ नामको पृष्ठ पहिलेबाट भएर पनि यदि यो खालि छ अथवा अनुप्रेषित छ र सम्पादित इतिहास छैन भनें सारिनेछ।\nयसको अर्थ हुन्छ यदि कुनै गल्ती गरेमा तपाईंले पुनः पुरानै नाम दिनु पर्ने हुन्छ यसलाई अधिलेखन गर्नसक्नु हुनेछैन। \n\n<strong>चेतावनी!</strong>\nयो एक लोकप्रिय पृष्ठको लागि एउटा कठोर र अप्रत्याशित परिवर्तन हुनसक्नेछ;\nकृपया सुनिश्चित गर्नुहोस् कि तपाईंले यसको सही परिणाम बुझ्नु भएको छ अनि मात्र नयाँ नाम दिन अघि बढ्नुहोस्।",
-       "movepagetext-noredirectfixer": "तल दिइएको फारम पृष्ठको नाम परिवर्तन गर्नेछ, उसको सबै इतिहास पनि नयाँ नामले देखिनेछ।\nपुरानो शीर्षक नयाँ नाममा अनुप्रेषण गर्नेछ।\nमूल शीर्षक तर्फ लिएर जाने सबै अनुप्रेषणहरूलाई तपाईं स्वचालित रूपले परिवर्तन गर्न सक्नुहुन्छ।\nयदि तपाईं यसो गर्नुहुन्न भने कृपया [[Special:DoubleRedirects|दोहोरो]] पुनर्निर्देशन वा [[Special:BrokenRedirects|टुटेको पुनर्निर्देशन]]को लागि पक्कै जाँच गर्नुहोस।\nलिङ्क आफ्नो स्थानमै रहोस, यो सुनिश्चित गर्ने जिम्मेवारी तपाईंको हो।\n\nयदि नयाँ शीर्षकको लेख पहिले देखि छ भने स्थानान्तरण '''हुन''' सक्दैन। तर यदि नयाँ शीर्षक भएको लेख खाली छ अथवा कतै अन्य स्थानमा अनुप्रेषित गर्दैछ र साथै उसको पुरानो संस्करण छैन भने त्यो स्थानान्तरण हुनेछ।\nयसको अभिप्राय यो हो कि यदि तपाईंद्वारा गलती भएको छ भने तपाईं फेरी पुरानो नाममा यस पृष्ठलाई स्थानान्तरण गर्न सक्नुहुन्छ, र साथै तपाईं कुनै पहिले देखि रहेको पृष्ठको सट्टा यो स्थानान्तरण गर्न सक्नुहुन्न।\n\n<strong>चेतावनी!<strong>\nयदि पृष्ठ खासै लोकप्रिय छ भने त्यसको लागि यो एउटा ठुलो र अकस्मात परिवर्तन हुन सक्छ;\nअगाडी बढ्नु भन्दा पहिले तपाईं यसको नतिजासँग परिचित हुनुहुन्छ।",
+       "movepagetext-noredirectfixer": "तल दिइएको फारमले पृष्ठको नाम परिवर्तन गर्नेछ, उसको सबै इतिहास पनि नयाँ नामले देखिनेछ ।\nपुरानो शीर्षक नयाँ नाममा अनुप्रेषण गर्नेछ ।\nमूल शीर्षक तर्फ लिएर जाने सबै अनुप्रेषणहरूलाई तपाईं स्वचालित रूपले परिवर्तन गर्न सक्नुहुन्छ ।\nयदि तपाईं यसो गर्नुहुन्न भने कृपया [[Special:DoubleRedirects|दोहोरो]] पुनर्निर्देशन वा [[Special:BrokenRedirects|टुटेको पुनर्निर्देशन]]को लागि पक्कै जाँच गर्नुहोस् ।\nलिङ्क आफ्नो स्थानमै रहोस्, यो सुनिश्चित गर्ने जिम्मेवारी तपाईंको हो ।\n\nयदि नयाँ शीर्षकको लेख पहिले देखि छ भने नाम परिवर्तन '''हुन''' सक्दैन । तर यदि नयाँ शीर्षक भएको लेख खाली छ अथवा कतै अन्य स्थानमा अनुप्रेषित गर्दैछ र साथै उसको पुरानो संस्करण छैन भने त्यसको नाम परिवर्तन हुनेछ ।\nयसको अभिप्राय यो हो कि यदि तपाईंद्वारा गल्ती भएको छ भने तपाईं फेरी पुरानो नाममा यस पृष्ठलाई सार्न सक्नुहुन्छ, र साथै तपाईं कुनै पहिले देखि रहेको पृष्ठको सट्टा यो स्थानान्तरण गर्न सक्नुहुन्न।\n\n<strong>चेतावनी!<strong>\nयदि पृष्ठ खासै लोकप्रिय छ भने त्यसको लागि यो एउटा ठुलो र अकस्मात परिवर्तन हुन सक्छ;\nअगाडी बढ्नु भन्दा पहिले तपाईं यसको नतिजासँग परिचित हुनुहुन्छ।",
        "movepagetalktext": "संबद्ध वार्तालाप पृष्ठ स्वतः योसित जानेछ '''यदि'''\n* नयाँ नामको पृष्ठको वार्तालाप पृष्ठ रिक्त छैन अथवा\n* तपाईंले यसको सन्दूकमा अनचेक गर्नुहुन्छ भनें '''वार्तालाप पृष्ठ जानेछैन'''। \n\nयस्तो भएमा, तपाईंको इच्छाले आफैंले (manually) पृष्ठ सार्नु अथवा मिलाउनु पर्ने हुन्छ।",
        "movearticle": "पृष्ठ सार्नुहोस्",
        "moveuserpage-warning": "'''चेतावनी:''' तपाईंले प्रयोगकर्ता पृष्ठ सार्न आँट्नु भएकोछ। कृपया याद राख्नुहोस् पृष्ठ मात्र सारिने छ र प्रयोगकर्ताको अर्को नाम राख्न '''सकिंदैन'''।",
        "move-over-sharedrepo": "==फाइल पहिले देखि छ==\n[[$1]] एक साझा भण्डारमा पहिले देखि नै छ। यस नामको स्थानान्तरणले नयाँ फाइल साझा फाइललाई ओभरराइड गर्नेछ।",
        "file-exists-sharedrepo": "छानिएको फाइल नाम पहिले देखि नै साझा भण्डारमा प्रयोगमा छ। कृपया अन्य नाम छान्नुहोस्।",
        "export": "पृष्ठहरू निर्यात गर्ने",
-       "exporttext": "तपाईं विशिष्ठ पृष्ठको विषय वस्तु र सम्पादन इतिहासलाई निर्यात गर्न सक्नुहुन्छ अथवा पृष्ठहरूको समूहका केहि XML मा बेर्न सक्नुहुन्छ।\nयो [[Special:Import|आयात पृष्ठ]]को सहायताले मीडियाविकीको प्रयोग गरेर दोश्रो विकीबाट आयात गर्न सकिनेछ।\n\nपृष्ठहरूको निर्यात गर्नका लागि, तल विषय वस्तु बाकसमा शीर्षक दिनुहोस, एक शीर्षक प्रति पङ्क्ति, र छान्नुहोस् कि तपाईं वर्तमान अवतरणसँग पुरानै अवतरण पनि चाहनुहुन्छ वा चाहनुहुन्न, वा पछिल्लो सम्पादनको बारेमा जानकारीसँग मात्रै वर्तमान अवतरण चाहनुहुन्छ।\n\nपछीको स्थितिको लागि तपाईं लिङ्कको पनि प्रयोग गर्न सक्नुहुन्छ, उदाहरणको लागि, \"[[{{MediaWiki:Mainpage}}]]\" पृष्ठको लागि [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]।",
+       "exporttext": "तपाईं विशिष्ठ पृष्ठको विषय वस्तु र सम्पादन इतिहासलाई निर्यात गर्न सक्नुहुन्छ अथवा पृष्ठहरूको समूहका केहि XML मा बेर्न सक्नुहुन्छ।\nयो [[Special:Import|आयात पृष्ठ]]को सहायताले मीडियाविकीको प्रयोग गरेर दोश्रो विकीबाट आयात गर्न सकिनेछ।\n\nपृष्ठहरूको निर्यात गर्नका लागि, तल विषय वस्तु बाकसमा शीर्षक दिनुहोस, एक शीर्षक प्रति पङ्क्ति, र छान्नुहोस् कि तपाईं वर्तमान अवतरणसँग पुरानै अवतरण पनि चाहनुहुन्छ वा चाहनुहुन्न, वा पछिल्लो सम्पादनको बारेमा जानकारीसँग मात्रै वर्तमान अवतरण चाहनुहुन्छ।\n\nपछीको स्थितिको लागि तपाईं लिङ्कको पनि प्रयोग गर्न सक्नुहुन्छ, उदाहरणको लागि, \"[[{{MediaWiki:Mainpage}}]]\" पृष्ठको लागि [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]।",
        "exportall": "सबै पृष्ठहरू निर्यात गर्ने",
        "exportcuronly": "हालको संस्करण मात्र थप्ने ,पूरा इतिहास हैन",
        "exportnohistory": "----\n<strong>सूचना:</strong> यस फारमको प्रयोग गरेर पृष्ठको पुरै इतिहास निर्यात गर्दा प्रदर्शन कारणले अक्षम गरिएको छ।",
        "export-addnstext": "नेमस्पेसबाट पृष्ठ थप्ने :",
        "export-addns": "थप्ने",
        "export-download": "सङ्ग्रह गर्ने",
-       "export-templates": "ढाà¤\81à¤\9aाहरà¥\81 संलग्न गर्नुहोस्",
+       "export-templates": "ढाà¤\81à¤\9aाहरà¥\82 संलग्न गर्नुहोस्",
        "export-pagelinks": "जोडिएको पृष्ठलाई यस गहराईसम्म समाबेश गर्नेः",
        "allmessages": "सिस्टम सन्देशहरू",
        "allmessagesname": "नाम",
        "import-interwiki-text": "आयात गर्नका लागि एक विकि वा एक पृष्ठ छान्नुहोस्।\nअवतरण मिति र सम्पादकहरूको नाम उस्तै राखिनेछ। अन्य विकिबाट सबै आयात [[Special:Log/import|आयात लग]]मा राखिन्छ।",
        "import-interwiki-sourcewiki": "श्रोत विकिः",
        "import-interwiki-sourcepage": "श्रोत पृष्ठः",
-       "import-interwiki-history": "यà¥\8b à¤ªà¥\83षà¥\8dठà¤\95à¥\8bलाà¤\97ि à¤¸à¤¬à¥\88 à¤\87तिहास à¤¸à¤\82शà¥\8bधनहरà¥\81 प्रतिलिपि गर्ने",
+       "import-interwiki-history": "यà¥\8b à¤ªà¥\83षà¥\8dठà¤\95à¥\8bलाà¤\97ि à¤¸à¤¬à¥\88 à¤\87तिहास à¤¸à¤\82शà¥\8bधनहरà¥\82 प्रतिलिपि गर्ने",
        "import-interwiki-templates": "सबै टेम्प्लेटहरु(नमुना) समेट्ने",
        "import-interwiki-submit": "आयात",
        "import-mapping-default": "पूर्वनिर्धारित स्थानहरूमा आयात",
        "import-rootpage-nosubpage": "दिइएको उपसर्ग पृष्ठ \"$1\" को नामस्थानमा उप-पृष्ठ बनाउन सकिंदैन।",
        "importlogpage": "आयात सूची",
        "importlogpagetext": "अन्य विकिहरूबाट प्रवन्धकहरूद्वारा गरिएको सम्पादन इतिहाससँग हुने पृष्ठहरूको आयात।",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|सà¤\82शà¥\8bधन|सà¤\82शà¥\8bधनहरà¥\81}} आयात भयो",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|सà¤\82शà¥\8bधन|सà¤\82शà¥\8bधनहरà¥\82}} आयात भयो",
        "import-logentry-interwiki-detail": "$2 देखि $1 {{PLURAL:$1|पुनरावलोकन|पुनरावलोकनहरु}} आयात भयो",
        "javascripttest": "JavaScript जाँच गरिदै",
        "javascripttest-pagetext-noframework": "यो पृष्ठ जाभास्क्रिपट जाँचहरूको लागी जगेडामा राखिएको छ ।",
        "autoredircomment": "पृष्ठ[[$1]]मा पठाइएको",
        "autosumm-new": " $1 को साथमा पृष्ठ शृजना भयो",
        "autosumm-newblank": "खाली पृष्ठ तयार गर्ने",
-       "size-bytes": "$1 à¤¬à¤¾à¤\87à¤\9fहरà¥\81",
-       "size-kilobytes": "$1 à¤\95िलà¥\8bबाà¤\87à¤\9fहरà¥\81",
-       "size-megabytes": "$1 à¤®à¥\87à¤\97ाबाà¤\87à¤\9fहरà¥\81",
-       "size-gigabytes": "$1 à¤\97िà¤\97ाबाà¤\87à¤\9fहरà¥\81",
+       "size-bytes": "$1 à¤¬à¤¾à¤\87à¤\9fहरà¥\82",
+       "size-kilobytes": "$1 à¤\95िलà¥\8bबाà¤\87à¤\9fहरà¥\82",
+       "size-megabytes": "$1 à¤®à¥\87à¤\97ाबाà¤\87à¤\9fहरà¥\82",
+       "size-gigabytes": "$1 à¤\97िà¤\97ाबाà¤\87à¤\9fहरà¥\82",
        "lag-warn-normal": " $1 {{PLURAL:$1|सेकेन्ड |सेकेन्डहरू}} भन्दा नयाँ परिवर्तनहरू यस सूचीमा नदेखाइन सक्छ ।",
        "lag-warn-high": "डेटावेस सर्भरको धेरै ढिलाइको कारणले  $1 {{PLURAL:$1|सेकेन्ड|सेकेन्डहरू}} पछिका परिवर्तनहरू नदेखिन सक्छ ।",
        "watchlistedit-normal-title": " निगरानी सूची सम्पादन गर्ने",
        "tags-delete-title": "ट्याग मेट्नुहोस्",
        "tags-delete-explanation-initial": "तपाईले ट्याग \"$1\" लाई डाटावेसबाट हटाउन खोज्दै हुनु हुन्छ ।",
        "tags-delete-explanation-in-use": "ट्यागलाई {{PLURAL:$2|$2 संशोधन वा लग प्रविष्टि|सबै $2 संशोधन र/वा लग प्रविष्टिहरू}}बाट हटाइनेछ जहाँ अहिले त्यसको प्रयोग गरिंदै छ।",
-       "tags-delete-explanation-warning": "यà¥\8b à¤\95à¥\8dरिया <strong>à¤\85परिवरà¥\8dतनà¥\80य</strong> à¤¹à¥\8b à¤° <strong>तà¥\8dयसलाà¤\88 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dन à¤¸à¤\95िà¤\82दà¥\88न</strong>, à¤¡à¥\87à¤\9fाà¤\9fाबà¥\87स à¤ªà¥\8dरवनà¥\8dधà¤\95 à¤ªà¤¨à¤¿ à¤¯à¤¸à¤²à¤¾à¤\88 à¤\95à¥\87हि à¤\97रà¥\8dन à¤¸à¤\95à¥\8dदà¥\88ननà¥\8d। à¤µà¤¿à¤¶à¥\8dवासपà¥\82रà¥\8dण à¤°à¥\82पलà¥\87 à¤¤à¤ªà¤¾à¤\88à¤\82 à¤¤à¤¯ à¤\97रà¥\8dनà¥\81स कि तपाईं यस ट्यागलाई हटाउन चाहनुहुन्छ।",
+       "tags-delete-explanation-warning": "यà¥\8b à¤\95à¥\8dरिया <strong>à¤\85परिवरà¥\8dतनà¥\80य</strong> à¤¹à¥\8b à¤° <strong>तà¥\8dयसलाà¤\88 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dन à¤¸à¤\95िà¤\82दà¥\88न</strong>, à¤¡à¥\87à¤\9fाबà¥\87स à¤ªà¥\8dरवनà¥\8dधà¤\95 à¤ªà¤¨à¤¿ à¤¯à¤¸à¤²à¤¾à¤\88 à¤\95à¥\87हि à¤\97रà¥\8dन à¤¸à¤\95à¥\8dदà¥\88ननà¥\8d। à¤µà¤¿à¤¶à¥\8dवासपà¥\82रà¥\8dण à¤°à¥\82पलà¥\87 à¤¤à¤ªà¤¾à¤\88à¤\82 à¤¤à¤¯ à¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d कि तपाईं यस ट्यागलाई हटाउन चाहनुहुन्छ।",
        "tags-delete-explanation-active": "<strong>ट्याग \"$1\" अहिले पनि सक्रिय छ, र यसको प्रयोग भविष्यमा पनि जारी रहनेछ।</strong> यसलाई रोकनका लागि, ती स्थानहरूमा जानुहोस जहाँ यस ट्यागको प्रयोग भइरहेको छ र त्यहाँ देखि यसलाई अक्षम गर्नुहोस।",
        "tags-delete-reason": "कारण:",
        "tags-delete-submit": "उल्टाउन नसकिने गरि यो ट्यागलाई मेटाउने",
        "feedback-back": "अघिल्लो",
        "feedback-bugcheck": "राम्रो! जाँच्नुस की कतै [ $1 ज्ञात बगहरू] पहिले देखि नै नहोस्।",
        "feedback-bugnew": "मैले जाँच गरिसके। नयाँ बगको खबर दिनुहोस्",
-       "feedback-bugornote": "यदि à¤¤à¤ªà¤¾à¤\88à¤\82 à¤\95à¥\81नà¥\88 à¤ªà¥\8dराविधिà¤\95 à¤¸à¤®à¤¸à¥\8dयालाà¤\88 à¤µà¤¿à¤¸à¥\8dतारलà¥\87 à¤¸à¤®à¤\9dाà¤\89न à¤¤à¤¯à¤¾à¤° à¤¹à¥\81नà¥\81हà¥\81नà¥\8dà¤\9b à¤­à¤¨à¥\87 à¤\95à¥\83पया [$1 à¤¬à¤\97 à¤°à¤¾à¤\96à¥\8dनà¥\81हà¥\8bस]।\nयदि à¤¹à¥\88न, à¤­à¤¨à¥\87 à¤¤à¤ªà¤¾à¤\88à¤\82 à¤¤à¤² à¤¦à¤¿à¤\87à¤\8fà¤\95à¥\8b à¤¸à¤°à¤² à¤«à¤¾à¤°à¤®à¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97 à¤\97रà¥\8dनसà¤\95à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b। à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95à¥\8b à¤\9fिपà¥\8dपणà¥\80 à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤® à¤° à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95à¥\8b à¤¬à¥\8dराà¤\89à¤\9cरà¤\95à¥\8b à¤¨à¤¾à¤® à¤¸à¤¹à¤¿à¤¤ \"[$3 $2]\" à¤ªà¥\83षà¥\8dठ मा जोडिनेछ।",
+       "feedback-bugornote": "यदि à¤¤à¤ªà¤¾à¤\88à¤\82 à¤\95à¥\81नà¥\88 à¤ªà¥\8dराविधिà¤\95 à¤¸à¤®à¤¸à¥\8dयालाà¤\88 à¤µà¤¿à¤¸à¥\8dतारलà¥\87 à¤¸à¤®à¥\8dà¤\9dाà¤\89न à¤¤à¤¯à¤¾à¤° à¤¹à¥\81नà¥\81हà¥\81नà¥\8dà¤\9b à¤­à¤¨à¥\87 à¤\95à¥\83पया [$1 à¤¬à¤\97 à¤°à¤¾à¤\96à¥\8dनà¥\81हà¥\8bस]।\nयदि à¤¹à¥\88न, à¤­à¤¨à¥\87 à¤¤à¤ªà¤¾à¤\88à¤\82 à¤¤à¤² à¤¦à¤¿à¤\87à¤\8fà¤\95à¥\8b à¤¸à¤°à¤² à¤«à¤¾à¤°à¤®à¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97 à¤\97रà¥\8dनसà¤\95à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b। à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95à¥\8b à¤\9fिपà¥\8dपणà¥\80 à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤® à¤° à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95à¥\8b à¤¬à¥\8dराà¤\89à¤\9cरà¤\95à¥\8b à¤¨à¤¾à¤® à¤¸à¤¹à¤¿à¤¤ \"[$3 $2]\" à¤ªà¥\83षà¥\8dठमा जोडिनेछ।",
        "feedback-cancel": "रद्द गर्ने",
        "feedback-close": "गरियो",
        "feedback-external-bug-report-button": "प्राविधिक कार्य पेश गर्नुहोस्",
        "log-name-pagelang": "लगको भाषा परिवर्तन गर्ने",
        "log-description-pagelang": "यो पृष्ठको भाषाहरूमा भएका परिवर्तनहरूको लग हो ।",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|परिवर्तन गरियो}} पृष्ठ भाषालाई $3 को लागि $4 बाट $5 ।",
-       "default-skin-not-found": "ओह! तपाईंको विकिको पूर्व निर्धारित खोल जस्तो कि <code dir=\"ltr\">$wgDefaultSkin</code> मा बताइएको<code>$1</code>, उपलब्ध छैन।\n\nतपाईंको इन्स्टलेसन यी खोलहरूलाई सम्मिलित गर्दछ {{PLURAL:$4|खोल|खोलहरू}}। हेर्नुस [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: खोललाई सम्मित गर्नु] ताकि तपाईंलाई जानकारी होस कि कसरि {{PLURAL:$4|उसलाई|उसलाई सम्मिलित गर्न सकियोस र निर्धारितलाई तय गर्ने}}।\n\n$2\n\n; यदि तपाईंले अहिले मीडियाविकि इन्स्टाल गर्नुभएको छ:\n: तपाईंले सम्भवत गिटबाट इन्स्टल गर्नुभएको छ, वा सिधै स्रोत कोडबाट गर्नुभएको छ जसको लागि कुनै अर्कै तारिका प्रयोग गरिएको छ। यो आशा अनुरूप छ। कोशिश गर्नुस केहि खोलहरू\n[https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's मीडियाविकिको खोल डाइरेक्ट्रीबाट डाउनलोड गर्ने], जसको लागि तपाईं:\n:* डाउनलोड गर्नुस [https://www.mediawiki.org/wiki/Download टरबल इन्स्टलर], जुन कयौं खोलहरू र विस्तारमा उपलब्ध छन्। तपाईं खोलहरूको कोड <code>skins/</code> त्यसको डाइरेक्ट्रीबाट कपी-पेस्ट गर्न सक्नुहुन्छ। \n:* व्यक्तिगत खोलहरू टरबलबाट डाउनलोड गर्नुस [https://www.mediawiki.org/wiki/Special:SkinDistributor मीडिया विकि] बाट।\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins गिटको प्रयोग गरेर डाउनलोड गर्न सक्नुहुन्छ]।\n: यदि तपाईं विकासकर्ता हो भने यसो गर्दा समय तपाईंको गिट-रिपजिटरीमा केहि हुनुहुँदैन । \n; यदि तपाईंले अहिले मीडियाविकिलाई अपग्रेड गर्नुभएको छ:\n: मीडियाविकि १.२४ र यसको नवीन रूप स्वतः रूपले खोलहरूलाई सक्षम गर्दैनन् (हेर्नुस [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual:खोलहरूको स्वतः खोज])। तपाईं निम्नलिखितलाई पेस्ट गर्न सक्नुहुन्छ: {{PLURAL:$5|लाइन|लाइनहरू}}  <code>LocalSettings.php</code> मा ताकि {{PLURAL:$5|उसले|सबै}} सक्षम होस् जस्तो कि तपाईंले इन्स्टल गरिएको {{PLURAL:$5|खोल|खोलहरू}}को मामिलामा:\n\n<pre dir=\"ltr\">$3</pre>\n\n; यदि तपाईंले अहिले परिवर्तन गर्नुभएको छ<code>LocalSettings.php</code>:\n: खोल नामहरूको अगाडी डबल-क्लिक गर्नुहोस जसले तपाईंलाई विभिन्न प्रकारहरूको विकल्प दिन्छ।",
+       "default-skin-not-found": "ओह! तपाईंको विकिको पूर्व निर्धारित खोल जस्तो कि <code dir=\"ltr\">$wgDefaultSkin</code> मा बताइएको<code>$1</code>, उपलब्ध छैन ।\n\nतपाईंको इन्स्टलेसन यी खोलहरूलाई सम्मिलित गर्दछ {{PLURAL:$4|खोल|खोलहरू}}। हेर्नुहोस् [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: खोललाई सम्मिलित गर्नु] ताकि तपाईंलाई जानकारी होस् कि कसरि {{PLURAL:$4|उसलाई|उसलाई सम्मिलित गर्न सकियोस् र निर्धारितलाई तय गर्ने}}।\n\n$2\n\n; यदि तपाईंले अहिले मीडियाविकि इन्स्टाल गर्नुभएको छ:\n: तपाईंले सम्भवत गिटबाट इन्स्टाल गर्नुभएको छ, वा सिधै स्रोत कोडबाट गर्नुभएको छ जसको लागि कुनै अर्कै तारिका प्रयोग गरिएको छ। यो आशा अनुरूप छ। कोशिश गर्नुहोस् केहि खोलहरू\n[https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's मीडियाविकिको खोल डाइरेक्ट्रीबाट डाउनलोड गर्ने], जसको लागि तपाईं:\n:* डाउनलोड गर्नुहोस् [https://www.mediawiki.org/wiki/Download टरबल इन्स्टलर], जुन कयौं खोलहरू र विस्तारमा उपलब्ध छन्। तपाईं खोलहरूको कोड <code>skins/</code> त्यसको डाइरेक्ट्रीबाट कपी-पेस्ट गर्न सक्नुहुन्छ। \n:* व्यक्तिगत खोलहरू टरबलबाट डाउनलोड गर्नुहोस् [https://www.mediawiki.org/wiki/Special:SkinDistributor मीडिया विकि] बाट।\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins गिटको प्रयोग गरेर डाउनलोड गर्न सक्नुहुन्छ]।\n: यदि तपाईं विकासकर्ता हो भने यसो गर्दा  तपाईंको गिट-रिपजिटरीमा केहि हुनुहुँदैन । \n; यदि तपाईंले अहिले मीडियाविकिलाई अपग्रेड गर्नुभएको छ:\n: मीडियाविकि १.२४ र यसको नवीन रूप स्वतः रूपले खोलहरूलाई सक्षम गर्दैनन् (हेर्नुहोस् [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual:खोलहरूको स्वतः खोज])। तपाईं निम्नलिखितलाई पेस्ट गर्न सक्नुहुन्छ: {{PLURAL:$5|लाइन|लाइनहरू}}  <code>LocalSettings.php</code> मा ताकि {{PLURAL:$5|उसले|सबै}} सक्षम होस् जस्तो कि तपाईंले इन्स्टाल गरेको {{PLURAL:$5|खोल|खोलहरू}}को मामिलामा:\n\n<pre dir=\"ltr\">$3</pre>\n\n; यदि तपाईंले अहिले परिवर्तन गर्नुभएको छ<code>LocalSettings.php</code>:\n: खोल नामहरूको अगाडी डबल-क्लिक गर्नुहोस् जसले तपाईंलाई विभिन्न प्रकारहरूको विकल्प दिन्छ।",
        "default-skin-not-found-no-skins": "ओह! तपाईंको विकिको पूर्व निर्धारित खोल जस्तो कि <code>$wgDefaultSkin</code> मा बताइएको <code>$1</code>, उपलब्ध छैन।\nतपाईंसँग कुनै इन्स्टल गरिएको खोल छैन।\n; यदि तपाईंले अहिले मीडियाविकि इन्स्टल गर्नुभएको छ वा यसलाई अपडेट गर्नुभएको छ:\nतपाईंले सम्भवत गिटबाट इन्स्टल गर्नुभएको छ, वा सिधै स्रोत कोडबाट गर्नुभएको छ जसको लागि कुनै अर्कै तारिका प्रयोग गरिएको छ। यो आशा अनुरूप छ। कोशिश गर्नुस केहि खोलहरू\n[https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's मीडियाविकिको खोल डाइरेक्ट्रीबाट डाउनलोड गर्ने], जसको लागि तपाईं:\n:* डाउनलोड गर्नुस [https://www.mediawiki.org/wiki/Download टरबल इन्स्टलर], जुन कयौं खोलहरू र विस्तारमा उपलब्ध छन्। तपाईं खोलहरूको कोड <code>skins/</code> त्यसको डाइरेक्ट्रीबाट कपी-पेस्ट गर्न सक्नुहुन्छ। \n:* व्यक्तिगत खोलहरू टरबलबाट डाउनलोड गर्नुस [https://www.mediawiki.org/wiki/Special:SkinDistributor मीडिया विकि] बाट।\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins गिटको प्रयोग गरेर डाउनलोड गर्न सक्नुहुन्छ]।\n:यदि तपाईं विकासकर्ता हो भने यसो गर्दा समय तपाईंको गिट-रिपजिटरीमा केहि हुनुहुँदैन।",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (सक्रिय)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''निष्क्रिय''')",
index ae9d063..2ed06aa 100644 (file)
        "passwordreset": "Wachtwoord opnieuw instellen",
        "passwordreset-text-one": "Vul dit formulier in om uw wachtwoord opnieuw in te stellen.",
        "passwordreset-text-many": "{{PLURAL:$1|Vul een van de gegevensvelden in om per e-mail een tijdelijk wachtwoord te ontvangen.}}",
-       "passwordreset-legend": "Wachtwoord opnieuw instellen",
        "passwordreset-disabled": "Het is in deze wiki niet mogelijk uw wachtwoord opnieuw in te stellen.",
        "passwordreset-emaildisabled": "E-mailmogelijkheden zijn uitgeschakeld op deze wiki.",
        "passwordreset-username": "Gebruiker:",
        "resettokens": "Tokens opnieuw instellen",
        "resettokens-text": "U kunt hier tokens opnieuw instellen die toegang tot bepaalde persoonlijke gegevens die zijn gekoppeld aan uw gebruiker.\n\nDoe dit als u ze per ongeluk met iemand hebt gedeeld of als uw onbevoegden toegang hebben gekregen tot uw gebruiker.",
        "resettokens-no-tokens": "Er zijn geen tokens om opnieuw in te stellen.",
-       "resettokens-legend": "Tokens opnieuw instellen",
        "resettokens-tokens": "Tokens:",
        "resettokens-token-label": "$1 (huidige waarde: $2)",
        "resettokens-watchlist-token": "Token voor webfeed van [[Special:Watchlist|uw volglijst]] (Atom/RSS)",
        "creating": "Bezig met het aanmaken van $1",
        "editingsection": "Bezig met bewerken van $1 (deelpagina)",
        "editingcomment": "Bezig met bewerken van $1 (nieuw kopje)",
-       "editconflict": "Bewerkingsconflict: $1",
+       "editconflict": "Uw wijzigingen konden niet opgeslagen worden vanwege een bewerkingsconflict. Wilt {{GENDER:|u}} het conflict handmatig oplossen?",
        "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",
        "randomincategory-nopages": "Er zijn geen pagina's in de categorie [[:Category:$1|$1]].",
        "randomincategory-category": "Categorie:",
        "randomincategory-legend": "Willekeurige pagina in een categorie",
+       "randomincategory-submit": "OK",
        "randomredirect": "Willekeurige doorverwijzing",
        "randomredirect-nopages": "Er zijn geen doorverwijzingen in de naamruimte \"$1\".",
        "statistics": "Statistieken",
        "nmembers": "$1 {{PLURAL:$1|item|items}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|lid|leden}}",
        "nrevisions": "$1 {{PLURAL:$1|versie|versies}}",
-       "nviews": "{{PLURAL:$1|1 keer|$1 keer}} bekeken",
        "nimagelinks": "Gebruikt op {{PLURAL:$1|één pagina|$1 pagina's}}",
        "ntransclusions": "gebruikt op {{PLURAL:$1|één pagina|$1 pagina's}}",
        "specialpage-empty": "Er zijn geen resultaten voor deze rapportage.",
        "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 \"Bewerking ter controle bekijken\" 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",
        "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": "Opnieuw aanmaken",
+       "recreate": "De pagina is verwijderd sinds je begon te bewerken. Klik op \"$1\" om de pagina opnieuw aan te maken.",
        "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.",
        "special-characters-group-khmer": "Khmer",
        "special-characters-title-endash": "liggend streepje",
        "special-characters-title-emdash": "gedachtenstreepje",
-       "special-characters-title-minus": "minteken"
+       "special-characters-title-minus": "minteken",
+       "mw-widgets-titleinput-description-new-page": "pagina bestaat nog niet",
+       "mw-widgets-titleinput-description-redirect": "doorverwijzing naar $1"
 }
index 2984e93..bcb4256 100644 (file)
        "resetpass-abort-generic": "Passordbytet vart stogga av ei utviding.",
        "passwordreset": "Attendestilling av passord",
        "passwordreset-text-one": "Fyll ut dette skjemaet for å attendestilla passordet ditt.",
-       "passwordreset-legend": "↓Nullstill passordet",
        "passwordreset-disabled": "↓Tilbakestilling av passord er ikkje aktivert på denne wikien",
        "passwordreset-emaildisabled": "E-postfunksjonen er slegen av på wikien.",
        "passwordreset-username": "Brukarnamn:",
        "randomincategory-nopages": "Det er ingen sider i kategorien [[:Category:$1|$1]].",
        "randomincategory-category": "Kategori:",
        "randomincategory-legend": "Tilfeldig side frå kategori",
+       "randomincategory-submit": "Gå",
        "randomredirect": "Tilfeldig omdirigering",
        "randomredirect-nopages": "Det finst ingen omdirigeringar i namnerommet «$1».",
        "statistics": "Statistikk",
        "movepagetalktext": "Den tilhøyrande diskusjonssida, om ho finst, vert automatisk flytt med sida '''minder:'''\n*ei ikkje-tom diskusjonsside alt finst under det nye namnet, eller\n*du fjernar avhakinga i boksen nedanfor.\n\nI desse falla lyt du flytta eller fletta sida manuelt, om ynskjeleg.",
        "movearticle": "Flytt side:",
        "moveuserpage-warning": "'''Åtvaring:''' Du er i ferd med å flytta ei brukarside. Merk at berre sida vert flytt og at brukarnamnet '''ikkje''' vert endra.",
+       "movecategorypage-warning": "<strong>Åtvaring:</strong> Du er i ferd med å flytta ei kategoriside. Merk at berre kategorisida vert flytt og at sider i den gamle kategorien <em>ikkje</em> vert omkategoriserte til den nye kategorien.",
        "movenologintext": "Du lyt vera registrert brukar og vera [[Special:UserLogin|innlogga]] for å flytte ei side.",
        "movenotallowed": "Du har ikkje tilgang til å flytte sider.",
        "movenotallowedfile": "Du har ikkje løyve til å flytta filer.",
index 7e67800..758f34b 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|ନିଜର ଦେଖଣାତାଲିକରେ ହେଉଥିବା ବଦଳ]]ର ୱେବ ଫିଡ଼ ପାଇଁ ଟୋକନ (ଆଟମ/RSS)",
        "watchthis": "ଏହି ପୃଷ୍ଠାଟିକୁ ଦେଖିବେ",
        "savearticle": "ସାଇତିବେ [Save]",
        "preview": "ସାଇତିବା ଆଗରୁ ଦେଖନ୍ତୁ",
-       "showpreview": "ପà­\82ରà­\8dବଦà­\87à¬\96ଣା [Preview]",
+       "showpreview": "ଦେଖଣା [Preview]",
        "showdiff": "ବଦଳଗୁଡ଼ିକ ଦେଖାଇବେ",
        "blankarticle": "<strong>ଚେତାବନୀ:</strong> ଆପଣ ସମ୍ପାଦନା କରୁଥିବା ଏହି ପୃଷ୍ଠାଟି ଫାଙ୍କା ଅଛି ।\nଯଦି ଆପଣ \"{{int:savearticle}}\" ଉପରେ ଆଉଥରେ କ୍ଲିକ କରନ୍ତି, ପୃଷ୍ଠାଟି କୌଣସି ବିଷୟବସ୍ତୁ ନଥାଇ ତିଆରି ହୋଇଯିବ ।",
        "anoneditwarning": "<strong>ସାବଧାନ:</strong> ଆପଣ ଲଗ-ଇନ କରିନାହାନ୍ତି । ଅଧିକ ସମ୍ପାଦନା କଲେ ଆପଣଙ୍କ IP Address ଟି ସମସ୍ତଙ୍କୁ ଦେଖାଯିବ । <strong>[$1ଲଗ ଇନ କଲେ]</strong> କିମ୍ବା <strong>[$2 ନୂଆ ଖାତାଟିଏ ତିଆରି କଲେ]</strong>, ଆପଣଙ୍କ ସମ୍ପାଦନାର ଶ୍ରେୟ ଅନ୍ୟାନ୍ୟ ସୁବିଧା ସହିତ ଆପଣଙ୍କ ଇଉଜର ନାମରେ ଦିଆହେବ ।",
        "prefs-timeoffset": "ସମୟ ଆରମ୍ଭ",
        "prefs-advancedediting": "ସାଧାରଣ ବିକଳ୍ପ",
        "prefs-editor": "ସମ୍ପାଦକ",
-       "prefs-preview": "ପà­\82ରà­\8dବଦà­\87à¬\96ଣା",
+       "prefs-preview": "ଦେଖଣା",
        "prefs-advancedrc": "ଉନ୍ନତ ବିକଳ୍ପସମୂହ",
        "prefs-advancedrendering": "ଉନ୍ନତ ବିକଳ୍ପସମୂହ",
        "prefs-advancedsearchoptions": "ଉନ୍ନତ ବିକଳ୍ପସମୂହ",
        "version-entrypoints": "ନିବେଶ ହେଉଥିବା ସ୍ଥାନର URLଗୁଡିକ",
        "version-entrypoints-header-entrypoint": "ପ୍ରବେଶ ବିନ୍ଦୁ",
        "version-entrypoints-header-url": "ଇଉଆରଏଲ",
+       "version-libraries": "ଇନଷ୍ଟାଲ ହୋଇଥିବା ପାଠାଗାର",
+       "version-libraries-library": "ପାଠାଗାର",
+       "version-libraries-version": "ସଂସ୍କରଣ",
        "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]].",
        "tags-tag": "ଚିହ୍ନ ନାମ",
        "tags-display-header": "ବଦଳ ତାଲିକାରେ ଦେଖଣା",
        "tags-description-header": "ଅର୍ଥର ପୁରା ବିବରଣୀ",
+       "tags-source-header": "ଉତ୍ସ",
        "tags-active-header": "ସକ୍ରିୟ କି?",
        "tags-hitcount-header": "ଚିହ୍ନିତ ବଦଳ",
+       "tags-actions-header": "କାମସବୁ",
        "tags-active-yes": "ହଁ",
        "tags-active-no": "ନାଁ",
+       "tags-source-extension": "ଏକ୍ସଟେନସନ ଦ୍ଵାରା ଦର୍ଶାଯାଇଥିବା",
+       "tags-source-manual": "ବ୍ୟବହାରକାରୀ ଓ ବଟଦ୍ଵାରା କରାଯାଇଛି",
+       "tags-source-none": "ଆଉ ବ୍ୟବହାର ହେଉନାହିଁ",
        "tags-edit": "ସମ୍ପାଦନା",
+       "tags-delete": "ଲିଭାଇବେ",
+       "tags-activate": "ସଚଳ କରିବେ",
+       "tags-deactivate": "ଅଚଳ କରିବେ",
        "tags-hitcount": "$1 {{PLURAL:$1|ବଦଳ|ବଦଳସବୁ}}",
+       "tags-manage-no-permission": "ଆପଣଙ୍କର ଟାଗ ବଦଳ କରିବା ଅଧିକାର ନାହିଁ ।",
+       "tags-create-heading": "ନୂଆ ଟାଗ ତିଆରି କରିବେ",
+       "tags-create-tag-name": "ଟାଗ ନାମ",
+       "tags-create-reason": "କାରଣ",
+       "tags-create-submit": "ତିଆରି କରିବେ",
+       "tags-create-no-name": "ଆପଣଙ୍କୁ ଗୋଟିଏ ଟାଗ ନାମ ଦେବାକୁ ପଡିବ ।",
+       "tags-delete-title": "ଟାଗ ଲିଭାଇବେ",
+       "tags-delete-reason": "କାରଣ:",
+       "tags-activate-reason": "କାରଣ:",
+       "tags-activate-submit": "ସଚଳ କରିବେ",
+       "tags-deactivate-title": "ଟାଗ ଅଚଳ କରିବେ",
+       "tags-deactivate-reason": "କାରଣ:",
+       "tags-edit-title": "ଟାଗ ସମ୍ପାଦନ କରିବେ",
+       "tags-edit-manage-link": "ଟାଗ ବଦଳାଇବେ",
+       "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": "କିଛି ଟାଗ ବାଛିବେ",
+       "tags-edit-reason": "କାରଣ:",
        "comparepages": "ବଦଳ ତୁଳନା କରିବେ",
        "compare-page1": "ପୃଷ୍ଠା ୧",
        "compare-page2": "ପୃଷ୍ଠା ୨",
        "logentry-upload-upload": "$1, $3 {{GENDER:$2|ଅପଲୋଡ଼ କଲେ}}",
        "logentry-upload-overwrite": "$1, $3ର ଏକ ନୂଆ ସଂସ୍କରଣ {{GENDER:$2|ଅପଲୋଡ଼ କଲେ}}",
        "logentry-upload-revert": "$1, $3 {{GENDER:$2|ଅପଲୋଡ଼ କଲେ}}",
+       "log-name-tag": "ଟାଗ ଲଗ",
        "rightsnone": "(କିଛି ନାହିଁ)",
        "revdelete-summary": "ସାରକଥା ସମ୍ପାଦନା",
        "feedback-adding": "ପୃଷ୍ଠାରେ ମତାମତ ଦେଉଛି...",
+       "feedback-back": "ପଛକୁ ଯିବେ",
        "feedback-bugcheck": "ବହୁତ ଭଲ ! ଖାଲି ଦେଖିଦିଅନ୍ତୁ ଯେ ଏହା ଆଗରୁ ଥିବା [$1 known bugs] ମଧ୍ୟରୁ ନୁହେଁ ତ ।",
        "feedback-bugnew": "ମୁଁ ଯାଞ୍ଚ କରିଦେଲି । ନୂତନ ଅସୁବିଧାର ବିବରଣ କରନ୍ତୁ ।",
        "feedback-bugornote": "ଦୟାକରି ଆପଣ ଏକ କାରିଗରି ଅସୁବିଧାଟିଏ ଜଣାଇବା ପାଇଁ ଚାହୁଁଥିଲେ ଦୟାକରି [$1 ଏଠାରେ ଅସୁବିଧାଟି ଜଣାନ୍ତୁ] । \nଅଥବା, ଆପଣ ତଳେ ଠିଆ ସହଜ ଆବେଦନ ପତ୍ରଟି ପୁରଣ କରିପାରିବେ ।  ଆପଣଙ୍କ ବ୍ୟବହାରକାରୀ ନାମ ଓ ଆପଣ ବ୍ୟବହାର କରୁଥିବା ବ୍ରାଉଜର ଅନୁସାରେ ଆପଣଙ୍କ ମତାମତ \"[$3 $2]\"ରେ ଯୋଡ଼ାଯିବ ।",
        "feedback-cancel": "ନାକଚ",
        "feedback-close": "ହୋଇଗଲା",
+       "feedback-error-title": "ଅସୁବିଧା",
        "feedback-error1": "ଭୁଲ: API ରୁ ଅଚିହ୍ନା ଫଳାଫଳ",
        "feedback-error2": "ଅସୁବିଧା: ସମ୍ପାଦନା ବିଫଳ ହେଲା",
        "feedback-error3": "ଅସୁବିଧା: API ରୁ କିଛି ଉତ୍ତର ମିଳିଲା ନାହିଁ",
        "feedback-subject": "ବିଷୟ:",
        "feedback-submit": "ଦାଖଲ କରିବା",
        "feedback-thanks": "ଧନ୍ୟବାଦ ! ଆପଣଙ୍କର ମତାମତ  \"[$2 $1]\" ପୃଷ୍ଠାରେ ଦର୍ଶାଯାଇଛି ।",
+       "feedback-thanks-title": "ଧନ୍ୟବାଦ!",
        "searchsuggest-search": "ଖୋଜନ୍ତୁ",
        "searchsuggest-containing": "ଖୋଜୁଛି...",
        "api-error-badaccess-groups": "ଆପଣଙ୍କୁ ଏହି ଉଇକିରେ ଅପଲୋଡ଼ କରିବାକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ ।",
        "expand_templates_remove_nowiki": "ଫଳାଫଳରେ <nowiki> ଟ୍ୟାଗମାନଙ୍କୁ ଦବାଇଦିଅନ୍ତୁ",
        "expand_templates_generate_xml": "XML ପାର୍ସ ସଂରଚନା ଦେଖାନ୍ତୁ",
        "expand_templates_generate_rawhtml": "କେବଳ HTML କୋଡ଼ ଦେଖାନ୍ତୁ",
-       "expand_templates_preview": "ପà­\82ରà­\8dବଦà­\87à¬\96ଣା",
+       "expand_templates_preview": "ଦେଖଣା",
        "pagelanguage": "ପୃଷ୍ଠା ଭାଷା ବଛା",
        "pagelang-name": "ପୃଷ୍ଠା",
        "pagelang-language": "ଭାଷା",
        "json-error-recursion": "ଏନକୋଡ଼ ହେବାକୁ ଥିବା ଭାଲ୍ୟୁରେ ଏକରୁ ଅଧିକ ରିକର୍ସିଭ ଆଧାର",
        "json-error-inf-or-nan": "ଭାଲ୍ୟୁରେ ଏକରୁ ଅଧିକ NAN କିମ୍ବା INF ମୂଲ୍ୟ ଏନକୋଡ଼ କରିବାକୁ ହେବ",
        "json-error-unsupported-type": "ଏନକୋଡ଼ ହୋଇନପାରିବା ଭଳି ଏକ ପ୍ରକାରର ମୂଲ୍ୟ ଦିଆଗଲା",
+       "headline-anchor-title": "ଏହି ବିଭାଗକୁ ଲିଙ୍କ କରିବେ",
        "special-characters-group-latin": "ଲାଟିନ",
        "special-characters-group-latinextended": "ଲାଟିନ ଅଧିକ ଅକ୍ଷର",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-khmer": "ଖମେର ଭାଷା",
        "special-characters-title-endash": "en ଡ୍ୟାସ",
        "special-characters-title-emdash": "em dash",
-       "special-characters-title-minus": "ମେନୁଗୁଡିକର ଚିହ୍ନ"
+       "special-characters-title-minus": "ମେନୁଗୁଡିକର ଚିହ୍ନ",
+       "mw-widgets-titleinput-description-redirect": "$1କୁ ପୁନଃପ୍ରେରଣ କରିବେ"
 }
index f37779b..8225de5 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-done": "ਨਿਸ਼ਾਨੀਆਂ ਮੁੜ ਬਣਾਈਆਂ ਗਈਆਂ।",
        "notextmatches": "ਕਿਸੇ ਸਫ਼ੇ ਦੀ ਲਿਖਤ ਮੇਲ ਨਹੀਂ ਖਾਂਦੀ",
        "prevn": "ਪਿੱਛੇ {{PLURAL:$1|$1}}",
        "nextn": "ਅੱਗੇ {{PLURAL:$1|$1}}",
+       "prev-page": "ਪਿਛਲਾ ਸਫ਼ਾ",
+       "next-page": "ਅਗਲਾ ਸਫ਼ਾ",
        "prevn-title": "ਪਿਛਲੇ $1 {{PLURAL:$1|ਨਤੀਜਾ|ਨਤੀਜੇ}}",
        "nextn-title": "{{PLURAL:$1|ਅਗਲਾ|ਅਗਲੇ}} $1 {{PLURAL:$1|ਨਤੀਜਾ|ਨਤੀਜੇ}}",
        "shown-title": "ਪ੍ਰਤੀ ਸਫ਼ਾ $1 {{PLURAL:$1|ਨਤੀਜਾ|ਨਤੀਜੇ}} ਵਿਖਾਓ",
        "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-file-match": "(ਫ਼ਾਈਲ ਦੀ ਸਮੱਗਰੀ ਨਾਲ਼ ਰਲ਼ਦਾ-ਮਿਲ਼ਦਾ)",
        "search-suggest": "ਕੀ ਤੁਹਾਡਾ ਮਤਲਬ ਸੀ: $1",
        "search-interwiki-caption": "ਸਾਥੀ ਪ੍ਰੋਜੈਕਟ",
        "searchrelated": "ਸਬੰਧਤ",
        "searchall": "ਸਭ",
        "showingresults": "ਹੇਠਾਂ #'''$2''' ਨਾਲ਼ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲ਼ੇ {{PLURAL:\n$1|'''1''' ਨਤੀਜਾ|'''$1''' ਤੱਕ ਨਤੀਜੇ}} ਵਖਾਓ।",
+       "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> ਵਿੱਚੋਂ <strong>$1</strong> ਨਤੀਜੇ| <strong>$3</strong> ਵਿੱਚੋਂ <strong>$1 - $2</strong> ਨਤੀਜੇ}}",
        "search-nonefound": "ਤੁਹਾਡੀ ਖੋਜ ਨਾਲ ਮੇਲ ਖਾਂਦੇ ਕੋਈ ਨਤੀਜੇ ਨਹੀਂ ਮਿਲੇ।",
        "powersearch-legend": "ਤਕਨੀਕੀ ਖੋਜ",
        "powersearch-ns": "ਨੇਮ-ਸਪੇਸ ਵਿੱਚ ਖੋਜ:",
        "prefs-personal": "ਵਰਤੋਂਕਾਰ ਪ੍ਰੋਫ਼ਾਈਲ",
        "prefs-rc": "ਹਾਲੀਆ ਤਬਦੀਲੀਆਂ",
        "prefs-watchlist": "ਨਿਗਰਾਨ-ਸੂਚੀ",
+       "prefs-editwatchlist": "ਨਿਗਰਾਨੀ-ਲਿਸਟ ਸੋਧੋ",
        "prefs-watchlist-days": "ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਦਿਖਾਉਣ ਲਈ ਦਿਨ:",
        "prefs-watchlist-days-max": "ਵੱਧ ਤੋਂ ਵੱਧ $1 {{PLURAL:$1|ਦਿਨ|ਦਿਨ}}",
        "prefs-watchlist-edits": "ਵਧਾਈ ਹੋਈ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਦਿਖਾਉਣ ਲਈ ਵੱਧ ਤੋਂ ਵੱਧ ਤਬਦੀਲੀਆਂ:",
index d1a9564..6c3561d 100644 (file)
@@ -7,19 +7,20 @@
                        "Urhixidur",
                        "Val2397",
                        "아라",
-                       "Leeheonjin"
+                       "Leeheonjin",
+                       "TTO"
                ]
        },
        "tog-underline": "Gulisan lang panglalam deng suglung:",
        "tog-hideminor": "Isalikut la reng mangalating edit kareng bayung mengayalili",
-       "tog-hidepatrolled": "Isalikut la reng edit a babanten (''controlled edits'') kareng bayung mengayalili",
+       "tog-hidepatrolled": "Isalikut la reng edit a babanten kareng bayung mengayalili",
        "tog-newpageshidepatrolled": "Isalikut la reng bulung a babanten (''patrolled pages'') king listaan king bayung bulung (''new page list'')",
        "tog-extendwatchlist": "Dagdagan la reng babanten ba lang palto deng anggang mialilan, aliwa mu deng pekabayu.",
        "tog-usenewrc": "↓mesanting la reng bayung mengayalili (JavaScript)",
        "tog-numberheadings": "Tambing lang dinan nomiru deng pamagat",
-       "tog-showtoolbar": "Ipakit ya panaliling toolbar (JavaScript)",
-       "tog-editondblclick": "Alilan la reng bulung kapamilatan ning makataduang pamagpindut (JavaScript)",
-       "tog-editsectiononrightclick": "Paganan ya ing pamag-edit seksiyon (section editing) kapamilata'ning pamag right click kareng pamagat da reng seksiyon (JavaScript)",
+       "tog-showtoolbar": "Ipakit ya panaliling toolbar",
+       "tog-editondblclick": "Iyalilan la reng bulung king dobling klik",
+       "tog-editsectiononrightclick": "Paganan ya ing pamag-edit seksiyon (section editing) kapamilatan ning pamag right click kareng pamagat da reng seksiyon",
        "tog-watchcreations": "Idagdag la deng bulung a lelengan ku kareng babanten",
        "tog-watchdefault": "Idagdag la reng bulung a inalilan ku kareng babanten",
        "tog-watchmoves": "Idagdag la reng bulung a inalis ku kareng babanten",
@@ -30,7 +31,7 @@
        "tog-enotifwatchlistpages": "I e-mail mu ku ustung ing bulung a babanten ku meyalili ya",
        "tog-enotifusertalkpages": "E-mail mu ku ustung ing kanakung gamit talamitam meyalili ya",
        "tog-enotifminoredits": "E-mail mu ku kareng mangalating alili da reng bulung",
-       "tog-enotifrevealaddr": "Ipakit me ing kanakung e-mail address kareng pamanabisang sulat",
+       "tog-enotifrevealaddr": "Ipakit ya ing kanakung e-mail address kareng pamanabisang sulat",
        "tog-shownumberswatching": "Ipakit la reng bilang da reng magbanteng talagamit",
        "tog-oldsig": "I-preview ya ing salukuyan a pirma",
        "tog-fancysig": "Ituring yang wikitext ing pirma (alang automatic link o tambing a suglung)",
        "tog-watchlisthideanons": "Isalikut la reng elilan da reng e migpakilala king babanten o watchlist",
        "tog-ccmeonemails": "Paralan mu kung kauangis da reng e-mails a peparala ku kareng aliwang talagamit",
        "tog-diffonly": "Eya papakit ing laman ning bulung lalam ning diffs",
-       "tog-showhiddencats": "Ipakit la reng makasalikut a categories",
+       "tog-showhiddencats": "Ipakit la reng makasalikut a kategorya",
        "underline-always": "Pane",
        "underline-never": "emaliari agiang misan",
        "underline-default": "Browser default",
        "sunday": "Dominggu",
        "monday": "Lunis",
        "tuesday": "Martis",
-       "wednesday": "Mierkulis",
-       "thursday": "Juebis",
-       "friday": "Biernis",
+       "wednesday": "Miyerkulis",
+       "thursday": "Huwebis",
+       "friday": "Biyernis",
        "saturday": "Sabadu",
        "sun": "Dom",
        "mon": "Lun",
        "march": "Marsu",
        "april": "Abril",
        "may_long": "Mayu",
-       "june": "Juniu",
-       "july": "Juliu",
+       "june": "Hunyu",
+       "july": "Hulyu",
        "august": "Agostu",
-       "september": "Septiembri",
-       "october": "Octubri",
-       "november": "Nobiembri",
-       "december": "Disiembri",
+       "september": "Setyembri",
+       "october": "Oktubri",
+       "november": "Nobyembri",
+       "december": "Disyembri",
        "january-gen": "Eneru",
        "february-gen": "Pebreru",
        "march-gen": "Marsu",
        "april-gen": "Abril",
        "may-gen": "Mayu",
-       "june-gen": "Juniu",
-       "july-gen": "Juliu",
+       "june-gen": "Hunyu",
+       "july-gen": "Hulyu",
        "august-gen": "Agostu",
-       "september-gen": "Septiembri",
-       "october-gen": "Octubri",
-       "november-gen": "Nobiembri",
-       "december-gen": "Disiembri",
+       "september-gen": "Setyembri",
+       "october-gen": "Oktubri",
+       "november-gen": "Nobyembri",
+       "december-gen": "Disyembri",
        "jan": "Ene",
        "feb": "Peb",
        "mar": "Mrs",
        "apr": "Abr",
        "may": "Myu",
-       "jun": "Jnu",
-       "jul": "Jul",
+       "jun": "Hnu",
+       "jul": "Hul",
        "aug": "Ago",
        "sep": "Set",
-       "oct": "Oct",
+       "oct": "Okt",
        "nov": "Nob",
-       "dec": "Dic",
-       "pagecategories": "{{PLURAL:$1|Kategoriya|Kategoriya}}",
-       "category_header": "Deng bulung king kategoriyang \"$1\"",
-       "subcategories": "Deng subcategory",
-       "category-media-header": "Media king kategoriyang \"$1\"",
+       "dec": "Dis",
+       "january-date": "Eneru $1",
+       "february-date": "Pebreru $1",
+       "march-date": "Marsu $1",
+       "april-date": "Abril $1",
+       "may-date": "Mayu $1",
+       "june-date": "Hunyu $1",
+       "july-date": "Hulyu $1",
+       "august-date": "Agostu $1",
+       "september-date": "Setyembri $1",
+       "october-date": "Oktubri $1",
+       "november-date": "Nobyembri $1",
+       "december-date": "Disyembri $1",
+       "pagecategories": "{{PLURAL:$1|Kategorya|Kategorya}}",
+       "category_header": "Deng bulung king kategoryang \"$1\"",
+       "subcategories": "Deng subkategorya",
+       "category-media-header": "Media king kategoryang \"$1\"",
        "category-empty": "''Ala yang bulung o media ngening salukuyan ining kategoriya.''",
        "hidden-categories": "{{PLURAL:$1|Makasalikut a kategoriya|Makasalikut a kategoriya}}",
        "hidden-category-category": "Pakasalikut a categoria",
        "newwindow": "(mibusni ya king bayung awang)",
        "cancel": "E taglus",
        "moredotdotdot": "Dakal pa...",
-       "mypage": "Ing kakung bulung",
-       "mytalk": "Makisabi kaku",
-       "anontalk": "Pamakisabi para keng IPing ini",
-       "navigation": "Pamaglibut",
+       "mypage": "Bulung",
+       "mytalk": "Pamisabi-sabi",
+       "anontalk": "Pamisabi-sabi para keng direksyung IP",
+       "navigation": "Pamaglibut (nabigasyun)",
        "and": "&#32;ampo",
-       "qbfind": "Maintun",
+       "qbfind": "Mayintun",
        "qbbrowse": "Bation (browse)",
        "qbedit": "Mag-edit",
        "qbpageoptions": "Ining bulung",
-       "qbmyoptions": "Deng kakung bulung",
+       "qbmyoptions": "Deng kanakung bulung",
        "faq": "Maralas a Kukutang (MAK)",
        "faqpage": "Project:MAK",
-       "actions": "↓Ding kilus",
-       "namespaces": "Karinanlagiu",
-       "variants": "Aliwapa",
+       "actions": "Deng kilus",
+       "namespaces": "Deng pirinan-lagyu (Namespaces)",
+       "variants": "Deng aliwa pa",
        "errorpagetitle": "Mali",
        "returnto": "Magbalik king $1.",
        "tagline": "Ibat king {{SITENAME}}",
        "nlinks": "$1 {{PLURAL:$1|link|suglung}}",
        "nmembers": "$1 {{PLURAL:$1|kayanib}}",
        "nrevisions": "$1 {{PLURAL:$1|pamagbayu|pamagbayu}}",
-       "nviews": "$1 {{PLURAL:$1|linawe|linawe}}",
        "specialpage-empty": "Alang linual/resulta king ulat (report) a ini.",
        "lonelypages": "Bulung a alang suglung (orphaned)",
        "lonelypagestext": "Alang suglung manibat kareng aliwang bulung ning {{SITENAME}} kareng makatuking bulung.",
        "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-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",
        "feedback-error-title": "Mali",
        "feedback-submit": "I-sumiti",
        "feedback-thanks-title": "Salamat pu!",
-       "headline-anchor-title": "Ing suglung king seksyun a ini"
+       "headline-anchor-title": "Ing suglung king seksyun a ini",
+       "mw-widgets-titleinput-description-new-page": "Ala yu pa ing bulung (page)",
+       "mw-widgets-titleinput-description-redirect": "I-redirekta king/kang $1"
 }
index 8329f56..1bf6dc2 100644 (file)
@@ -7,7 +7,8 @@
                        "Xqt",
                        "לערי ריינהארט",
                        "아라",
-                       "Purodha"
+                       "Purodha",
+                       "Geitost"
                ]
        },
        "tog-underline": "Gleecher unnerleine:",
        "resetpass-submit-loggedin": "Paesswatt ennere",
        "resetpass-submit-cancel": "Ausduh",
        "passwordreset": "Paesswatt zerricksetze",
-       "passwordreset-legend": "Paesswatt zerricksetze",
        "passwordreset-username": "Yuuser-Naame:",
        "passwordreset-email": "E-Poschd:",
        "passwordreset-emailelement": "Yuusernaame: $1\nPaesswatt fer nau: $2",
        "ipbreason": "Grund:",
        "ipbsubmit": "Daen Yuuser aabinne",
        "ipbother": "Annere Zeit (englisch):",
-       "ipboptions": "2 Schtund:2 hours,1 Daag:1 day,3 Daag:3 days,1 Woch:1 week,2 Woche:2 weeks,1 Munet:1 month,3 Munede:3 months,6 Monate:6 months,1 Yaar:1 year,Fer immer:infinite",
+       "ipboptions": "2 Schtund:2 hours,1 Daag:1 day,3 Daag:3 days,1 Woch:1 week,2 Woche:2 weeks,1 Munet:1 month,3 Munede:3 months,6 Munede:6 months,1 Yaar:1 year,fer immer:infinite",
        "blocklist-reason": "Grund",
        "ipblocklist-submit": "Guck uff",
        "infiniteblock": "fer immer",
index 01ddf9a..fea3d1c 100644 (file)
@@ -78,7 +78,8 @@
                        "Ency",
                        "Kszapsza",
                        "Openbk",
-                       "Doctore"
+                       "Doctore",
+                       "PiotrAntosz"
                ]
        },
        "tog-underline": "Podkreślenie linków:",
        "underline-never": "Nigdy",
        "underline-default": "według ustawień skórki lub przeglądarki",
        "editfont-style": "Styl czcionki w polu edycyjnym:",
-       "editfont-default": "Domyślna przeglądarka",
+       "editfont-default": "domyślny przeglądarki",
        "editfont-monospace": "czcionka o stałej szerokości",
        "editfont-sansserif": "czcionka bezszeryfowa",
        "editfont-serif": "czcionka szeryfowa",
        "passwordreset": "Wyczyść hasło",
        "passwordreset-text-one": "Wypełnij ten formularz, aby otrzymać tymczasowe hasło na email.",
        "passwordreset-text-many": "{{PLURAL:$1|Wypełnij jedno z poniższych pól, aby otrzymać tymczasowe hasło przez e-mail.}}",
-       "passwordreset-legend": "Zresetuj hasło",
        "passwordreset-disabled": "Na tej wiki wyłączono możliwość resetowania haseł.",
        "passwordreset-emaildisabled": "Wysyłanie emaili zostało wyłączone na tej wiki",
        "passwordreset-username": "Nazwa użytkownika:",
        "changeemail-newemail": "Nowy adres e-mail:",
        "changeemail-none": "(brak)",
        "changeemail-password": "Twoje hasło:",
-       "changeemail-submit": "Zmień email",
+       "changeemail-submit": "Zmień e-mail",
        "changeemail-throttled": "Zbyt wiele razy próbowałeś zalogować się na to konto.\nOdczekaj $1, zanim ponowisz próbę.",
        "resettokens": "Resetowanie tokenów",
        "resettokens-text": "Na tej stronie możesz zresetować tokeny, które umożliwiają dostęp do pewnych prywatnych danych związanych z Twoim kontem.\n\nNależy to zrobić, jeśli ktoś je poznał lub zdobył hasło do Twojego konta.",
        "resettokens-no-tokens": "Brak tokenów do zresetowania.",
-       "resettokens-legend": "Resetowanie tokenów",
        "resettokens-tokens": "Tokeny:",
        "resettokens-token-label": "$1 (obecna wartość: $2)",
        "resettokens-watchlist-token": "Token kanału internetowego (Atom/RSS) zmian w [[Special:Watchlist|obserwowanych stronach]]",
        "creating": "Tworzenie $1",
        "editingsection": "Edytujesz $1 (sekcja)",
        "editingcomment": "Edytujesz $1 (nowa sekcja)",
-       "editconflict": "Konflikt edycji: $1",
+       "editconflict": "Twoje zmiany nie mogły zostać zapisane z powodu wystąpienia konfliktu edycji. Czy {{GENDER:|chcesz}} rozwiązać go ręcznie?",
        "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",
        "randomincategory-nopages": "Nie ma żadnych stron w [[:Category:$1]].",
        "randomincategory-category": "Kategoria:",
        "randomincategory-legend": "Losowa strona w kategorii",
+       "randomincategory-submit": "Dalej",
        "randomredirect": "Losowe przekierowanie",
        "randomredirect-nopages": "Brak jakichkolwiek przekierowań w przestrzeni nazw „$1”.",
        "statistics": "Statystyki",
        "rollback-success": "Wycofano edycje użytkownika $1;\nprzywrócono ostatnią wersję autorstwa $2.",
        "sessionfailure-title": "Błąd sesji",
        "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-reason-label": "Powód:",
+       "logentry-contentmodel-change-revertlink": "Przywróć",
+       "logentry-contentmodel-change-revert": "Przywróć",
        "protectlogpage": "Zabezpieczone",
        "protectlogtext": "Poniżej znajduje się lista zmian w zabezpieczeniu pojedynczych stron.\nWszystkie aktywne zabezpieczenia odnajdziesz na liście [[Special:ProtectedPages|zabezpieczonych stron]].",
        "protectedarticle": "zabezpieczył(a) „[[$1]]”",
        "import-upload": "Prześlij dane w formacie XML",
        "import-token-mismatch": "Utracono dane sesji. Proszę spróbować ponownie.",
        "import-invalid-interwiki": "Nie można importować z podanej wiki.",
-       "import-error-edit": "Strona „$1” nie została zaimportowana ponieważ nie jesteś uprawniony do jej edytowania.",
-       "import-error-create": "Strona „$1” nie została zaimportowana ponieważ nie jesteś uprawniony do jej utworzenia.",
+       "import-error-edit": "Strona „$1” nie została zaimportowana, ponieważ nie jesteś uprawniony do jej edytowania.",
+       "import-error-create": "Strona „$1” nie została zaimportowana, ponieważ nie jesteś uprawniony do jej utworzenia.",
        "import-error-interwiki": "Strona „$1” nie została zaimportowana, ponieważ jej nazwa jest zarezerwowana do linków zewnętrznych (interwiki).",
        "import-error-special": "Strona „$1” nie została zaimportowana, ponieważ należy do specjalnej przestrzeni nazw, która nie zezwala na strony.",
        "import-error-invalid": "Strona „$1” nie została zaimportowana, ponieważ jej nazwa jest nieprawidłowa na tej wiki.",
        "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": "Możesz edytować tę stronę. Przed zapisaniem zmian użyj przycisku podgląd.",
+       "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": "Utwórz ponownie",
+       "recreate": "Strona została usunięta od czasu rozpoczęcia twojej edycji. Naciśnij „$1”, aby ją powtórnie utworzyć.",
        "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.",
        "version-libraries": "Zainstalowane biblioteki",
        "version-libraries-library": "Biblioteka",
        "version-libraries-version": "Wersja",
+       "version-libraries-license": "Licencja",
+       "version-libraries-description": "Opis",
+       "version-libraries-authors": "Autorzy",
        "redirect": "Przekierowanie według pliku, użytkownika, strony lub identyfikatora wersji",
        "redirect-legend": "Przekieruj do pliku lub strony",
        "redirect-summary": "Ta strona specjalna przekierowuje do: pliku (o podanej nazwie), do strony (o podanym numerze wersji lub identyfikatorze strony) albo do strony użytkownika (o podanym identyfikatorze numerycznym). Sposób użycia: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]] albo [[{{#Special:Redirect}}/user/101]].",
index 564c09c..36a59ba 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": "کله چې په مخونو او دوتنو کې وړې سمونې کېږي نو ماته دې د بدلون په اړه برېښليک راشي",
        "passwordreset": "پټنوم بياپرځايول",
        "passwordreset-text-one": "د برېښليک له لارې د لنډمهاله پټنوم د ترلاسه کولو لپاره دا فورمه ډکه کړئ.",
        "passwordreset-text-many": "{{PLURAL:$1|د برېښليک له لارې د يو لنډمهاله پټنوم د ترلاسه کولو لپاره له لاندينيو ډگرونو څخه يو يې ډک کړۍ.}}",
-       "passwordreset-legend": "پټنوم بياپرځايول",
        "passwordreset-disabled": "په دې ويکي پټنوم بياپرځای کولو کړنه ناچارنه شوې.",
        "passwordreset-emaildisabled": "په دې ويکي باندې د برېښليک ځانتياوې ناچارنې شوي دي.",
        "passwordreset-username": "کارن-نوم:",
        "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": "دا د کارن-نوم د جوړېدو يادښت دی",
        "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آيا تاسې غواړۍ چې يو داسې بېل نوم ټاکۍ چې د پخوانۍ دوتنې سره توپير ولري؟",
        "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": "د دې راپور لپاره کومې پايلې نشته.",
        "unusedimages": "ناکارېدلې دوتنې",
        "wantedcategories": "غوښتلې وېشنيزې",
        "wantedpages": "غوښتلي مخونه",
+       "wantedpages-summary": "دا د هغو ناموجودو مخونو لړليک دی چې تر ټولو ډېرې تړنې لري، په دې لړليک کې د مخ گرځونو مخونه شامل نه دي. د هغو ناموجودو مخونو لپاره چې د مخ گرځونو مخونه په کې شامل دي، [[{{#special:BrokenRedirects}}|د ماتو مخ گرځونو لړليک]] کې کتلی شی.",
        "wantedfiles": "غوښتلې دوتنې",
        "wantedtemplates": "غوښتلې کينډۍ",
        "mostlinked": "د ډېرو تړنو مخونه",
        "delete-edit-reasonlist": "د ړنگولو سببونه سمول",
        "rollbacklink": "په شابېول",
        "rollbacklinkcount": "$1 {{PLURAL:$1|سمون|سمونونه}} پرشابېول",
+       "editcomment": "د سمون لنډيز دا و: \"''$1''\".",
+       "changecontentmodel-title-label": "مخ سرليک",
+       "changecontentmodel-reason-label": "سبب:",
        "protectlogpage": "د ژغورنې يادښت",
        "protectlogtext": "دلته لاندې د ژغورل شويو مخونو د بدلونونو لړليک راغلی.\nد دم گړۍ فعالو مخ ژغورنو لړليک لپاره د [[Special:ProtectedPages|ژغورل شويو مخونو لړليک]] وگورئ.",
        "protectedarticle": "\"[[$1]]\" وژغورل شو",
        "ipusubmit": "دا بنديز ليرې کول",
        "unblocked": "له [[User:$1|$1]] بنديز ليري شو",
        "unblocked-range": "له $1 بنديز ليرې شو",
+       "unblocked-ip": "له [[Special:Contributions/$1|$1]] څخه بنديز ليرې شو.",
        "blocklist": "بنديز لگېدلي کارنان",
        "ipblocklist": "بنديز لگېدلي کارنان",
        "ipblocklist-legend": "يو بنديز شوی کارن موندل",
        "tooltip-pt-logout": "وتل",
        "tooltip-pt-createaccount": "تاسې ته د يو گڼون د جوړولو او بيا غونډال کې ورننوتلو سپارښتنه کېږي؛ که څه هم چې دا يو اړين کار نه دی",
        "tooltip-ca-talk": "د مخ د مېنځپانگې په اړه خبرې اترې",
-       "tooltip-ca-edit": "تاسÛ\90 Ù\87Ù\85دا Ù\85Ø® Ø³Ù\85Ù\88Ù\84اÛ\8c Ø´Û\8c. Ù\84Ø·Ù\81اÙ\8b Ø¯ Ù\84Ù\8aÚ©Ù\86Û\90 Ø¯ Ø®Ù\88Ù\86دÙ\8a Ú©Ù\88Ù\84Ù\88 Ø¯Ù\85Ø®Ù\87Ø\8c Ø¯ Ù\87Ù\85دÛ\90 Ù\84Ù\8aÚ©Ù\86Û\90 Ù\85Ø®Ù\84Ù\8aدÙ\86Ù\87 Ù\88Ú¯Ù\88رÛ\8d.",
+       "tooltip-ca-edit": "دا Ù\85Ø® Ø³Ù\85Ù\88Ù\84",
        "tooltip-ca-addsection": "يوه نوې برخه پيلول",
        "tooltip-ca-viewsource": "دا مخ ژغورل شوی. تاسې کولای شی چې د دې مخ سرجينه وگورۍ.",
        "tooltip-ca-history": "د دې مخ پخوانۍ بڼې",
        "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": "معيار",
        "version-entrypoints-header-url": "يو آر اېل",
        "version-libraries-library": "کتابتون",
        "version-libraries-version": "بڼه",
-       "redirect": "د دوتنې، کارن، مخ يا بڼې پېژند له مخې ورگرځېدنې",
+       "version-libraries-license": "منښتليک",
+       "version-libraries-description": "څرگندونه",
+       "version-libraries-authors": "ليکوالان",
+       "redirect": "ورگرځېدنې د دوتنې، کارن، مخ يا بڼې پېژند له مخې",
        "redirect-submit": "ورځه",
        "redirect-value": "ارزښت:",
        "redirect-user": "کارن پېژند",
        "specialpages-group-pages": "د مخونو لړليک",
        "specialpages-group-pagetools": "د مخ اوزارونه",
        "specialpages-group-wiki": "توکي او اوزارونه",
+       "specialpages-group-redirects": "د ځانگړو مخونو مخ گرځونې",
        "blankpage": "تش مخ",
        "intentionallyblankpage": "همدا مخ په لوی لاس تش پرېښودل شوی دی",
        "external_image_whitelist": " #دا کرښه چې څنگه ده، همداسې پرېږدۍ<pre>\n#لاندې د منظمو اصطلاحگانو ټوټې (يوازې هغه برخه چې د // په مېنځ کې ليکلې) ځای پر ځای کړی\n#دا به د باندنيو انځورونو د يو آر اېل (hotlinked) سره مطابقه شي \n#هغه څه چې مطابقت لري هغه به د انځورونو په توگه ښکاره شي، کوم چې مطابقت نلري نو يوازې د انځور تړنه به ښکاره کېږي\n#هغه کرښې چې په # پيل کېږي د تبصرو په توگه په نظر کې نيول کېږي\n#دا کرښې د غټو تورو او وړو تورو سره حساسې نه دي\n\n#ټولې regex ټوټې د دغې کرښې نه پورته ځای پر ځای کړی. دا کرښه چې څنگه ده، همداسې يې پرېږدۍ</pre>",
        "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-devanagari": "دېوانګري",
        "special-characters-group-thai": "تايلنډي",
        "special-characters-group-lao": "لاوي",
-       "special-characters-group-khmer": "خمري"
+       "special-characters-group-khmer": "خمري",
+       "mw-widgets-titleinput-description-new-page": "پدې نوم لا تر اوسه پورې مخ نشته",
+       "mw-widgets-titleinput-description-redirect": "$1 ته ورگرځول"
 }
index 7148987..053ee0d 100644 (file)
        "passwordreset": "Redefinir senha",
        "passwordreset-text-one": "Complete este formulário para trocar sua senha.",
        "passwordreset-text-many": "{{PLURAL:$1|Preencha um dos campos para trocar sua senha.}}",
-       "passwordreset-legend": "Reiniciar a senha",
        "passwordreset-disabled": "Redefinições de senha foram desabilitadas nesta wiki.",
        "passwordreset-emaildisabled": "Os recursos de e-mail foram desativados nesta wiki.",
        "passwordreset-username": "Nome de usuário:",
        "resettokens": "Reiniciar os tokens",
        "resettokens-text": "Você pode reiniciar os tokens, que permitem o acesso a certos dados privados associados à sua conta, aqui.\n\nVocê só deve reiniciá-los se compartilhou-os com alguém ou se a sua conta foi comprometida.",
        "resettokens-no-tokens": "Não existem tokens para reiniciar.",
-       "resettokens-legend": "Reiniciar tokens",
        "resettokens-tokens": "Símbolos:",
        "resettokens-token-label": "$1 (valor atual: $2)",
        "resettokens-watchlist-token": "Tokens para o feed da web (Atom/RSS) das [[Special:Watchlist|mudanças de páginas em sua lista de páginas vigiadas]]",
        "randomincategory-nopages": "Não há paginas em [[:Category:$1]].",
        "randomincategory-category": "Categoria:",
        "randomincategory-legend": "Página aleatória na categoria",
+       "randomincategory-submit": "Ir",
        "randomredirect": "Redirecionamento aleatório",
        "randomredirect-nopages": "Não há redirecionamentos no espaço nominal \"$1\".",
        "statistics": "Estatísticas",
        "delete-confirm": "Eliminar \"$1\"",
        "delete-legend": "Eliminar",
        "historywarning": "<strong>Aviso:</strong> A página que está prestes a eliminar tem um histórico com aproximadamente $1 {{PLURAL:$1|revisão|revisões}}:",
-       "confirmdeletetext": "Encontra-se prestes a eliminar permanentemente uma página ou uma imagem e todo o seu histórico.\nPor favor, confirme que possui a intenção de fazer isto, que compreende as consequências e que encontra-se a fazer isto de acordo com as [[{{MediaWiki:Policy-url}}|políticas]] do projeto.",
+       "confirmdeletetext": "Encontra-se prestes a eliminar uma página juntamente com todo o seu histórico.\nPor favor, confirme que possui a intenção de fazer isto, que compreende as consequências e que encontra-se a fazer isto de acordo com as [[{{MediaWiki:Policy-url}}|políticas]] do projeto.",
        "actioncomplete": "Ação concluída",
        "actionfailed": "Falha na ação",
        "deletedtext": "\"$1\" foi eliminada.\nConsulte $2 para um registro de eliminações recentes.",
index e93576e..e1c80b8 100644 (file)
        "passwordreset": "Redefinir palavra-passe",
        "passwordreset-text-one": "Preencha este formulário para receber uma palavra-passe temporária por correio eletrónico.",
        "passwordreset-text-many": "{{PLURAL:$1|Preencha um dos campos para receber uma palavra-passe temporária por correio eletrónico.}}",
-       "passwordreset-legend": "Redefinir palavra-passe",
        "passwordreset-disabled": "A redefinição da palavra-passe foi impossibilitada nesta wiki.",
        "passwordreset-emaildisabled": "A funcionalidade de correio eletrónico foi desativada nesta wiki.",
        "passwordreset-username": "Nome de utilizador(a):",
        "resettokens": "Redefinir chaves",
        "resettokens-text": "Pode redefinir as chaves de acesso a certos dados privados associados à sua conta aqui.\n\nDeve fazê-lo se as divulgou acidentalmente a alguém ou se a sua conta tiver sido comprometida.",
        "resettokens-no-tokens": "Não há chaves para redefinir.",
-       "resettokens-legend": "Redefinir chaves",
        "resettokens-tokens": "Chaves:",
        "resettokens-token-label": "$1 (valor atual: $2)",
        "resettokens-watchlist-token": "Chave para o ''feed'' Atom/RSS de [[Special:Watchlist|mudanças às páginas vigiadas]]",
        "creating": "A criar $1",
        "editingsection": "A editar $1 (secção)",
        "editingcomment": "A editar $1 (nova secção)",
-       "editconflict": "Conflito de edição: $1",
+       "editconflict": "As suas alterações não puderam ser gravadas devido a um conflito de edição. Gostaria de resolver o conflito manualmente?",
        "explainconflict": "A página foi alterada por alguém desde que começou a editá-la.\nA caixa de texto abaixo mostra o texto existente neste momento.\nAs suas mudanças são mostradas na área ao fundo da página.\nTerá de reintegrar as suas mudanças no texto da caixa abaixo.\n'''Só''' o texto desta caixa será gravado quando clicar \"{{int:savearticle}}\".",
        "yourtext": "O seu texto",
        "storedversion": "Versão gravada",
        "randomincategory-nopages": "Não há páginas na categoria [[:Category:$1|$1]].",
        "randomincategory-category": "Categoria:",
        "randomincategory-legend": "Página aleatória na categoria",
+       "randomincategory-submit": "Ir",
        "randomredirect": "Redirecionamento aleatório",
        "randomredirect-nopages": "Não há redirecionamentos no domínio \"$1\".",
        "statistics": "Estatísticas",
        "delete-confirm": "Eliminar \"$1\"",
        "delete-legend": "Eliminar",
        "historywarning": "<strong>Aviso:</strong> A página que está prestes a eliminar tem um histórico com aproximadamente $1 {{PLURAL:$1|revisão|revisões}}:",
-       "confirmdeletetext": "Está prestes a eliminar permanentemente uma página ou uma imagem e todo o seu histórico.\nConfirme que é realmente esta a sua intenção, que compreende as consequências e que o faz de acordo com as [[{{MediaWiki:Policy-url}}|políticas e recomendações]] do projeto, por favor.",
+       "confirmdeletetext": "Está prestes a eliminar uma página juntamente com todo o seu histórico.\nConfirme que é realmente esta a sua intenção, que compreende as consequências e que o faz de acordo com as [[{{MediaWiki:Policy-url}}|políticas e recomendações]] do projeto, por favor.",
        "actioncomplete": "Operação executada",
        "actionfailed": "Operação falhou",
        "deletedtext": "\"$1\" foi eliminada.\nConsulte $2 para um registo de eliminações recentes.",
        "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-reason-label": "Motivo:",
        "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]]\"",
        "tooltip-pt-logout": "Sair da conta",
        "tooltip-pt-createaccount": "É encorajado a criar uma conta e iniciar sessão; no entanto, não é obrigatório",
        "tooltip-ca-talk": "Discussão sobre o conteúdo da página",
-       "tooltip-ca-edit": "Pode editar esta página.\nUtilize o botão de antevisão do resultado antes de gravar, por favor.",
+       "tooltip-ca-edit": "Editar esta página",
        "tooltip-ca-addsection": "Iniciar uma nova secção",
        "tooltip-ca-viewsource": "Esta página está protegida.\nApenas pode visualizar o seu conteúdo",
        "tooltip-ca-history": "Edições anteriores desta página.",
        "deletedwhileediting": "<strong>AVISO:</strong> Esta página foi eliminada depois de ter começado a editá-la!",
        "confirmrecreate": "Depois de ter começado a editar esta página, o utilizador [[User:$1|$1]] ([[User talk:$1|conversar]]) eliminou-a pelo seguinte motivo:\n: <em>$2</em>\nPor favor, confirme que quer realmente recriar esta página.",
        "confirmrecreate-noreason": "O utilizador [[User:$1|$1]] ([[User talk:$1|discussão]]) eliminou esta página depois de ter começado a editá-la. Confirme que deseja recriar a página, por favor.",
-       "recreate": "Recriar",
+       "recreate": "A página que começou a editar foi eliminada entretanto. Pressione \"$1\" para recriá-la.",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Limpar a memória cache desta página?",
        "confirm-purge-bottom": "Recarregar uma página, limpa a cache e força a sua versão mais recente a aparecer.",
        "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 pelo ID do ficheiro, do utilizador ou da revisão",
        "redirect-legend": "Redirecionar para um ficheiro ou página",
        "redirect-summary": "Esta página especial redireciona para um ficheiro (dado o nome do ficheiro), para uma página (dado um ID de revisão ou página) ou para uma página de utilizador (dado um ID numérico do utilizador). Utilização: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]] ou [[{{#Special:Redirect}}/user/101]].",
index 7288066..0867cf7 100644 (file)
                        "Totosunarto",
                        "Macofe",
                        "FRacco",
-                       "Robin0van0der0vliet"
+                       "Robin0van0der0vliet",
+                       "TTO"
                ]
        },
        "sidebar": "{{notranslate}}",
        "passwordreset": "Title of [[Special:PasswordReset]].\n{{Identical|Reset password}}",
        "passwordreset-text-one": "Text on [[Special:PasswordReset]] that appears when there is only one way of resetting the password.\n\n{{msg-mw|Passwordreset-text-many}} will be used, when there are multiple ways of resetting the password.",
        "passwordreset-text-many": "Text on [[Special:PasswordReset]] that appears when there are multiple ways of resetting the password.\n\nParameters:\n* $1 - the number of password reset routes\n\n{{msg-mw|Passwordreset-text-one}} will be used, when there is only one way of resetting the password.",
-       "passwordreset-legend": "{{Identical|Reset password}}",
        "passwordreset-disabled": "Used as error message in changing password.",
        "passwordreset-emaildisabled": "Used as error message in changing password when site's email feature is disabled.",
        "passwordreset-username": "{{Identical|Username}}",
        "resettokens-summary": "{{ignored}}",
        "resettokens-text": "Text on [[Special:ResetTokens]].",
        "resettokens-no-tokens": "Additional text on [[Special:ResetTokens]] if the user has no tokens.",
-       "resettokens-legend": "Form legend on [[Special:ResetTokens]].\n{{Identical|Reset token}}",
        "resettokens-tokens": "Form label on [[Special:ResetTokens]].\n{{Identical|Token}}",
        "resettokens-token-label": "Label for each checkbox on [[Special:ResetTokens]]. Parameters:\n* $1 - short information about the token (for example {{msg-mw|resettokens-watchlist-token}})\n* $2 - its current value",
        "resettokens-watchlist-token": "Label for watchlist token checkbox on [[Special:ResetTokens]] (see {{msg-mw|prefs-watchlist-token}} at [[Special:Preferences#mw-prefsection-watchlist]]).",
        "creating": "Shown as page title when creating a page. Parameters:\n* $1 - the name of the page that is being created. Example: \"Creating Main Page\".\n{{Related|Editing}}\n{{Identical|Creating}}",
        "editingsection": "This message displays at the top of the page when a user is editing a page section. Parameters:\n* $1 - page name\n{{Related|Editing}}",
        "editingcomment": "This message displays at the top of the page when a user is creating a new section. Parameters:\n* $1 - page name\n{{Related|Editing}}",
-       "editconflict": "Used as title of error message. Parameters:\n* $1 - page title",
+       "editconflict": "Alert message when saving a page causes an edit conflict",
        "editnotice-notext": "{{ignored}}\nCustom message on top of the edit page if no edit notices apply to this page.",
        "explainconflict": "Appears at the top of a page when there is an edit conflict.\n\nSee also:\n* {{msg-mw|Savearticle}}",
        "yourtext": "Used in Diff Preview page. The diff is between {{msg-mw|currentrev}} and {{msg-mw|yourtext}}.\n\nAlso used in Edit Conflict page; the diff between {{msg-mw|yourtext}} and {{msg-mw|storedversion}}.",
        "currentrevisionlink": "{{Identical|Current revision}}",
        "cur": "Link in page history ([https://translatewiki.net/w/i.php?title=MediaWiki:Cur/qqq&action=history example])",
        "next": "Link in page history\n\n{{Identical|Next}}",
-       "last": "Link in page history\n\n{{Identical|Last}}",
+       "last": "Link in page history",
        "page_first": "This is part of the navigation message on the top and bottom of Special pages which are lists of things in alphabetical order, e.g. the '[[Special:Categories|Categories]]' special page. It is followed by the message {{msg-mw|Viewprevnext}}.\n{{Identical|First}}",
        "page_last": "This is part of the navigation message on the top and bottom of Special pages which are lists of things in alphabetical order, e.g. the '[[Special:Categories|Categories]]' special page. It is followed by the message {{msg-mw|Viewprevnext}}.\n\n{{Identical|Last}}",
        "histlegend": "Text in history page.\n\nSee also:\n* {{msg-mw|Cur}}\n* {{msg-mw|Last}}\n* {{msg-mw|Minoreditletter}}",
        "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]].",
        "randomincategory-nopages": "Message shown from [[Special:RandomInCategory]] if the category is empty.\n\nParameters:\n* $1 - the category name (without the namespace prefix)",
        "randomincategory-category": "Shown on [[Special:RandomInCategory]] as a label for a text box allowing the user to input a category name.\n{{Identical|Category}}",
        "randomincategory-legend": "Used as fieldset label for the form on [[Special:RandomInCategory]].",
+       "randomincategory-submit": "Used as label for the Submit button on [[Special:RandomInCategory]].\n{{Identical|Go}}",
        "randomredirect": "{{doc-special|RandomRedirect}}",
        "randomredirect-nopages": "Parameters:\n* $1 - list of namespaces\n* $2 - (Unused) number of namespaces\nSee also:\n* {{msg-mw|Randompage-nopages}}",
        "statistics": "{{doc-special|Statistics}}\n{{Identical|Statistics}}",
        "rollback-success": "This message shows up on screen after successful revert (generally visible only to admins). $1 describes user whose changes have been reverted, $2 describes user which produced version, which replaces reverted version.\n{{Identical|Revert}}\n{{Identical|Rollback}}",
        "sessionfailure-title": "Used as title of the error message {{msg-mw|Sessionfailure}}.",
        "sessionfailure": "Used as error message.\n\nThe title for this error message is {{msg-mw|Sessionfailure-title}}.",
+       "changecontentmodel": "Title of the change content model special page",
+       "changecontentmodel-legend": "Legend of the fieldset on the change content model special page",
+       "changecontentmodel-title-label": "Label for the input field where the target page title should be entered\n{{Identical|Page title}}",
+       "changecontentmodel-model-label": "Label of the dropdown listing available content model types the user can change a page to",
+       "changecontentmodel-reason-label": "{{Identical|Reason}}",
+       "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.\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]].",
+       "logentry-contentmodel-change": "{{Logentry}}\n$4 is the original content model.\n$5 is the new content model.",
+       "logentry-contentmodel-change-revertlink": "Text on a link that reverts the content model change. {{identical|revertmove}}.",
+       "logentry-contentmodel-change-revert": "Prefilled edit summary when reverting a content model change. {{identical|revertmove}}",
        "protectlogpage": "{{doc-logpage}}\n\nTitle of [[Special:Log/protect]].",
        "protectlogtext": "Text in [[Special:Log/protect]].",
        "protectedarticle": "Text describing an action on [[Special:Log]]. $1 is a page title.",
        "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",
        "tooltip-pt-logout": "Tooltip shown when hovering over the {{msg-mw|Logout}} link in your personal toolbox (upper right side).\n\nSee also:\n* {{msg-mw|Logout}}\n* {{msg-mw|Accesskey-pt-logout}}\n* {{msg-mw|Tooltip-pt-logout}}\n{{Identical|Log out}}",
        "tooltip-pt-createaccount": "Tooltip shown when hovering over the link 'Create account' in the upper right corner show on all pages while not logged in.",
        "tooltip-ca-talk": "Tooltip shown when hovering over the {{msg-mw|Talk}} tab.\n\nA 'content page' is a page that forms part of the purpose of the wiki. It includes the main page and pages in the main namespace and any other namespaces that are included when the wiki is customised. For example on Wikimedia Commons 'content pages' include pages in the file and category namespaces. On Wikinews 'content pages' include pages in the Portal namespace. For a technical definition of 'content namespaces' see [[mw:Manual:Using_custom_namespaces#Content_namespaces|MediaWiki]].\n\nPossible alternatives to the word 'content' are 'subject matter' or 'wiki subject' or 'wiki purpose'.\n\nSee also:\n* {{msg-mw|Talk}}\n* {{msg-mw|Accesskey-ca-talk}}\n* {{msg-mw|Tooltip-ca-talk}}\n{{Identical|Content page}}",
-       "tooltip-ca-edit": "The tooltip when hovering over the {{msg-mw|Edit}} tab.\n\nSee also:\n* {{msg-mw|Edit}}\n* {{msg-mw|Accesskey-ca-edit}}\n* {{msg-mw|Tooltip-ca-edit}}",
+       "tooltip-ca-edit": "Over-ridden tooltip of the wikitext \"Edit source\" tab.\n{{Identical|Edit this page}}",
        "tooltip-ca-addsection": "Tooltip shown when hovering over the \"addsection\" tab (shown on talk pages).\n\nSee also:\n* {{msg-mw|Addsection}}\n* {{msg-mw|Accesskey-ca-addsection}}\n* {{msg-mw|Tooltip-ca-addsection}}",
        "tooltip-ca-viewsource": "Tooltip displayed when hovering over the {{msg-mw|Viewsource}} tab.\n\nSee also:\n* {{msg-mw|Viewsource}}\n* {{msg-mw|Accesskey-ca-viewsource}}\n* {{msg-mw|Tooltip-ca-viewsource}}",
        "tooltip-ca-history": "Used as tooltip for {{msg-mw|Vector-view-history}}.\n\nSee for example [{{canonicalurl:Main Page|useskin=vector}} Main Page]\n\nSee also:\n* {{msg-mw|Vector-view-history}}\n* {{msg-mw|Accesskey-ca-history}}",
        "pageinfo-robot-index": "An indication that the page is indexable by search engines, that is listed in their search results.\n\nPreceded by the label {{msg-mw|Pageinfo-robot-policy}}.\n{{Identical|Allowed}}",
        "pageinfo-robot-noindex": "An indication that the page is not indexable (that is, is not listed on the results page of a search engine).\n\nPreceded by the label {{msg-mw|Pageinfo-robot-policy}}.",
        "pageinfo-watchers": "Header of the row in the first table of the info action.",
+       "pageinfo-visiting-watchers": "Header of the row in the first table of the info action. More explicitly, the number counts how many users have last visited the page 26 weeks or less (by default) before the latest edit to the page; in other words, watching users who may see a future edit within about 6 months.",
        "pageinfo-few-watchers": "Message displayed when there are fewer than $wgUnwatchedPageThreshold watchers. $1 is the value of $wgUnwatchedPageThreshold.",
+       "pageinfo-few-visiting-watchers": "Message displayed when there are fewer than 2 \"active\" watchers.",
        "pageinfo-redirects-name": "Header of the row in the first table of the info action.\n\nFollowed by {{msg-mw|Pageinfo-redirects-value}}.\n\nUsed as link text. The link points to \"{{int:Whatlinkshere-title}}\" page ([[Special:WhatLinksHere]]).\n\nSee example: [{{canonicalurl:Main page|action=info}} Main page?action=info]",
        "pageinfo-redirects-value": "{{Optional}}\nParameters:\n* $1 - the number of redirects to the page",
        "pageinfo-subpages-name": "Header of the row in the first table of the info action.\n\nFollowed by {{msg-mw|Pageinfo-subpages-value}}.\n\nUsed as link text. The link points to the \"{{int:Prefixindex}}\" page ([[Special:PrefixIndex]]).\n\nSee example: [{{canonicalurl:Main page|action=info}} Main page?action=info]",
        "exif-ycbcrpositioning-2": "If the Chrominance samples are on top of to the Luminance samples.\nSee: http://www.awaresystems.be/imaging/tiff/tifftags/ycbcrpositioning.html\n{{Related|Exif-ycbcrpositioning}}",
        "exif-dc-contributor": "People who helped make the resource, but are secondary in contribution to the author.\n{{Identical|Contributor}}",
        "exif-dc-coverage": "\"The extent or scope of the resource\" see dc:coverage in http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart2.pdf",
-       "exif-dc-date": "One or more dates associated with the image. How they are associated is not really defined. From the dc:date XMP property.",
+       "exif-dc-date": "One or more dates associated with the image. How they are associated is not really defined. From the dc:date XMP property.\n{{Identical|Date}}",
        "exif-dc-publisher": "One or more publisher of resource.\n{{Identical|Publisher}}",
        "exif-dc-relation": "Something related to this image. Often a list of URL's to related images.",
        "exif-dc-rights": "Copyright information about the image/media given in informal language.\n{{Identical|Right}}",
        "deletedwhileediting": "Used as warning in the EditPage page.",
        "confirmrecreate": "Followed by the checkbox which has the label {{msg-mw|Recreate}}.\n\nParameters:\n* $1 - username\n* $2 - reason\nSee also:\n* {{msg-mw|Confirmrecreate-noreason}}",
        "confirmrecreate-noreason": "Followed by the checkbox which has the label {{msg-mw|Recreate}}.\n\nParameters:\n* $1 - username\n* $2 - (Unused) reason\nSee also:\n* {{msg-mw|Confirmrecreate}}",
-       "recreate": "Used as link text.\n\nSee also:\n* {{msg-mw|Recreate}}\n* {{msg-mw|Tooltip-recreate}}",
+       "recreate": "Text shown when the editor fails to save the page due to it having been deleted since they opened VE. $1 is the message {{msg-mw|ooui-dialog-process-continue}}.",
        "unit-pixel": "{{optional}}\npx is the abbreviation for \"pixel\".",
        "confirm_purge_button": "Used as Submit button text.\n{{Identical|OK}}",
        "confirm-purge-top": "Used as confirmation message.",
        "version-libraries": "Header on [[Special:Version]] above a table that lists installed external libraries and their version numbers.",
        "version-libraries-library": "Column header for the library's name\n{{Identical|Library}}",
        "version-libraries-version": "Column header for the library's version number\n{{Identical|Version}}",
+       "version-libraries-license": "Column header for the library's license\n{{Identical|License}}",
+       "version-libraries-description": "Column header for the library's description\n{{Identical|Description}}",
+       "version-libraries-authors": "Column header for the library's authors\n{{Identical|Author}}",
        "redirect": "{{doc-special|Redirect}}\nThis means \"Redirect by file'''name''', user '''ID''', page '''ID''', or revision ID\".",
        "redirect-legend": "Legend of fieldset around input box in [[Special:Redirect]]",
        "redirect-text": "Inside fieldset for [[Special:Redirect]]",
        "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 866b687..555e802 100644 (file)
        "passwordreset": "Resetare parolă",
        "passwordreset-text-one": "Completați acest formular pentru a vă reseta parola.",
        "passwordreset-text-many": "{{PLURAL:$1|Completați unul din câmpuri pentru a primi o parolă temporară prin e-mail.}}",
-       "passwordreset-legend": "Resetare parolă",
        "passwordreset-disabled": "Resetarea parolei a fost dezactivată pe acest wiki.",
        "passwordreset-emaildisabled": "Funcțiile de e-mail au fost dezactivate de pe acest wiki.",
        "passwordreset-username": "Nume de utilizator:",
        "resettokens": "Resetare jetoane",
        "resettokens-text": "Puteți reseta, aici, jetoanele care permit accesul la anumite date asociate contului dumneavoastră.\n\nAr trebui să faceți acest lucru numai dacă le-ați partajat accidental cu altcineva ori contul dumneavoastră a fost compromis.",
        "resettokens-no-tokens": "Nu există jetoane de resetat.",
-       "resettokens-legend": "Resetare jetoane",
        "resettokens-tokens": "Jetoane:",
        "resettokens-token-label": "$1 (valoare actuală: $2)",
        "resettokens-watchlist-token": "Jeton pentru fluxul web (Atom/RSS) al [[Special:Watchlist|modificărilor aduse paginilor pe care le urmăriți]]",
        "yourdiff": "Diferențe",
        "copyrightwarning": "Reține că toate contribuțiile la {{SITENAME}} sunt distribuite sub licența $2 (vezi $1 pentru detalii).\nDacă nu doriți ca ceea ce scrieți să fie modificat fără milă și redistribuit în voie, atunci nu trimiteți materialele respective aici.<br />\nDe asemenea, ne asigurați că ceea ce ați scris a fost compoziție proprie sau copie dintr-o resursă publică sau liberă.\n'''Nu introduceți materiale aflate sub incidența drepturilor de autor fără a avea permisiune!'''",
        "copyrightwarning2": "Rețineți că toate contribuțiile la {{SITENAME}} pot fi modificate, alterate sau șterse de alți contribuitori.\nDacă nu doriți ca ceea ce scrieți să fie modificat fără milă și redistribuit în voie, atunci nu trimiteți materialele respective aici.<br />\nDe asemenea, ne asigurați că ceea ce ați scris a fost compoziție proprie sau copie dintr-o resursă publică sau liberă (vedeți $1 pentru detalii).\n'''Nu introduceți materiale aflate sub incidența drepturilor de autor fără a avea permisiune!'''",
+       "editpage-cannot-use-custom-model": "Modelul de conținut al acestei pagini nu poate fi modificat.",
        "longpageerror": "'''Eroare: Textul pe care l-ați trimis are o lungime de {{PLURAL:$1|un kilooctet|$1 kiloocteți|$1 de kiloocteți}}, ceea ce înseamnă mai mult decât maximul de {{PLURAL:$2|un kilooctet|$2 kiloocteți|$2 de kiloocteți}}.'''\nSalvarea nu este posibilă.",
        "readonlywarning": "'''Atenție: Baza de date a fost blocată pentru întreținere, deci nu veți putea salva modificările în acest moment.'''\nPuteți copia textul într-un fișier text, păstrându-l pentru mai târziu.\n\nAdministratorul care a efectuat blocarea a oferit următoarea explicație: $1",
        "protectedpagewarning": "'''Atenție: această pagină a fost protejată astfel încât poate fi modificată doar de către administratori.'''\nUltima intrare în jurnal este afișată mai jos pentru referință:",
        "randomincategory-nopages": "Nu există pagini în [[:Category:$1]].",
        "randomincategory-category": "Categorie:",
        "randomincategory-legend": "Pagină aleatorie din categoria",
+       "randomincategory-submit": "Du-te",
        "randomredirect": "Redirecționare aleatorie",
        "randomredirect-nopages": "Nu există redirecționări în spațiul de nume \"$1\".",
        "statistics": "Statistici",
        "rollback-success": "Anularea modificărilor făcute de $1;\nrevenire la ultima versiune de $2.",
        "sessionfailure-title": "Eroare de sesiune",
        "sessionfailure": "Se pare că este o problemă cu sesiunea de autentificare; această acțiune a fost oprită ca o precauție împotriva hijack. Apăsați \"back\" și reîncărcați pagina de unde ați venit, apoi reîncercați.",
+       "changecontentmodel": "Modificare model de conținut al unei pagini",
+       "changecontentmodel-legend": "Modifică modelul de conținut",
+       "changecontentmodel-title-label": "Titlul paginii",
+       "changecontentmodel-model-label": "Model de conținut nou",
+       "changecontentmodel-reason-label": "Motiv:",
+       "changecontentmodel-success-title": "Modelul de conținut a fost modificat",
+       "changecontentmodel-success-text": "Tipul de conținut al paginii [[:$1]] a fost modificat.",
+       "changecontentmodel-cannot-convert": "Conținutul paginii [[:$1]] nu poate fi convertit în tipul $2.",
+       "changecontentmodel-title-cantexist": "Nu se poate utiliza titlul de pagină: $1.",
+       "changecontentmodel-nodirectediting": "Modelul de conținut $1 nu acceptă editarea directă",
+       "log-name-contentmodel": "Jurnal modificări model de conținut",
+       "log-description-contentmodel": "Evenimente referitoare la modelele de conținut ale paginilor",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|a modificat}} modelul de conținut al paginii $3 din „$4” în „$5”",
+       "logentry-contentmodel-change-revertlink": "revenire",
+       "logentry-contentmodel-change-revert": "revenire",
        "protectlogpage": "Jurnal protecții",
        "protectlogtext": "Mai jos se află o listă cu schimbări în ceea ce privește protejarea paginilor.\nConsultați [[Special:ProtectedPages|indexul paginilor protejate]] pentru o listă cu protecțiile în vigoare.",
        "protectedarticle": "a protejat \"[[$1]]\"",
        "tooltip-pt-logout": "Închide sesiunea de lucru",
        "tooltip-pt-createaccount": "Vă încurajăm să vă creați un cont și să vă autentificați; totuși, nu este obligatoriu",
        "tooltip-ca-talk": "Discuții despre această pagină",
-       "tooltip-ca-edit": "Puteți modifica această pagină. Înainte de a o salva vă rugăm s-o previzualizați.",
+       "tooltip-ca-edit": "Modificați această pagină",
        "tooltip-ca-addsection": "Adaugă o nouă secțiune.",
        "tooltip-ca-viewsource": "Această pagină este protejată. Puteți vizualiza doar codul sursă",
        "tooltip-ca-history": "Versiunile anterioare ale paginii și autorii lor.",
        "pageinfo-robot-index": "Permisă",
        "pageinfo-robot-noindex": "Nepermisă",
        "pageinfo-watchers": "Număr de utilizatori care urmăresc pagina",
+       "pageinfo-visiting-watchers": "Numărul de urmăritori ai paginii care au vizualizat modificările recente",
        "pageinfo-few-watchers": "Mai puțin de {{PLURAL:$1|un urmăritor|$1 urmăritori|$1 de urmăritori}}",
+       "pageinfo-few-visiting-watchers": "Ar putea să existe sau nu un urmăritor al paginii care să fi vizualizat modificările recente",
        "pageinfo-redirects-name": "Număr de redirecționări către această pagină",
        "pageinfo-subpages-name": "Subpagini ale acestei pagini",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirecționare|redirecționări|de redirecționări}}; $3 {{PLURAL:$3|non-redirecționare|non-redirecționări|de non-redirecționări}})",
        "version-libraries": "Biblioteci instalate",
        "version-libraries-library": "Bibliotecă",
        "version-libraries-version": "Versiune",
+       "version-libraries-license": "Licență",
+       "version-libraries-description": "Descriere",
+       "version-libraries-authors": "Autori",
        "redirect": "Redirecționare după fișier, utilizator, ID-ul paginii sau al versiunii",
        "redirect-legend": "Redirecționare către un fișier sau o pagină",
        "redirect-summary": "Această pagină specială vă redirecționează către un fișier (dat fiind un nume de fișier), o pagină (dat fiind ID-ul unei versiuni sau ID-ul unei pagini) sau o pagină de utilizator (dat fiind un ID numeric al utilizatorului). Utilizare: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] sau [[{{#Special:Redirect}}/user/101]].",
index 7d0cf38..54c4084 100644 (file)
        "passwordreset": "Azzere 'a passuord",
        "passwordreset-text-one": "Comblete stu module pe azzerà 'a passuord toje.",
        "passwordreset-text-many": "{{PLURAL:$1|Inghie une de le cambe pe azzerà 'a passuord toje.}}",
-       "passwordreset-legend": "Azzere 'a passuord",
        "passwordreset-disabled": "'U reset de le passuord ha state desabbilitate sus a sta uicchi.",
        "passwordreset-emaildisabled": "Le funziune de l'email onne state disabbilitate sus a sta uicchi.",
        "passwordreset-username": "Nome utende:",
        "resettokens": "Azzere le gettone",
        "resettokens-text": "Tu puè azzerà le gettone le quale te donne l'accesse a certe date private collegate cu 'u cunde tune aqquà.\n\nTu avissa farle ce pe sbaglie l'è condivise cu otre o ce 'u cunde tune ha state combromesse.",
        "resettokens-no-tokens": "Non ge stonne gettone de azzerà.",
-       "resettokens-legend": "Azzere le gettone",
        "resettokens-tokens": "Gettone:",
        "resettokens-token-label": "$1 (valore de mò: $2)",
        "resettokens-watchlist-token": "Gettone pu feed web (Atom/RSS) de [[Special:Watchlist|le cangiaminde de le pàggene condrollate]]",
        "creating": "Stoche a ccreje $1",
        "editingsection": "Cangiaminde de $1 (sezione)",
        "editingcomment": "Cangiaminde de $1 (seziona nove)",
-       "editconflict": "Conflitte de cangiaminde: $1",
+       "editconflict": "Le cangiaminde tune non ge ponne essere reggistrate purcé ste 'nu conflitte de cangiaminde. Vuè {{GENDER:|ccu}} resolve stu conflitte a màne?",
        "explainconflict": "Quacchedune otre ha cangete 'a pàgene apprime ca tu accumenzasse a fà 'u cangiamende tue.\n'U teste ca iacchie sus condene 'u teste d'a pàgene accume se iacchije jndr'à stu mumende.\nLe cangiaminde sonde fatte vedè jndr'à vanne de sotte.\nTu puè scuagghià le cangiaminde jndr'à 'u teste de mò.\n'''Sulamende''' 'u teste ca stè sus avène reggistrate cazzanne 'u buttone \"{{int:savearticle}}\".",
        "yourtext": "'U teste tue",
        "storedversion": "Versione archivijete",
        "yourdiff": "Differenze",
        "copyrightwarning": "Pe piacere vide ca tutte le condrebbute de {{SITENAME}} sonde considerete de essere rilasciete sotte 'a $2 (vide $1 pe le dettaglie).\nCe tu non ge vuè ca le condrebbute tue avènene ausete da otre o avènene cangete, non le scè mettènne proprie.<br />\nTu na promettere pure ca le cose ca scrive tu, sonde 'mbormaziune libbere o copiete da 'nu pubbleche dominie.<br />\n'''NON METTE' NISCIUNA FATJE CA JE' PROTETTE DA DERITTE SENZA PERMESSE!'''",
        "copyrightwarning2": "Pe piacere vide ca tutte le condrebbute de {{SITENAME}} ponne essere cangete, alterate o luvete da otre condrebbutore.\nCe tu non ge vuè ca quidde ca scrive avène cangete da tre, allore non scè scrivenne proprie aqquà.<br />\nTu ne stè promitte ca quidde ca scrive tu, o lè scritte cu 'u penziere tue o lè cupiate da risorse de pubbliche dominie o sembre robba libbere (vide $1 pe cchiù dettaglie).\n'''NO REGGISTRA' FATIJE CUPERTE DA 'U COPYRIGHT SENZA PERMESSE! NO FA STUDECARIE!'''",
+       "editpage-cannot-use-custom-model": "'U modelle de condenute de sta pàgene non ge pò essere cangiate.",
        "longpageerror": "'''ERRORE: 'U teste ca tu vuè ccu reggistre è luenghe {{PLURAL:$1|'nu kilobyte|$1 kilobyte}}, invece 'u limite massime jè de {{PLURAL:$2|'nu kilobyte|$2 kilobyte}}.'''\nNon ge puè reggistrà sta pàggene.",
        "readonlywarning": "'''FA ATTENZIO': 'U database ha state bloccate pe manutenzione, e allore tu non ge puè reggistrà le cangiaminde ca ste face mò.'''\nTu puè fa 'na bella cose, tagghie e 'nzicche le cangiaminde jndr'à 'nu file de teste sus a 'u combiuter tune e pò cchiù tarde le reggistre sus 'a Uicchi.\n\nL'amministratore ca ha bloccate 'u database ha date stu mutive: $1",
        "protectedpagewarning": "'''ATTENZIO': Sta pàgene ha state bloccate e allore sulamende le utinde cu le privilegge de ''sysop'' ponne cangiarle.'''\nL'urteme archivie de le trasute ha state previste aqquà sotte pe referimende:",
        "content-model-css": "CSS",
        "content-json-empty-object": "Oggette vacande",
        "content-json-empty-array": "Matrice vacande",
+       "duplicate-args-warning": "<strong>Attenziò:</strong> [[:$1]] ste chiame [[:$2]] cu cchiù de 'nu valore pu parametre \"$3\". Sulamende l'urteme valore date avène ausate.",
        "duplicate-args-category": "Pàggene ca ausane le argumende a doppie jndr'à le chiamate d'u template",
        "duplicate-args-category-desc": "'A pàgene téne chiamate a template ca ausane arguminde a doppie, cumme <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Fà attenziò: Sta vosce tène 'nu sbuenne de funziune de chiamate a l'analizzatore.\n\nAvessere a essere mene de $2 {{PLURAL:$2|chiamate|chiamate}}, 'nvece mò {{PLURAL:$1|ste $1 chiamate|ne stonne $1 chiamate}}.",
        "uploaded-script-svg": "Acchiate elemende pe script \"$1\" jndr'à 'u file SVG carecate.",
        "uploaded-hostile-svg": "Acchiate 'nu CSS insecure ndr'à l'elemende de stile d'u file SVG carecate.",
        "uploaded-event-handler-on-svg": "'A 'mbostazione de le attribute de gestione de l'evende <code>$1=\"$2\"</code> non ge se pò ffà cu le file SVG.",
+       "uploaded-href-attribute-svg": "le attribbute href <code>&lt;$1 $2=\"$3\"&gt;</code> cu le destinaziune de fore (p.e. http://, javascript:, etc) non ge se ponne mettere jndr'à le file SVG.",
        "uploadscriptednamespace": "Stu file SVG tène 'nu namespace illegale '$1'",
        "uploadinvalidxml": "L'XML jndr'à 'u file carecate non ge pò essere analizzate.",
        "uploadvirus": "Alanga toje, 'u file condiene 'nu virus! Dettaglie: $1",
        "randomincategory-nopages": "Non ge stonne pàggene jndr'à [[:Category:$1]].",
        "randomincategory-category": "Categorije:",
        "randomincategory-legend": "Pàgene a uecchije jndr'à categorije",
+       "randomincategory-submit": "Veje",
        "randomredirect": "Redirezionamende a uecchie",
        "randomredirect-nopages": "Non ge stonne redirezionaminde jndr'à 'u namespace \"$1\".",
        "statistics": "Statisteche",
        "tooltip-pt-logout": "Isse",
        "tooltip-pt-createaccount": "Te ste 'ngoragge pe ccrejà 'nu cunde e trasè; comungue, non g'è obbligatorie",
        "tooltip-ca-talk": "'Ngazzaminde sus 'a pàgene de le condenute",
-       "tooltip-ca-edit": "Tu puè cangià sta pàgene.\nPe piacere ause 'u buttone de l'andeprime apprime de salvà.",
+       "tooltip-ca-edit": "Tu puè cangià sta pàgene. Pe piacere ause 'u buttone de l'andeprime apprime de salvà.",
        "tooltip-ca-addsection": "Fà accumenzà 'na seziona nove",
        "tooltip-ca-viewsource": "Sta pàgene jè prutette.\nPuè vedè sulamende 'u sorgende.",
        "tooltip-ca-history": "Versiune passete de sta pàgene",
        "version-libraries": "Libbrerie installate",
        "version-libraries-library": "Libbrerie",
        "version-libraries-version": "Versione",
+       "version-libraries-license": "Licenze",
+       "version-libraries-description": "Descrizione",
+       "version-libraries-authors": "Auture",
        "redirect": "Redirette da 'u file, utende o ID d'a revisione",
        "redirect-legend": "Redirette a 'nu file o 'na pàgene",
        "redirect-summary": "Sta pàgena speciale redirezione a 'nu file (date 'u nome d'u file), 'na pàgene (date 'n'ID de revisione), o 'na pàgene utende (date 'n'ID numeriche de l'utende). Ause: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], o [[{{#Special:Redirect}}/user/101]].",
        "special-characters-group-khmer": "Khmer",
        "special-characters-title-endash": "trattine en",
        "special-characters-title-emdash": "trattine em",
-       "special-characters-title-minus": "segne mene"
+       "special-characters-title-minus": "segne mene",
+       "mw-widgets-titleinput-description-new-page": "'a pàgene non g'esiste angore",
+       "mw-widgets-titleinput-description-redirect": "redirezionate sus a $1"
 }
index d1647d9..5183fdc 100644 (file)
@@ -81,7 +81,8 @@
                        "DonRumata",
                        "Mariya",
                        "Marina Melik-Adamyan",
-                       "Normalex"
+                       "Normalex",
+                       "WindEwriX"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "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|изменений страниц в вашем списке наблюдения]]",
        "yourdiff": "Различия",
        "copyrightwarning": "Обратите внимание, что все добавления и изменения текста статьи рассматриваются как выпущенные на условиях лицензии $2 (см. $1).\nЕсли вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.<br />\nВы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из\nисточника, допускающего свободное распространение и изменение своего содержимого.<br />\n'''НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ МАТЕРИАЛЫ, ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ!'''",
        "copyrightwarning2": "Пожалуйста, учтите, что любой ваш вклад в проект «{{SITENAME}}» может быть отредактирован или удалён другими участниками.\nЕсли вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.<br />\nВы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. $1).\n'''НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!'''",
+       "editpage-cannot-use-custom-model": "Модель содержимого этой страницы не может быть изменена.",
        "longpageerror": "'''ОШИБКА: записываемый вами текст имеет размер $1 {{PLURAL:$1|килобайт|килобайта|килобайт}}, что больше, чем установленный предел в $2 {{PLURAL:$2|килобайт|килобайта|килобайт}}. Страница не может быть сохранена.'''",
        "readonlywarning": "'''Предупреждение. База данных заблокирована в связи с процедурами обслуживания, поэтому вы не можете записать ваши изменения прямо сейчас.'''\nВозможно, вам следует скопировать этот текст в текстовый файл, чтобы сохранить его на будущее.\n\nАдминистратор, заблокировавший базу данных, оставил следующее объяснение: $1",
        "protectedpagewarning": "'''Предупреждение. Эта страница защищена от изменений, её могут редактировать только участники с полномочиями администраторов.'''\nНиже для справки приведена последняя запись журнала:",
        "badsig": "Неверная подпись. Проверьте корректность HTML-тегов.",
        "badsiglength": "Слишком длинная подпись.\nПодпись не должна превышать $1 {{PLURAL:$1|символа|символа|символов}}.",
        "yourgender": "Какое описание вам более подходит?",
-       "gender-unknown": "Я Ð¿Ñ\80едпоÑ\87иÑ\82аÑ\8e Ð½Ðµ Ñ\83казÑ\8bваÑ\82Ñ\8c",
+       "gender-unknown": "Ð\9fÑ\80и Ñ\83поминании Ð²Ð°Ñ\81 Ð¿Ñ\80огÑ\80аммное Ð¾Ð±ÐµÑ\81пеÑ\87ение, ÐºÐ¾Ð³Ð´Ð° Ñ\8dÑ\82о Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾, Ð±Ñ\83деÑ\82 Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ð³ÐµÐ½Ð´ÐµÑ\80но-нейÑ\82Ñ\80алÑ\8cнÑ\8bе Ñ\81лова",
        "gender-male": "Он редактирует страницы вики",
        "gender-female": "Онa редактирует страницы вики",
        "prefs-help-gender": "Этот параметр задавать необязательно.\nДвижок использует это значение, чтобы обращаться к вам и упоминать вас в правильном грамматическом роде.\nЭта информация будет общедоступной.",
        "randomincategory-nopages": "Нет страниц в категории [[:Category:$1]].",
        "randomincategory-category": "Категория:",
        "randomincategory-legend": "Случайная страница в категории",
+       "randomincategory-submit": "Перейти",
        "randomredirect": "Случайное перенаправление",
        "randomredirect-nopages": "Пространство имён «$1» не содержит перенаправлений.",
        "statistics": "Статистика",
        "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]]»",
        "tooltip-pt-logout": "Завершить сеанс работы",
        "tooltip-pt-createaccount": "Мы предлагаем вам создать учётную запись и войти в систему, хотя это и не обязательно.",
        "tooltip-ca-talk": "Обсуждение основной страницы",
-       "tooltip-ca-edit": "Ð\92Ñ\8b Ð¼Ð¾Ð¶ÐµÑ\82е Ñ\80едакÑ\82иÑ\80оваÑ\82Ñ\8c Ñ\8dÑ\82Ñ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83. Ð\9fеÑ\80ед Ñ\82ем, ÐºÐ°Ðº Ð·Ð°Ð¿Ð¸Ñ\81аÑ\82Ñ\8c Ñ\81вои Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f, Ð²Ð¾Ñ\81полÑ\8cзÑ\83йÑ\82еÑ\81Ñ\8c, Ð¿Ð¾Ð¶Ð°Ð»Ñ\83йÑ\81Ñ\82а, ÐºÐ½Ð¾Ð¿ÐºÐ¾Ð¹ Ð¿Ñ\80едваÑ\80иÑ\82елÑ\8cного Ð¿Ñ\80оÑ\81моÑ\82Ñ\80а.",
+       "tooltip-ca-edit": "РедакÑ\82иÑ\80оваÑ\82Ñ\8c Ð´Ð°Ð½Ð½Ñ\83Ñ\8e Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\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-redirects-value": "$1",
        "pageinfo-subpages-name": "Подстраницы данной страницы",
        "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/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] или [[{{#Special:Redirect}}/user/101]].",
        "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 c765dee..cb9d930 100644 (file)
        "passwordreset": "Azziramentu dâ password",
        "passwordreset-text-one": "Jinchi stu mòdulu pi' ricèviri na password timpurania pi' posta elittrònica.",
        "passwordreset-text-many": "{{PLURAL:$1|Jinchi unu dî campi pi' ricèviri na password timpurania pi' posta elittrònica.}}",
-       "passwordreset-legend": "Azzera la password",
        "passwordreset-disabled": "L'azziramentu dî password fu disattivatu nta sta wiki.",
        "passwordreset-emaildisabled": "Li funzionalità di e-mail furu disattivati nta sta wiki.",
        "passwordreset-username": "Nomu utenti:",
        "resettokens": "Azziramentu dî token",
        "resettokens-text": "Cca poi azzirari i ''token'' chi' dùnunu accessu a' certi dati risirvati assuciati ô to cuntu.\n\nSta cosa s'avissi a' fari si' pi' sbagghiu i facisti sapiri a' quarchidunu o si' u to cuntu fu' cumprumisu.",
        "resettokens-no-tokens": "Nun ci su' token di azzirari.",
-       "resettokens-legend": "Azziramentu dî token",
        "resettokens-tokens": "Token:",
        "resettokens-token-label": "$1 (valuri attuali: $2)",
        "resettokens-watchlist-token": "Token pû feed web (Atom/RSS) dî [[Special:Watchlist|canciamenti ê pàggini ntâ to lista taliata]]",
        "yourdiff": "Diffirenzi",
        "copyrightwarning": "Pi' favuri nota ca tutti li cuntribbuti mannati a' {{SITENAME}} s'hannu a' cunsiddirari sutta â licenza d'usu $2 (talìa $1 pî dittagghî).\nSi' nun voi ca li to testi vènunu mudificati senza nuddu riguardu e ridistribbuùti a' vogghia, allura nê mannari cca.<br />\nMannannu lu to testu nni dichiari sparti chi' lu scrivisti tu pirsunalmenti, o puru ca lu cupiasti di na fonti di pùbblicu duminiu o analugamenti lìbbira.\n<strong>Nun mannari matiriali cupertu di drittu d'auturi senza auturizzazzioni!</strong>",
        "copyrightwarning2": "Pi' favuri nota ca tutti li cuntribbuti mannati a' {{SITENAME}} ponnu vèniri canciati, altirati o cancillati di l'autri participanti.\nSi' nun voi ca li to testi vènunu mudificati senza nuddu riguardu, allura nê mannari cca.<br />\nMannannu lu to testu nni dichiari sparti ca lu scrivisti tu pirsunalmenti, o puru ca lu cupiasti di na fonti di pùbblicu duminiu o analugamenti lìbbira (talìa $1 pi' majuri dittagghî).\n<strong>Nun mannari matiriali cupertu di drittu d'auturi senza auturizzazzioni!</strong>",
+       "editpage-cannot-use-custom-model": "Lu mudellu dû cuntinutu di sta pàggina nun si po’ canciari.",
        "longpageerror": "<strong>Erruri: Lu testu ca hai suttamisu è longu {{PLURAL:$1|un kilobyte|$1 kilobyte}}, cchiù' ssai dû màssimu ca è di {{PLURAL:$2|un kilobyte|$2 kilobyte}}.</strong>\nNun si po' sarvari.",
        "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:",
        "badsig": "Firma grezza nun vàlida.\nCuntrolla l'etichetti HTML.",
        "badsiglength": "La to firma è troppu longa.\nNun havi a' èssiri cchiu' longa di $1 {{PLURAL:$1|caràttiri|caràttiri}}.",
        "yourgender": "Comu prifirisci èssiri discrivutu?",
-       "gender-unknown": "Nô vogghiu diri",
+       "gender-unknown": "Quannu ti mmuntùa, si’ po’, lu prugramma adupiriràvi lu gèniri grammaticali neutru",
        "gender-male": "N'auturi di pàggini dâ wiki",
        "gender-female": "N'autrici di pàggini dâ wiki",
        "prefs-help-gender": "Mpustari sta prifirenza è facultativu.\nU software adòpira u so valuri pi' parrari cu' tia, e di tia a' l'autri, facennu usu dû gèniri grammaticali currettu.\nSta nfurmazzioni sarravi pùbblica.",
        "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",
        "nmembers": "$1 {{PLURAL:$1|membru|membra}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|membru|membra}}",
        "nrevisions": "$1 {{PLURAL:$1|rivisioni|rivisioni}}",
-       "nviews": "$1 {{PLURAL:$1|vìsita|vìsiti}}",
        "nimagelinks": "Adupiratu nta $1 {{PLURAL:$1|pàggina|pàggini}}",
        "ntransclusions": "adupiratu nta $1 {{PLURAL:$1|pàggina|pàggini}}",
        "specialpage-empty": "Nun cci su' risultati pi' stu rennicuntu.",
        "rollback-success": "Annullati li canciamenti di $1;\nsi turnau a' l'ùltima virsioni di $2.",
        "sessionfailure-title": "Erruri dâ sissioni",
        "sessionfailure": "Pari chi' cc'è quarchi' prubblema câ to sissioni di trasuta;\nst'azzioni fu' annullata comu pricauzzioni contra dû furtu di sissioni.\nTorna â pàggina pricidenti, ricàrricala e prova n'autra vota.",
+       "changecontentmodel": "Canciamentu dû mudellu dû cuntinutu di na pàggina",
+       "changecontentmodel-legend": "Canciamentu dû mudellu dû cuntinutu",
+       "changecontentmodel-title-label": "Tìtulu dâ pàggina",
+       "changecontentmodel-model-label": "Mudellu dû cuntinutu novu",
+       "changecontentmodel-reason-label": "Mutivu:",
+       "changecontentmodel-success-title": "Lu mudellu dû cuntinutu fu’ canciatu",
+       "changecontentmodel-success-text": "Lu tipu dû cuntinutu di [[:$1]] fu’ canciatu.",
+       "changecontentmodel-cannot-convert": "Nun si po’ cunvèrtiri lu cuntinutu di [[:$1]] ntô tipu $2.",
+       "changecontentmodel-title-cantexist": "Nun si po’ mèttiri na pàggina nta $1.",
+       "changecontentmodel-nodirectediting": "Lu mudellu dû cuntinutu $1 nun cunsenti lu canciamentu direttu.",
+       "log-name-contentmodel": "Riggistru dî canciamenti ô mudellu dû cuntinutu",
+       "log-description-contentmodel": "Eventi ca riguàrdunu lu mudellu dû cuntinutu di na pàggina",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|canciàu}} lu mudellu dû cuntinutu dâ pàggina $3 di «$4» a’ «$5»",
+       "logentry-contentmodel-change-revertlink": "annulla",
+       "logentry-contentmodel-change-revert": "annullamentu",
        "protectlogpage": "Riggistru dî prutizzioni",
        "protectlogtext": "Ccassutta c'è nu riggistru dî canciamenti â prutizzioni dî pàggini.\nVidi la [[Special:ProtectedPages|lista dî pàggini prutetti]] pi' canùsciri tutti i prutizzioni di pàggini chi' su' in viguri.",
        "protectedarticle": "prutiggìu [[$1]]",
        "tooltip-pt-logout": "Nisciuta",
        "tooltip-pt-createaccount": "Si' nvitatu a criari nu cuntu e tràsiri; però nun è obbligatoriu",
        "tooltip-ca-talk": "Vidi li discussioni rilativi a sta pàggina",
-       "tooltip-ca-edit": "Poi canciari sta pàggina. Pi favuri usa lu pulsanti d'antiprima prima di sarvari.",
+       "tooltip-ca-edit": "Cancia sta pàggina",
        "tooltip-ca-addsection": "Agghiunci un cummentu a sta discussioni.",
        "tooltip-ca-viewsource": "Sta pàggina è prutetta, ma poi vìdiri lu sò còdici surgenti.",
        "tooltip-ca-history": "Virsioni pricidenti di sta pàggina.",
        "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-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",
        "pageinfo-subpages-name": "Nùmmiru di suttapàggini di sta pàggina",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|chi' è un rimannu|chi' su' rimanni}}; $3 {{PLURAL:$3|chi' nun è un rimannu|chi' nun su' rimanni}})",
        "version-libraries": "Libbrarìi installati",
        "version-libraries-library": "Libbrarìa",
        "version-libraries-version": "Virsioni",
+       "version-libraries-license": "Licenza",
+       "version-libraries-description": "Discrizzioni",
+       "version-libraries-authors": "Autura",
        "redirect": "Rimannu pi' nomu di file o còdici di utenti, di pàggina o di virsioni",
        "redirect-legend": "Rimannari a' nu file o na pàggina",
        "redirect-summary": "Sta pàggina spiciali rimanna a' nu file (datu u nomu dû file), a' na pàggina (datu n'ID di virsioni o n'ID di pàggina), o puru â pàggina di n'utenti (datu n'ID nummèricu di utenti). Esempî di usu: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], o [[{{#Special:Redirect}}/user/101]].",
        "special-characters-group-khmer": "Khmer",
        "special-characters-title-endash": "liniedda enni",
        "special-characters-title-emdash": "liniedda emmi",
-       "special-characters-title-minus": "signu menu"
+       "special-characters-title-minus": "signu menu",
+       "mw-widgets-titleinput-description-new-page": "sta pàggina ancora nun esisti",
+       "mw-widgets-titleinput-description-redirect": "rimannu a’ $1"
 }
index 6dfc6f8..728e19b 100644 (file)
@@ -8,7 +8,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Milicevic01",
-                       "Macofe"
+                       "Macofe",
+                       "KWiki"
                ]
        },
        "tog-underline": "Podvuci linkove:",
        "passwordreset": "Ponovno postavi lozinku",
        "passwordreset-text-one": "Dovršite ovaj obrazac kako biste resetirali svoju lozinku/zaporku.",
        "passwordreset-text-many": "{{PLURAL:$1|Ispunite jedno od polja kako bi ste resetirali svoju lozinku/zaporku.}}",
-       "passwordreset-legend": "Ponovno postavi lozinku",
        "passwordreset-disabled": "Ponovno postavljanje lozinke je onemogućeno na ovom wikiju.",
        "passwordreset-emaildisabled": "Postavke E-maila su deaktivirane na ovoj wiki.",
        "passwordreset-username": "Korisničko ime:",
        "resettokens": "Resetirajte tokene",
        "resettokens-text": "Možete resetirati tokene koji dozvoljavaju pristup određenim privatnim podacima povezanim sa vašim računom ovdje.\n\nTo možete učiniti ako ste ih slučajno podijelili sa nekim ili ako je vaš račun kompromitiran.",
        "resettokens-no-tokens": "Nema tokena za resetiranje.",
-       "resettokens-legend": "Resetiranje tokena",
        "resettokens-tokens": "Tokeni:",
        "resettokens-token-label": "$1 (trenutna vrijednost: $2)",
        "resettokens-watchlist-token": "Token za web feed (Atom/RSS) [[Special:Watchlist|promjena za vašem spisku praćenja]]",
        "nmembers": "$1 {{PLURAL:$1|član|članova}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|član|članova}}",
        "nrevisions": "$1 {{PLURAL:$1|revizija|revizije|revizija}}",
-       "nviews": "$1 {{PLURAL:$1|pregled|pregleda}}",
        "nimagelinks": "Koristi se na $1 {{PLURAL:$1|stranici|stranice|stranica}}",
        "ntransclusions": "koristi se na $1 {{PLURAL:$1|stranici|stranice|stranica}}",
        "specialpage-empty": "Ne postoje rezultati za ovaj izvještaj.",
        "movepage-moved-noredirect": "Pravljenje preusmjerenja je onemogućeno.",
        "articleexists": "Stranica pod tim imenom već postoji, ili je ime koje ste izabrali neispravno.\nMolimo Vas da izaberete drugo ime.",
        "cantmove-titleprotected": "Ne možete premjestiti stranicu na ovu lokaciju, jer je novi naslov zaštićen od pravljenja",
-       "movetalk": "Premjesti i stranicu za diskusiju zajedno sa člankom (ukoliko nije prazna).",
+       "movetalk": "Premjesti i stranicu za diskusiju zajedno sa člankom (ako nije prazna).",
        "move-subpages": "Premjesti sve podstranice (do $1)",
        "move-talk-subpages": "Premjesti podstranice stranica za razgovor (do $1)",
        "movepage-page-exists": "Stranica $1 već postoji i ne može biti automatski zamijenjena.",
index 96d221d..4002e8b 100644 (file)
        "passwordreset": "Reset hesla",
        "passwordreset-text-one": "Pre získanie nového hesla vyplňte tento formulár.",
        "passwordreset-text-many": "{{PLURAL:$1|Pre získanie nového hesla emailom, zadajte jeden z údajov.}}",
-       "passwordreset-legend": "Obnoviť heslo",
        "passwordreset-disabled": "Obnovenie hesla bolo na tejto wiki zakázané.",
        "passwordreset-emaildisabled": "E-mailové funkcie boli na tejto wiki vypnuté.",
        "passwordreset-username": "Používateľské meno:",
        "resettokens": "Obnoviť tokeny",
        "resettokens-text": "Tu môžete obnoviť tokeny, ktoré umožňujú prístup k určitým súkromným údajom spojeným s vaším účtom.\n\nMali by ste to urobiť, ak ste ich omylom niekomu poskytli alebo ak bolo vaše konto zneužité.",
        "resettokens-no-tokens": "Neexistujú žiadne tokeny, ktoré by bolo možné obnoviť.",
-       "resettokens-legend": "Obnoviť tokeny",
        "resettokens-tokens": "Tokeny:",
        "resettokens-token-label": "$1 (aktuálna hodnota: $2)",
        "resettokens-watchlist-token": "Token pre webový kanál (Atom/RSS) [[Special:Watchlist|zmien na stránkach, ktoré sledujete]]",
        "searchrelated": "súvisiace",
        "searchall": "všetko",
        "showingresults": "Nižšie {{PLURAL:$1|je zobrazený jeden výsledok|sú zobrazené '''1''' výsledky|je zobrazených '''$1''' výsledkov}}, počnúc od  #<b>$2</b>.",
-       "showingresultsinrange": "Nižšie {{PLURAL:$1|je zobrazený|sú zobrazené|je zobrazených}} max strong>$1</strong> {{PLURAL:$1|výsledok|výsledky|výsledkov}} v rozsahu #<strong>$2</strong> – #<strong>$3</strong>.",
+       "showingresultsinrange": "Nižšie {{PLURAL:$1|je zobrazený|sú zobrazené|je zobrazených}} max <strong>$1</strong> {{PLURAL:$1|výsledok|výsledky|výsledkov}} v rozsahu #<strong>$2</strong> – #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Výsledok <strong>$1</strong> z <strong>$3</strong>|Výsledky <strong>$1 – $2</strong> z <strong>$3</strong>}}",
        "search-nonefound": "Vyhľadávanie nenašlo žiadne výsledky.",
        "powersearch-legend": "Pokročilé hľadanie",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Rozdiely",
        "prefs-help-prefershttps": "Táto voľba sa prejaví pri vašom ďalšom prihlásení.",
-       "email-address-validity-valid": "Formát e-mailovej adresa vyzerá byť správny",
+       "prefswarning-warning": "Vykonali ste zmeny v nastaveniach, ktoré zatiaľ nie sú uložené. Ak túto stránku opustíte bez kliknutia na „$1“, vaše nastavenia sa neaktualizujú.",
+       "email-address-validity-valid": "Formát e-mailovej adresy sa zdá byť správny",
        "email-address-validity-invalid": "Zadajte platnú e-mailovú adresu",
        "userrights": "Spravovanie používateľských práv",
        "userrights-lookup-user": "Spravovať skupiny používateľov",
        "right-browsearchive": "Hľadať v zmazaných stránkach",
        "right-undelete": "Obnoviť zmazanú stránku",
        "right-suppressrevision": "Kontrolovať a obnovovať revízie skryté správcom",
+       "right-viewsuppressed": "Zobrazovať revízie skryté pred všetkými používateľmi",
        "right-suppressionlog": "Zobrazovať súkromné záznamy",
        "right-block": "Blokovať ostatných používateľov",
        "right-blockemail": "Zablokovať používateľovi posielanie emailu",
        "right-protect": "Meniť úroveň zamknutia a upravovať kaskádovito zamknuté stránky",
        "right-editprotected": "Upravovať stránky zamknuté ako „{{int:protect-level-sysop}}“",
        "right-editsemiprotected": "Upravovať stránky zamknuté ako „{{int:protect-level-autoconfirmed}}“",
+       "right-editcontentmodel": "Upravovať model obsahu stránky",
        "right-editinterface": "Upravovať správy používateľského rozhrania",
        "right-editusercssjs": "Upravovať CSS a JS súbory ostatných používateľov",
        "right-editusercss": "Upravovať CSS súbory ostatných používateľov",
        "action-viewmywatchlist": "zobraziť zoznam sledovaných stránok",
        "action-viewmyprivateinfo": "zobraziť vaše súkromné údaje",
        "action-editmyprivateinfo": "upraviť vaše súkromné údaje",
+       "action-editcontentmodel": "upraviť model obsahu stránky",
        "action-managechangetags": "vytvorte a odstráňte značky z databázy",
        "nchanges": "$1 {{PLURAL:$1|úprava|úpravy|úprav}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|od poslednej návštevy}}",
        "randomincategory-nopages": "V [[:Category:$1|kategórii $1]] nie sú žiadne stránky.",
        "randomincategory-category": "Kategória:",
        "randomincategory-legend": "Náhodná stránka v kategórii",
+       "randomincategory-submit": "Vykonať",
        "randomredirect": "Náhodná presmerovacia stránka",
        "randomredirect-nopages": "V mennom „$1“ priestore nie sú žiadne presmerovania.",
        "statistics": "Štatistiky",
        "unusedimages": "Nepoužité obrázky",
        "wantedcategories": "Žiadané kategórie",
        "wantedpages": "Žiadané stránky",
+       "wantedpages-summary": "Zoznam neexistujúcich stránok, na ktoré smeruje najviac odkazov, s výnimkou stránok, na ktoré odkazujú len presmerovania. Pre zoznam neexistujúcich stránok, na ktoré odkazujú presmerovania, pozri [[{{#special:BrokenRedirects}}|zoznam pokazených presmerovaní]].",
        "wantedpages-badtitle": "Neplatný názov vo výsledkoch: $1",
        "wantedfiles": "Žiadané súbory",
        "wantedfiletext-cat": "Nasledovné súbory sa používajú, ale nie sú k dispozícii. Súbory z cudzích repozitárov môžu byť uvedené aj napriek tomu, že existujú. Takéto falošné poplachy budú <del>prečiarknuté</del>. Okrem toho stránky, ktoré obsahujú vložené súbory, ktoré nie sú k dispozícii sú uvedené na [[:$1]].",
        "deadendpagestext": "Nasledujúce stránky neodkazujú na žiadne iné stránky na {{GRAMMAR:lokál|{{SITENAME}}}}.",
        "protectedpages": "Zamknuté stránky",
        "protectedpages-indef": "Zamknutia iba na neurčito",
+       "protectedpages-summary": "Táto stránka obsahuje zoznam existujúcich stránok, ktoré sú momentálne zamknuté. Zoznam názvov zamknutých proti vytvoreniu nájdete na stránke [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Iba kaskádové zamykanie",
        "protectedpages-noredirect": "Skryť presmerovania",
        "protectedpagesempty": "Momentálne nie sú žiadne stránky s týmito parametrami zamknuté.",
        "protectedpages-timestamp": "Dátum a čas",
        "protectedpages-page": "Stránka",
        "protectedpages-expiry": "Koniec platnosti",
+       "protectedpages-performer": "Zamkol",
        "protectedpages-params": "Nastavenie zámku",
        "protectedpages-reason": "Dôvod",
        "protectedpages-unknown-timestamp": "Neznáme",
        "protectedpages-unknown-performer": "Neznámy redaktor",
        "protectedtitles": "Zamknuté názvy",
+       "protectedtitles-summary": "Táto stránka obsahuje zoznam názvov, ktoré sú momentálne zamknuté proti vytvoreniu. Zoznam existujúcich zamknutých stránok nájdete na stránke [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Tieto parametre momentálne nezamykajú žiadne názvy stránok.",
        "listusers": "Zoznam používateľov",
        "listusers-editsonly": "Vynechať používateľov bez úprav",
index 4c7e55e..ce555e4 100644 (file)
        "passwordreset": "Ponastavitev gesla",
        "passwordreset-text-one": "Da ponastavite svoje geslo, izpolnite naslednji obrazec.",
        "passwordreset-text-many": "{{PLURAL:$1|Da po e-pošti prejmete začasno geslo, izpolnite eno od polj.}}",
-       "passwordreset-legend": "Ponastavitev gesla",
        "passwordreset-disabled": "Ponastavljanje gesla je na tem wikiju onemogočeno.",
        "passwordreset-emaildisabled": "Na tem wikiju so možnosti e-pošte onemogočene.",
        "passwordreset-username": "Uporabniško ime:",
        "resettokens": "Ponastavitev žetonov",
        "resettokens-text": "Žetone lahko ponastavite, kar omogoča dostop do nekaterih zasebnih podatkov, povezanih z vašim računom.\n\nTo storite, če ste po nesreči žetone z nekom delili, ali če je bil vaš račun ogrožen.",
        "resettokens-no-tokens": "Ni nobenih žetonov za ponastavitev.",
-       "resettokens-legend": "Ponastavitev žetonov",
        "resettokens-tokens": "Žetoni:",
        "resettokens-token-label": "$1 (trenutna vrednost: $2)",
        "resettokens-watchlist-token": "Žeton spletnega vira (Atom/RSS) [[Special:Watchlist|sprememb strani na vašem spisku nadzorov]]",
        "version-libraries": "Nameščene knjižnice",
        "version-libraries-library": "Knjižnica",
        "version-libraries-version": "Različica",
+       "version-libraries-license": "Dovoljenje",
+       "version-libraries-description": "Opis",
+       "version-libraries-authors": "Avtorji",
        "redirect": "Preusmeri po datoteki, uporabniku, strani ali ID-ju redakcije",
        "redirect-legend": "Preusmeritev na datoteko ali stran",
        "redirect-summary": "Posebna stran preusmeri na datoteko (če podate ime datoteke), stran (če podate ID redakcije ali ID strani) ali uporabniško stran (če podate številski ID uporabnika). Uporaba: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] ali [[{{#Special:Redirect}}/user/101]].",
        "special-characters-group-khmer": "Kmerski",
        "special-characters-title-endash": "navaden pomišljaj",
        "special-characters-title-emdash": "dolgi pomišljaj",
-       "special-characters-title-minus": "znak za minus"
+       "special-characters-title-minus": "znak za minus",
+       "mw-widgets-titleinput-description-new-page": "stran še ne obstaja",
+       "mw-widgets-titleinput-description-redirect": "preusmeritev na $1"
 }
index 2793fa3..d828ff5 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": "Статистике",
        "special-characters-group-thai": "тајландски",
        "special-characters-group-lao": "лаоски",
        "special-characters-group-khmer": "кмерски",
-       "mw-widgets-titleinput-description-new-page": "страница још увек не постоји"
+       "mw-widgets-titleinput-description-new-page": "страница још увек не постоји",
+       "mw-widgets-titleinput-description-redirect": "преусмерава на $1"
 }
index 81d2447..a20d502 100644 (file)
        "passwordreset": "Obnavljanje lozinke",
        "passwordreset-text-one": "Popunite ovaj obrazac da biste dobili privremenu lozinku na e-poštu.",
        "passwordreset-text-many": "{{PLURAL:$1|Ispunite jedno od polja kako bi ste dobili privremenu lozinku na e-poštu.}}",
-       "passwordreset-legend": "Poništi lozinku",
        "passwordreset-disabled": "Obnavljanje lozinke je onemogućeno na ovom vikiju.",
        "passwordreset-emaildisabled": "E-pošta je onemogućena na ovom vikiju.",
        "passwordreset-username": "Korisničko ime:",
        "changeemail-throttled": "Previše puta ste pokušali da se prijavite.\nMolimo vas da sačekate $1 pre nego što pokušate ponovo.",
        "resettokens": "Resetovanje žetona",
        "resettokens-no-tokens": "Nema žetona za resetovanje.",
-       "resettokens-legend": "Resetovanje žetona",
        "resettokens-tokens": "Žetoni:",
        "resettokens-token-label": "$1 (trenutna vrednost: $2)",
        "resettokens-watchlist-token": "Žeton za veb dovod (Atom/RSS) vašeg [[Special:Watchlist|spiska nadgledanja]]",
index 6da7572..bf11951 100644 (file)
        "passwordreset": "Återställ lösenord",
        "passwordreset-text-one": "Fyll i detta formulär för att återställa ditt lösenord.",
        "passwordreset-text-many": "{{PLURAL:$1|Fyll i ett av fälten för att få ett tillfälligt lösenord via e-post.}}",
-       "passwordreset-legend": "Återställ lösenord",
        "passwordreset-disabled": "Lösenordsåterställning har inaktiverats på denna wiki.",
        "passwordreset-emaildisabled": "E-postfunktioner har inaktiverats på denna wiki.",
        "passwordreset-username": "Användarnamn:",
        "resettokens": "Återställ nycklar",
        "resettokens-text": "Du kan återställa nycklar som tillåter åtkomst till vissa privata uppgifter som är associerade till ditt konto här.\n\nDu bör återställa om du av misstag delade dem med någon eller om ditt konto har äventyrats.",
        "resettokens-no-tokens": "Det finns inga nycklar att återställa.",
-       "resettokens-legend": "Återställ nycklar",
        "resettokens-tokens": "Nycklar:",
        "resettokens-token-label": "$1 (aktuellt värde: $2)",
        "resettokens-watchlist-token": "Nyckel för webbflöde (Atom/RSS) av [[Special:Watchlist|ändringar i sidor på din bevakningslista]]",
        "yourdiff": "Skillnader",
        "copyrightwarning": "Observera att alla bidrag till {{SITENAME}} är att betrakta som utgivna under $2 (se $1 för detaljer). Om du inte vill att din text ska redigeras eller kopieras efter andras gottfinnande skall du inte skriva något här.<br />\nDu lovar oss också att du skrev texten själv, eller kopierade från kulturellt allmängods som inte skyddas av upphovsrätt, eller liknande källor. '''LÄGG INTE UT UPPHOVSRÄTTSSKYDDAT MATERIAL HÄR UTAN TILLÅTELSE!'''",
        "copyrightwarning2": "Observera att alla bidrag till {{SITENAME}} kan komma att redigeras, ändras, eller tas bort av andra deltagare. Om du inte vill se din text förändrad efter andras gottfinnade skall du inte skriva in någon text här.<br />\nDu lovar oss också att du skrev texten själv, eller kopierade från kulturellt allmängods som inte skyddas av upphovsrätt, eller liknande källor - se $1 för detaljer.\n'''LÄGG INTE UT UPPHOVSRÄTTSSKYDDAT MATERIAL HÄR UTAN TILLÅTELSE!'''",
+       "editpage-cannot-use-custom-model": "Innehållsmodellen för denna sida kan inte ändras.",
        "longpageerror": "'''FEL: Texten som du försöker spara är {{PLURAL:$1|en kilobyte|$1 kilobyte}}, vilket är mer än det maximalt tillåtna {{PLURAL:$2|en kilobyte|$2 kilobyte}}.'''\nDen kan inte sparas.",
        "readonlywarning": "'''VARNING: Databasen är tillfälligt låst för underhåll. Du kommer inte att kunna spara dina ändringar just nu.\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:",
        "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",
        "randomincategory-nopages": "Det finns inga sidor i kategorin [[:Category:$1]].",
        "randomincategory-category": "Kategori:",
        "randomincategory-legend": "Slumpsida i kategori",
+       "randomincategory-submit": "Gå",
        "randomredirect": "Slumpmässig omdirigering",
        "randomredirect-nopages": "Det finns inte några omdirigeringar i namnrymden \"$1\".",
        "statistics": "Statistik",
        "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",
        "protectlogtext": "Detta är en lista över applicerande och borttagande av skrivskydd.\nSe [[Special:ProtectedPages|listan över skyddade sidor]] för listan över aktiva sidskydd.",
        "protectedarticle": "skrivskyddade \"[[$1]]\"",
        "tooltip-pt-logout": "Logga ut",
        "tooltip-pt-createaccount": "Du uppmuntras att skapa ett konto och logga in, men det är inte obligatoriskt",
        "tooltip-ca-talk": "Diskussion om innehållssidan",
-       "tooltip-ca-edit": "Du kan redigera den här sidan.\nVänligen använd förhandsgranskningsknappen innan du sparar.",
+       "tooltip-ca-edit": "Redigera denna sida",
        "tooltip-ca-addsection": "Starta ett nytt avsnitt",
        "tooltip-ca-viewsource": "Den här sidan är skrivskyddad. Du kan se källtexten.",
        "tooltip-ca-history": "Tidigare versioner av sidan",
        "version-libraries": "Installerade bibliotek",
        "version-libraries-library": "Bibliotek",
        "version-libraries-version": "Version",
+       "version-libraries-license": "Licens",
+       "version-libraries-description": "Beskrivning",
+       "version-libraries-authors": "Författare",
        "redirect": "Omdirigering efter filnamn, användar-ID, sida eller versions-ID",
        "redirect-legend": "Omdirigera till en fil eller sida",
        "redirect-summary": "Den här specialsidan omdirigerar till en fil (efter filnamn), en sida (efter en versions eller sidas ID) eller en användarsida (efter användar-ID). Användning: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], eller [[{{#Special:Redirect}}/user/101]].",
index 9db8359..093635c 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": "{{SITENAME}} தளத்தில் உங்கள் பங்களிப்புகள் $2 உரிமத்தின் கீழ் அளிக்கப்பட்டதாக கருதப்படும்.(மேலதிக தகவல்களுக்கு $1 பக்கத்தைப் பார்க்க) உங்களுடைய எழுத்துக்கள் கடுமையாகத் தொகுக்கப்படுவதையோ, விரும்பியபடி பகிரப்படுவதையோ நீங்கள் விரும்பாவிடில் இங்கே சமர்ப்பிக்காதீர்.<br />\nஅத்துடன் நீங்களே இதை எழுதியதாகவோ, அல்லது வேறு பொதுக் களம் அல்லது அது போன்ற விடுதலையளிக்கும் மூலங்களிலிருந்து பிரதி பண்ணியிருப்பதாகவோ உறுதி கூறுகிறீர்கள்.\n'''பதிப்புரிமையுள்ள ஆக்கங்களை அனுமதியின்றி சமர்ப்பிக்க வேண்டாம்!'''",
        "copyrightwarning2": "{{SITENAME}} தளத்துக்கான உமது பங்களிப்புக்கள் அனைத்தும் வேறு பயனர்களால் தொகுக்கப் படவோ, மாற்றங்கள் செய்யப்படவோ அல்லது நீக்கப்படவோ கூடும். உமது பங்களிப்புகள் கடுமையாகத் தொகுக்கப்படுவதை நீர் விரும்பாவிடில் இங்கே சமர்ப்பிக்காதீர்.<br />\nநீர் இதை எழுதியதாகவோ, அல்லது வேறு பொதுக் களம் அல்லது அது போன்ற விடுதலையளிக்கும் மூலங்களிலிருந்து பிரதி பண்ணியிருப்பதாகவோ உறுதி கூறுகிறீர்.(மேலதிக தகவல்களுக்கு $1).'''பதிப்புரிமையுள்ள ஆக்கங்களை அனுமதியின்றி சமர்ப்பிக்காதீர்!'''",
+       "editpage-cannot-use-custom-model": "இப்பக்கத்தின் உள்ளடக்க மாதிரிகையை மாற்ற முடியாது.",
        "longpageerror": "'''தவறு: நீங்கள் இட்ட உரை {{PLURAL:$1|ஒரு கிலோபைட்|$1கிலோபைட்டுகள்}}  நீளமானது,{{PLURAL:$2|ஒரு கிலோபைட்|$2கிலோபைட்டுகள்}}  கூடிய அளவுள்ள பக்கங்கள் இங்கே அனுமதிக்கப்படுவதில்லை. உங்கள் உரையை சேமிக்க முடியாது.'''",
        "readonlywarning": "'''எச்சரிக்கை: பராமரிப்புக்காகத் தரவுவழங்கி பூட்டப்பட்டுள்ளது, எனவே உங்கள் தொகுப்புக்களை இப்பொழுது சேமிக்க முடியாது. உங்கள் உரையை இன்னொரு உரைக் கோப்பில் வெட்டி ஒட்டி சேமித்துவைத்துப் பின்பு பயன்படுத்தலாம்.'''\n\nஇந்தத் தரவுவழங்கியைப் பூட்டிய நிர்வாகி அதுகுறித்து அளித்த விளக்கம் பின்வருமாறு: $1",
        "protectedpagewarning": "'''எச்சரிக்கை: இது ஒரு பாதுகாக்கப்பட்ட பக்கமாகும். இதனை நிர்வாகிகள் தரத்திற்கான உரிமைகளை பெற்றவர்களே தொகுக்க முடியும்.'''\n\nகடைசியாகப் பதியபட்ட குறிப்பினை தங்களின் கவனத்திற்காக கீழே கொடுக்கப்பட்டது.",
        "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": "{{PLURAL:$1|ஒரு திருத்தம்|$1 திருத்தங்கள்}}",
-       "nviews": "{{PLURAL:$1|ஒரு பார்வை|$1 பார்வைகள்}}",
        "nimagelinks": "$1 {{PLURAL:$!|பக்கத்தில்|பக்கங்களில்}} பயன்படுத்தப்பட்டது",
        "ntransclusions": "$1 {{PLURAL:$1|பக்கத்தில்|பக்கங்களில்}} பயன்படுத்தப்பட்டது",
        "specialpage-empty": "இந்தப் புகாருக்குகந்த முடிவுகள் எதுவுமில்லை.",
index d153dcb..397188b 100644 (file)
        "passwordreset": "సంకేతపదాన్ని మార్చుకోండి",
        "passwordreset-text-one": "ఈమెయిలు ద్వారా తాత్కాలిక సంకేతపదాన్ని పొందేందుకు ఈ ఫారమును నింపండి.",
        "passwordreset-text-many": "{{PLURAL:$1|ఈమెయిలు ద్వారా తాత్కాలిక సంకేతపదాన్ని పొందేందుకు ఏదో ఒక ఫీల్డును నింపండి.Fill in one of the fields to receive a temporary password via email.}}",
-       "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|changes to pages on your watchlist]] యొక్క జాల వడ్డన (Atom/RSS) కు టోకెన్",
        "yourdiff": "తేడాలు",
        "copyrightwarning": "{{SITENAME}}కు సమర్పించే అన్ని రచనలూ $2కు లోబడి ప్రచురింపబడినట్లుగా భావించబడతాయి (వివరాలకు $1 చూడండి). మీ రచనలను ఎవ్వరూ మార్చ రాదనీ లెదా వేరే ఎవ్వరూ వాడుకో రాదని మీరు భావిస్తే, ఇక్కడ ప్రచురించకండి.<br /> మీ స్వీయ రచనను గాని, సార్వజనీనమైన రచననుగాని, ఇతర ఉచిత వనరుల నుండి సేకరించిన రచననుగాని మాత్రమే ప్రచురిస్తున్నానని కూడా మీరు ప్రమాణం చేస్తున్నారు. <strong>కాపీహక్కులుగల రచనను తగిన అనుమతి లేకుండా సమర్పించకండి!</strong>",
        "copyrightwarning2": "{{SITENAME}}లో ప్రచురించే రచనలన్నిటినీ ఇతర రచయితలు సరిదిద్దడం, మార్చడం, తొలగించడం జరగవచ్చు. మీ రచనలను అలా నిర్దాక్షిణ్యంగా దిద్దుబాట్లు చెయ్యడం మీకిష్టం లేకపోతే, వాటిని ఇక్కడ ప్రచురించకండి. <br />\nఅలాగే, ఈ రచనను మీరే చేసారని, లేదా ఏదైనా సార్వజనిక వనరు నుండి గానీ, అలాంటి ఉచిత, స్వేచ్ఛా వనరు నుండి గానీ కాపీ చేసి తెచ్చారని మాకు వాగ్దానం చేస్తున్నారు. (వివరాలకు $1 చూడండి).\n<strong>తగు అనుమతులు లేకుండా కాపీ హక్కులు గల రచనలను సమర్పించకండి!</strong>",
+       "editpage-cannot-use-custom-model": "ఈ పేజీ కంటెంట్ మోడల్ మార్చడం వీలుకాదు.",
        "longpageerror": "<strong>లోపం: మీరు సమర్పించిన పాఠ్యం {{PLURAL:$1|ఒక కిలోబైటు|$1 కిలోబైట్ల}} నిడివి కలిగి ఉంది. ఇది గరిష్ఠ పరిమితి అయిన {{PLURAL:$2|ఒక కిలోబైటుని|$2 కిలోబైట్లను}} మించింది.</strong>\n దీన్ని భద్రపరచలేము.",
        "readonlywarning": "<strong>హెచ్చరిక: నిర్వహణ కొరకు డేటాబేసుకి తాళం వేసారు. కాబట్టి మీ మార్పుచేర్పులను ఇప్పుడు భద్రపరచలేరు.</strong> \nమీ మార్పులను ఒక ఫాఠ్య ఫైలులోకి కాపీ చేసి భద్రపరచుకొని, తరువాత సమర్పించండి.\n\nతాళం వేసిన నిర్వాహకుడి వివరణ ఇదీ: $1",
        "protectedpagewarning": "<strong>హెచ్చరిక: ఈ పేజీ సంరక్షించబడింది. కాబట్టి నిర్వాహక అనుమతులు ఉన్న వాడుకరులు మాత్రమే మార్చగలరు.</strong>\nచివరి లాగ్ పద్దును మీ సమాచారం కోసం ఇక్కడ ఇస్తున్నాం:",
        "content-model-javascript": "జావాస్క్రిప్ట్",
        "content-model-css": "CSS",
        "content-json-empty-object": "ఖాళీ అంశం",
+       "content-json-empty-array": "ఖాళీ అరే",
        "expensive-parserfunction-warning": "<strong>హెచ్చరిక:</strong> ఈ పేజీలో ఖరీదైన పార్సరు పిలుపులు చాలా ఉన్నాయి.\n\nపార్సరు {{PLURAL:$2|పిలుపు|పిలుపులు}} $2 కంటే తక్కువ ఉండాలి,  ప్రస్తుతం {{PLURAL:$1|$1 పిలుపు ఉంది|$1  పిలుపులు ఉన్నాయి}}.",
        "expensive-parserfunction-category": "పార్సరు సందేశాలు అధికంగా ఉన్న పేజీలు",
        "post-expand-template-inclusion-warning": "<strong>హెచ్చరిక:</strong> మూస ఇముడ్పు సైజు చాలా పెద్దదిగా ఉంది.\nకొన్ని మూసలు ఇమడ్చబడవు.",
        "parser-template-recursion-depth-warning": "మూస రికర్షను లోతు అధిగమించబడింది ($1)",
        "language-converter-depth-warning": "భాషా మార్పిడి లోతు పరిమితిని అధిగమించారు ($1)",
        "node-count-exceeded-category": "నోడ్-కౌంటును మించిన పేజీలు",
-       "node-count-exceeded-category-desc": "à°¨à±\8bà°¡à±\81-à°¸à°\82à°\96à±\8dà°¯ à°\8eà°\95à±\8dà°\95à±\81à°µ à°\85యిన à°ªà±\8dà°°à°¤à±\81à°²à°\95à±\81 à°µà°°à±\8dà°\97à°®à±\81",
-       "node-count-exceeded-warning": "పేజీ నోడ్-కౌంటును మించింది",
+       "node-count-exceeded-category-desc": "à°ªà±\87à°\9cà±\80 à°\97à°°à°¿à°·à±\8dà°  à°¨à±\8bà°¡à±\81-à°¸à°\82à°\96à±\8dà°¯ à°®à°¿à°\82à°\9aినది.",
+       "node-count-exceeded-warning": "పేజీ నోడ్-కౌంటు మించింది",
        "expansion-depth-exceeded-category": "విస్తరణ లోతును మించిన పేజీలు",
-       "expansion-depth-exceeded-category-desc": "విసà±\8dతరణ à°²à±\8bà°¤à±\81à°¨à±\81 à°®à°¿à°\82à°\9aà°¿à°¨ à°ªà±\87à°\9cà±\80à°²à°\95à±\81 à°µà°°à±\8dà°\97à°®à±\81",
+       "expansion-depth-exceeded-category-desc": "à°ªà±\87à°\9cà±\80 à°\97à°°à°¿à°·à±\8dà°  à°µà°¿à°¸à±\8dతరణ à°²à±\8bà°¤à±\81à°¨à±\81 à°®à°¿à°\82à°\9aà°¿à°\82ది",
        "expansion-depth-exceeded-warning": "పేజీ విస్తరణ లోతును మించింది",
        "parser-unstrip-loop-warning": "Unstrip లూపును కనుక్కున్నాం",
        "parser-unstrip-recursion-limit": "Unstrip రికర్షన్ పరిమితిని దాటింది ($1)",
        "history-feed-description": "ఈ పేజీకి వికీలో కూర్పుల చరిత్ర",
        "history-feed-item-nocomment": "$2 న $1",
        "history-feed-empty": "మీరడిగిన పేజీ లేదు.\nదాన్ని వికీలోంచి తొలగించి ఉండొచ్చు, లేదా పేరు మార్చి ఉండొచ్చు.\nసంబంధిత కొత్త పేజీల కోసం [[Special:Search|వికీలో వెతికి చూడండి]].",
+       "history-edit-tags": "ఎంచుకున్న సంస్కరణల ట్యాగులను సవరించు",
        "rev-deleted-comment": "(మార్పుల సంగ్రహాన్ని తొలగించారు)",
        "rev-deleted-user": "(వాడుకరి పేరుని తొలగించారు)",
        "rev-deleted-event": "(చిట్టా వివరాలను తొలగించారు)",
        "revdelete-legend": "సందర్శక నిబంధనలు అమర్చు",
        "revdelete-hide-text": "కూర్పు పాఠ్యం",
        "revdelete-hide-image": "ఫైలులోని విషయాన్ని దాచు",
-       "revdelete-hide-name": "à°\9aà°°à±\8dయనà±\81, à°²à°\95à±\8dà°·à±\8dయానà±\8dà°¨à±\80 à°¦à°¾à°\9aà±\81",
+       "revdelete-hide-name": "పారామితà±\81లనà±\81, à°²à°\95à±\8dà°·à±\8dయానà±\8dà°¨à±\80 à°¦à°¾à°¯à°¿",
        "revdelete-hide-comment": "దిద్దుబాటు సారాంశం",
        "revdelete-hide-user": "దిద్దుబాటు చేసిన వాడుకరి పేరు/ఐపీ చిరునామా",
        "revdelete-hide-restricted": "డేటాను అందరిలాగే నిర్వాహకులకు కూడా కనబడనివ్వకు",
        "preferences": "అభిరుచులు",
        "mypreferences": "అభిరుచులు",
        "prefs-edits": "దిద్దుబాట్ల సంఖ్య:",
-       "prefsnologintext2": "మీ అభిరుచులను మార్చుకునేందుకు $1.",
+       "prefsnologintext2": "మీ అభిరుచులను మార్చుకునేందుకు ప్రవేశించండి.",
        "prefs-skin": "రూపు",
        "skin-preview": "మునుజూడు",
        "datedefault": "ఏదైనా పరవాలేదు",
        "prefs-personal": "వాడుకరి ప్రవర",
        "prefs-rc": "ఇటీవలి మార్పులు",
        "prefs-watchlist": "వీక్షణ జాబితా",
+       "prefs-editwatchlist": "వీక్షణజాబితాను సవరించు",
        "prefs-editwatchlist-label": "మీ వీక్షణజాబితా లోని అంశాలను సవరించండి:",
+       "prefs-editwatchlist-edit": "మీ వీక్షణజాబితాపై ఉన్న శీర్షికలను చూడండి, తీసివేయండి",
+       "prefs-editwatchlist-raw": "ముడి వీక్షణజాబితాను సవరించు",
+       "prefs-editwatchlist-clear": "మీ వీక్షణజాబితాను తుడిచివేయండి",
        "prefs-watchlist-days": "వీక్షణ జాబితాలో చూపించవలసిన రోజులు:",
        "prefs-watchlist-days-max": "గరిష్ఠంగా $1 {{PLURAL:$1|రోజు|రోజులు}}",
        "prefs-watchlist-edits": "విస్తృత వీక్షణ జాబితాలో చూపించవలసిన దిద్దుబాట్లు:",
        "right-browsearchive": "తొలగించిన పేజీల్లో వెతకడం",
        "right-undelete": "పేజీ తొలగింపును రద్దు చెయ్యి",
        "right-suppressrevision": "నిర్వాహకులకు కనబడకుండా ఉన్న కూర్పులను సమీక్షించి పునస్థాపించడం",
+       "right-viewsuppressed": "ఏ వాడుకరి నుండైనా వీక్షణ సంస్కరణలు దాయబడ్డాయి",
        "right-suppressionlog": "గోప్యంగా ఉన్న లాగ్‌లను చూడడం",
        "right-block": "దిద్దుబాటు చెయ్యకుండా ఇతర వాడుకరులను నిరోధించగలగడం",
        "right-blockemail": "ఈమెయిలు పంపకుండా సభ్యుని నిరోధించు",
        "right-protect": "సంరక్షణ స్థాయిలను మార్చు, కాస్కేడ్-రక్షిత పేజీలలో దిద్దుబాటు చెయ్యి",
        "right-editprotected": "\"{{int:protect-level-sysop}}\" గా సంక్షించబడిన పేజీలను సరిదిద్దు",
        "right-editsemiprotected": "\"{{int:protect-level-autoconfirmed}}\" గా సంరక్షించబడ్డ పేజీలను మార్చు",
+       "right-editcontentmodel": "పేజీ యొక్క కంటెంటు మోడలును సవరించు",
        "right-editinterface": "యూజరు ఇంటరుఫేసులో దిద్దుబాటు చెయ్యి",
        "right-editusercssjs": "ఇతర వాడుకరుల CSS, JS ఫైళ్ళలో దిద్దుబాటు చెయ్యి",
        "right-editusercss": "ఇతర వాడుకరుల CSS ఫైళ్ళలో దిద్దుబాటు చెయ్యడం",
        "action-viewmywatchlist": "మీ వీక్షణ జాబితాను చూడండి",
        "action-viewmyprivateinfo": "మీ గోపనీయ సమాచారాన్ని చూడండి",
        "action-editmyprivateinfo": "మీ గోపనీయ సమాచారాన్ని సరిదిద్దండి",
+       "action-editcontentmodel": "పేజీ యొక్క కంటెంటు మోడలును సవరించు",
        "action-managechangetags": "డేటాబేసులో ట్యాగులను చేర్చే లేదా తొలగించే",
        "action-applychangetags": "మీ మార్పులతో ట్యాగులను ఆపాదించే",
        "nchanges": "{{PLURAL:$1|ఒక మార్పు|$1 మార్పులు}}",
        "license": "లైసెన్సు వివరాలు:",
        "license-header": "లైసెన్సింగ్",
        "nolicense": "దేన్నీ ఎంచుకోలేదు",
+       "licenses-edit": "లైసెన్సు ఎంపికలను సవరించు",
        "license-nopreview": "(మునుజూపు అందుబాటులో లేదు)",
        "upload_source_url": " (సార్వజనికంగా అందుబాటులో ఉన్న, సరైన URL)",
-       "upload_source_file": " (మీ కంప్యూటర్లో ఒక ఫైలు)",
+       "upload_source_file": "(మీ కంప్యూటరు నుండి ఎంచుకోబడిన దస్త్రం)",
        "listfiles-delete": "తొలగించు",
        "listfiles-summary": "ఈ ప్రత్యేక పేజీ, ఎక్కించిన ఫైళ్ళన్నిటినీ చూపిస్తుంది.",
        "listfiles_search_for": "మీడియా పేరుకై వెతుకు:",
        "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": "{{PLURAL:$1|కూర్పు|$1 కూర్పులు}}",
-       "nviews": "$1 {{PLURAL:$1|సందర్శన|సందర్శనలు}}",
        "nimagelinks": "$1 {{PLURAL:$1|పుట|పుటల}}లో ఉపయోగించారు",
        "ntransclusions": "$1 {{PLURAL:$1|పుట|పుటల}}లో ఉపయోగించారు",
        "specialpage-empty": "ఈ పేజీ ఖాళీగా ఉంది.",
        "wantedtemplates": "కావాల్సిన మూసలు",
        "mostlinked": "అధిక లింకులు చూపే పేజీలు",
        "mostlinkedcategories": "అధిక లింకులు చూపే వర్గాలు",
-       "mostlinkedtemplates": "à°\8eà°\95à±\8dà°\95à±\81à°µà°\97à°¾ à°\89పయà±\8bà°\97à°¿à°\82à°\9aà°¿à°¨ à°®à±\82à°¸లు",
+       "mostlinkedtemplates": "à°\8eà°\95à±\8dà°\95à±\81à°µà°\97à°¾ à°\89పయà±\8bà°\97à°¿à°\82à°\9aà°¿à°¨ à°ªà±\87à°\9cà±\80లు",
        "mostcategories": "అధిక వర్గాలలో చేరిన వ్యాసాలు",
        "mostimages": "అధిక లింకులు గల బొమ్మలు",
        "mostinterwikis": "అత్యధిక అంతరవికీ లింకులు కలిగిన పేజీలు",
        "logempty": "సరిపోలిన అంశాలేమీ చిట్టాలో లేవు.",
        "log-title-wildcard": "ఈ పాఠ్యంతో మొదలయ్యే పుస్తకాల కొరకు వెతుకు",
        "showhideselectedlogentries": "ఎంచుకున్న చిట్టా పద్దులను చూపించు/దాచు",
+       "log-edit-tags": "ఎంచుకున్న చిట్టా ప్రవేశాల ట్యాగులను సవరించు",
        "allpages": "అన్ని పేజీలు",
        "nextpage": "తరువాతి పేజీ ($1)",
        "prevpage": "మునుపటి పేజీ ($1)",
        "trackingcategories": "పహారా కాయు వర్గాలు",
        "trackingcategories-msg": "పహారా కార్యు వర్గము",
        "trackingcategories-name": "సందేశం పేరు",
+       "trackingcategories-desc": "వర్గపు చేర్పు క్రైటేరియా",
+       "broken-file-category-desc": "ఈ పుటలో విరిగిన దస్త్ర లంకె ఉన్నది (దస్త్రం ఉనికిలో లేనప్పుడు దస్త్రానికి ఎంబెడ్ చేయు లంకె).",
        "trackingcategories-nodesc": "వివరణ లేదు.",
        "trackingcategories-disabled": "వర్గం అచేతనమై ఉంది",
        "mailnologin": "పంపించవలసిన చిరునామా లేదు",
        "import-interwiki-history": "ఈ పేజీ యొక్క అన్ని చారిత్రక కూర్పులను కాపీ చెయ్యి",
        "import-interwiki-templates": "అన్ని మూసలను ఉంచు",
        "import-interwiki-submit": "దిగుమతించు",
+       "import-mapping-default": "అప్రమేయ స్థానాలకు దిగుమతించు",
+       "import-mapping-namespace": "పేరుబరికి దిగుమతించు:",
+       "import-mapping-subpage": "దిగువ పేర్కొన్న పేజీ యొక్క ఉప పేజీలుగా దిగుమతించు:",
        "import-upload-filename": "పైలుపేరు:",
        "import-comment": "వ్యాఖ్య:",
        "importtext": "[[Special:Export|ఎగుమతి ఉపకరణాన్ని]] ఉపయోగించి, ఈ ఫైలుని  మూల వికీ నుంచి ఎగుమతి చెయ్యండి.\nదాన్ని మీ కంప్యూటర్లో భద్రపరచి, ఆపై ఇక్కడికి ఎక్కించండి.",
        "version-entrypoints": "ప్రవేశ బిందు చిరునామాలు",
        "version-entrypoints-header-entrypoint": "ప్రవేశ బిందువు",
        "version-entrypoints-header-url": "చిరునామా",
+       "version-libraries-library": "గ్రంథాలయం",
        "version-libraries-version": "సంచిక",
+       "version-libraries-license": "లైసెన్సు",
+       "version-libraries-description": "వివరణ",
+       "version-libraries-authors": "రచయితలు",
        "redirect": "ఫైలు, వాడుకరి, పేజీ లేదా కూర్పు ఐడీ ప్రకారం దారిమార్పు",
        "redirect-legend": "ఫైలు లేదా పేజీకి దారిమార్పు",
        "redirect-submit": "వెళ్ళు",
        "tags-apply-no-permission": "మీ మార్పులతో పాటు వాటికి ట్యాగులను ఆపాదించే అనుమతి మీకు లేదు.",
        "tags-apply-not-allowed-one": "\"$1\" ట్యాగును మానవీయంగా ఆపాదించలేరు.",
        "tags-apply-not-allowed-multi": "ఈ {{PLURAL:$2|ట్యాగును|ట్యాగులను}} మానవీయంగా ఆపాదించడానికి అనుమతించరు:",
+       "tags-edit-title": "ట్యాగులను సవరించు",
+       "tags-edit-manage-link": "ట్యాగులను నిర్వహించండి",
        "tags-edit-existing-tags": "ప్రస్తుత ట్యాగులు:",
        "tags-edit-existing-tags-none": "''ఏమీలేవు''",
        "tags-edit-new-tags": "కొత్త ట్యాగులు:",
        "mediastatistics-header-drawing": "రేఖాచిత్రాలు (వెక్టర్ చిత్రాలు)",
        "mediastatistics-header-audio": "ఆడియో",
        "mediastatistics-header-video": "వీడియోలు",
+       "mediastatistics-header-office": "కార్యాలయం",
        "mediastatistics-header-text": "పాఠ్య",
        "json-error-state-mismatch": "చెల్లని లేదా సరికాని JSON",
+       "json-error-syntax": "వ్యాకరణ దోషం",
        "headline-anchor-title": "ఈ విభాగానికి లంకె",
        "special-characters-group-latin": "లాటిన్",
        "special-characters-group-latinextended": "విస్తరిత లాటిన్",
        "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": "పేజీ ఉనికిలో లేదు"
 }
index b75b945..d7b5dd4 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|การเปลี่ยนแปลงแก่หน้าในรายการเฝ้าดูของคุณ]]",
        "badsig": "ลายเซ็นดิบไม่ถูกต้อง \nให้ตรวจสอบป้ายระบุเอชทีเอ็มแอล",
        "badsiglength": "ลายเซ็นของคุณยาวเกินไป \nต้องยาวไม่เกิน $1 อักขระ",
        "yourgender": "ต้องการให้ระบุคุณเป็นเพศใด",
-       "gender-unknown": "à¸\82อà¹\84มà¹\88ระà¸\9aุ",
+       "gender-unknown": "à¹\80มืà¹\88อà¸\81ลà¹\88าวà¸\96ึà¸\87à¸\84ุà¸\93 à¸\8bอà¸\9fà¸\95à¹\8cà¹\81วรà¹\8cà¸\88ะà¹\83à¸\8aà¹\89à¸\84ำà¸\97ีà¹\88à¹\84มà¹\88ระà¸\9aุà¹\80à¸\9eศà¸\97ุà¸\81à¹\80มืà¹\88อà¸\97ีà¹\88à¹\80à¸\9bà¹\87à¸\99à¹\84à¸\9bà¹\84à¸\94à¹\89",
        "gender-male": "ชาย",
        "gender-female": "หญิง",
        "prefs-help-gender": "เลือกตั้งค่านี้หรือไม่ก็ได้\nซอฟต์แวร์ใช้ค่านี้เพื่อติดต่อคุณและกล่าวถึงคุณโดยใช้เพศทางไวยากรณ์ที่เหมาะสมเมื่อติดต่อผู้อื่น\nสารสนเทศนี้เปิดเผยต่อสาธารณะ",
        "nmembers": "$1 หน้า",
        "nmemberschanged": "$1 → $2 สมาชิก",
        "nrevisions": "$1 รุ่นปรับปรุง",
-       "nviews": "$1 ครั้ง",
        "nimagelinks": "ใช้ใน $1 {{PLURAL:$1|หน้า|หน้า}}",
        "ntransclusions": "ใช้ใน $1 {{PLURAL:$1|หน้า|หน้า}}",
        "specialpage-empty": "ไม่มีผลลัพธ์รายงานนี้",
        "blocklogpage": "ปูมการบล็อก",
        "blocklog-showlog": "ผู้ใช้นี้เคยถูกบล็อก\nปูมการบล็อกแสดงไว้ด้านล่างนี้เพื่อการอ้างอิง:",
        "blocklog-showsuppresslog": "ผู้ใช้นี้ถูกบล็อกและซ่อน\nปูมการระงับแสดงไว้ด้านล่างนี้เพื่อการอ้างอิง:",
-       "blocklogentry": "บล็อก [[$1]] หมดอายุ $2 $3",
-       "reblock-logentry": "à¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารà¸\9aลà¹\87อà¸\81สำหรัà¸\9a [[$1]] หมดอายุ $2 $3",
+       "blocklogentry": "à¸\9aลà¹\87อà¸\81 [[$1]] à¹\82à¸\94ยมีà¹\80วลาหมà¸\94อายุ $2 $3",
+       "reblock-logentry": "à¹\80à¸\9bลีà¹\88ยà¸\99à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\81ารà¸\9aลà¹\87อà¸\81สำหรัà¸\9a [[$1]] à¹\82à¸\94ยมีà¹\80วลาหมดอายุ $2 $3",
        "blocklogtext": "นี่คือปูมการบล็อกและการเลิกบล็อกผู้ใช้\nการบล็อกที่อยู่ไอพีโดยอัตโนมัติจะไม่แสดงในรายการ\nดู[[Special:BlockList|รายการบล็อกไอพี]]สำหรับการบล็อกและการระงับในปัจจุบัน",
        "unblocklogentry": "ปลดบล็อก $1",
        "block-log-flags-anononly": "เฉพาะผู้ใช้นิรนาม",
        "tooltip-pt-logout": "ล็อกเอาต์",
        "tooltip-pt-createaccount": "สนับสนุนให้คุณสร้างบัญชีและล็อกอิน แต่ไม่บังคับ",
        "tooltip-ca-talk": "อภิปรายเกี่ยวกับหน้าเนื้อหา",
-       "tooltip-ca-edit": "à¸\84ุà¸\93สามารà¸\96à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\99ีà¹\89à¹\84à¸\94à¹\89 à¹\82à¸\9bรà¸\94à¹\83à¸\8aà¹\89à¸\9bุà¹\88มà¸\95ัวอยà¹\88าà¸\87à¸\81à¹\88อà¸\99à¸\9aัà¸\99à¸\97ึà¸\81",
+       "tooltip-ca-edit": "à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\99ีà¹\89",
        "tooltip-ca-addsection": "เริ่มส่วนใหม่",
        "tooltip-ca-viewsource": "หน้านี้ถูกล็อก \nแต่ยังดูโค้ดได้",
        "tooltip-ca-history": "รุ่นที่แล้วของหน้านี้",
index 3ec0241..b43794e 100644 (file)
        "passwordreset": "Скинути пароль",
        "passwordreset-text-one": "Заповніть цю форму, щоб отримати тимчасовий пароль електронною поштою.",
        "passwordreset-text-many": "{{PLURAL:$1|Заповніть одне з полів для отримання тимчасового пароля електронною поштою.}}",
-       "passwordreset-legend": "Перевстановити пароль",
        "passwordreset-disabled": "У цій вікі вимкнена можливість скидання пароля.",
        "passwordreset-emaildisabled": "В цій вікі вимкнуто Функції електронної пошти.",
        "passwordreset-username": "Ім'я користувача:",
        "resettokens": "Скидання жетонів",
        "resettokens-text": "Ви можете скинути жетони, що забезпечують доступ до певних особистих даних, пов'язаних тут із вашим обліковим записом.\nВам слід це зробити, якщо ви випадково поділились жетонами з кимось, або якщо ваш обліковий запис було зламано.",
        "resettokens-no-tokens": "Немає жетонів до скидання.",
-       "resettokens-legend": "Скинути жетони",
        "resettokens-tokens": "Жетони:",
        "resettokens-token-label": "$1 (поточне значення: $2)",
        "resettokens-watchlist-token": "Маркер стрічки новин (Atom/RSS) щодо [[Special:Watchlist|зміни на сторінці з вашого списку спостереження]]",
        "yourdiff": "Відмінності",
        "copyrightwarning": "Зверніть увагу, що будь-які додавання і зміни до {{grammar:genitive|{{SITENAME}}}} розглядаються як випущені на умовах ліцензії $2 (детальніше див. $1).\nЯкщо ви не бажаєте, щоб написане вами безжально редагувалось і розповсюджувалося за бажанням будь-кого, не пишіть тут.<br />\nВи також підтверджуєте, що написане вами тут належить вам або взяте з джерела, що є суспільним надбанням чи подібного вільного джерела.\n'''Не публікуйте тут без дозволу матеріали, захищені авторським правом!'''",
        "copyrightwarning2": "Будь ласка, зверніть увагу, що всі зміни, внесені вами до {{SITENAME}}, можуть редагуватися, доповнюватися або вилучатися іншими користувачами.\nЯкщо ви не бажаєте, щоб написане вами безжально редагувалось — не пишіть тут.<br />\nВи також підтверджуєте, що наведене тут написано вами особисто або запозичено з джерела, яке є суспільним надбанням, або подібного вільного джерела (див. $1).<br />\n'''Не публікуйте тут без дозволу матеріали, захищені авторським правом!'''",
+       "editpage-cannot-use-custom-model": "Модель вмісту цієї сторінки не може бути змінена.",
        "longpageerror": "'''Помилка: Поданий вами текст становить $1 {{PLURAL:$1|кілобайт|кілобайти|кілобайтів}}, що більше за встановлену межу у {{PLURAL:$2|кілобайт|кілобайти|кілобайтів}}.'''\nЙого неможливо зберегти.",
        "readonlywarning": "'''Попередження: База даних заблокована на обслуговування, тому, на даний момент, ви не можете записати ваші зміни.\nМожливо, вам варто скопіювати текст у файл на вашому комп'ютері й зберегти його на пізніше.'''\n\nАдміністратор, що заблокував базу даних, залишив наступне пояснення: $1",
        "protectedpagewarning": "'''Попередження: Ця сторінка була захищена від змін так, що тільки користувачі з правами адміністратора можуть її редагувати.'''\nОстанній запис журналу наведений нижче для довідки:",
        "badsig": "Неправильний підпис.\nПеревірте коректність HTML-тегів.",
        "badsiglength": "Ваш підпис дуже довгий.\nПовинно бути не більше $1 {{PLURAL:$1|символу|символів|символів}}.",
        "yourgender": "Стать:",
-       "gender-unknown": "Ð\9dе Ð²Ð¸Ð·Ð½Ð°Ñ\87ена",
+       "gender-unknown": "Ð\97гадÑ\83Ñ\8eÑ\87и Ð\92аÑ\81, Ð¿Ñ\80огÑ\80амне Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ\87еннÑ\8f Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82име Ð¿Ð¾ Ð·Ð¼Ð¾Ð·Ñ\96 Ð³ÐµÐ½Ð´ÐµÑ\80но Ð½ÐµÐ¹Ñ\82Ñ\80алÑ\8cнÑ\96 Ñ\81лова",
        "gender-male": "Чоловіча",
        "gender-female": "Жіноча",
        "prefs-help-gender": "Задання цього параметру — необов'язкове. Застосовується рушієм у тих звертаннях до користувача, які залежать від статі.\nЦя інформація загальнодоступна.",
        "nmembers": "$1 {{PLURAL:$1|об'єкт|об'єкти|об'єктів}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|член|члени|членів}}",
        "nrevisions": "$1 {{PLURAL:$1|версія|версії|версій}}",
-       "nviews": "$1 {{PLURAL:$1|перегляд|перегляди|переглядів}}",
        "nimagelinks": "Використовується на $1 {{PLURAL:$1|1=сторінці|сторінках}}",
        "ntransclusions": "використовується на $1 {{PLURAL:$1|1=сторінці|сторінках}}",
        "specialpage-empty": "Запит не дав результатів.",
        "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 8eae706..17cfc1a 100644 (file)
        "unusedtemplateswlh": "دیگر روابط",
        "randompage": "بےترتیب صفحہ",
        "randomincategory-category": "زمرہ:",
+       "randomincategory-submit": "جانا",
        "statistics": "اعداد و شمار",
        "statistics-header-pages": "احصائے صفحات",
        "statistics-header-edits": "احصائے تدوین",
        "blocklink": "پابندی لگائیں",
        "unblocklink": "پابندی ختم",
        "change-blocklink": "پابندی میں تبدیلی",
-       "contribslink": "شـراکـت",
+       "contribslink": "شراکت",
        "blocklogpage": "نوشتۂ پابندی",
        "block-log-flags-nocreate": "کھاتے کی تخلیق غیرفعال",
        "move-page": "منتقلی",
index aa1146a..ad3028e 100644 (file)
        "passwordreset": "Maxfiy soʻzni yangilash",
        "passwordreset-text-one": "Mahfiy soʻzni tashlash uchun ushbu oynalarni toʻltiring.",
        "passwordreset-text-many": "{{PLURAL:$1|Quyidagi oynalardan birini toʻldirsangiz, elektron pochtangizga vaqtinchalik maxfiy soʻz joʻnatiladi.}}",
-       "passwordreset-legend": "Maxfiy soʻzni yangilash",
        "passwordreset-emaildisabled": "Email xususiyatlari ushbu vikida oʻchirib qoʻyilgan.",
        "passwordreset-username": "Foydalanuvchi nomi:",
        "passwordreset-domain": "Domen:",
        "changeemail-password": "Sizning {{SITENAME}}dagi maxfiy so‘zingiz:",
        "changeemail-submit": "Manzilni o'zgartirish",
        "resettokens": "Kalitlaringizni yangilash",
-       "resettokens-legend": "Kalitlaringizni yangilash",
        "resettokens-tokens": "Kalitlar:",
        "resettokens-token-label": "$1 (joriy koʻrsatkich: $2)",
        "resettokens-done": "Kalitlar yangilandi.",
index 4c0ddb1..0cfe6c8 100644 (file)
        "badtitletext": "Tựa trang yêu cầu không đúng, rỗng, hoặc là một liên kết ngôn ngữ hoặc liên kết wiki sai. Nó có thể chứa một hoặc nhiều ký tự mà tựa trang không thể sử dụng.",
        "title-invalid-empty": "Tiêu đề trang được yêu cầu rỗng hoặc chỉ chứa tên của một không gian tên.",
        "title-invalid-utf8": "Tiêu đề trang được yêu cầu chứa một chuỗi UTF-8 không hợp lệ",
-       "title-invalid-interwiki": "Tiêu đề chứa một liên kết liên wiki",
+       "title-invalid-interwiki": "Tiêu đề trang yêu cầu có chứa một liên kết liên wiki mà không thể được sử dụng làm tiêu đề",
        "title-invalid-talk-namespace": "Tiêu đề trang đã yêu cầu chỉ đến trang thảo luận không thể tồn tại.",
        "title-invalid-characters": "Tiêu đề trang đã yêu cầu chứa ký tự không hợp lệ: \"$1\".",
        "title-invalid-relative": "Tiêu đề có đường dẫn tương đối. Tiêu đề trang tương đối (./, ../) là không hợp lệ , bởi chúng thường sẽ không thể đến được khi được xử lý bởi trình duyệt của người dùng.",
        "title-invalid-magic-tilde": "Tiêu đề trang đã yêu cầu chứa dãy dấu ngã không hợp lệ (<nowiki>~~~</nowiki>).",
-       "title-invalid-too-long": "Tiêu đề trang đã yêu cầu quá dài. Tiêu đề phải ngắn hơn $1 byte theo mã hóa UTF-8.",
+       "title-invalid-too-long": "Tiêu đề trang đã yêu cầu quá dài. Tiêu đề phải ngắn hơn $1 {{PLURAL:$1|byte|bytes}} byte theo mã hóa UTF-8.",
        "title-invalid-leading-colon": "Tiêu đề trang đã yêu cầu chứa dấu hai chấm ở đầu là không hợp lệ.",
        "perfcached": "Dữ liệu sau được lấy từ bộ nhớ đệm và có thể đã lỗi thời. Tối đa có sẵn {{PLURAL:$1|một kết quả|$1 kết quả}} trong bộ nhớ đệm.",
        "perfcachedts": "Dữ liệu dưới đây được đưa vào vùng nhớ đệm và được cập nhật lần cuối lúc $1. Tối đa có sẵn {{PLURAL:$4|một kết quả|$4 kết quả}} trong vùng nhớ đệm.",
        "passwordreset": "Tái tạo mật khẩu",
        "passwordreset-text-one": "Hãy điền mẫu đơn này để tái tạo mật khẩu.",
        "passwordreset-text-many": "Điền vào {{PLURAL:$1}}một hộp sau để nhận một mật khẩu tạm thời qua thư điện tử.",
-       "passwordreset-legend": "Tái tạo mật khẩu",
        "passwordreset-disabled": "Chức năng tái tạo mật khẩu đã bị tắt trên wiki này.",
        "passwordreset-emaildisabled": "Tính năng gửi thư điện tử không được kích hoạt trên wiki này.",
        "passwordreset-username": "Tên người dùng:",
        "resettokens": "Đặt lại dấu hiệu",
        "resettokens-text": "Bạn có thể đặt lại các dấu hiệu cho phép truy cập những dữ liệu cá nhân của tài khoản của bạn tại đây.\n\nBạn nên sử dụng chức năng này nếu bạn đã vô tình chia sẻ các dấu hiệu với người khác hoặc tài khoản của bạn đã bị xâm phạm.",
        "resettokens-no-tokens": "Không có dấu hiệu để đặt lại.",
-       "resettokens-legend": "Đặt lại dấu hiệu",
        "resettokens-tokens": "Dấu hiệu:",
        "resettokens-token-label": "$1 (giá trị hiện tại: $2)",
        "resettokens-watchlist-token": "Dấu hiệu cho nguồn cấp [[Special:Watchlist|thay đổi trong danh sách theo dõi]] (dạng Atom/RSS)",
        "yourdiff": "Khác",
        "copyrightwarning": "Xin chú ý rằng tất cả các đóng góp của bạn tại {{SITENAME}} được xem là sẽ phát hành theo giấy phép $2 (xem $1 để biết thêm chi tiết). Nếu bạn không muốn trang của bạn bị sửa đổi không thương tiếc và không sẵn lòng cho phép phát hành lại, đừng đăng trang ở đây.<br />\nBạn phải đảm bảo với chúng tôi rằng chính bạn là người viết nên, hoặc chép nó từ một nguồn thuộc phạm vi công cộng hoặc tự do tương đương.\n'''ĐỪNG ĐĂNG TÁC PHẨM CÓ BẢN QUYỀN MÀ CHƯA XIN PHÉP!'''",
        "copyrightwarning2": "Xin chú ý rằng tất cả các đóng góp của bạn tại {{SITENAME}} có thể được sửa đổi, thay thế, hoặc xóa bỏ bởi các thành viên khác. Nếu bạn không muốn trang của bạn bị sửa đổi không thương tiếc, đừng đăng trang ở đây.<br />\nBạn phải đảm bảo với chúng tôi rằng chính bạn là người viết nên, hoặc chép nó từ một nguồn thuộc phạm vi công cộng hoặc tự do tương đương (xem $1 để biết thêm chi tiết).\n'''ĐỪNG ĐĂNG TÁC PHẨM CÓ BẢN QUYỀN MÀ CHƯA XIN PHÉP!'''",
+       "editpage-cannot-use-custom-model": "Mẫu nội dung của trang này không thể thay.",
        "longpageerror": "'''Lỗi: Văn bạn mà bạn muốn lưu dài $1 kilôbyte, dài hơn độ dài tối đa cho phép $2 kilôbyte.'''\nKhông thể lưu trang.",
        "readonlywarning": "'''CẢNH BÁO: Cơ sở dữ liệu đã bị khóa để bảo dưỡng, do đó bạn không thể lưu các sửa đổi của mình. Bạn nên cắt-dán đoạn bạn vừa sửa vào một tập tin và lưu nó lại để sửa đổi sau này.'''\n\nBảo quản viên khi khóa dữ liệu đã đưa ra lý do: $1",
        "protectedpagewarning": "'''Cảnh báo: Trang này đã bị khóa và chỉ có các thành viên có quyền quản lý mới có thể sửa được.'''\nThông tin mới nhất trong nhật trình được ghi dưới đây để tiện theo dõi:",
        "content-model-css": "CSS",
        "content-json-empty-object": "Đối tượng trống",
        "content-json-empty-array": "Mảng trống",
+       "duplicate-args-warning": "<strong>Cảnh báo:</strong> [[:$1]] đang gọi  [[:$2]] với nhiều hơn một giá trị cho thông số \"$3\". Chỉ giá trị cuối cùng mới được sử dụng.",
        "duplicate-args-category": "Trang đưa đối số thừa vào bản mẫu",
        "duplicate-args-category-desc": "Trang đưa một đối số nhiều lần vào một bản mẫu được nhúng, thí dụ <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> hoặc <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Cảnh báo: Trang này có quá nhiều lần gọi hàm cú pháp cần mức độ xử lý cao.\n\nNó nên ít hơn $2 {{PLURAL:$2|lần gọi|lần gọi}}, hiện giờ đang là {{PLURAL:$1|$1 lần gọi|$1 lần gọi}}.",
        "badsig": "Chữ ký không hợp lệ; hãy kiểm tra thẻ HTML.",
        "badsiglength": "Chữ ký của bạn quá dài.\nNó không được dài quá $1 ký tự.",
        "yourgender": "Bạn muốn được miêu tả như thế nào?",
-       "gender-unknown": "Tôi không muốn chỉ rõ",
+       "gender-unknown": "Khi nhắc nhở bạn, phần mềm sẽ sử dụng các từ chỉ giới tính trung tính bất cứ khi nào có thể",
        "gender-male": "Nam",
        "gender-female": "Nữ",
        "prefs-help-gender": "Tùy chỉnh này không được bắt buộc.\nPhần mềm sử dụng giá trị này để xưng hô bạn với giới tính đúng.\nThông tin này là công khai.",
        "userrights-lookup-user": "Quản lý nhóm thành viên",
        "userrights-user-editname": "Nhập tên thành viên:",
        "editusergroup": "Sửa nhóm thành viên",
-       "editinguser": "Thay đổi quyền hạn của thành viên '''[[User:$1|$1]]''' $2",
+       "editinguser": "Thay đổi quyền hạn thành viên  của {{GENDER:$1|user}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Sửa nhóm thành viên",
        "saveusergroups": "Lưu nhóm thành viên",
        "userrights-groupsmember": "Thuộc nhóm:",
        "uploaddisabledtext": "Chức năng tải tập tin đã bị tắt.",
        "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-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-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.",
        "listfiles-delete": "xóa",
        "listfiles-summary": "Trang đặc biệt này liệt kê các tập tin được tải lên.",
        "listfiles_search_for": "Tìm kiếm theo tên tập tin:",
-       "listfiles-userdoesnotexist": "Tài khoản người dùng \"$ 1\" không được đăng ký.",
+       "listfiles-userdoesnotexist": "Tài khoản người dùng \"$1\" không được đăng ký.",
        "imgfile": "tập tin",
        "listfiles": "Danh sách tập tin",
        "listfiles_thumb": "Hình nhỏ",
        "randomincategory-nopages": "Không có trang nào trong [[:Category:$1]].",
        "randomincategory-category": "Thể loại:",
        "randomincategory-legend": "Trang ngẫu nhiên trong thể loại",
+       "randomincategory-submit": "Xem",
        "randomredirect": "Trang đổi hướng ngẫu nhiên",
        "randomredirect-nopages": "Không có trang đổi hướng nào trong không gian tên “$1”.",
        "statistics": "Thống kê",
        "nmembers": "$1 trang",
        "nmemberschanged": "$1 → $2 trang",
        "nrevisions": "$1 {{PLURAL:$1|phiên bản|phiên bản}}",
-       "nviews": "$1 {{PLURAL:$1|lượt truy cập|lượt truy cập}}",
        "nimagelinks": "Được sử dụng trong $1 trang",
        "ntransclusions": "được sử dụng trong $1 trang",
        "specialpage-empty": "Trang này đang trống.",
        "unusedimages": "Tập tin chưa dùng",
        "wantedcategories": "Thể loại cần thiết",
        "wantedpages": "Trang cần viết",
-       "wantedpages-summary": "Danh sách các trang không tồn tại có nhiều trang nhất liên kết đến, trừ các trang chỉ có trang đổi hướng đến. Xem danh sách các trang không tồn tại có trang đổi hướng đến tại [[{{#special:BrokenRedirects}}]].",
+       "wantedpages-summary": "Danh sách các trang không tồn tại có nhiều trang nhất liên kết đến, trừ các trang chỉ có trang đổi hướng đến. Xem [[{{#special:BrokenRedirects}}|danh sách các trang không tồn tại có trang đổi hướng đến]].",
        "wantedpages-badtitle": "Tiêu đề không hợp lệ trong tập kết quả: $1",
        "wantedfiles": "Tập tin cần thiết",
        "wantedfiletext-cat": "Các tập tin sau được nhúng nhưng không tồn tại. Các tập tin từ kho dùng chung có thể được liệt kê trong khi tồn tại; các trường hợp này được <del>gạch bỏ</del>. Ngoài ra, các trang nhúng tập tin không tồn tại được liệt kê tại [[:$1]].",
        "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.",
        "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",
        "version-libraries": "Các thư viện đã cài đặt",
        "version-libraries-library": "Thư viện",
        "version-libraries-version": "Phiên bản",
+       "version-libraries-license": "Giấy phép",
+       "version-libraries-description": "Miêu tả",
+       "version-libraries-authors": "Tác giả",
        "redirect": "Đổi hướng đến tập tin, người dùng, trang, hoặc số phiên bản",
        "redirect-legend": "Đổi hướng đến tập tin hoặc trang",
        "redirect-summary": "Trang đặc biệt này đổi hướng đến một tập tin (theo tên tập tin được cho vào), trang (theo số phiên bản hoặc số trang được cho vào), hoặc trang cá nhân (theo số thành viên). Cách sử dụng: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], hoặc [[{{#Special:Redirect}}/user/101]].",
        "special-characters-group-khmer": "Khơ-me",
        "special-characters-title-endash": "dấu gạch en",
        "special-characters-title-emdash": "dấu gạch em",
-       "special-characters-title-minus": "dấu trừ"
+       "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 $1"
 }
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 d17bf77..f341b8c 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|გვერდების ცვლილებები თქვენი კონტროლის სიაში]]",
        "noarticletext": "ასე თე ხასილას ტექსტ ვა რე. \nთქვა შეილებუნა [[Special:Search/{{PAGENAME}}|გორათ ათე ხასილაშ ჯოხო]] შხვა ხასილეფს,\n<span class=\\\"plainlinks\\\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} დოგორათ მეხუჯაფილ ჟურნალეფ],\nვარა [{{fullurl:{{FULLPAGENAME}}|action=edit}} დიჭყათ ათე ხასილაშ რედაქტირაფა]</span>.",
        "noarticletext-nopermission": "ათე ხასჷლას ასე ტექსტი ვა რე. თქვა შეილებუნა [[Special:Search/{{PAGENAME}}|დოგორათ თე ხასჷლაშ დუდჯოხო]] შხვა ხასჷლეფს,\nვარდა <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“ ვაარსებენს. დერწმუნით, ნამჷ-და დასურო გოკონა თე ანგარიშიშ დორსხუაფა ვარდა მიშათინუა.",
        "userpage-userdoesnotexist-view": "მომხმარებელი „$1“ არ არის დარეგისტრირებული.",
        "blocked-notice-logextract": "ეს მომხმარებელი უკვე დაიბლოკა.\nდაბლოკვის მიზეზი შემდეგშია:",
        "clearyourcache": "'''შენიშვნა:''' შენახვის შემდეგ შესაძლოა დაგჭირდეთ ბრაუზერის ქეშის გაწმენდა ცვლილებების სანახავად. \n* '''Firefox / Safari:''' დააჭირეთ ''Shift'' ''Reload''-ზე დაწკაპებისას, ან დააჭირეთ ''Ctrl-F5'', ან ''Ctrl-R'' (''⌘-R'' Mac-ზე); \n* '''Google Chrome:''' დააჭირეთ ''Ctrl-Shift-R'' (''⌘-Shift-R'' Mac-ზე);\n* '''IE:''' დააჭირეთ ''Ctrl'' ''Refresh''-ზე დაწკაპებისას, ან დააჭირეთ ''Ctrl-F5'';\n* '''Opera''' გაწმინდეთ კეში ''Tools→Preferences''-დან.",
        "usercssyoucanpreview": "'''რჩევა:''' შენახვამდე გამოიყენეთ ღილაკი \"{{int:showpreview}}\" თქვენი ახალი CSS ტესტირებისთვის.",
        "userjsyoucanpreview": "<strong>რჩევა:</strong> შენახვამდე გამოიყენეთ ღილაკი \"{{int:showpreview}}\" თქვენი ახალი JS ტესტირებისთვის.",
+       "usercsspreview": "'''რშუდან, ნამჷ-და თქვა ხვალო გიწოთოლორაფას ორწყეთ თქვან მახვარებუშ CSS-ის, თინა დიო ვარე ჩუალირი!'''",
+       "sitecsspreview": "'''რშუდან, ნამჷ-და თქვა ხვალო გიწოთოლორაფას ორწყეთ თქვან მახვარებუშ CSS-ის, თინა დიო ვარე ჩუალირი!'''",
+       "sitejspreview": "'''რშუდან, ნამჷ-და თქვა თე JavaScript კოდიშ ხვალო გიწოთოლორაფას ორწყეთ.'''\n'''თინა დიო ვარე ჩუალირი!'''",
        "updated": "(განახლდა)",
        "note": "<strong>შენიშვნა:</strong>",
        "previewnote": "<strong>რშუდანი თენა რე ხვალე გიწოთოლორაფა</strong>\nთქვანი თირაფეფი დიო ვარე ჩუალირი!",
        "shown-title": "ქაძირი $1 მოღალუ ირ ხასჷლას",
        "viewprevnext": "ქოძირ  ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "თე ვიკის \"[[:$1]]\" ჯოხოთ ხასჷლა რე",
-       "searchmenu-new": "''ქჷდარსხი \"[[:$1]]\" ხასჷლა თე ვიკის'''",
+       "searchmenu-new": "'''ქჷდარსხით „[[:$1]]“ ხასჷლა თე ვიკის!''' {{PLURAL:$2|0=|თაშნეშე ქოძირით გორუაშ შედეგი.|თაშნეშე ქოძირით გორუაშ შედეგეფი.}}",
        "searchprofile-articles": "სტატიეფი",
        "searchprofile-images": "მულტიმედია",
        "searchprofile-everything": "ირფელი",
        "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": "ეს გვერდი ცარიელია.",
        "namespace": "ჯოხოეფიშ ოფირჩა:",
        "invert": "არძო, მერჩქინელიშ მოხ",
        "blanknamespace": "(დუდ)",
-       "contributions": "მახვარებუშ მიშაღალირ თია",
+       "contributions": "{{GENDER:$1|მახვარებუშ}} მიშნაღელ თია",
        "contributions-title": "$1-შა მახვარებუშ მიშაღალირ თია",
        "mycontris": "ჩქიმ მიშნაღელ თია",
        "contribsub2": "$1 ($2) შენი",
        "svg-long-desc": "SVG ფაილ, ნომინალურო $1 × $2 პიქსელ, ფაილიშ ზიმა: $3",
        "show-big-image": "რსული გიშაგორანჯალა",
        "show-big-image-preview": "ზჷმა გიწოთოლორაფაშ ბორჯის: $1.",
+       "show-big-image-other": "შხვა {{PLURAL:$2|გოფართაფა|გოფართაფა}}: $1.",
        "show-big-image-size": "$1 × $2 პიქსელი",
        "newimages": "ახალ სურათეფ",
        "newimages-legend": "ფილტრი",
        "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-imagewidth": "სიგანე",
        "exif-imagelength": "სიმაღალე",
+       "exif-orientation": "ორიენტაცია",
+       "exif-xresolution": "ჰორიზონტალური გაფართაფა",
+       "exif-yresolution": "ვერტიკალური გაფართაფა",
        "exif-datetime": "ფაილიშ თირუაშ რიცხუ დო ბორჯი",
+       "exif-make": "კამერაშ მაწარმაფალი",
+       "exif-model": "კამერაშ მოდელი",
        "exif-software": "გჷმორინაფილი პროგრამა",
        "exif-exifversion": "ვერსია Exif",
        "exif-colorspace": "ფერეფიშ პალიტრა",
+       "exif-datetimeoriginal": "გენერირაფაშ თარიღი დო ბორჯი",
+       "exif-datetimedigitized": "ციფრირაფაშ თარიღი დო ბორჯი",
        "exif-meteringmode": "ექსპოზიციის დათვლის რეჟიმი",
        "exif-lightsource": "განათების წყარო",
        "exif-flash": "ფლეშის სტატუსი",
        "htmlform-cloner-required": "აუცილებელია სულ მცირე ერთი მნიშვნელობა.",
        "logentry-delete-delete": "მოხვარებუქ $1 {{GENDER:$2|დოლასუ}} ხასჷლა: „$3“",
        "logentry-move-move": "მახვარებუქ $1 ხასჷლა „$3“ {{GENDER:$2|გეგნიღჷ}} ხასჷლაშა „$4“",
+       "logentry-newusers-create": "{{GENDER:$2|დორსხუაფილი რე}} მახვარებუშ ანგარიში $1",
        "logentry-upload-upload": "მახვარებუქ $1 {{GENDER:$2|ეხარგუ}} $3",
        "rightsnone": "(არცერთი)",
        "revdelete-summary": "ცვლილებების აღწერა",
index e5c65f6..500a168 100644 (file)
@@ -13,7 +13,8 @@
                        "פוילישער",
                        "아라",
                        "Har-wradim",
-                       "Amire80"
+                       "Amire80",
+                       "පසිඳු කාවින්ද"
                ]
        },
        "tog-underline": "שטרייכט אונטער לינקען",
        "badtitle": "שלעכט קעפל",
        "badtitletext": "דאס קעפל פון דעם געזוכטן בלאט איז געווען אומגעזעצליך, ליידיג, אן אינטערשפראך אדער אינטערוויקי לינק וואס פאסט נישט, אדער אנטהאט כאראקטערס וואס מ'קען נישט ניצן אין א קעפל.",
        "title-invalid-empty": "דער געזוכטער בלאט־קעפל איז ליידיג אדער אנטהאלט נאר דעם נאמען פון א נאמענטייל.",
+       "title-invalid-utf8": "דער געזוכטער בלאט־טיטל אנטהאלט אן אומגילטיגן UTF-8 סעקווענץ.",
        "title-invalid-interwiki": "דער געזונט ער בלאט־קעפל אנטהאלט אן אינטערוויקי־לינק, וואס מ'קען נישט ניצן אין א קעפל.",
        "title-invalid-talk-namespace": "דער געזוכטער בלאט־קעפל באציט זיך צו א שמועס־בלאט וואס קען נישט עקזעסטירן.",
        "title-invalid-characters": "דער געזוכטער בלאט־קעפל אנטהאלט אומגילטיקע צייכענען: \"$1\".",
+       "title-invalid-leading-colon": "דער געבעטענער בלאט־טיטל הייבט אן מיט אן אומגילטיגן צווייפינטל.",
        "perfcached": "די פאלגנדע דאטן זענען גענומען פונעם 'זאַפאַס' און מעגלעך נישט אקטועל. מאקסימום {{PLURAL:$1|איין רעזולטאט איז|$1 רעזולטאטן זענען}} פאראן אין זאפאס.",
        "perfcachedts": "די פאלגנדע דאטן זענען פונעם זאַפאַס, וואס איז לעצט געווארן דערהײַנטיגט $1. מאקסימום {{PLURAL:$4|איין רעזולטאט איז|$4 רעזולטאטן זענען}} פאראן אין זאפאס",
        "querypage-no-updates": "דערהיינטיגן דעם בלאט איז איצט אומערמעגלעכט.\nדאטן דא וועט נישט דערווייל ווערן באנייט.",
        "passwordreset": "צוריקשטעלן פאַסווארט",
        "passwordreset-text-one": "דערגאַנצט די פאָרעם צוריקצושטעלן אײַער פאַסווארט.",
        "passwordreset-text-many": "{{PLURAL:$1|דערגאַנצט איינע פֿון די פֿעלדער כדי צו באקומען א פראוויזאריש פאַסווארט דור כן פאסט.}}",
-       "passwordreset-legend": "צוריקשטעלן פאַסווארט",
        "passwordreset-disabled": "מען האט אומאַקטיוויטר צוריקשטעלן פאַסווערטער אויף דער וויקי.",
        "passwordreset-emaildisabled": "ע-פאסט דינסטן זענען געווארן אומאקטיווירט אויף דער דאזיקער וויקי.",
        "passwordreset-username": "באַניצער נאָמען:",
        "resettokens": "צוריקזעצן טאקנס",
        "resettokens-text": "דא קענט איר צוריקשטעלן טאקנס וואס דערלויבן צוטריט צו געוויסע פריוואטע דאטן שייך צו אײַער קאנטע.\n\nYou should do it if you accidentally shared them with someone or if your account has been compromised.",
        "resettokens-no-tokens": "נישט פאראן קיין טאקנס צוריקצוזעצן.",
-       "resettokens-legend": "צוריקזעצן טאקנס",
        "resettokens-tokens": "טאקנס:",
        "resettokens-token-label": "$1 (אקטועלער ווערט: $2)",
        "resettokens-watchlist-token": "טאקן פארן וועב־פֿיד (Atom/RSS) פון [[Special:Watchlist|ענדערונגען צו בלעטער אויף אייער אויפֿפאסונג ליסטע]]",
        "creating": "שאפֿן $1",
        "editingsection": "ענדערט $1 (אפטיילונג)",
        "editingcomment": "רעדאַקטירן $1 (נײַע אפטיילונג)",
-       "editconflict": "×¢× ×\93ער×\9f ×§×\90נפליקט: $1",
+       "editconflict": "רע×\93×\90ק×\98×\99ר×\9f ×§×\90נפֿליקט: $1",
        "explainconflict": "איינער אנדערשט האט געטוישט דעם בלאט זינט איר האט אנגעהויבן דאס צו ענדערן.\nדער אויבערשטער טעקסט אפטייל אנטהאלט דעם בלאט טעקסט ווי עס טוט איצט עקזעסטירן.\nאייערע ענדערונגן זענען געוויזן אין דער אונטערשטער טעקסט אפטיילונג.\nאיר וועט דארפן צאמשטעלן אייערע ענדערונגען אינעם עקזעסטירנדן טעקסט.\n'''בלויז''' דער טעקסט אינעם אויבערשטען טעקסט אפטיילונג וועט ווערן אפגעהיטן ווען איר וועט קוועטשן \"טוט אויפֿהיטן\".",
        "yourtext": "אייער טעקסט",
        "storedversion": "אוועגעלייגטע ווערסיע",
        "yourdiff": "אונטערשיידן",
        "copyrightwarning": "<small>ביטע מערקט אויף אז אייערע אלע ביישטייערונגען אינעם '''{{SITENAME}}''' ערשיינען אונטער דעם $2 דערלויבן (זעט $1 פֿאַר מער פרטים). אויב איר וויִלט נישט לאזן אַנדערע ענדערן אײַערע בײַשטײַערונגען און פֿאַרשפרייטן אייער אַרבעט - ביטע שרײַבט זיי נישט דאָ.<br />\nאיר זאָגט צו אז איר האט געשריבן אן אייגענעם אינהאַלט, אדער האט איר באקומען ערלויבעניש צו שרײַבן אים דאָ.</small>",
        "copyrightwarning2": "'''אכטונג:''' אנדערע באניצערס קענען מעקן און ענדערן אייערע ביישטייערונגען צו {{SITENAME}}.\nאויב ווילט איר נישט  אז אייער ארבעט זאל זיין הפקר פאר אנדערע דאס צו באארבעטן – פארשפרייט זי נישט דא.\n\nאזוי אויך, זאגט איר צו אז איר האט דאס געשריבן אליין, אדער דאס איבערקאפירט פון א מקור מיט פולן רשות דאס מפקיר זיין (זעט $1 פאר מער פרטים).\n'''זיכט נישט באניצן מיט שטאף וואס איז באשיצט מיט קאפירעכטן!'''",
+       "editpage-cannot-use-custom-model": "מען קען נישט ענדערן דעם אינהאלט־מאדעל פון דעם בלאט.",
        "longpageerror": "'''פעלער: דער טעקסט וואס איר האט ארײַנגעשטעלט איז לאנג {{PLURAL:$1|איין קילאבייט|$1 קילאבייטן}}, וואס איז לענגער פון דעם מאקסימום פון {{PLURAL:$2|איין קילאבייט|$2 קילאבייטן}}.\nער קען נישט ווערן אפגעהיטן.'''",
        "readonlywarning": "'''ווארענונג: די דאטנבאזע איז געווארן פארשלאסן פאר אויפהאלטונג, ממילא וועט איר נישט קענען אפהיטן אייערע ענדערונגען אצינד. '''\nאיר קענט קאפירן און ארײַנלייגן דעם טעקסט אריין צו א טעקסט טעקע און דאס דארטן אפהיטן אויף שפעטער.\n\nדער אדמיניסטראטאר וואס האט זי פארשלאסן האט מסביר געווען אזוי: $1",
        "protectedpagewarning": "'''ווארענונג:  דער בלאט איז געווארן פארשפארט אז בלויז באניצערס מיט סיסאפ פריווילעגיעס קענען אים ענדערן.'''\nדי פארגאנגענע לאגבוך באשרײַבונג ווערט געוויזן דא:",
        "badsig": "נישט גילטיקער רויער אונטערשריפט. ביטע קאנטראלירט די HTML טאַגן.",
        "badsiglength": "אונטערשריפט צו לאנג; מוז זיין ווינציגער פון {{PLURAL:$1|איין אות|$1 אותיות}}.",
        "yourgender": "וויאזוי ווילסטו זיך באשרײַבן?",
-       "gender-unknown": "×\9b\95×\95×\99×\9c ×\96×\99×\9a × ×\99ש×\98 ×\91×\90שרײַ×\91×\9f",
+       "gender-unknown": "×\91×\99×\99×\9d ×\93ער×\9e×\90× ×¢×\9f ×\90×\99×\99×\9a, ×\95×\95×¢×\98 ×\93×\90ס ×\95×\95×\99×\99×\9b×\95×\95×\90ר×\92 × ×\99צ×\9f × ×\99×\99×\98ר×\90×\9c×¢ ×\95×\95ער×\98ער ×\95×\95×¢×\9f ×\9e×¢×\92×\9c×¢×\9a",
        "gender-male": "ער רעדאקטירט וויקי בלעטער",
        "gender-female": "זי רעדאקטירט וויקי בלעטער",
        "prefs-help-gender": "שטעלן דעם פרעפֿערענץ איז אפציאנאַל.\nדאס ווייכוואַרג באניצט זיין ווערט אײַך צו אַדרעסירן און דערמאנען צו אנדערע מיטן געהעריגן מין פֿארעם. \nדי אינפֿארמאַציע ווערט ידוע צו אַלעמען.",
        "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": "{{PLURAL:$1|איין רעוויזיע|$1 רעוויזיעס}}",
-       "nviews": "{{PLURAL:$1|איין קוק|$1 קוקן}}",
        "nimagelinks": "געניצט אויף $1 {{PLURAL:$1|בלאַט|בלעטער}}",
        "ntransclusions": "געניצט אויף $1 {{PLURAL:$1|בלאַט|בלעטער}}",
        "specialpage-empty": "דער בלאט איז ליידיג.",
        "tooltip-pt-logout": "ארויסלאגירן",
        "tooltip-pt-createaccount": "איר ווערט דערמוטיגט צו שאפן א קאנטע און אריינלאגירן; ס'איז אביר נישט אבליגאטאריש",
        "tooltip-ca-talk": "שמועס וועגן דעם אינהאַלט בלאַט",
-       "tooltip-ca-edit": "×\90×\99ר ×§×¢× ×\98 ×¢× ×\93ער×\9f ×\93×¢×\9d ×\91×\9c×\90×\98. ×\91×\99×\98×¢ ×\91×\90× ×\99צ×\98 ×\93×¢×\9d ''פֿ×\90ר×\95×\99סק×\95ק'' ×§× ×¢×¤×\9c ×\91עפֿ×\90ר×\9f ×\90פ×\94×\99×\98×\9f",
+       "tooltip-ca-edit": "רע×\93×\90ק×\98×\99ר×\9f ×\93×¢×\9d ×\91×\9c×\90Ö·×\98",
        "tooltip-ca-addsection": "אָנהייבן א נײַע אָפטיילונג",
        "tooltip-ca-viewsource": "דאס איז א פֿארשלאסענער בלאט, איר קענט נאר באַקוקן זיין מקור",
        "tooltip-ca-history": "פריערדיגע ווערסיעס פון דעם בלאט.",
index e90cb51..5d21409 100644 (file)
@@ -23,7 +23,9 @@
                        "Impersonator 1",
                        "Cedric tsan cantonais",
                        "Liuxinyu970226",
-                       "Yueman"
+                       "Yueman",
+                       "CRCHF",
+                       "Shinjiman"
                ]
        },
        "tog-underline": "連結加底線:",
        "no-null-revision": "唔可以對 \"$1\" 開個新嘅空白修改",
        "badtitle": "錯嘅標題",
        "badtitletext": "要求嘅標題唔啱、空白,跨語言或者跨維基連結標題錯誤。亦可能係標題包括咗一個或多過一個字元。",
+       "title-invalid-empty": "所請求嘅版面標題係空嘅,或者凈係得個空間名。",
+       "title-invalid-utf8": "所請求嘅版標題有無效嘅UTF-8嘅序列。",
+       "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 {{PLURAL:$1|字節}}",
+       "title-invalid-leading-colon": "所請求嘅版面標題開頭有無效冒號。",
        "perfcached": "以下嘅資料係嚟自快取,可能唔係最新嘅。 最多有{{PLURAL:$1|一個結果|$1個結果}}響快取度。",
        "perfcachedts": "以下嘅資料係嚟自快取,上一次嘅更新喺$1。 最多有{{PLURAL:$4|一個結果|$4個結果}}響快取度。",
        "querypage-no-updates": "響呢一頁嘅更新現時停用。啲資料將唔會即時更新。",
        "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 嘅密匙",
        "creating": "開版$1",
        "editingsection": "而家喺度編輯$1 (小節)",
        "editingcomment": "而家喺度編輯$1 (新小節)",
-       "editconflict": "編輯è¡\9dçª\81ï¼\9a$1",
+       "editconflict": "ç\94±æ\96¼ç·¨è¼¯è¡\9dçª\81ï¼\8c{{GENDER:|ä½ |妳|ä½ }}å\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": "已經儲存咗嘅修訂",
        "semiprotectedpagewarning": "'''注意:'''呢一頁已經保護咗,只有已經註冊嘅用戶先至可以改。\n最近嘅日誌響下面提供以便參考:",
        "cascadeprotectedwarning": "'''警告:'''呢一頁已經保護咗,只有管理員權限嘅用戶先至可以改,因為佢係響以下連串保護嘅{{PLURAL:$1|一|幾}}頁度包含咗:",
        "titleprotectedwarning": "'''警告:呢一版已經保護咗,需要一啲[[Special:ListGroupRights|指定權限]]先至可以開到。'''\n最近嘅日誌響下面提供以便參考:",
-       "templatesused": "呢版用嘅模{{PLURAL:$1|模|模}}:",
+       "templatesused": "呢版用嘅{{PLURAL:$1|模}}:",
        "templatesusedpreview": "呢一次預覽裏面,用咗下面呢啲{{PLURAL:$1|模|模}}:",
        "templatesusedsection": "呢一節用咗嘅{{PLURAL:$1|模|模}}:",
        "template-protected": "(保護)",
        "content-model-css": "層疊樣式表",
        "content-json-empty-object": "吉嘅嘢",
        "content-json-empty-array": "吉嘅陣列",
-       "duplicate-args-category": "模用重複參數嘅嘅版面",
+       "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佢應該少過$2次呼叫,佢而家係$1次呼叫。",
        "expensive-parserfunction-category": "響版度有太多嘅耗費嘅語法功能呼叫",
        "post-expand-template-inclusion-warning": "警告: 包含模大細太大。\n有啲模將唔會包含。",
        "right-move": "搬版",
        "right-move-subpages": "搬版同埋佢哋嘅細版",
        "right-move-rootuserpages": "搬根用戶版",
+       "right-move-categorypages": "移走類頁",
        "right-movefile": "搬檔案",
        "right-suppressredirect": "當搬版嗰陣唔開來源頁嘅跳轉",
        "right-upload": "上載檔案",
        "nmembers": "$1 位成員",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|位成員}}",
        "nrevisions": "$1 次修訂",
-       "nviews": "$1 次瀏覽",
        "nimagelinks": "用響$1版",
        "ntransclusions": "用響$1版",
        "specialpage-empty": "呢個報告嘅結果係空嘅。",
        "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 7b1b65d..ed31245 100644 (file)
        "passwordreset": "重置密码",
        "passwordreset-text-one": "请输入你要重置的用户名。",
        "passwordreset-text-many": "{{PLURAL:$1|在此键入您希望接收临时密码的邮件地址。}}",
-       "passwordreset-legend": "重置密码",
        "passwordreset-disabled": "此Wiki已经禁用密码重置。",
        "passwordreset-emaildisabled": "此Wiki上无法使用邮件功能。",
        "passwordreset-username": "用户名:",
        "resettokens": "重置密钥",
        "resettokens-text": "你可以在这里重置允许访问与你的账户有关的特定私人数据的密钥。\n\n如果你意外将它们分享给他人,或是你的账户已经被入侵,你应该重置它们。",
        "resettokens-no-tokens": "没有可以重置的密钥。",
-       "resettokens-legend": "重置密钥",
        "resettokens-tokens": "密钥:",
        "resettokens-token-label": "$1(当前值:$2)",
        "resettokens-watchlist-token": "[[Special:Watchlist|对你的监视列表中的页面的更改]]的网页feed(Atom/RSS)的密钥",
        "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|登录]]以避免在未来与其他匿名用户混淆。''",
        "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": "删除文件",
        "randomincategory-nopages": "[[:Category:$1]]中没有页面。",
        "randomincategory-category": "分类:",
        "randomincategory-legend": "分内中随机页面",
+       "randomincategory-submit": "提交",
        "randomredirect": "随机重定向",
        "randomredirect-nopages": "“$1”名字空间中没有重定向。",
        "statistics": "统计",
        "notvisiblerev": "上次由不同用户所作的版本已经删除",
        "watchlist-details": "不计讨论页,您的监视列表中有$1个页面。",
        "wlheader-enotif": "已启用电子邮件通知。",
-       "wlheader-showupdated": "您上次访问后发生更改的页面'''加粗'''显示",
+       "wlheader-showupdated": "您上次访问后发生更改的页面<strong>加粗</strong>显示。",
        "wlnote": "下面是{{PLURAL:$2|过去<strong>$2</strong>小时}}的{{PLURAL:$1|最后<strong>$1</strong>个更改}},截至$3 $4。",
        "wlshowlast": "显示过去$1小时$2天",
        "watchlist-options": "监视列表选项",
        "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将页面$3的内容模型从“$4”{{GENDER:$2|更改}}为“$5”",
+       "logentry-contentmodel-change-revertlink": "回退",
+       "logentry-contentmodel-change-revert": "回退",
        "protectlogpage": "保护日志",
        "protectlogtext": "下面是页面保护更改的列表。请见[[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": "本页面受到保护。\n您可以查看其源代码",
        "tooltip-ca-history": "本页面过去的版本",
        "pageinfo-robot-index": "允许",
        "pageinfo-robot-noindex": "不允许",
        "pageinfo-watchers": "页面监视者数",
+       "pageinfo-visiting-watchers": "正在访问最近编辑的页面浏览者数量",
        "pageinfo-few-watchers": "少于$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|talk]]) 在您开始编辑之后删除此页面。请确认您确实要重新创建此页面。",
-       "recreate": "重建",
+       "recreate": "重新创建",
        "confirm_purge_button": "确定",
        "confirm-purge-top": "要清除此页面的缓存吗?",
        "confirm-purge-bottom": "清除页面数据会清除缓存并强制显示最近的版本。",
        "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]]。",
index 6875c06..6e435e3 100644 (file)
        "passwordreset": "重新設定密碼",
        "passwordreset-text-one": "完成此表單,透過電子郵件傳送臨時密碼以重新設定您的密碼。",
        "passwordreset-text-many": "{{PLURAL:$1|請完成此表單以透過電子郵件接收臨時密碼。}}",
-       "passwordreset-legend": "重設密碼",
        "passwordreset-disabled": "此 Wiki 已停用重設密碼。",
        "passwordreset-emaildisabled": "此 Wiki 已停用電子郵件功能。",
        "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 的密鑰",
        "creating": "正在建立 $1",
        "editingsection": "正在編輯 $1 (章節)",
        "editingcomment": "正在編輯 $1 (新章節)",
-       "editconflict": "編輯è¡\9dçª\81ï¼\9a$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",
        "explainconflict": "在您開始編輯之後已有其他人儲存了此頁面。\n上方的文字框內顯示了目前頁面中的文字內容,\n您所變更的文字內容顯示在下方文字框中。\n您須要將您所變更的文字內容合併到已儲存的文字內容當中。\n若您直接點選 \"{{int:savearticle}}\" <strong>只有</strong> 上方文字框中的內容會被儲存。",
        "yourtext": "您的文字",
        "storedversion": "已儲存修訂",
        "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": "此頁面的內容模型不能被修改。",
        "longpageerror": "<strong>錯誤:您所送出的文字內容共有 {{PLURAL:$1|1 KB|$1 KB}},已超出系統上限 {{PLURAL:$2|1 KB|$2 KB}}。</strong>\n\n無法儲存。",
        "readonlywarning": "<strong>警告:資料庫已被鎖定以進行維護,因此無法儲存您目前所做的編輯動作。</strong>\n您可先複製您的文字並貼上到文字檔案中儲存,稍後再儲存您編輯。\n\n鎖定資料庫的管理員有以下說明:$1",
        "protectedpagewarning": "<strong>警告:本頁已經被保護,只有擁有管理員權限的使用者才可編輯。</strong>\n以下提供最近的日誌以便參考:",
        "badsig": "錯誤的原始簽名。請檢查 HTML 標籤。",
        "badsiglength": "您的簽名過長。\n它的長度不可超過 $1 個字元。",
        "yourgender": "您希望使用何種性別稱呼?",
-       "gender-unknown": "我不想說明",
+       "gender-unknown": "當提到您時,本軟體將會盡可能使用不分性別詞",
        "gender-male": "他編輯了 Wiki 頁面",
        "gender-female": "她編輯了 Wiki 頁面",
        "prefs-help-gender": "此偏好設定為選填欄位。\n系統會使用您選擇的方式稱呼您,對他人提及您時也會使用適當語法稱呼。\n此項資訊會被公開。",
        "randomincategory-nopages": "[[:Category:$1]] 中沒有任何頁面。",
        "randomincategory-category": "分類:",
        "randomincategory-legend": "隨機分類頁面",
+       "randomincategory-submit": "進入",
        "randomredirect": "隨機重新導向",
        "randomredirect-nopages": "在命名空間 \"$1\" 中沒有任何重新導向頁面。",
        "statistics": "統計",
        "trackingcategories-disabled": "已停用分類",
        "mailnologin": "沒有傳送位址",
        "mailnologintext": "您必須先 [[Special:UserLogin|登入]]\n並在 [[Special:Preferences|偏好設定]]\n中設定一個有效的電子郵件地址才可以傳送郵件給其他使用者。",
-       "emailuser": "Email 此使用者",
+       "emailuser": "Email 聯絡此使用者",
        "emailuser-title-target": "E-mail 聯絡此{{GENDER:$1|使用者}}",
        "emailuser-title-notarget": "E-mail 聯絡使用者",
        "emailpage": "E-mail 聯絡使用者",
        "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": "$1 已變頁面 $3 的內容模型自 \"$4\" 至 \"$5\"",
+       "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": "此頁面已被保護。\n您可檢視此頁面原始碼",
        "tooltip-ca-history": "此頁面先前的修訂",
        "pageinfo-robot-index": "允許",
        "pageinfo-robot-noindex": "不允許",
        "pageinfo-watchers": "頁面監視者數",
+       "pageinfo-visiting-watchers": "頁面監視者參觀最近編輯數",
        "pageinfo-few-watchers": "少於 $1 名監視者",
+       "pageinfo-few-visiting-watchers": "參觀近期編輯的使用者可能為監視使用者",
        "pageinfo-redirects-name": "指向此頁面的重新導向頁面數量",
        "pageinfo-subpages-name": "此頁面的子頁面數",
        "pageinfo-subpages-value": "$1 ($2 個{{PLURAL:$2|重新導向}}; $3 個{{PLURAL:$3|非重新導向}})",
        "deletedwhileediting": "<strong>警告:</strong>此頁在您開始編輯之後已經被刪除﹗",
        "confirmrecreate": "在您編輯的同時,使用者 [[User:$1|$1]] ([[User talk:$1|對話]]) 刪除了此頁面,原因為:\n: <em>$2</em>\n請確認您是否真的要重新建立此頁面。",
        "confirmrecreate-noreason": "在您編輯的同時,使用者 [[User:$1|$1]] ([[User talk:$1|對話]]) 刪除了此頁面,請確認您是否真的要重新建立此頁面。",
-       "recreate": "重新建立",
+       "recreate": "此頁面在您編輯的這段期間已被刪除,請點選 \"$1\" 重新建立頁面。",
        "confirm_purge_button": "確定",
        "confirm-purge-top": "要清除此頁面的快取嗎?",
        "confirm-purge-bottom": "清除頁面會清空頁面的快取記錄並強制顯示最近的頁面修訂。",
        "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-managetags-deactivate": "$1 {{GENDER:$2|已停用}}標籤 \"$4\" 供使用者與機器人使用",
        "log-name-tag": "標籤日誌",
        "log-description-tag": "當使用者自各別修訂或日誌項目加入或移除[[Special:Tags|標籤]]時會顯示於此頁面。 此日誌並不會列出當時對標籤所做的編輯、刪除或類似的動作。",
-       "logentry-tag-update-add-revision": "$1 {{GENDER:$2|已加入}}{{PLURAL:$7|標籤|標籤}} $6 至頁面 $3 的修訂 $4。",
-       "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|已加入}}{{PLURAL:$7|標籤|標籤}} $6 至頁面 $3 的日誌項目 $5。",
+       "logentry-tag-update-add-revision": "$1 {{GENDER:$2|已新增}}{{PLURAL:$7|標籤|標籤}} $6 至頁面 $3 的修訂版本 $4。",
+       "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|已新增}}{{PLURAL:$7|標籤|標籤}} $6 至頁面 $3 的日誌項目 $5。",
        "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|已移除}}{{PLURAL:$9|標籤|標籤}} $8 自頁面 $3 的修訂 $4。",
        "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|已移除}}{{PLURAL:$9|標籤|標籤}} $8 自日誌項目 $3 的修訂 $5。",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|已更新}}標籤於頁面 $3 的修訂 $4 ({{PLURAL:$7|加入}} $6; {{PLURAL:$9|移除}} $8)。",
        "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 8abb491..57a79bc 100644 (file)
@@ -303,6 +303,7 @@ $magicWords = array(
        'stylepath'               => array( 0, 'STYLEPATH' ),
        'grammar'                 => array( 0, 'GRAMMAR:' ),
        'gender'                  => array( 0, 'GENDER:' ),
+       'bidi'                    => array( 0, 'BIDI:' ),
        'notitleconvert'          => array( 0, '__NOTITLECONVERT__', '__NOTC__' ),
        'nocontentconvert'        => array( 0, '__NOCONTENTCONVERT__', '__NOCC__' ),
        'currentweek'             => array( 1, 'CURRENTWEEK' ),
@@ -395,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' ),
index b7fe80b..3e86d8a 100644 (file)
@@ -31,7 +31,7 @@ class ConvertExtensionToRegistration extends Maintenance {
         * @var array
         */
        protected $noLongerSupportedGlobals = array(
-               'SpecialPageGroups' => 'deprecated',
+               'SpecialPageGroups' => 'deprecated', // Deprecated 1.21, removed in 1.26
        );
 
        /**
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 ac50d29..d029bf7 100644 (file)
@@ -25,7 +25,7 @@ require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Generates the normalizer data file for Arabic.
- * For NFC see includes/libs/normal.
+ * For NFC see includes/compat/normal.
  *
  * @ingroup MaintenanceLanguage
  */
index 8580187..770a98c 100644 (file)
@@ -25,7 +25,7 @@ require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Generates the normalizer data file for Malayalam.
- * For NFC see includes/libs/normal.
+ * For NFC see includes/compat/normal.
  *
  * @ingroup MaintenanceLanguage
  */
index 6f2dd39..a3ea91c 100644 (file)
@@ -58,7 +58,9 @@
 堂姊 堂姐
 學姊 学姐
 乾姊 干姐
+清澈 清澈 #分詞用
 澈底 彻底
+仲介 中介
 卯足 铆足
 逕庭 径庭
 逕到 径到
@@ -2662,8 +2664,8 @@ A型肝炎        甲型肝炎
 電腦程式   计算机程序
 應用程式   应用程序
 雷射 激光
-鱼雷射      鱼雷射
-魚雷射      鱼雷射
+鱼雷 鱼雷 #分詞用
+魚雷 鱼雷
 尖峰時間   高峰时间
 尖峰時段   高峰时段
 咖哩 咖喱
index 6e3a7b5..61ffc4d 100644 (file)
 冲着 衝著
 干着 幹著
 干着急      干著急
+对着干      對著幹
 斗着 鬥著
 面包着      面包著
 徵狀 症狀
index 464f455..bc4bff8 100644 (file)
 乾村沙
 乾暖
 乾料
-乾敲梆子不賣油
 乾支支
 乾支剌
 乾擦
 幹人
 乾產
 乾喬
-夯幹
 大目乾連
 國之楨榦
 唇乾
 顛乾倒坤
 強幹
 乾眼
-幹的停當
 井幹
 乾巴
 偎乾
 臧穀亡羊
 種穀
 颳雪
-刮風下雪倒便宜
 广部
-亂鬨不過來
+亂鬨
 斗鬨
-亂鬨
 開鬨
 花鬨
 鬨動
 印纍綬若
 灕湘
 灕然
¾¤æ»²ç\81\95è\80\8cä¸\8bé\99\8d
»²ç\81\95
 裏勾外連
 水里溪
 二里頭
 擀麵
 過水麵
 蕎麥麵
-巧婦做不得無麵餺飥
 削麵
 小米麵
 壯麵
 麵點師
 麵點、
 、麵點
+麵製品
 冷面相
 糞穢衊面
 僕僕
 鬆元音
 鬆喉
 鬆化
+很鬆
 囉囉囌囌
 囉囌
 骨罈
 幹事
 幹什麼
 幹細胞
-配水幹管
 口燥唇乾
 舌乾唇焦
 不食乾腊
 乾物
 乾食
 乾鍋
+自乾五
+不乾膠
 楨幹
 新幹縣
 誰幹的
+他幹的
+們幹的
+人幹的
+幹的事
+幹的好事
 得力幹將
 黑幹將
 的幹將
+幹大事
+對着幹
 李連杰
 周杰
 杰倫
 鬥獸
 鬥龍
 鬥勇
+鬥狗
+鬥蛐
+鬥垮
+鬥敗
 石樑
 木樑
 藏歷史
 母醜
 一齣子
 齣兒
-獃串了皮
-占便宜的是獃
 丰標
 丰姿
 丰韻
 仲裁制
 獨裁制
 恒生
+恒基
+恒隆
 嚴云農
 伊東怜
 衛後莊公
 留長髮
 髮披肩
 髮及腰
+飄髮自由女神
 後天
 學家
 游離
 誇稱
 誇讚
 讚嘆
-繼承制
 布穀鳥
 黎克特制
 筆桿
 麻將蓆
 被廢後
 蒸製
+烹製
 體徵
 綜合徵
 价川
 菜餚
 梁啓超
 改制成
+王添灯
diff --git a/maintenance/populateContentModel.php b/maintenance/populateContentModel.php
new file mode 100644 (file)
index 0000000..3f5d6b6
--- /dev/null
@@ -0,0 +1,207 @@
+<?php
+/**
+ * Populate the page_content_model and {rev,ar}_content_{model,format} fields.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Usage:
+ *  populateContentModel.php --ns=1 --table=page
+ */
+class PopulateContentModel extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = 'Populate the various content_* fields';
+               $this->addOption( 'ns', 'Namespace to run in, or "all" for all namespaces', true, true );
+               $this->addOption( 'table', 'Table to run in', true, true );
+               $this->setBatchSize( 100 );
+       }
+
+       public function execute() {
+               $dbw = wfGetDB( DB_MASTER );
+               $ns = $this->getOption( 'ns' );
+               if ( !ctype_digit( $ns ) && $ns !== 'all' ) {
+                       $this->error( 'Invalid namespace', 1 );
+               }
+               $ns = $ns === 'all' ? 'all' : (int)$ns;
+               $table = $this->getOption( 'table' );
+               switch ( $table ) {
+                       case 'revision':
+                       case 'archive':
+                               $this->populateRevisionOrArchive( $dbw, $table, $ns );
+                               break;
+                       case 'page':
+                               $this->populatePage( $dbw, $ns );
+                               break;
+                       default:
+                               $this->error( "Invalid table name: $table", 1 );
+               }
+       }
+
+       private function updatePageRows( DatabaseBase $dbw, $pageIds, $model ) {
+               $count = count( $pageIds );
+               $this->output( "Setting $count rows to $model..." );
+               $dbw->update(
+                       'page',
+                       array( 'page_content_model' => $model ),
+                       array( 'page_id' => $pageIds ),
+                       __METHOD__
+               );
+               wfWaitForSlaves();
+               $this->output( "done.\n" );
+       }
+
+       protected function populatePage( DatabaseBase $dbw, $ns ) {
+               $toSave = array();
+               $lastId = 0;
+               $nsCondition = $ns === 'all' ? array() : array( 'page_namespace' => $ns );
+               do {
+                       $rows = $dbw->select(
+                               'page',
+                               array( 'page_namespace', 'page_title', 'page_id' ),
+                               array(
+                                       'page_content_model' => null,
+                                       'page_id > ' . $dbw->addQuotes( $lastId ),
+                               ) + $nsCondition,
+                               __METHOD__,
+                               array( 'LIMIT' => $this->mBatchSize, 'ORDER BY' => 'page_id ASC' )
+                       );
+                       $this->output( "Fetched {$rows->numRows()} rows.\n" );
+                       foreach ( $rows as $row ) {
+                               $title = Title::newFromRow( $row );
+                               $model = ContentHandler::getDefaultModelFor( $title );
+                               $toSave[$model][] = $row->page_id;
+                               if ( count( $toSave[$model] ) >= $this->mBatchSize ) {
+                                       $this->updatePageRows( $dbw, $toSave[$model], $model );
+                                       unset( $toSave[$model] );
+                               }
+                               $lastId = $row->page_id;
+                       }
+               } while ( $rows->numRows() >= $this->mBatchSize );
+               foreach ( $toSave as $model => $pages ) {
+                       $this->updatePageRows( $dbw, $pages, $model );
+               }
+       }
+
+       private function updateRevisionOrArchiveRows( DatabaseBase $dbw, $ids, $model, $table ) {
+               $prefix = $table === 'archive' ? 'ar' : 'rev';
+               $model_column = "{$prefix}_content_model";
+               $format_column = "{$prefix}_content_format";
+               $key = "{$prefix}_id";
+
+               $count = count( $ids );
+               $format = ContentHandler::getForModelID( $model )->getDefaultFormat();
+               $this->output( "Setting $count rows to $model / $format..." );
+               $dbw->update(
+                       $table,
+                       array( $model_column => $model, $format_column => $format ),
+                       array( $key => $ids ),
+                       __METHOD__
+               );
+               $this->output( "done.\n" );
+       }
+
+       protected function populateRevisionOrArchive( DatabaseBase $dbw, $table, $ns ) {
+               $prefix = $table === 'archive' ? 'ar' : 'rev';
+               $model_column = "{$prefix}_content_model";
+               $format_column = "{$prefix}_content_format";
+               $key = "{$prefix}_id";
+               if ( $table === 'archive' ) {
+                       $selectTables = 'archive';
+                       $fields = array( 'ar_namespace', 'ar_title' );
+                       $join_conds = array();
+                       $where = $ns === 'all' ? array() : array( 'ar_namespace' => $ns );
+               } else { // revision
+                       $selectTables = array( 'revision', 'page' );
+                       $fields = array( 'page_title', 'page_namespace' );
+                       $join_conds = array( 'page' => array( 'INNER JOIN', 'rev_page=page_id' ) );
+                       $where = $ns === 'all' ? array() : array( 'page_namespace' => $ns );
+               }
+
+               $toSave = array();
+               $lastId = 0;
+               do {
+                       $rows = $dbw->select(
+                               $selectTables,
+                               array_merge( $fields, array( $model_column, $format_column, $key ) ),
+                               // @todo support populating format if model is already set
+                               array(
+                                       $model_column => null,
+                                       "$key > " . $dbw->addQuotes( $lastId ),
+                               ) + $where,
+                               __METHOD__,
+                               array( 'LIMIT' => $this->mBatchSize, 'ORDER BY' => "$key ASC" ),
+                               $join_conds
+                       );
+                       $this->output( "Fetched {$rows->numRows()} rows.\n" );
+                       foreach ( $rows as $row ) {
+                               if ( $table === 'archive' ) {
+                                       $title = Title::makeTitle( $row->ar_namespace, $row->ar_title );
+                               } else {
+                                       $title = Title::newFromRow( $row );
+                               }
+                               $lastId = $row->{$key};
+                               try {
+                                       $handler = ContentHandler::getForTitle( $title );
+                               } catch ( MWException $e ) {
+                                       $this->error( "Invalid content model for $title" );
+                                       continue;
+                               }
+                               $defaultModel = $handler->getModelID();
+                               $defaultFormat = $handler->getDefaultFormat();
+                               $dbModel = $row->{$model_column};
+                               $dbFormat = $row->{$format_column};
+                               $id = $row->{$key};
+                               if ( $dbModel === null && $dbFormat === null ) {
+                                       // Set the defaults
+                                       $toSave[$defaultModel][] = $row->{$key};
+                               } else { // $dbModel === null, $dbFormat set.
+                                       if ( $dbFormat === $defaultFormat ) {
+                                               $toSave[$defaultModel][] = $row->{$key};
+                                       } else { // non-default format, just update now
+                                               $this->output( "Updating model to match format for $table $id of $title... ");
+                                               $dbw->update(
+                                                       $table,
+                                                       array( $model_column => $defaultModel ),
+                                                       array( $key => $id ),
+                                                       __METHOD__
+                                               );
+                                               wfWaitForSlaves();
+                                               $this->output( "done.\n" );
+                                               continue;
+                                       }
+                               }
+
+                               if ( count( $toSave[$defaultModel] ) >= $this->mBatchSize ) {
+                                       $this->updateRevisionOrArchiveRows( $dbw, $toSave[$defaultModel], $defaultModel, $table );
+                                       unset( $toSave[$defaultModel] );
+                               }
+                       }
+               } while ( $rows->numRows() >= $this->mBatchSize );
+               foreach ( $toSave as $model => $ids ) {
+                       $this->updateRevisionOrArchiveRows( $dbw, $ids, $model, $table );
+               }
+       }
+}
+
+$maintClass = 'PopulateContentModel';
+require_once RUN_MAINTENANCE_IF_MAIN;
index 82eae21..a7fd827 100644 (file)
@@ -125,12 +125,12 @@ class MwSql extends Maintenance {
                        try {
                                $res = $db->query( $wholeLine );
                                $this->sqlPrintResult( $res, $db );
-                               $prompt = $newPrompt;
-                               $wholeLine = '';
                        } catch ( DBQueryError $e ) {
                                $doDie = !Maintenance::posix_isatty( 0 );
                                $this->error( $e, $doDie );
                        }
+                       $prompt = $newPrompt;
+                       $wholeLine = '';
                }
                wfWaitForSlaves();
        }
index 3bb722e..452b53c 100755 (executable)
@@ -4,7 +4,6 @@
  * Run all updaters.
  *
  * This is used when the database schema is modified and we need to apply patches.
- * It is kept compatible with php 4 parsing so that it can give out a meaningful error.
  *
  * 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
@@ -62,8 +61,7 @@ class UpdateMediaWiki extends Maintenance {
        }
 
        function compatChecks() {
-               // Avoid syntax error in PHP4
-               $minimumPcreVersion = constant( 'Installer::MINIMUM_PCRE_VERSION' );
+               $minimumPcreVersion = Installer::MINIMUM_PCRE_VERSION;
 
                list( $pcreVersion ) = explode( ' ', PCRE_VERSION, 2 );
                if ( version_compare( $pcreVersion, $minimumPcreVersion, '<' ) ) {
@@ -174,7 +172,7 @@ class UpdateMediaWiki extends Maintenance {
                        $child = $this->runChild( $maint );
 
                        // LoggedUpdateMaintenance is checking the updatelog itself
-                       $isLoggedUpdate = is_a( $child, 'LoggedUpdateMaintenance' );
+                       $isLoggedUpdate = $child instanceof LoggedUpdateMaintenance;
 
                        if ( !$isLoggedUpdate && $updater->updateRowExists( $maint ) ) {
                                continue;
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 f7a0531..5b6d52f 100644 (file)
@@ -853,6 +853,7 @@ return array(
        'mediawiki.api.parse' => array(
                'scripts' => 'resources/src/mediawiki.api/mediawiki.api.parse.js',
                'dependencies' => 'mediawiki.api',
+               'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.api.watch' => array(
                'scripts' => 'resources/src/mediawiki.api/mediawiki.api.watch.js',
@@ -963,10 +964,6 @@ return array(
                        'colon-separator',
                ),
        ),
-       'mediawiki.htmlform.ooui' => array(
-               'scripts' => 'resources/src/mediawiki/mediawiki.htmlform.ooui.js',
-               'dependencies' => 'oojs-ui',
-       ),
        'mediawiki.htmlform.ooui.styles' => array(
                'styles' => 'resources/src/mediawiki/mediawiki.htmlform.ooui.css',
                'position' => 'top',
@@ -1237,6 +1234,7 @@ return array(
                        'jquery.textSelection',
                        'mediawiki.jqueryMsg',
                        'mediawiki.confirmCloseWindow',
+                       'user.options',
                ),
                'messages' => array(
                        'editwarning-warning',
@@ -1305,6 +1303,7 @@ return array(
                'dependencies' => array(
                        'mediawiki.util',
                        'mediawiki.language',
+                       'user.options',
                        'dom-level2-shim',
                ),
                'targets' => array( 'desktop', 'mobile' ),
@@ -1494,6 +1493,7 @@ return array(
                'position' => 'top',
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.search.js',
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.search.css',
+               'dependencies' => 'mediawiki.widgets',
                'messages' => array(
                        'powersearch-togglelabel',
                        'powersearch-toggleall',
@@ -1527,6 +1527,7 @@ return array(
                        'mediawiki.Title',
                        'mediawiki.util',
                        'mediawiki.confirmCloseWindow',
+                       'user.options',
                ),
        ),
        'mediawiki.special.userlogin.common.styles' => array(
@@ -1736,11 +1737,13 @@ return array(
                        'resources/src/mediawiki.widgets/mw.widgets.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',
                ),
                'skinStyles' => array(
                        'default' => 'resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.css',
                ),
                'dependencies' => array(
+                       'jquery.autoEllipsis',
                        'mediawiki.Title',
                        'mediawiki.api',
                        'oojs-ui',
index d6a06bb..fe6e997 100644 (file)
@@ -4,17 +4,20 @@
                        "An13sa",
                        "Unai Fdz. de Betoño",
                        "Xabier Armendaritz",
-                       "Subi"
+                       "Subi",
+                       "Sator"
                ]
        },
        "ooui-outline-control-move-down": "Mugitu itema beherantz",
        "ooui-outline-control-move-up": "Mugitu itema gorantz",
+       "ooui-outline-control-remove": "Elementua kendu",
        "ooui-toolbar-more": "Gehiago",
        "ooui-toolgroup-expand": "Gehiago",
        "ooui-toolgroup-collapse": "Gutxiago",
        "ooui-dialog-message-accept": "Ados",
        "ooui-dialog-message-reject": "Utzi",
        "ooui-dialog-process-error": "Zerbaitek huts egin du",
+       "ooui-dialog-process-dismiss": "Utzi",
        "ooui-dialog-process-retry": "Saiatu berriro",
        "ooui-dialog-process-continue": "Jarraitu",
        "ooui-selectfile-placeholder": "Ez da fitxategirik hautatu"
index 7cfcfa2..62198f4 100644 (file)
@@ -11,7 +11,8 @@
                        "Taha",
                        "درفش کاویانی",
                        "Armin1392",
-                       "Alirezaaa"
+                       "Alirezaaa",
+                       "Leyth"
                ]
        },
        "ooui-outline-control-move-down": "انتقال مورد به پایین",
@@ -25,5 +26,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 3fb4110..d00254c 100644 (file)
@@ -27,5 +27,7 @@
        "ooui-dialog-process-error": "Jokin meni pieleen",
        "ooui-dialog-process-dismiss": "Hylkää",
        "ooui-dialog-process-retry": "Yritä uudelleen",
-       "ooui-dialog-process-continue": "Jatka"
+       "ooui-dialog-process-continue": "Jatka",
+       "ooui-selectfile-not-supported": "Tiedoston valitsemista ei tueta",
+       "ooui-selectfile-placeholder": "Tiedostoa ei ole valittu"
 }
diff --git a/resources/lib/oojs-ui/i18n/hrx.json b/resources/lib/oojs-ui/i18n/hrx.json
new file mode 100644 (file)
index 0000000..1534af7
--- /dev/null
@@ -0,0 +1,12 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Midnight Gambler"
+               ]
+       },
+       "ooui-toolbar-more": "Meahr",
+       "ooui-toolgroup-expand": "Meahr",
+       "ooui-dialog-message-accept": "OK",
+       "ooui-dialog-message-reject": "Abbreche",
+       "ooui-dialog-process-dismiss": "Ausblenne"
+}
index a2bdbd5..94b4687 100644 (file)
@@ -11,5 +11,6 @@
        "ooui-dialog-message-accept": "Baş e",
        "ooui-dialog-message-reject": "Betal bike",
        "ooui-dialog-process-retry": "Dîsa hewl bide",
-       "ooui-dialog-process-continue": "Bidomîne"
+       "ooui-dialog-process-continue": "Bidomîne",
+       "ooui-selectfile-placeholder": "Ti dosye nehatiye hilbijartin"
 }
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 9e77392..9e2d8f2 100644 (file)
@@ -21,5 +21,6 @@
        "ooui-dialog-process-error": "Noe gikk galt",
        "ooui-dialog-process-dismiss": "Lukk",
        "ooui-dialog-process-retry": "Prøv igjen",
-       "ooui-dialog-process-continue": "Fortsett"
+       "ooui-dialog-process-continue": "Fortsett",
+       "ooui-selectfile-placeholder": "Ingen fil er valgt"
 }
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 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 129dd6a..f5674b3 100644 (file)
@@ -30,5 +30,6 @@
        "ooui-dialog-process-error": "Что-то пошло не так",
        "ooui-dialog-process-dismiss": "Закрыть",
        "ooui-dialog-process-retry": "Попробовать ещё раз",
-       "ooui-dialog-process-continue": "Продолжить"
+       "ooui-dialog-process-continue": "Продолжить",
+       "ooui-selectfile-not-supported": "Выбор файла не поддерживается"
 }
index d499427..c2422ba 100644 (file)
@@ -25,5 +25,6 @@
        "ooui-dialog-process-error": "Något gick fel",
        "ooui-dialog-process-dismiss": "Stäng",
        "ooui-dialog-process-retry": "Försök igen",
-       "ooui-dialog-process-continue": "Fortsätt"
+       "ooui-dialog-process-continue": "Fortsätt",
+       "ooui-selectfile-placeholder": "Ingen fil är vald"
 }
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 81ad9a9..7d4e710 100644 (file)
@@ -1,16 +1,22 @@
 {
        "@metadata": {
                "authors": [
-                       "Deryck Chan"
+                       "Deryck Chan",
+                       "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": "取消",
        "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 dcdf950..0c670e1 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.11.6
+ * OOjs UI v0.11.8
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-06-23T21:49:41Z
+ * Date: 2015-07-08T01:31:46Z
  */
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
        from {
        border: none;
        background: none;
 }
-.oo-ui-toolbar-actions > .oo-ui-buttonElement {
+.oo-ui-toolbar-actions > .oo-ui-buttonElement-framed,
+.oo-ui-toolbar-actions > .oo-ui-buttonElement-framed:last-child {
        margin-top: 0.4em;
        margin-bottom: 0.4em;
-}
-.oo-ui-toolbar-actions > .oo-ui-buttonElement:last-child {
        margin-right: 0.5em;
 }
+.oo-ui-toolbar-actions > .oo-ui-buttonElement-frameless.oo-ui-labelElement,
+.oo-ui-toolbar-actions > .oo-ui-buttonElement-frameless:last-child.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-frameless:last-child.oo-ui-labelElement > .oo-ui-buttonElement-button {
+       margin: 0;
+       padding: 1.1953125em 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-frameless:last-child.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       margin: 0 1em;
+}
 .oo-ui-toolbar-shadow {
        background-image: /* @embed */ url(themes/apex/images/toolbar-shadow.png);
        bottom: -9px;
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed,
 .oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed {
-       margin: 0.75em 0 0.75em 0.75em;
+       margin: 0.75em;
 }
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
 .oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
        padding: 0 1em;
        vertical-align: middle;
+       /* Adjust for border so text aligns with title */
+       margin: -1px;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-frameless {
+       margin: 0;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-frameless .oo-ui-buttonElement-button {
+       padding: 0.75em 1em;
+       vertical-align: middle;
 }
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget:hover {
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget:active {
        background-color: rgba(0, 0, 0, 0.1);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed {
-       margin: 0.75em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-       /* Adjust for border so text aligns with title */
-       margin: -1px;
-}
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:hover,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:hover {
        background-color: rgba(8, 126, 204, 0.05);
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
        background-color: rgba(212, 83, 83, 0.1);
 }
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement {
+       margin-right: 0;
+}
 .oo-ui-processDialog > .oo-ui-window-frame {
        min-height: 5em;
 }
index 3212616..6a12aa1 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.11.6
+ * OOjs UI v0.11.8
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-06-23T21:49:33Z
+ * Date: 2015-07-08T01:31:38Z
  */
 /**
  * @class
index 64b9827..3153746 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.11.6
+ * OOjs UI v0.11.8
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-06-23T21:49:41Z
+ * Date: 2015-07-08T01:31:46Z
  */
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
        from {
        background: none;
        box-shadow: none;
 }
-.oo-ui-toolbar-actions > .oo-ui-buttonElement {
-       margin-top: 0.25em;
-       margin-bottom: 0.25em;
+.oo-ui-toolbar-actions > .oo-ui-buttonElement.oo-ui-labelElement {
+       margin: 0;
 }
-.oo-ui-toolbar-actions > .oo-ui-toolbar,
-.oo-ui-toolbar-actions > .oo-ui-buttonElement:last-child {
-       margin-right: 0.5em;
+.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.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       margin: 0 1em;
+       line-height: inherit;
 }
 .oo-ui-optionWidget {
        position: relative;
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed,
 .oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed {
-       margin: 0.75em 0 0.75em 0.75em;
+       margin: 0.75em;
 }
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
 .oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
        padding: 0 1em;
        vertical-align: middle;
+       /* Adjust for border so text aligns with title */
+       margin: -1px;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-frameless {
+       margin: 0;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-frameless .oo-ui-buttonElement-button {
+       padding: 0.75em 1em;
+       vertical-align: middle;
 }
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget:hover {
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget:active {
        background-color: rgba(0, 0, 0, 0.1);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed {
-       margin: 0.75em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-       /* Adjust for border so text aligns with title */
-       margin: -1px;
-}
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:hover,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:hover {
        background-color: rgba(8, 126, 204, 0.05);
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
        background-color: rgba(212, 83, 83, 0.1);
 }
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement {
+       margin-right: 0;
+}
 .oo-ui-processDialog > .oo-ui-window-frame {
        min-height: 5em;
 }
index 15cffdc..48de83f 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.11.6
+ * OOjs UI v0.11.8
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-06-23T21:49:33Z
+ * Date: 2015-07-08T01:31:38Z
  */
 /**
  * @class
@@ -44,7 +44,10 @@ OO.ui.MediaWikiTheme.prototype.getElementClasses = function ( element ) {
 
        if ( element.supports( [ 'hasFlag' ] ) ) {
                isFramed = element.supports( [ 'isFramed' ] ) && element.isFramed();
-               if ( isFramed && ( element.isDisabled() || element.hasFlag( 'primary' ) ) ) {
+               if (
+                       ( isFramed && ( element.isDisabled() || element.hasFlag( 'primary' ) ) ) ||
+                       ( !isFramed && element.hasFlag( 'primary' ) )
+               ) {
                        variants.invert = true;
                } else {
                        variants.progressive = element.hasFlag( 'progressive' );
index 218acf3..b67289b 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.11.6
+ * OOjs UI v0.11.8
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-06-23T21:49:33Z
+ * Date: 2015-07-08T01:31:38Z
  */
 ( function ( OO ) {
 
@@ -1436,11 +1436,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 ) {
@@ -11517,7 +11518,8 @@ OO.ui.mixin.ItemWidget.prototype.setElementGroup = function ( group ) {
 /**
  * OutlineControlsWidget is a set of controls for an {@link OO.ui.OutlineSelectWidget outline select widget}.
  * Controls include moving items up and down, removing items, and adding different kinds of items.
- * ####Currently, this class is only used by {@link OO.ui.BookletLayout booklet layouts}.####
+ *
+ * **Currently, this class is only used by {@link OO.ui.BookletLayout booklet layouts}.**
  *
  * @class
  * @extends OO.ui.Widget
@@ -13521,6 +13523,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;
@@ -13542,15 +13545,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
                        } );
                } ) );
 
@@ -13759,6 +13765,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;
@@ -13780,15 +13787,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
                        } );
                } ) );
 
@@ -13842,12 +13852,16 @@ OO.ui.RadioSelectInputWidget.prototype.setOptions = function ( options ) {
  * @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} [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
@@ -13858,8 +13872,7 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
        // Configuration initialization
        config = $.extend( {
                type: 'text',
-               labelPosition: 'after',
-               maxRows: 10
+               labelPosition: 'after'
        }, config );
 
        // Parent constructor
@@ -13875,7 +13888,8 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( 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
@@ -13921,6 +13935,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();
        }
@@ -14131,7 +14151,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 );
 
@@ -14707,6 +14727,7 @@ OO.ui.OptionWidget = function OoUiOptionWidget( config ) {
        this.$element
                .data( 'oo-ui-optionWidget', this )
                .attr( 'role', 'option' )
+               .attr( 'aria-selected', 'false' )
                .addClass( 'oo-ui-optionWidget' )
                .append( this.$label );
 };
@@ -17258,7 +17279,7 @@ OO.ui.TextInputMenuSelectWidget.prototype.position = function () {
  * OutlineSelectWidget is a structured list that contains {@link OO.ui.OutlineOptionWidget outline options}
  * A set of controls can be provided with an {@link OO.ui.OutlineControlsWidget outline controls} widget.
  *
- * ####Currently, this class is only used by {@link OO.ui.BookletLayout booklet layouts}.####
+ * **Currently, this class is only used by {@link OO.ui.BookletLayout booklet layouts}.**
  *
  * @class
  * @extends OO.ui.SelectWidget
@@ -17292,7 +17313,7 @@ OO.mixinClass( OO.ui.OutlineSelectWidget, OO.ui.mixin.TabIndexedElement );
 /**
  * TabSelectWidget is a list that contains {@link OO.ui.TabOptionWidget tab options}
  *
- * ####Currently, this class is only used by {@link OO.ui.IndexLayout index layouts}.####
+ * **Currently, this class is only used by {@link OO.ui.IndexLayout index layouts}.**
  *
  * @class
  * @extends OO.ui.SelectWidget
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 bc9d4fd..74cf62b 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 33fb468..855b7b8 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 14.5v-2.9l-1.8-.3c-.1-.4-.3-.8-.6-1.4l1.1-1.5-2.1-2.1-1.5 1.1c-.5-.3-1-.5-1.4-.6L13.5 5h-2.9l-.3 1.8c-.5.1-.9.3-1.4.6L7.4 6.3 5.3 8.4l1 1.5c-.3.5-.4.9-.6 1.4l-1.7.2v2.9l1.8.3c.1.5.3.9.6 1.4l-1 1.5 2.1 2.1 1.5-1c.4.2.9.4 1.4.6l.3 1.8h3l.3-1.8c.5-.1.9-.3 1.4-.6l1.5 1.1 2.1-2.1-1.1-1.5c.3-.5.5-1 .6-1.4l1.5-.3zM12 16c-1.7 0-3-1.3-3-3s1.3-3 3-3 3 1.3 3 3-1.3 3-3 3z"/>
+    <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"/>
 </svg>
index 6c1a068..c486b98 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 3159624..cdf07b2 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 14.5v-2.9l-1.8-.3c-.1-.4-.3-.8-.6-1.4l1.1-1.5-2.1-2.1-1.5 1.1c-.5-.3-1-.5-1.4-.6L13.5 5h-2.9l-.3 1.8c-.5.1-.9.3-1.4.6L7.4 6.3 5.3 8.4l1 1.5c-.3.5-.4.9-.6 1.4l-1.7.2v2.9l1.8.3c.1.5.3.9.6 1.4l-1 1.5 2.1 2.1 1.5-1c.4.2.9.4 1.4.6l.3 1.8h3l.3-1.8c.5-.1.9-.3 1.4-.6l1.5 1.1 2.1-2.1-1.1-1.5c.3-.5.5-1 .6-1.4l1.5-.3zM12 16c-1.7 0-3-1.3-3-3s1.3-3 3-3 3 1.3 3 3-1.3 3-3 3z"/>
+    <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"/>
 </svg>
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 45ba543..9b0c430 100644 (file)
@@ -7,9 +7,6 @@
        height: 22px;
        cursor: pointer;
        vertical-align: middle;
-       /* Cross-browser inline-block */
-       /* Firefox 2 */
-       display: -moz-inline-block;
        /* Modern browsers */
        display: inline-block;
        /* IE7 */
index 9a8d391..e35b1cf 100644 (file)
@@ -123,7 +123,6 @@ pre, .mw-code {
        border: 1px solid #aaaaaa;
        background-color: #f9f9f9;
        padding: 5px;
-       display: -moz-inline-block;
        display: inline-block;
        display: table;
        /* IE7 and earlier */
index c2bd5a7..196ea21 100644 (file)
@@ -168,7 +168,6 @@ img {
        padding: 5px;
        font-size: 95%;
        text-align: center;
-       display: -moz-inline-block;
        display: inline-block;
        display: table;
 
index 6b8cb19..a0861df 100644 (file)
@@ -566,7 +566,6 @@ table.wikitable > caption {
        border: 1px solid;
        padding: .5em 1em;
        margin-bottom: 1em;
-       display: -moz-inline-block;
        display: inline-block;
        zoom: 1;
        *display: inline;
index db983a7..56b6811 100644 (file)
@@ -33,7 +33,7 @@
 // Button styling
 // ----------------------------------------------------------------------------
 
-.button-colors(@bgColor, @highlightColor) {
+.button-colors(@bgColor, @highlightColor, @activeColor) {
        background: @bgColor;
 
        &:hover {
 
        &: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;
 
@@ -83,7 +83,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;
 
        &:active,
        &.mw-ui-checked {
-               color: @highlightColor;
+               color: @activeColor;
        }
 
        &:disabled {
index 8ffc6ed..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;
 
@@ -67,5 +71,5 @@
 
 
 // Icon related variables
-@iconSize: 1.4em;
+@iconSize: 1.5em;
 @iconGutterWidth: 1em;
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 36eb9d4..8ec4cf0 100644 (file)
                }
                $nodes.updateTooltipAccessKeys();
 
+               // Infuse OOUI widgets, if any are present
+               $nodes = $( '[data-ooui]' );
+               if ( $nodes.length ) {
+                       mw.loader.using( 'mediawiki.widgets' ).done( function () {
+                               $nodes.each( function () {
+                                       OO.ui.infuse( this );
+                               } );
+                       } );
+               }
+
        } );
 
 }( mediaWiki, jQuery ) );
index 7dd5ee7..454fe58 100644 (file)
  * We use display:table. Even though it should only contain other table-* display
  * elements, there are no known problems with using this.
  *
- * Because IE < 8, FF 2 and other older browsers don't support display:table, we fallback to
+ * Because IE < 8 and other older browsers don't support display:table, we fallback to
  * using inline-block mode, which features at least intrinsic width, but won't clear preceding
  * inline elements. In practice inline elements surrounding the TOC are uncommon enough that
  * this is an acceptable sacrifice.
  */
 #toc,
 .toc {
-       display: -moz-inline-block;
        display: inline-block;
        display: table;
 
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 8f845df..8d648a6 100644 (file)
@@ -172,3 +172,7 @@ table#mw-search-powertable {
 form#powersearch {
        clear: both;
 }
+
+#searchText {
+       display: inline-block;
+}
index b27fe34..23602b3 100644 (file)
@@ -33,8 +33,7 @@
 
                // Change the header search links to what user entered
                $headerLinks = $( '.search-types a' );
-               $( '#searchText, #powerSearchText' ).change( function () {
-                       var searchterm = $( this ).val();
+               OO.ui.infuse( 'searchText' ).on( 'change', function ( searchterm ) {
                        $headerLinks.each( function () {
                                var parts = $( this ).attr( 'href' ).split( 'search=' ),
                                        lastpart = '',
@@ -46,7 +45,7 @@
                                }
                                this.href = parts[0] + prefix + encodeURIComponent( searchterm ) + lastpart;
                        } );
-               } ).trigger( 'change' );
+               } );
 
                // When saving settings, use the proper request method (POST instead of GET).
                $( '#mw-search-powersearch-remember' ).change( function () {
index b4efa9a..5b259e7 100644 (file)
@@ -1,7 +1,8 @@
 /*!
  * Styling for Special:Version
  */
-.mw-version-ext-name {
+.mw-version-ext-name,
+.mw-version-library-name {
        font-weight: bold;
 }
 
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 {
index 221de0f..df2f1a7 100644 (file)
@@ -16,6 +16,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
@@ -37,6 +38,7 @@
                // Properties
                this.limit = config.limit || 10;
                this.namespace = config.namespace || null;
+               this.relative = config.relative !== undefined ? config.relative : true;
                this.showRedirectTargets = config.showRedirectTargets !== false;
                this.showRedlink = !!config.showRedlink;
                this.showImages = !!config.showImages;
        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,
                        imageUrl: this.showImages ? data.imageUrl : null,
                        description: this.showDescriptions ? data.description : null,
                        missing: data.missing,
diff --git a/resources/src/mediawiki.widgets/mw.widgets.infuse.js b/resources/src/mediawiki.widgets/mw.widgets.infuse.js
new file mode 100644 (file)
index 0000000..98480bb
--- /dev/null
@@ -0,0 +1,3 @@
+// 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 );
index e46eca5..661ab74 100644 (file)
                 * @return {string}
                 */
                getName: function () {
-                       if ( $.inArray( this.namespace, mw.config.get( 'wgCaseSensitiveNamespaces' ) ) !== -1 ) {
+                       if (
+                               $.inArray( this.namespace, mw.config.get( 'wgCaseSensitiveNamespaces' ) ) !== -1 ||
+                               !this.title.length
+                       ) {
                                return this.title;
                        }
                        return this.title[0].toUpperCase() + this.title.slice( 1 );
diff --git a/resources/src/mediawiki/mediawiki.htmlform.ooui.js b/resources/src/mediawiki/mediawiki.htmlform.ooui.js
deleted file mode 100644 (file)
index 48b8a87..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-/*global OO */
-jQuery( function ( $ ) {
-
-       // Infuse everything with JavaScript widgets
-       $( '.mw-htmlform-ooui [data-ooui]' ).each( function () {
-               OO.ui.infuse( this.id );
-       } );
-
-} );
index a815c99..2c88e93 100644 (file)
 
                        /**
                         * Write a message the console's warning channel.
-                        * Also logs a stacktrace for easier debugging.
                         * Actions not supported by the browser console are silently ignored.
                         *
                         * @param {string...} msg Messages to output to console
                                var console = window.console;
                                if ( console && console.warn && console.warn.apply ) {
                                        console.warn.apply( console, arguments );
-                                       if ( console.trace ) {
-                                               console.trace();
-                                       }
                                }
                        };
 
index 1f3b123..b620e05 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' )
                                );
                        }
                searchboxesSelectors = [
                        // Primary searchbox on every page in standard skins
                        '#searchInput',
-                       // Special:Search
-                       '#powerSearchText',
-                       '#searchText',
                        // Generic selector for skins with multiple searchboxes (used by CologneBlue)
                        // and for MediaWiki itself (special pages with page title inputs)
                        '.mw-searchInput'
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 c3019c9..8a81a64 100644 (file)
@@ -94,6 +94,9 @@ $wgAutoloadClasses += array(
        'ResourceLoaderImageModuleTest' => "$testDir/phpunit/includes/resourceloader/ResourceLoaderImageModuleTest.php",
        'ResourceLoaderImageModuleTestable' => "$testDir/phpunit/includes/resourceloader/ResourceLoaderImageModuleTest.php",
 
+       # tests/phpunit/includes/specials
+       'SpecialPageTestBase' => "$testDir/phpunit/includes/specials/SpecialPageTestBase.php",
+
        # tests/phpunit/languages
        'LanguageClassesTestCase' => "$testDir/phpunit/languages/LanguageClassesTestCase.php",
 
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..766db1e 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
 
 ###
@@ -4006,6 +4113,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 +4173,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 +5318,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 +5430,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 +5632,7 @@ Simple table but with multiple dashes for row wikitext
 </td></tr></table>
 
 !! end
+
 !! test
 Multiplication table
 !! wikitext
@@ -5600,6 +5753,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 +5962,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 +6128,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 +7075,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 +7390,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 +7780,6 @@ Blah blah blah
 [[   es :Spanish]]
 [[ ZH :Chinese]]
 [[es:Foo_bar]]
-[[es:Foo bar]]
 !! html/php
 <p>Blah blah blah
 </p>
@@ -7524,7 +7788,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 +7980,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 +7994,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 +8018,7 @@ Empty redirect
 parsoid=wt2html,wt2wt
 !! wikitext
 #REDIRECT [[]]
-!! html
+!! html/parsoid
 <ol>
 <li>REDIRECT [[]]</li></ol>
 !! end
@@ -7745,8 +8031,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 +8047,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 +8059,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 [[:en:File:Wiki.png]]
+!! html/parsoid
+<link rel="mw:PageProp/redirect" href="//en.wikipedia.org/wiki/File:Wiki.png"/>
+!! end
+
+!! test
+Redirect to interwiki (T104918)
 !! wikitext
 #REDIRECT [[meatball:File:Wiki.png]]
-!! html
-<link rel="mw:PageProp/redirect" href="./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 +8161,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 +8512,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 +8545,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 +9597,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 +9933,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 +10175,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 +10980,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 +11225,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 +12290,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 +12301,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 +12358,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 +12380,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 +12396,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 +12412,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 +12430,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 +12556,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 +12703,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 +12741,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 +12770,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 +12787,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 +12801,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 +12817,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 +12831,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 +12847,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 +12919,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 +12933,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 +12945,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 +12958,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 +12982,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 +12993,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 +13004,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 +13095,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 +13119,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 +13138,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 +13155,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 +13197,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 +13211,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 +13232,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 +13279,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 +13290,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 +13299,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 +13310,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 +13334,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 +13343,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 +13351,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 +13419,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 +13430,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 +13457,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 +13804,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 +13965,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 +14151,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 +14265,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 +17880,7 @@ __FORCETOC__ override
 !! wikitext
 __NEWSECTIONLINK__
 __FORCETOC__
-!! html
+!! html/php
 <p><br />
 </p>
 !! end
@@ -17548,7 +18085,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 +19630,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 +19960,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 +20370,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 +20734,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 +20757,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 +20776,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 +20793,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 +20810,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 +20827,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 +20848,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 +20878,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 +20904,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 +20918,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 +20933,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 +20950,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 +20991,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 +21009,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 +21026,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 +21043,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 +21057,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 +21074,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 +21091,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 +21109,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 +21135,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 +21161,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 +21185,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 +21208,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 +21237,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 +21268,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 +21299,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 +21319,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 +21332,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 +21566,6 @@ parsoid=html2wt
 
 !! test
 Headings: 5. Empty headings
-!! options
-parsoid
 !! wikitext
 =<nowiki/>=
 
@@ -21059,13 +21578,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 +22235,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 +22644,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 +22765,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 +22798,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,7 +22811,22 @@ parsoid=html2wt
  ==foo==
 !! end
 
+!!test
+T95794: nowiki escaping should account for leading space at start-of-line in an indent-pre block
+!! options
+parsoid
+!! wikitext
+ * foo
+ * bar
+!! html
+<pre>
+* foo
+* bar
+</pre>
+!! end
+
 #### --------------- Behavior Switches --------------------
+
 !! test
 1. Valid behavior switches should be escaped
 !! options
@@ -22278,6 +22851,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 +23195,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 +23357,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 +23374,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 +23385,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 +23401,7 @@ Ensure ParagraphWrapper can deal with stray closing pre tags
 parsoid=wt2html
 !! wikitext
 plain text</pre>
-!! html
+!! html/parsoid
 plain text
 !!end
 
@@ -22817,7 +23411,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 +23427,7 @@ parsoid=wt2html,wt2wt
 <tr> || ||
 <td> a
 </table>
-!! html
+!! html/parsoid
 <p> || ||
 </p><table>
 <tbody><tr><td> a</td></tr>
@@ -22846,7 +23440,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 +23450,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 +23466,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 +23483,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 +23502,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 +23521,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 +23542,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 +23564,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 +23575,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 +23587,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 +23606,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 +23621,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 +23649,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 +23926,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 +23944,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 +24091,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 +24103,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 +24239,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 +24398,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 +24462,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 +24720,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 +24880,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 +24901,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 +24916,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
diff --git a/tests/phpunit/data/media/2_webp_a.webp b/tests/phpunit/data/media/2_webp_a.webp
new file mode 100644 (file)
index 0000000..8764f06
Binary files /dev/null and b/tests/phpunit/data/media/2_webp_a.webp differ
diff --git a/tests/phpunit/data/media/2_webp_ll.webp b/tests/phpunit/data/media/2_webp_ll.webp
new file mode 100644 (file)
index 0000000..5794bbf
Binary files /dev/null and b/tests/phpunit/data/media/2_webp_ll.webp differ
diff --git a/tests/phpunit/data/media/webp_animated.webp b/tests/phpunit/data/media/webp_animated.webp
new file mode 100644 (file)
index 0000000..25c6a4d
Binary files /dev/null and b/tests/phpunit/data/media/webp_animated.webp differ
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 df94d3e..e196243 100644 (file)
@@ -34,7 +34,7 @@ class MediaWikiTest extends MediaWikiTestCase {
                                'url' => 'http://example.org/w/index.php?title=Foo_Bar',
                                'query' => array( 'title' => 'Foo_Bar' ),
                                'title' => 'Foo_Bar',
-                               'redirect' => false,
+                               'redirect' => 'http://example.org/wiki/Foo_Bar',
                        ),
                        array(
                                // View: Script path with implicit title from page id
@@ -76,21 +76,21 @@ class MediaWikiTest extends MediaWikiTestCase {
                                'url' => 'http://example.org/w/?title=Foo_Bar',
                                'query' => array( 'title' => 'Foo_Bar' ),
                                'title' => 'Foo_Bar',
-                               'redirect' => false,
+                               'redirect' => 'http://example.org/wiki/Foo_Bar',
                        ),
                        array(
                                // View: Root path with escaped title
                                'url' => 'http://example.org/?title=Foo_Bar',
                                'query' => array( 'title' => 'Foo_Bar' ),
                                'title' => 'Foo_Bar',
-                               'redirect' => false,
+                               'redirect' => 'http://example.org/wiki/Foo_Bar',
                        ),
                        array(
                                // View: Canonical with redundant query
                                'url' => 'http://example.org/wiki/Foo_Bar?action=view',
                                'query' => array( 'action' => 'view' ),
                                'title' => 'Foo_Bar',
-                               'redirect' => false,
+                               'redirect' => 'http://example.org/wiki/Foo_Bar',
                        ),
                        array(
                                // Edit: Canonical view url with action query
@@ -104,7 +104,7 @@ class MediaWikiTest extends MediaWikiTestCase {
                                'url' => 'http://example.org/w/index.php?title=Foo_Bar&action=view',
                                'query' => array( 'title' => 'Foo_Bar', 'action' => 'view' ),
                                'title' => 'Foo_Bar',
-                               'redirect' => false,
+                               'redirect' => 'http://example.org/wiki/Foo_Bar',
                        ),
                        array(
                                // Edit: Index with action query
index fa528da..e006bf7 100644 (file)
@@ -475,7 +475,7 @@ class ApiEditPageTest extends ApiTestCase {
        public function testCheckDirectApiEditingDisallowed_forNonTextContent() {
                $this->setExpectedException(
                        'UsageException',
-                       'Direct editing via API is not supported for this content type.'
+                       'Direct editing via API is not supported for content model testing used by Dummy:ApiEditPageTest_nonTextPageEdit'
                );
 
                $this->doApiRequestWithToken( array(
diff --git a/tests/phpunit/includes/api/format/ApiFormatDumpTest.php b/tests/phpunit/includes/api/format/ApiFormatDumpTest.php
deleted file mode 100644 (file)
index c0f67f8..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-
-/**
- * @group API
- * @covers ApiFormatDump
- */
-class ApiFormatDumpTest extends ApiFormatTestBase {
-
-       protected $printerName = 'dump';
-
-       public static function provideGeneralEncoding() {
-               // Sigh. Docs claim it's a boolean, but can have values 0, 1, or 2.
-               // Fortunately wfIniGetBool does the right thing.
-               if ( wfIniGetBool( 'xdebug.overload_var_dump' ) ) {
-                       return array(
-                               array( array(), 'Cannot test ApiFormatDump when xDebug overloads var_dump', array( 'SKIP' => true ) ),
-                       );
-               }
-
-               $warning = "\n  [\"warnings\"]=>\n  array(1) {\n    [\"dump\"]=>\n    array(1) {\n      [\"*\"]=>\n" .
-                       "      string(64) \"format=dump has been deprecated. Please use format=json instead.\"\n" .
-                       "    }\n  }";
-
-               return array(
-                       // Basic types
-                       array( array( null ), "array(2) {{$warning}\n  [0]=>\n  NULL\n}\n" ),
-                       array( array( true ), "array(2) {{$warning}\n  [0]=>\n  string(0) \"\"\n}\n" ),
-                       array( array( false ), "array(1) {{$warning}\n}\n" ),
-                       array( array( true, ApiResult::META_BC_BOOLS => array( 0 ) ),
-                               "array(2) {{$warning}\n  [0]=>\n  bool(true)\n}\n" ),
-                       array( array( false, ApiResult::META_BC_BOOLS => array( 0 ) ),
-                               "array(2) {{$warning}\n  [0]=>\n  bool(false)\n}\n" ),
-                       array( array( 42 ), "array(2) {{$warning}\n  [0]=>\n  int(42)\n}\n" ),
-                       array( array( 42.5 ), "array(2) {{$warning}\n  [0]=>\n  float(42.5)\n}\n" ),
-                       array( array( 1e42 ), "array(2) {{$warning}\n  [0]=>\n  float(1.0E+42)\n}\n" ),
-                       array( array( 'foo' ), "array(2) {{$warning}\n  [0]=>\n  string(3) \"foo\"\n}\n" ),
-                       array( array( 'fóo' ), "array(2) {{$warning}\n  [0]=>\n  string(4) \"fóo\"\n}\n" ),
-
-                       // Arrays
-                       array( array( array() ), "array(2) {{$warning}\n  [0]=>\n  array(0) {\n  }\n}\n" ),
-                       array( array( array( 1 ) ), "array(2) {{$warning}\n  [0]=>\n  array(1) {\n    [0]=>\n    int(1)\n  }\n}\n" ),
-                       array( array( array( 'x' => 1 ) ), "array(2) {{$warning}\n  [0]=>\n  array(1) {\n    [\"x\"]=>\n    int(1)\n  }\n}\n" ),
-                       array( array( array( 2 => 1 ) ), "array(2) {{$warning}\n  [0]=>\n  array(1) {\n    [2]=>\n    int(1)\n  }\n}\n" ),
-                       array( array( (object)array() ), "array(2) {{$warning}\n  [0]=>\n  array(0) {\n  }\n}\n" ),
-                       array( array( array( 1, ApiResult::META_TYPE => 'assoc' ) ), "array(2) {{$warning}\n  [0]=>\n  array(1) {\n    [0]=>\n    int(1)\n  }\n}\n" ),
-                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'array' ) ), "array(2) {{$warning}\n  [0]=>\n  array(1) {\n    [0]=>\n    int(1)\n  }\n}\n" ),
-                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'kvp' ) ), "array(2) {{$warning}\n  [0]=>\n  array(1) {\n    [\"x\"]=>\n    int(1)\n  }\n}\n" ),
-                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCkvp', ApiResult::META_KVP_KEY_NAME => 'key' ) ),
-                               "array(2) {{$warning}\n  [0]=>\n  array(1) {\n    [0]=>\n    array(2) {\n      [\"key\"]=>\n      string(1) \"x\"\n      [\"*\"]=>\n      int(1)\n    }\n  }\n}\n" ),
-                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCarray' ) ), "array(2) {{$warning}\n  [0]=>\n  array(1) {\n    [\"x\"]=>\n    int(1)\n  }\n}\n" ),
-                       array( array( array( 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ) ), "array(2) {{$warning}\n  [0]=>\n  array(2) {\n    [0]=>\n    string(1) \"a\"\n    [1]=>\n    string(1) \"b\"\n  }\n}\n" ),
-
-                       // Content
-                       array( array( 'content' => 'foo', ApiResult::META_CONTENT => 'content' ),
-                               "array(2) {{$warning}\n  [\"*\"]=>\n  string(3) \"foo\"\n}\n" ),
-
-                       // BC Subelements
-                       array( array( 'foo' => 'foo', ApiResult::META_BC_SUBELEMENTS => array( 'foo' ) ),
-                               "array(2) {{$warning}\n  [\"foo\"]=>\n  array(1) {\n    [\"*\"]=>\n    string(3) \"foo\"\n  }\n}\n" ),
-               );
-       }
-
-}
diff --git a/tests/phpunit/includes/api/format/ApiFormatWddxTest.php b/tests/phpunit/includes/api/format/ApiFormatWddxTest.php
deleted file mode 100644 (file)
index 0711130..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-
-/**
- * @group API
- * @covers ApiFormatWddx
- */
-class ApiFormatWddxTest extends ApiFormatTestBase {
-
-       protected $printerName = 'wddx';
-
-       public static function provideGeneralEncoding() {
-               if ( ApiFormatWddx::useSlowPrinter() ) {
-                       return array(
-                               array( array(), 'Fast Wddx printer is unavailable', array( 'SKIP' => true ) )
-                       );
-               }
-               return self::provideEncoding();
-       }
-
-       public static function provideEncoding() {
-               $p = '<wddxPacket version=\'1.0\'><header/><data><struct><var name=\'warnings\'><struct><var name=\'wddx\'><struct><var name=\'*\'><string>format=wddx has been deprecated. Please use format=json instead.</string></var></struct></var></struct></var>';
-               $s = '</struct></data></wddxPacket>';
-
-               return array(
-                       // Basic types
-                       array( array( null ), "{$p}<var name='0'><null/></var>{$s}" ),
-                       array( array( true ), "{$p}<var name='0'><string></string></var>{$s}" ),
-                       array( array( false ), "{$p}{$s}" ),
-                       array( array( true, ApiResult::META_BC_BOOLS => array( 0 ) ),
-                               "{$p}<var name='0'><boolean value='true'/></var>{$s}" ),
-                       array( array( false, ApiResult::META_BC_BOOLS => array( 0 ) ),
-                               "{$p}<var name='0'><boolean value='false'/></var>{$s}" ),
-                       array( array( 42 ), "{$p}<var name='0'><number>42</number></var>{$s}" ),
-                       array( array( 42.5 ), "{$p}<var name='0'><number>42.5</number></var>{$s}" ),
-                       array( array( 1e42 ), "{$p}<var name='0'><number>1.0E+42</number></var>{$s}" ),
-                       array( array( 'foo' ), "{$p}<var name='0'><string>foo</string></var>{$s}" ),
-                       array( array( 'fóo' ), "{$p}<var name='0'><string>fóo</string></var>{$s}" ),
-
-                       // Arrays and objects
-                       array( array( array() ), "{$p}<var name='0'><array length='0'></array></var>{$s}" ),
-                       array( array( array( 1 ) ), "{$p}<var name='0'><array length='1'><number>1</number></array></var>{$s}" ),
-                       array( array( array( 'x' => 1 ) ), "{$p}<var name='0'><struct><var name='x'><number>1</number></var></struct></var>{$s}" ),
-                       array( array( array( 2 => 1 ) ), "{$p}<var name='0'><struct><var name='2'><number>1</number></var></struct></var>{$s}" ),
-                       array( array( (object)array() ), "{$p}<var name='0'><struct></struct></var>{$s}" ),
-                       array( array( array( 1, ApiResult::META_TYPE => 'assoc' ) ), "{$p}<var name='0'><struct><var name='0'><number>1</number></var></struct></var>{$s}" ),
-                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'array' ) ), "{$p}<var name='0'><array length='1'><number>1</number></array></var>{$s}" ),
-                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'kvp' ) ), "{$p}<var name='0'><struct><var name='x'><number>1</number></var></struct></var>{$s}" ),
-                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCkvp', ApiResult::META_KVP_KEY_NAME => 'key' ) ),
-                               "{$p}<var name='0'><array length='1'><struct><var name='key'><string>x</string></var><var name='*'><number>1</number></var></struct></array></var>{$s}" ),
-                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCarray' ) ), "{$p}<var name='0'><struct><var name='x'><number>1</number></var></struct></var>{$s}" ),
-                       array( array( array( 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ) ), "{$p}<var name='0'><array length='2'><string>a</string><string>b</string></array></var>{$s}" ),
-
-                       // Content
-                       array( array( 'content' => 'foo', ApiResult::META_CONTENT => 'content' ),
-                               "{$p}<var name='*'><string>foo</string></var>{$s}" ),
-
-                       // BC Subelements
-                       array( array( 'foo' => 'foo', ApiResult::META_BC_SUBELEMENTS => array( 'foo' ) ),
-                               "{$p}<var name='foo'><struct><var name='*'><string>foo</string></var></struct></var>{$s}" ),
-               );
-       }
-
-       /**
-        * @dataProvider provideEncoding
-        */
-       public function testSlowEncoding( array $data, $expect, array $params = array() ) {
-               // Adjust expectation for differences between fast and slow printers.
-               $expect = str_replace( '\'', '"', $expect );
-               $expect = str_replace( '/>', ' />', $expect );
-               $expect = '<?xml version="1.0"?>' . $expect;
-
-               $this->assertSame( $expect, $this->encodeData( $params, $data, 'ApiFormatWddxTest_SlowWddx' ) );
-       }
-}
-
-class ApiFormatWddxTest_SlowWddx extends ApiFormatWddx {
-       public static function useSlowPrinter() {
-               return true;
-       }
-}
index b5fd5f6..cac3b10 100644 (file)
@@ -27,34 +27,95 @@ class ComposerLockTest extends MediaWikiTestCase {
                        'wikimedia/cdb' => array(
                                'version' => '1.0.1',
                                'type' => 'library',
+                               'licenses' => array( 'GPL-2.0' ),
+                               'authors' => array(
+                                       array(
+                                               'name' => 'Tim Starling',
+                                               'email' => 'tstarling@wikimedia.org',
+                                       ),
+                                       array(
+                                               'name' => 'Chad Horohoe',
+                                               'email' => 'chad@wikimedia.org',
+                                       ),
+                               ),
+                               'description' => 'Constant Database (CDB) wrapper library for PHP. Provides pure-PHP fallback when dba_* functions are absent.',
                        ),
                        'cssjanus/cssjanus' => array(
                                'version' => '1.1.1',
                                'type' => 'library',
+                               'licenses' => array( 'Apache-2.0' ),
+                               'authors' => array(),
+                               'description' => 'Convert CSS stylesheets between left-to-right and right-to-left.',
                        ),
                        'leafo/lessphp' => array(
                                'version' => '0.5.0',
                                'type' => 'library',
+                               'licenses' => array( 'MIT', 'GPL-3.0' ),
+                               'authors' => array(
+                                       array(
+                                               'name' => 'Leaf Corcoran',
+                                               'email' => 'leafot@gmail.com',
+                                               'homepage' => 'http://leafo.net',
+                                       ),
+                               ),
+                               'description' => 'lessphp is a compiler for LESS written in PHP.',
                        ),
                        'psr/log' => array(
                                'version' => '1.0.0',
                                'type' => 'library',
+                               'licenses' => array( 'MIT' ),
+                               'authors' => array(
+                                       array(
+                                               'name' => 'PHP-FIG',
+                                               'homepage' => 'http://www.php-fig.org/',
+                                       ),
+                               ),
+                               'description' => 'Common interface for logging libraries',
                        ),
                        'oojs/oojs-ui' => array(
                                'version' => '0.6.0',
                                'type' => 'library',
+                               'licenses' => array( 'MIT' ),
+                               'authors' => array(),
+                               'description' => '',
                        ),
                        'composer/installers' => array(
                                'version' => '1.0.19',
                                'type' => 'composer-installer',
+                               'licenses' => array( 'MIT' ),
+                               'authors' => array(
+                                       array(
+                                               'name' => 'Kyle Robinson Young',
+                                               'email' => 'kyle@dontkry.com',
+                                               'homepage' => 'https://github.com/shama',
+                                       ),
+                               ),
+                               'description' => 'A multi-framework Composer library installer',
                        ),
                        'mediawiki/translate' => array(
                                'version' => '2014.12',
                                'type' => 'mediawiki-extension',
+                               'licenses' => array( 'GPL-2.0+' ),
+                               'authors' => array(
+                                       array(
+                                               'name' => 'Niklas Laxström',
+                                               'email' => 'niklas.laxstrom@gmail.com',
+                                               'role' => 'Lead nitpicker',
+                                       ),
+                                       array(
+                                               'name' => 'Siebrand Mazeland',
+                                               'email' => 's.mazeland@xs4all.nl',
+                                               'role' => 'Developer',
+                                       ),
+                               ),
+                               'description' => 'The only standard solution to translate any kind of text with an avant-garde web interface within MediaWiki, including your documentation and software',
                        ),
                        'mediawiki/universal-language-selector' => array(
                                'version' => '2014.12',
                                'type' => 'mediawiki-extension',
+                               'licenses' => array( 'GPL-2.0+', 'MIT' ),
+                               'authors' => array(),
+                               'description' => 'The primary aim is to allow users to select a language and configure its support in an easy way. Main features are language selection, input methods and web fonts.',
                        ),
                ), $lock->getInstalledDependencies(), false, true );
        }
diff --git a/tests/phpunit/includes/media/WebPTest.php b/tests/phpunit/includes/media/WebPTest.php
new file mode 100644 (file)
index 0000000..d36710a
--- /dev/null
@@ -0,0 +1,127 @@
+<?php
+class WebPHandlerTest extends MediaWikiTestCase {
+       public function setUp() {
+               parent::setUp();
+               // Allocated file for testing
+               $this->tempFileName = tempnam( wfTempDir(), 'WEBP' );
+       }
+       public function tearDown() {
+               parent::tearDown();
+               unlink( $this->tempFileName );
+       }
+       /**
+        * @dataProvider provideTestExtractMetaData
+        */
+       public function testExtractMetaData( $header, $expectedResult ) {
+               // Put header into file
+               file_put_contents( $this->tempFileName, $header );
+
+               $this->assertEquals( $expectedResult, WebPHandler::extractMetadata( $this->tempFileName ) );
+       }
+       public function provideTestExtractMetaData() {
+               return array(
+                       // Files from https://developers.google.com/speed/webp/gallery2
+                       array( "\x52\x49\x46\x46\x90\x68\x01\x00\x57\x45\x42\x50\x56\x50\x38\x4C\x83\x68\x01\x00\x2F\x8F\x01\x4B\x10\x8D\x38\x6C\xDB\x46\x92\xE0\xE0\x82\x7B\x6C",
+                               array( 'compression' => 'lossless', 'width' => 400, 'height' => 301 ) ),
+                       array( "\x52\x49\x46\x46\x64\x5B\x00\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\x8F\x01\x00\x2C\x01\x00\x41\x4C\x50\x48\xE5\x0E",
+                               array( 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 400, 'height' => 301) ),
+                       array( "\x52\x49\x46\x46\xA8\x72\x00\x00\x57\x45\x42\x50\x56\x50\x38\x4C\x9B\x72\x00\x00\x2F\x81\x81\x62\x10\x8D\x40\x8C\x24\x39\x6E\x73\x73\x38\x01\x96",
+                               array( 'compression' => 'lossless', 'width' => 386, 'height' => 395 ) ),
+                       array( "\x52\x49\x46\x46\xE0\x42\x00\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\x81\x01\x00\x8A\x01\x00\x41\x4C\x50\x48\x56\x10",
+                               array( 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 386, 'height' => 395 ) ),
+                       array( "\x52\x49\x46\x46\x70\x61\x02\x00\x57\x45\x42\x50\x56\x50\x38\x4C\x63\x61\x02\x00\x2F\x1F\xC3\x95\x10\x8D\xC8\x72\xDB\xC8\x92\x24\xD8\x91\xD9\x91",
+                               array( 'compression' => 'lossless', 'width' => 800, 'height' => 600 ) ),
+                       array( "\x52\x49\x46\x46\x1C\x1D\x01\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\x1F\x03\x00\x57\x02\x00\x41\x4C\x50\x48\x25\x8B",
+                               array( 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 800, 'height' => 600 ) ),
+                       array( "\x52\x49\x46\x46\xFA\xC5\x00\x00\x57\x45\x42\x50\x56\x50\x38\x4C\xEE\xC5\x00\x00\x2F\xA4\x81\x28\x10\x8D\x40\x68\x24\xC9\x91\xA4\xAE\xF3\x97\x75",
+                               array( 'compression' => 'lossless', 'width' => 421, 'height' => 163 ) ),
+                       array( "\x52\x49\x46\x46\xF6\x5D\x00\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\xA4\x01\x00\xA2\x00\x00\x41\x4C\x50\x48\x38\x1A",
+                               array( 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 421, 'height' => 163 ) ),
+                       array( "\x52\x49\x46\x46\xC4\x96\x01\x00\x57\x45\x42\x50\x56\x50\x38\x4C\xB8\x96\x01\x00\x2F\x2B\xC1\x4A\x10\x11\x87\x6D\xDB\x48\x12\xFC\x60\xB0\x83\x24",
+                               array( 'compression' => 'lossless', 'width' => 300, 'height' => 300 ) ),
+                       array( "\x52\x49\x46\x46\x0A\x11\x01\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\x2B\x01\x00\x2B\x01\x00\x41\x4C\x50\x48\x67\x6E",
+                               array( 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 300, 'height' => 300 ) ),
+
+                       // Lossy files from https://developers.google.com/speed/webp/gallery1
+                       array( "\x52\x49\x46\x46\x68\x76\x00\x00\x57\x45\x42\x50\x56\x50\x38\x20\x5C\x76\x00\x00\xD2\xBE\x01\x9D\x01\x2A\x26\x02\x70\x01\x3E\xD5\x4E\x97\x43\xA2",
+                               array( 'compression' => 'lossy', 'width' => 550, 'height' => 368 ) ),
+                       array( "\x52\x49\x46\x46\xB0\xEC\x00\x00\x57\x45\x42\x50\x56\x50\x38\x20\xA4\xEC\x00\x00\xB2\x4B\x02\x9D\x01\x2A\x26\x02\x94\x01\x3E\xD1\x50\x96\x46\x26",
+                               array( 'compression' => 'lossy', 'width' => 550, 'height' => 404 ) ),
+                       array( "\x52\x49\x46\x46\x7A\x19\x03\x00\x57\x45\x42\x50\x56\x50\x38\x20\x6E\x19\x03\x00\xB2\xF8\x09\x9D\x01\x2A\x00\x05\xD0\x02\x3E\xAD\x46\x99\x4A\xA5",
+                               array( 'compression' => 'lossy', 'width' => 1280, 'height' => 720 ) ),
+                       array( "\x52\x49\x46\x46\x44\xB3\x02\x00\x57\x45\x42\x50\x56\x50\x38\x20\x38\xB3\x02\x00\x52\x57\x06\x9D\x01\x2A\x00\x04\x04\x03\x3E\xA5\x44\x96\x49\x26",
+                               array( 'compression' => 'lossy', 'width' => 1024, 'height' => 772) ),
+                       array( "\x52\x49\x46\x46\x02\x43\x01\x00\x57\x45\x42\x50\x56\x50\x38\x20\xF6\x42\x01\x00\x12\xC0\x05\x9D\x01\x2A\x00\x04\xF0\x02\x3E\x79\x34\x93\x47\xA4",
+                               array( 'compression' => 'lossy', 'width' => 1024, 'height' => 752) ),
+
+                       // Animated file from https://groups.google.com/a/chromium.org/d/topic/blink-dev/Y8tRC4mdQz8/discussion
+                       array( "\x52\x49\x46\x46\xD0\x0B\x02\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x12\x00\x00\x00\x3F\x01\x00\x3F\x01\x00\x41\x4E",
+                               array( 'compression' => 'unknown', 'animated' => true, 'transparency' => true, 'width' => 320, 'height' => 320 ) ),
+
+                       // Error cases
+                       array( '', false ),
+                       array( '                                    ', false ),
+                       array( 'RIFF                                ', false ),
+                       array( 'RIFF1234WEBP                        ', false ),
+                       array( 'RIFF1234WEBPVP8                     ', false ),
+                       array( 'RIFF1234WEBPVP8L                    ', false ),
+               );
+       }
+
+       /**
+        * @dataProvider provideTestWithFileExtractMetaData
+        */
+       public function testWithFileExtractMetaData( $filename, $expectedResult ) {
+               $this->assertEquals( $expectedResult, WebPHandler::extractMetadata( $filename ) );
+       }
+       public function provideTestWithFileExtractMetaData() {
+               return array(
+                               array( __DIR__ . '/../../data/media/2_webp_ll.webp',
+                                       array( 'compression' => 'lossless', 'width' => 386, 'height' => 395 ) ),
+                               array( __DIR__ . '/../../data/media/2_webp_a.webp',
+                                       array( 'compression' => 'lossy', 'animated' => false, 'transparency' => true, 'width' => 386, 'height' => 395 ) ),
+               );
+       }
+
+       /**
+        * @dataProvider provideTestGetImageSize
+        */
+       public function testGetImageSize( $path, $expectedResult ) {
+               $handler = new WebPHandler();
+               $this->assertEquals( $expectedResult, $handler->getImageSize( null, $path ) );
+       }
+       public function provideTestGetImageSize() {
+               return array(
+                       // Public domain files from https://developers.google.com/speed/webp/gallery2
+                       array( __DIR__ . '/../../data/media/2_webp_a.webp', array( 386, 395 ) ),
+                       array( __DIR__ . '/../../data/media/2_webp_ll.webp', array( 386, 395 ) ),
+                       array( __DIR__ . '/../../data/media/webp_animated.webp', array( 300, 225 ) ),
+
+                       // Error cases
+                       array( __FILE__, false ),
+               );
+       }
+
+       /**
+        * Tests the WebP MIME detection. This should really be a separate test, but sticking it
+        * here for now.
+        *
+        * @dataProvider provideTestGetMimeType
+        */
+       public function testGuessMimeType( $path ) {
+               $mime = MimeMagic::singleton();
+               $this->assertEquals( 'image/webp', $mime->guessMimeType( $path, false ) );
+       }
+       public function provideTestGetMimeType() {
+               return array(
+                               // Public domain files from https://developers.google.com/speed/webp/gallery2
+                               array( __DIR__ . '/../../data/media/2_webp_a.webp' ),
+                               array( __DIR__ . '/../../data/media/2_webp_ll.webp' ),
+                               array( __DIR__ . '/../../data/media/webp_animated.webp' ),
+               );
+       }
+}
+
+/* Python code to extract a header and convert to PHP format:
+ * print '"%s"' % ''.join( '\\x%02X' % ord(c) for c in urllib.urlopen(url).read(36) )
+ */
index 47a83b3..10f64be 100644 (file)
@@ -229,8 +229,10 @@ class WANObjectCacheTest extends MediaWikiTestCase {
        public function testTouchKeys() {
                $key = wfRandomString();
 
+               $priorTime = microtime( true );
+               usleep( 1 );
                $t0 = $this->cache->getCheckKeyTime( $key );
-               $this->assertFalse( $t0, 'Check key time is false' );
+               $this->assertGreaterThanOrEqual( $priorTime, $t0, 'Check key auto-created' );
 
                $priorTime = microtime( true );
                usleep( 1 );
diff --git a/tests/phpunit/includes/specials/SpecialBlankPageTest.php b/tests/phpunit/includes/specials/SpecialBlankPageTest.php
new file mode 100644 (file)
index 0000000..1d4f5e5
--- /dev/null
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @licence GNU GPL v2+
+ * @author Adam Shorland
+ *
+ * @covers SpecialBlankpage
+ */
+class SpecialBlankPageTest extends SpecialPageTestBase {
+
+       /**
+        * Returns a new instance of the special page under test.
+        *
+        * @return SpecialPage
+        */
+       protected function newSpecialPage() {
+               return new SpecialBlankpage();
+       }
+
+       public function testHasWikiMsg() {
+               list( $html, ) = $this->executeSpecialPage();
+               $this->assertContains( wfMessage( 'intentionallyblankpage' )->text(), $html );
+       }
+
+}
diff --git a/tests/phpunit/includes/specials/SpecialPageTestBase.php b/tests/phpunit/includes/specials/SpecialPageTestBase.php
new file mode 100644 (file)
index 0000000..9c7b0f0
--- /dev/null
@@ -0,0 +1,165 @@
+<?php
+
+/**
+ * Base class for testing special pages.
+ *
+ * @since 1.26
+ *
+ * @licence GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ * @author Daniel Kinzler
+ * @author Adam Shorland
+ * @author Thiemo Mättig
+ */
+abstract class SpecialPageTestBase extends MediaWikiTestCase {
+
+       private $obLevel;
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->obLevel = ob_get_level();
+       }
+
+       protected function tearDown() {
+               $obLevel = ob_get_level();
+
+               while ( ob_get_level() > $this->obLevel ) {
+                       ob_end_clean();
+               }
+
+               if ( $obLevel !== $this->obLevel ) {
+                       $this->fail(
+                               "Test changed output buffer level: was {$this->obLevel} before test, but $obLevel after test."
+                       );
+               }
+
+               parent::tearDown();
+       }
+
+       /**
+        * Returns a new instance of the special page under test.
+        *
+        * @return SpecialPage
+        */
+       abstract protected function newSpecialPage();
+
+       /**
+        * @param string $subPage The subpage parameter to call the page with
+        * @param WebRequest|null $request Web request that may contain URL parameters, etc
+        * @param Language|string|null $language The language which should be used in the context
+        * @param User|null $user The user which should be used in the context of this special page
+        *
+        * @throws Exception
+        * @return array( string, WebResponse ) A two-elements array containing the HTML output
+        * generated by the special page as well as the response object.
+        */
+       protected function executeSpecialPage(
+               $subPage = '',
+               WebRequest $request = null,
+               $language = null,
+               User $user = null
+       ) {
+               $context = $this->newContext( $request, $language, $user );
+
+               $output = new OutputPage( $context );
+               $context->setOutput( $output );
+
+               $page = $this->newSpecialPage();
+               $page->setContext( $context );
+               $output->setTitle( $page->getPageTitle() );
+
+               $html = $this->getHTMLFromSpecialPage( $page, $subPage );
+               $response = $context->getRequest()->response();
+
+               if ( $response instanceof FauxResponse ) {
+                       $code = $response->getStatusCode();
+
+                       if ( $code > 0 ) {
+                               $response->header( 'Status: ' . $code . ' ' . HttpStatus::getMessage( $code ) );
+                       }
+               }
+
+               return array( $html, $response );
+       }
+
+       /**
+        * @param WebRequest|null $request
+        * @param Language|string|null $language
+        * @param User|null $user
+        *
+        * @return DerivativeContext
+        */
+       private function newContext(
+               WebRequest $request = null,
+               $language = null,
+               User $user = null
+       ) {
+               $context = new DerivativeContext( RequestContext::getMain() );
+
+               $context->setRequest( $request ?: new FauxRequest() );
+
+               if ( $language !== null ) {
+                       $context->setLanguage( $language );
+               }
+
+               if ( $user !== null ) {
+                       $context->setUser( $user );
+               }
+
+               $this->setEditTokenFromUser( $context );
+
+               return $context;
+       }
+
+       /**
+        * If we are trying to edit and no token is set, supply one.
+        *
+        * @param DerivativeContext $context
+        */
+       private function setEditTokenFromUser( DerivativeContext $context ) {
+               $request = $context->getRequest();
+
+               // Edits via GET are a security issue and should not succeed. On the other hand, not all
+               // POST requests are edits, but should ignore unused parameters.
+               if ( !$request->getCheck( 'wpEditToken' ) && $request->wasPosted() ) {
+                       $request->setVal( 'wpEditToken', $context->getUser()->getEditToken() );
+               }
+       }
+
+       /**
+        * @param SpecialPage $page
+        * @param string $subPage
+        *
+        * @throws Exception
+        * @return string HTML
+        */
+       private function getHTMLFromSpecialPage( SpecialPage $page, $subPage ) {
+               ob_start();
+
+               try {
+                       $page->execute( $subPage );
+
+                       $output = $page->getOutput();
+
+                       if ( $output->getRedirect() !== '' ) {
+                               $output->output();
+                               $html = ob_get_contents();
+                       } elseif ( $output->isDisabled() ) {
+                               $html = ob_get_contents();
+                       } else {
+                               $html = $output->getHTML();
+                       }
+               } catch ( Exception $ex ) {
+                       ob_end_clean();
+
+                       // Re-throw exception after "finally" handling because PHP 5.3 doesn't have "finally".
+                       throw $ex;
+               }
+
+               ob_end_clean();
+
+               return $html;
+       }
+
+}
index faa30c3..ade8fc4 100644 (file)
@@ -1528,6 +1528,31 @@ class LanguageTest extends LanguageClassesTestCase {
                );
        }
 
+       /**
+        * @covers Language::embedBidi()
+        */
+       public function testEmbedBidi() {
+               $lre = "\xE2\x80\xAA"; // U+202A LEFT-TO-RIGHT EMBEDDING
+               $rle = "\xE2\x80\xAB"; // U+202B RIGHT-TO-LEFT EMBEDDING
+               $pdf = "\xE2\x80\xAC"; // U+202C POP DIRECTIONAL FORMATTING
+               $lang = $this->getLang();
+               $this->assertEquals(
+                       '123',
+                       $lang->embedBidi( '123' ),
+                       'embedBidi with neutral argument'
+               );
+               $this->assertEquals(
+                       $lre . 'Ben_(WMF)' . $pdf,
+                       $lang->embedBidi( 'Ben_(WMF)' ),
+                       'embedBidi with LTR argument'
+               );
+               $this->assertEquals(
+                       $rle . 'יהודי (מנוחין)' . $pdf,
+                       $lang->embedBidi( 'יהודי (מנוחין)' ),
+                       'embedBidi with RTL argument'
+               );
+       }
+
        /**
         * @covers Language::translateBlockExpiry()
         * @dataProvider provideTranslateBlockExpiry
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 34e3fb4..efde4c0 100755 (executable)
@@ -215,17 +215,23 @@ if ( version_compare( PHP_VERSION, '5.4.0', '<' ) ) {
 
 $ok = false;
 
-foreach ( array(
-       stream_resolve_include_path( 'phpunit.phar' ),
-       'PHPUnit/Runner/Version.php',
-       'PHPUnit/Autoload.php'
-) as $includePath ) {
-       // @codingStandardsIgnoreStart
-       @include_once $includePath;
-       // @codingStandardsIgnoreEnd
-       if ( class_exists( 'PHPUnit_TextUI_Command' ) ) {
-               $ok = true;
-               break;
+if ( class_exists( 'PHPUnit_TextUI_Command' ) ) {
+       echo "PHPUnit already present\n";
+       $ok = true;
+} else {
+       foreach ( array(
+                               stream_resolve_include_path( 'phpunit.phar' ),
+                               'PHPUnit/Runner/Version.php',
+                               'PHPUnit/Autoload.php'
+                       ) as $includePath ) {
+               // @codingStandardsIgnoreStart
+               @include_once $includePath;
+               // @codingStandardsIgnoreEnd
+               if ( class_exists( 'PHPUnit_TextUI_Command' ) ) {
+                       $ok = true;
+                       echo "Using PHPUnit from $includePath\n";
+                       break;
+               }
        }
 }
 
index c6f3a23..97eddee 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' ),
        ),
index 7c3d699..b828357 100644 (file)
                                        }
                                },
                                teardown: function () {
-                                       this.sandbox.verifyAndRestore();
-
                                        if ( localEnv.teardown ) {
                                                localEnv.teardown.call( this );
                                        }
+
+                                       this.sandbox.verifyAndRestore();
                                }
                        } );
                };
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 ) );
index c0afe07..284f21a 100644 (file)
                }
        } );
 
-       QUnit.test( 'Basic parsing', 12, function ( assert ) {
+       QUnit.test( 'Basic parsing', 21, function ( assert ) {
                var title;
                title = new mw.Title( 'File:Foo_bar.JPG' );
 
                title = new mw.Title( 'Foo#bar' );
                assert.equal( title.getPrefixedText(), 'Foo' );
                assert.equal( title.getFragment(), 'bar' );
+
+               title = new mw.Title( '.foo' );
+               assert.equal( title.getPrefixedText(), '.foo' );
+               assert.equal( title.getName(), '' );
+               assert.equal( title.getNameText(), '' );
+               assert.equal( title.getExtension(), 'foo' );
+               assert.equal( title.getDotExtension(), '.foo' );
+               assert.equal( title.getMain(), '.foo' );
+               assert.equal( title.getMainText(), '.foo' );
+               assert.equal( title.getPrefixedDb(), '.foo' );
+               assert.equal( title.getPrefixedText(), '.foo' );
        } );
 
        QUnit.test( 'Transformation', 11, function ( assert ) {
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..b530bb5 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -570,7 +570,7 @@ function wfThumbError( $status, $msg ) {
        } else {
                $debug = '';
        }
-       echo <<<EOT
+       $content = <<<EOT
 <!DOCTYPE html>
 <html><head>
 <meta charset="UTF-8" />
@@ -586,4 +586,6 @@ $debug
 </html>
 
 EOT;
+       header( 'Content-Length: ' . strlen( $content ) );
+       echo $content;
 }