Merge "Add two new debug log groups"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 14 Mar 2014 22:18:27 +0000 (22:18 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 14 Mar 2014 22:18:27 +0000 (22:18 +0000)
496 files changed:
.jshintignore
.travis.yml
RELEASE-NOTES-1.23
api.php
composer-example.json
docs/hooks.txt
img_auth.php
includes/Action.php [deleted file]
includes/AuthPlugin.php
includes/AutoLoader.php
includes/ChangesFeed.php
includes/DefaultSettings.php
includes/Export.php
includes/Feed.php
includes/GlobalFunctions.php
includes/Import.php
includes/MediaWikiVersionFetcher.php [new file with mode: 0644]
includes/Message.php
includes/PHPVersionError.php
includes/PathRouter.php
includes/PoolCounter.php
includes/Preferences.php
includes/ProtectionForm.php
includes/Sanitizer.php
includes/Setup.php
includes/SkinTemplate.php
includes/Title.php
includes/User.php
includes/WebRequest.php
includes/WebStart.php
includes/Wiki.php
includes/WikiMap.php
includes/WikiPage.php
includes/actions/Action.php [new file with mode: 0644]
includes/actions/FormAction.php [new file with mode: 0644]
includes/actions/FormlessAction.php [new file with mode: 0644]
includes/api/ApiBlock.php
includes/api/ApiComparePages.php
includes/api/ApiDelete.php
includes/api/ApiDisabled.php
includes/api/ApiExpandTemplates.php
includes/api/ApiFeedContributions.php
includes/api/ApiFeedRecentChanges.php [new file with mode: 0644]
includes/api/ApiFeedWatchlist.php
includes/api/ApiFileRevert.php
includes/api/ApiFormatBase.php
includes/api/ApiHelp.php
includes/api/ApiImageRotate.php
includes/api/ApiLogin.php
includes/api/ApiLogout.php
includes/api/ApiMain.php
includes/api/ApiMove.php
includes/api/ApiOpenSearch.php
includes/api/ApiOptions.php
includes/api/ApiParamInfo.php
includes/api/ApiParse.php
includes/api/ApiPatrol.php
includes/api/ApiProtect.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllCategories.php
includes/api/ApiQueryAllImages.php
includes/api/ApiQueryAllMessages.php
includes/api/ApiQueryAllPages.php
includes/api/ApiQueryAllUsers.php
includes/api/ApiQueryBacklinks.php
includes/api/ApiQueryBlocks.php
includes/api/ApiQueryCategories.php
includes/api/ApiQueryCategoryInfo.php
includes/api/ApiQueryCategoryMembers.php
includes/api/ApiQueryContributors.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryDuplicateFiles.php
includes/api/ApiQueryExtLinksUsage.php
includes/api/ApiQueryExternalLinks.php
includes/api/ApiQueryFilearchive.php
includes/api/ApiQueryIWBacklinks.php
includes/api/ApiQueryIWLinks.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryImages.php
includes/api/ApiQueryLangLinks.php
includes/api/ApiQueryLinks.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiQueryPagePropNames.php
includes/api/ApiQueryPageProps.php
includes/api/ApiQueryPagesWithProp.php
includes/api/ApiQueryProtectedTitles.php
includes/api/ApiQueryQueryPage.php
includes/api/ApiQueryRandom.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRedirects.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQuerySearch.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryStashImageInfo.php
includes/api/ApiQueryTags.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiQueryUsers.php
includes/api/ApiQueryWatchlist.php
includes/api/ApiQueryWatchlistRaw.php
includes/api/ApiRevisionDelete.php
includes/api/ApiRollback.php
includes/api/ApiRsd.php
includes/api/ApiRunJobs.php [new file with mode: 0644]
includes/api/ApiTokens.php
includes/api/ApiUnblock.php
includes/api/ApiUndelete.php
includes/api/ApiUpload.php
includes/api/ApiUserrights.php
includes/api/ApiWatch.php
includes/changes/EnhancedChangesList.php
includes/changes/OldChangesList.php
includes/changes/RCCacheEntryFactory.php [new file with mode: 0644]
includes/changes/RecentChange.php
includes/composer/ComposerHookHandler.php [new file with mode: 0644]
includes/composer/ComposerPackageModifier.php [new file with mode: 0644]
includes/composer/ComposerVersionNormalizer.php [new file with mode: 0644]
includes/content/AbstractContent.php
includes/content/Content.php
includes/content/ContentHandler.php
includes/content/CssContent.php
includes/content/CssContentHandler.php
includes/content/JavaScriptContent.php
includes/content/JavaScriptContentHandler.php
includes/content/MessageContent.php
includes/content/TextContent.php
includes/content/TextContentHandler.php
includes/content/WikitextContent.php
includes/content/WikitextContentHandler.php
includes/db/CloneDatabase.php
includes/db/Database.php
includes/db/DatabaseError.php
includes/db/DatabaseMssql.php
includes/db/DatabaseMysqli.php
includes/db/DatabaseOracle.php
includes/db/DatabaseSqlite.php
includes/diff/ArrayDiffFormatter.php
includes/diff/DairikiDiff.php
includes/diff/DiffFormatter.php
includes/diff/DifferenceEngine.php
includes/diff/TableDiffFormatter.php
includes/diff/UnifiedDiffFormatter.php
includes/diff/WikiDiff3.php
includes/filebackend/SwiftFileBackend.php
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLFormField.php
includes/htmlform/HTMLMultiSelectField.php
includes/htmlform/HTMLRadioField.php
includes/htmlform/HTMLSelectAndOtherField.php
includes/htmlform/HTMLSelectField.php
includes/htmlform/HTMLSelectOrOtherField.php
includes/htmlform/HTMLTextField.php
includes/installer/InstallDocFormatter.php
includes/installer/Installer.i18n.php
includes/installer/LocalSettingsGenerator.php
includes/installer/OracleUpdater.php
includes/installer/WebInstallerOutput.php
includes/installer/WebInstallerPage.php
includes/job/JobQueue.php
includes/job/JobQueueRedis.php
includes/libs/CSSMin.php
includes/libs/lessc.inc.php
includes/logging/LogEventsList.php
includes/logging/LogPage.php
includes/logging/LogPager.php
includes/media/DjVuImage.php
includes/media/Jpeg.php
includes/normal/RandomTest.php
includes/normal/Utf8Test.php
includes/normal/UtfNormal.php
includes/normal/UtfNormalBench.php
includes/normal/UtfNormalGenerate.php
includes/normal/UtfNormalMemStress.php
includes/normal/UtfNormalTest.php
includes/normal/UtfNormalUtil.php
includes/objectcache/BagOStuff.php
includes/objectcache/MemcachedBagOStuff.php
includes/objectcache/MemcachedPeclBagOStuff.php
includes/objectcache/RedisBagOStuff.php
includes/parser/CoreTagHooks.php
includes/parser/Parser.php
includes/rcfeed/IRCColourfulRCFeedFormatter.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/search/SearchEngine.php
includes/search/SearchMySQL.php
includes/search/SearchOracle.php
includes/search/SearchPostgres.php
includes/site/SiteList.php
includes/specialpage/ChangesListSpecialPage.php
includes/specials/SpecialContributions.php
includes/specials/SpecialDeletedContributions.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialImport.php
includes/specials/SpecialPrefixindex.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRecentchangeslinked.php
includes/specials/SpecialRevisiondelete.php
includes/specials/SpecialSearch.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialVersion.php
includes/templates/NoLocalSettings.php
includes/templates/Usercreate.php
includes/templates/Userlogin.php
includes/upload/UploadBase.php
languages/LanguageConverter.php
languages/classes/LanguageUz.php
languages/messages/MessagesAn.php
languages/messages/MessagesAng.php
languages/messages/MessagesAr.php
languages/messages/MessagesAry.php
languages/messages/MessagesArz.php
languages/messages/MessagesAst.php
languages/messages/MessagesBcl.php
languages/messages/MessagesBe.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBg.php
languages/messages/MessagesBn.php
languages/messages/MessagesBo.php
languages/messages/MessagesBr.php
languages/messages/MessagesBs.php
languages/messages/MessagesCa.php
languages/messages/MessagesCe.php
languages/messages/MessagesCkb.php
languages/messages/MessagesCo.php
languages/messages/MessagesCs.php
languages/messages/MessagesCsb.php
languages/messages/MessagesCu.php
languages/messages/MessagesCy.php
languages/messages/MessagesDa.php
languages/messages/MessagesDe.php
languages/messages/MessagesDiq.php
languages/messages/MessagesDsb.php
languages/messages/MessagesEgl.php
languages/messages/MessagesEl.php
languages/messages/MessagesEn.php
languages/messages/MessagesEo.php
languages/messages/MessagesEs.php
languages/messages/MessagesEt.php
languages/messages/MessagesEu.php
languages/messages/MessagesFa.php
languages/messages/MessagesFi.php
languages/messages/MessagesFr.php
languages/messages/MessagesFrp.php
languages/messages/MessagesFrr.php
languages/messages/MessagesGl.php
languages/messages/MessagesGsw.php
languages/messages/MessagesGu.php
languages/messages/MessagesHaw.php
languages/messages/MessagesHe.php
languages/messages/MessagesHi.php
languages/messages/MessagesHr.php
languages/messages/MessagesHsb.php
languages/messages/MessagesHu.php
languages/messages/MessagesHy.php
languages/messages/MessagesIa.php
languages/messages/MessagesId.php
languages/messages/MessagesIe.php
languages/messages/MessagesIlo.php
languages/messages/MessagesIs.php
languages/messages/MessagesIt.php
languages/messages/MessagesJa.php
languages/messages/MessagesKa.php
languages/messages/MessagesKab.php
languages/messages/MessagesKk_cyrl.php
languages/messages/MessagesKm.php
languages/messages/MessagesKo.php
languages/messages/MessagesKrc.php
languages/messages/MessagesKsh.php
languages/messages/MessagesLad.php
languages/messages/MessagesLb.php
languages/messages/MessagesLez.php
languages/messages/MessagesLrc.php
languages/messages/MessagesLt.php
languages/messages/MessagesLzh.php
languages/messages/MessagesMg.php
languages/messages/MessagesMk.php
languages/messages/MessagesMl.php
languages/messages/MessagesMn.php
languages/messages/MessagesMr.php
languages/messages/MessagesMs.php
languages/messages/MessagesNap.php
languages/messages/MessagesNb.php
languages/messages/MessagesNds_nl.php
languages/messages/MessagesNe.php
languages/messages/MessagesNl.php
languages/messages/MessagesNn.php
languages/messages/MessagesOc.php
languages/messages/MessagesPl.php
languages/messages/MessagesPms.php
languages/messages/MessagesPs.php
languages/messages/MessagesPt.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesQqq.php
languages/messages/MessagesQu.php
languages/messages/MessagesRm.php
languages/messages/MessagesRo.php
languages/messages/MessagesRoa_tara.php
languages/messages/MessagesRu.php
languages/messages/MessagesRue.php
languages/messages/MessagesSa.php
languages/messages/MessagesSc.php
languages/messages/MessagesSco.php
languages/messages/MessagesSi.php
languages/messages/MessagesSk.php
languages/messages/MessagesSl.php
languages/messages/MessagesSo.php
languages/messages/MessagesSq.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSr_el.php
languages/messages/MessagesSu.php
languages/messages/MessagesSv.php
languages/messages/MessagesSw.php
languages/messages/MessagesTa.php
languages/messages/MessagesTe.php
languages/messages/MessagesTh.php
languages/messages/MessagesTk.php
languages/messages/MessagesTl.php
languages/messages/MessagesTr.php
languages/messages/MessagesTt_cyrl.php
languages/messages/MessagesUg_arab.php
languages/messages/MessagesUk.php
languages/messages/MessagesUz.php
languages/messages/MessagesVi.php
languages/messages/MessagesVot.php
languages/messages/MessagesYi.php
languages/messages/MessagesYue.php
languages/messages/MessagesZh.php
languages/messages/MessagesZh_cn.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
languages/messages/MessagesZh_hk.php
languages/messages/MessagesZh_mo.php
languages/messages/MessagesZh_sg.php
languages/messages/MessagesZh_tw.php
maintenance/attachLatest.php
maintenance/doMaintenance.php
maintenance/importTextFile.php
maintenance/install.php
maintenance/jsduck/categories.json
maintenance/jsduck/config.json
maintenance/language/messageTypes.inc
maintenance/language/messages.inc
maintenance/namespaceDupes.php
maintenance/oracle/archives/patch-user_password_expire.sql [new file with mode: 0644]
maintenance/orphans.php
maintenance/postgres/tables.sql
maintenance/rebuildFileCache.php
maintenance/rebuildtextindex.php
maintenance/runJobs.php
maintenance/showCacheStats.php
maintenance/update.php
resources/Resources.php
resources/jquery/jquery.client.js
resources/jquery/jquery.color.js
resources/jquery/jquery.hidpi.js
resources/jquery/jquery.localize.js
resources/jquery/jquery.tablesorter.js
resources/mediawiki.api/mediawiki.api.category.js
resources/mediawiki.api/mediawiki.api.edit.js
resources/mediawiki.api/mediawiki.api.js
resources/mediawiki.api/mediawiki.api.parse.js
resources/mediawiki.api/mediawiki.api.watch.js
resources/mediawiki.less/mediawiki.mixins.animation.less [new file with mode: 0644]
resources/mediawiki.less/mediawiki.mixins.rotation.less
resources/mediawiki.libs/CLDRPluralRuleParser.js
resources/mediawiki.page/mediawiki.page.watch.ajax.js
resources/mediawiki.special/mediawiki.special.css
resources/mediawiki.special/mediawiki.special.userlogin.signup.js
resources/mediawiki.ui/components/default/forms.less
resources/mediawiki.ui/mixins/forms.less
resources/mediawiki/mediawiki.debug.css [deleted file]
resources/mediawiki/mediawiki.debug.js
resources/mediawiki/mediawiki.debug.less [new file with mode: 0644]
resources/mediawiki/mediawiki.feedback.js
resources/mediawiki/mediawiki.hlist.css
resources/mediawiki/mediawiki.hlist.js
resources/mediawiki/mediawiki.js
resources/mediawiki/mediawiki.notification.css
resources/mediawiki/mediawiki.searchSuggest.js
resources/mediawiki/mediawiki.toc.js
resources/mediawiki/mediawiki.user.js
resources/oojs-ui/i18n/ast.json
resources/oojs-ui/i18n/bg.json
resources/oojs-ui/i18n/ce.json
resources/oojs-ui/i18n/cs.json
resources/oojs-ui/i18n/cu.json
resources/oojs-ui/i18n/de.json
resources/oojs-ui/i18n/en.json
resources/oojs-ui/i18n/fa.json
resources/oojs-ui/i18n/fi.json
resources/oojs-ui/i18n/fr.json
resources/oojs-ui/i18n/gl.json
resources/oojs-ui/i18n/he.json
resources/oojs-ui/i18n/hsb.json
resources/oojs-ui/i18n/hu.json
resources/oojs-ui/i18n/hy.json
resources/oojs-ui/i18n/ilo.json
resources/oojs-ui/i18n/is.json
resources/oojs-ui/i18n/it.json
resources/oojs-ui/i18n/ja.json
resources/oojs-ui/i18n/ka.json
resources/oojs-ui/i18n/ko.json
resources/oojs-ui/i18n/lb.json
resources/oojs-ui/i18n/lt.json
resources/oojs-ui/i18n/mk.json
resources/oojs-ui/i18n/nl.json
resources/oojs-ui/i18n/om.json
resources/oojs-ui/i18n/pl.json
resources/oojs-ui/i18n/pt.json
resources/oojs-ui/i18n/qqq.json
resources/oojs-ui/i18n/ro.json
resources/oojs-ui/i18n/ru.json
resources/oojs-ui/i18n/sl.json
resources/oojs-ui/i18n/sq.json
resources/oojs-ui/i18n/sr-ec.json
resources/oojs-ui/i18n/sv.json
resources/oojs-ui/i18n/uk.json
resources/oojs-ui/i18n/vi.json
resources/oojs-ui/i18n/zh-hans.json
resources/oojs-ui/i18n/zh-hant.json
resources/oojs-ui/images/icons/add-item.png
resources/oojs-ui/images/icons/add-item.svg
resources/oojs-ui/oojs-ui-apex.css [new file with mode: 0644]
resources/oojs-ui/oojs-ui.js
resources/oojs-ui/oojs-ui.svg.css
resources/oojs-ui/update-oojs-ui.sh
resources/oojs/oojs.js
resources/oojs/update-oojs.sh
resources/sinonjs/sinon-1.8.1.js [deleted file]
resources/sinonjs/sinon-1.9.0.js [new file with mode: 0644]
resources/sinonjs/sinon-ie-1.8.1.js [deleted file]
resources/sinonjs/sinon-ie-1.9.0.js [new file with mode: 0644]
skins/CologneBlue.php
skins/MonoBook.php
skins/Vector.php
skins/cologneblue/screen.css
skins/monobook/main.css
skins/vector/components/animations.less [new file with mode: 0644]
skins/vector/components/common.less
skins/vector/components/search.less
skins/vector/styles.less
tests/TestsAutoLoader.php
tests/parser/parserTest.inc
tests/parser/parserTests.txt
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/ResourceLoaderTestCase.php [new file with mode: 0644]
tests/phpunit/docs/ExportDemoTest.php
tests/phpunit/includes/LinksUpdateTest.php
tests/phpunit/includes/MediaWikiVersionFetcherTest.php [new file with mode: 0644]
tests/phpunit/includes/MessageTest.php
tests/phpunit/includes/ResourceLoaderModuleTest.php [deleted file]
tests/phpunit/includes/ResourceLoaderTest.php [deleted file]
tests/phpunit/includes/RevisionStorageTest.php
tests/phpunit/includes/SampleTest.php
tests/phpunit/includes/SkinTemplateTest.php [new file with mode: 0644]
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/WikiPageTest.php
tests/phpunit/includes/XmlTest.php
tests/phpunit/includes/api/ApiEditPageTest.php
tests/phpunit/includes/changes/RCCacheEntryFactoryTest.php [new file with mode: 0644]
tests/phpunit/includes/changes/RecentChangeTest.php
tests/phpunit/includes/composer/ComposerVersionNormalizerTest.php [new file with mode: 0644]
tests/phpunit/includes/diff/ArrayDiffFormatterTest.php [new file with mode: 0644]
tests/phpunit/includes/diff/DiffOpTest.php [new file with mode: 0644]
tests/phpunit/includes/diff/DiffTest.php [new file with mode: 0644]
tests/phpunit/includes/diff/DifferenceEngineTest.php
tests/phpunit/includes/diff/FakeDiffOp.php [new file with mode: 0644]
tests/phpunit/includes/exception/ErrorPageErrorTest.php [new file with mode: 0644]
tests/phpunit/includes/exception/MWExceptionTest.php
tests/phpunit/includes/exception/ReadOnlyErrorTest.php [new file with mode: 0644]
tests/phpunit/includes/exception/UserNotLoggedInTest.php [new file with mode: 0644]
tests/phpunit/includes/installer/InstallDocFormatterTest.php
tests/phpunit/includes/libs/RunningStatTest.php
tests/phpunit/includes/objectcache/BagOStuffTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderModuleTest.php [new file with mode: 0644]
tests/phpunit/includes/resourceloader/ResourceLoaderStartupModuleTest.php [new file with mode: 0644]
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php [new file with mode: 0644]
tests/phpunit/includes/site/SiteListTest.php
tests/phpunit/includes/upload/UploadFromUrlTest.php
tests/phpunit/includes/utils/UIDGeneratorTest.php
tests/phpunit/languages/SpecialPageAliasTest.php [new file with mode: 0644]
tests/phpunit/phpunit.php
tests/phpunit/structure/StructureTest.php
tests/phpunit/tests/MediaWikiTestCaseTest.php [new file with mode: 0644]
tests/qunit/QUnitTestResources.php
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/jquery/jquery.color.test.js [new file with mode: 0644]
tests/qunit/suites/resources/jquery/jquery.delayedBind.test.js [deleted file]
tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js
tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.parse.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.watch.test.js [new file with mode: 0644]
tests/testHelpers.inc

index 0e3c679..a44a4d4 100644 (file)
@@ -16,6 +16,7 @@ resources/jquery/jquery.cookie.js
 resources/jquery/jquery.cycle.all.js
 resources/jquery/jquery.farbtastic.js
 resources/jquery/jquery.form.js
+resources/jquery/jquery.fullscreen.js
 resources/jquery/jquery.hoverIntent.js
 resources/jquery/jquery.js
 resources/jquery/jquery.json.js
index 84fa456..eb05fe2 100644 (file)
@@ -4,12 +4,21 @@
 # The Wikimedia Foundation uses a self-hosted Jenkins instance to run unit
 # tests, but it tests code against the version of PHP that is deployed on
 # Wikimedia's production cluster. This Travis CI configuration is designed to
-# complement that setup by testing MediaWiki against HHVM.
+# complement that setup by testing MediaWiki on travis
 #
 language: php
 
 php:
   - hhvm
+  - 5.3
+  - 5.4
+  - 5.5
+
+matrix:
+  allow_failures:
+    - php: 5.3
+    - php: 5.4
+    - php: 5.5
 
 services:
   - mysql
@@ -29,7 +38,7 @@ before_script:
   # Travis CI's HHVM environment provides PHPUnit as a phar file, but
   # MediaWiki's test suite only works if individual PHPUnit files are
   # actual files on disk (bug 58881).
-  - composer require 'phpunit/phpunit=3.7.*'
+  - composer require 'phpunit/phpunit=3.7.*' --prefer-source
   - >
       php maintenance/install.php testwiki admin
       --pass travis
@@ -40,7 +49,13 @@ before_script:
 
 script:
   - >
-      hhvm --php
-      -d include_path=".$(printf ':%s' vendor/phpunit/*)"
-      -d date.timezone="Etc/UTC"
-      tests/phpunit/phpunit.php
+      if [ "$TRAVIS_PHP_VERSION" = "hhvm" ];
+      then
+        hhvm --php \
+        -d include_path=".$(printf ':%s' vendor/phpunit/*)" \
+        -d date.timezone="Etc/UTC" \
+        tests/phpunit/phpunit.php
+      else
+        php tests/phpunit/phpunit.php \
+        --with-phpunitdir ./vendor/phpunit/phpunit
+      fi
index 4f29097..379b219 100644 (file)
@@ -9,6 +9,9 @@ MediaWiki 1.23 is an alpha-quality branch and is not recommended for use in
 production.
 
 === Configuration changes in 1.23 ===
+* When $wgJobRunRate is higher that zero, jobs are now executed via an
+  asynchronous HTTP request to a MediaWiki entry point. This may require
+  increasing the number of server worker threads.
 * $wgDebugLogGroups values may be set to an associative array with a
   'destination' key specifying the log destination. The array may also contain
   a 'sample' key with a positive integer value N indicating that the log group
@@ -38,6 +41,13 @@ production.
 * $wgSkipSkin, which has been replaceable by $wgSkipSkins since 2005 (r9249), is
   now formally deprecated.
 * Removed deprecated $wgDisabledActions as it is hardly used anywhere.
+* $wgRateLimitLog has been deprecated and replaced by
+  $wgDebugLogGroup['ratelimit'].
+* $wgLocalInterwikis is an array containing multiple local interwiki prefixes
+  (interwiki prefixes that point back to the current wiki). This effectively
+  allows more than one value of $wgLocalInterwiki to be specified and
+  understood by the parser. The value of $wgLocalInterwiki is automatically
+  prepended to the start of this array.
 
 === New features in 1.23 ===
 * ResourceLoader can utilize the Web Storage API to cache modules client-side.
@@ -109,6 +119,13 @@ production.
   $wgPasswordExpirationDays configuration setting.
 * Add new hook SendWatchlistEmailNotification, this will be used to determine
   whether to send a watchlist email notification.
+* (bug 42026) Special:Contributions now includes an option to filter page
+  creations, similar to the topOnly option.
+* Add mediawiki.ui.button styling to all pages so wiki content can use styled
+  buttons.
+* Special:UserLogin/signup now does AJAX checks for invalid and taken usernames,
+  displaying the error live.
+* Added BaseTemplateAfterPortlet hook to allow injecting html after portlets in skins.
 
 === Bug fixes in 1.23 ===
 * (bug 41759) The "updated since last visit" markers (on history pages, recent
@@ -146,6 +163,11 @@ production.
   message instead of leading the user to make a null edit.
 * (bug 52659) mediawiki.notification: Notification area remained visible when
   empty and thus was stealing pointer events from links on the page.
+* (bug 26811) When a DBUnexpectedError occurs, DB server hostnames are now
+  hidden unless $wgShowExceptionDetails is true, and $wgShowDBErrorBacktrace
+  no longer applies in such cases.
+* (bug 60960) Avoid doing file_exist() checks on data: URIs, as they cause
+  warnings to be printed on Windows due to large path length.
 
 === Web API changes in 1.23 ===
 * (bug 54884) action=parse&prop=categories now indicates hidden and missing
@@ -193,6 +215,9 @@ production.
 * Added llprop=langname and llprop=autonym for action=query&prop=langlinks.
 * prop=redirects is added, to return redirects to the pages in the query.
 * list=allredirects is added, to list all redirects pointing to a namespace.
+* (bug 42026) Added ucshow={new,!new,top,!top} to list=usercontribs.
+  Also added newonly to action=feedcontributions.
+* (bug 42026) Deprecated uctoponly in favor of ucshow=top.
 
 === Languages updated in 1.23 ===
 
@@ -256,6 +281,24 @@ changes to languages because of Bugzilla reports.
   object expects this column to exist. Use update.php to create this new field.
 * The jquery.delayedBind ResourceLoader module was deprecated in favor of the
   jquery.throttle-debounce module. It will be removed in MediaWiki 1.24.
+* mw.user.bucket has been deprecated.
+* On Special:PrefixIndex, a table#mw-prefixindex-list-table was changed to
+  table.mw-prefixindex-list-table to avoid duplicate ids when the special page
+  is transcluded.
+* (bug 62198) window.$j has been deprecated.
+* Preference "Disable link title conversion" was removed.
+* SpecialRecentChanges no longer includes any functionality for generating feeds
+  - it has been factored out to ApiFeedRecentChanges. Old URLs redirect to new
+  ones.
+* RecentChange::mExtra['lang'] is no longer set and should no longer be used.
+  Extensions should read from other configuration variables, including
+  $wgLocalInterwikis, to identify the current wiki.
+* Sections in the parser test framework have been renamed and the old
+  section names are deprecated.  Please use "!!wikitext" and "!!html"
+  (or "!!html/php") instead of "!!input" and "!!result".  This allows
+  us to extend parser tests to accommodate additional input/output
+  pairs, such as "!!html/parsoid" (for the output of the Parsoid
+  parser, where it differs from the PHP parser).
 
 ==== Removed classes ====
 * FakeMemCachedClient (deprecated in 1.18)
diff --git a/api.php b/api.php
index 0d2312a..554c272 100644 (file)
--- a/api.php
+++ b/api.php
@@ -70,10 +70,21 @@ $wgTitle = Title::makeTitle( NS_MAIN, 'API' );
 $processor = new ApiMain( RequestContext::getMain(), $wgEnableWriteAPI );
 
 // Last chance hook before executing the API
-wfRunHooks( 'ApiBeforeMain', array( &$processor ) );
+try {
+       wfRunHooks( 'ApiBeforeMain', array( &$processor ) );
+       if ( !$processor instanceof ApiMain ) {
+               throw new MWException( 'ApiBeforMain hook set $processor to a non-ApiMain class' );
+       }
+} catch ( Exception $e ) {
+       // Crap. Try to report the exception in API format to be friendly to clients.
+       ApiMain::handleApiBeforeMainException( $e );
+       $processor = false;
+}
 
 // Process data & print results
-$processor->execute();
+if ( $processor ) {
+       $processor->execute();
+}
 
 if ( function_exists( 'fastcgi_finish_request' ) ) {
        fastcgi_finish_request();
@@ -97,11 +108,15 @@ if ( $wgAPIRequestLog ) {
                $_SERVER['HTTP_USER_AGENT']
        );
        $items[] = $wgRequest->wasPosted() ? 'POST' : 'GET';
-       $module = $processor->getModule();
-       if ( $module->mustBePosted() ) {
-               $items[] = "action=" . $wgRequest->getVal( 'action' );
+       if ( $processor ) {
+               $module = $processor->getModule();
+               if ( $module->mustBePosted() ) {
+                       $items[] = "action=" . $wgRequest->getVal( 'action' );
+               } else {
+                       $items[] = wfArrayToCgi( $wgRequest->getValues() );
+               }
        } else {
-               $items[] = wfArrayToCgi( $wgRequest->getValues() );
+               $items[] = "failed in ApiBeforeMain";
        }
        wfErrorLog( implode( ',', $items ) . "\n", $wgAPIRequestLog );
        wfDebug( "Logged API request to $wgAPIRequestLog\n" );
index cf63678..85304c1 100644 (file)
@@ -7,5 +7,14 @@
                "ext-mbstring": "Faster unicode handling",
                "ext-wikidiff2": "Faster diff generation",
                "ext-apc": "Speed up MediaWiki with opcode caching (before PHP 5.5)"
+       },
+       "autoload": {
+               "psr-0": {
+                       "ComposerHookHandler": "includes/composer"
+               }
+       },
+       "scripts": {
+               "pre-update-cmd": "ComposerHookHandler::onPreUpdate",
+               "pre-install-cmd": "ComposerHookHandler::onPreInstall"
        }
 }
index e7fa89b..a833484 100644 (file)
@@ -709,6 +709,12 @@ pages or galleries in category pages.
 $name: Image name being checked
 &$bad: Whether or not the image is "bad"
 
+'BaseTemplateAfterPortlet': After output of portlets, allow injecting
+custom HTML after the section. Any uses of the hook need to handle escaping.
+$template BaseTemplate
+$portlet: string portlet name
+&$html: string
+
 'BeforeDisplayNoArticleText': Before displaying message key "noarticletext" or
 "noarticletext-nopermission" at Article::showMissingArticle().
 $article: article object
index 72a7dab..7765dd3 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * Image authorisation script
  *
- * To use this, see http://www.mediawiki.org/wiki/Manual:Image_Authorization
+ * To use this, see https://www.mediawiki.org/wiki/Manual:Image_Authorization
  *
  * - Set $wgUploadDirectory to a non-public directory (not web accessible)
  * - Set $wgUploadPath to point to this file
diff --git a/includes/Action.php b/includes/Action.php
deleted file mode 100644 (file)
index 72be46f..0000000
+++ /dev/null
@@ -1,600 +0,0 @@
-<?php
-/**
- * Base classes for actions done on pages.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
- *
- * @file
- */
-
-/**
- * @defgroup Actions Action done on pages
- */
-
-/**
- * Actions are things which can be done to pages (edit, delete, rollback, etc).  They
- * are distinct from Special Pages because an action must apply to exactly one page.
- *
- * To add an action in an extension, create a subclass of Action, and add the key to
- * $wgActions.  There is also the deprecated UnknownAction hook
- *
- * Actions generally fall into two groups: the show-a-form-then-do-something-with-the-input
- * format (protect, delete, move, etc), and the just-do-something format (watch, rollback,
- * patrol, etc). The FormAction and FormlessAction classes represent these two groups.
- */
-abstract class Action {
-
-       /**
-        * Page on which we're performing the action
-        * @var WikiPage|Article|ImagePage|CategoryPage|Page $page
-        */
-       protected $page;
-
-       /**
-        * IContextSource if specified; otherwise we'll use the Context from the Page
-        * @var IContextSource $context
-        */
-       protected $context;
-
-       /**
-        * The fields used to create the HTMLForm
-        * @var Array $fields
-        */
-       protected $fields;
-
-       /**
-        * Get the Action subclass which should be used to handle this action, false if
-        * the action is disabled, or null if it's not recognised
-        * @param $action String
-        * @param $overrides Array
-        * @return bool|null|string|callable
-        */
-       final private static function getClass( $action, array $overrides ) {
-               global $wgActions;
-               $action = strtolower( $action );
-
-               if ( !isset( $wgActions[$action] ) ) {
-                       return null;
-               }
-
-               if ( $wgActions[$action] === false ) {
-                       return false;
-               } elseif ( $wgActions[$action] === true && isset( $overrides[$action] ) ) {
-                       return $overrides[$action];
-               } elseif ( $wgActions[$action] === true ) {
-                       return ucfirst( $action ) . 'Action';
-               } else {
-                       return $wgActions[$action];
-               }
-       }
-
-       /**
-        * Get an appropriate Action subclass for the given action
-        * @param $action String
-        * @param $page Page
-        * @param $context IContextSource
-        * @return Action|bool|null false if the action is disabled, null
-        *     if it is not recognised
-        */
-       final public static function factory( $action, Page $page, IContextSource $context = null ) {
-               $classOrCallable = self::getClass( $action, $page->getActionOverrides() );
-
-               if ( is_string( $classOrCallable ) ) {
-                       $obj = new $classOrCallable( $page, $context );
-                       return $obj;
-               }
-
-               if ( is_callable( $classOrCallable ) ) {
-                       return call_user_func_array( $classOrCallable, array( $page, $context ) );
-               }
-
-               return $classOrCallable;
-       }
-
-       /**
-        * Get the action that will be executed, not necessarily the one passed
-        * passed through the "action" request parameter. Actions disabled in
-        * $wgActions will be replaced by "nosuchaction".
-        *
-        * @since 1.19
-        * @param $context IContextSource
-        * @return string: action name
-        */
-       final public static function getActionName( IContextSource $context ) {
-               global $wgActions;
-
-               $request = $context->getRequest();
-               $actionName = $request->getVal( 'action', 'view' );
-
-               // Check for disabled actions
-               if ( isset( $wgActions[$actionName] ) && $wgActions[$actionName] === false ) {
-                       $actionName = 'nosuchaction';
-               }
-
-               // Workaround for bug #20966: inability of IE to provide an action dependent
-               // on which submit button is clicked.
-               if ( $actionName === 'historysubmit' ) {
-                       if ( $request->getBool( 'revisiondelete' ) ) {
-                               $actionName = 'revisiondelete';
-                       } else {
-                               $actionName = 'view';
-                       }
-               } elseif ( $actionName == 'editredlink' ) {
-                       $actionName = 'edit';
-               }
-
-               // Trying to get a WikiPage for NS_SPECIAL etc. will result
-               // in WikiPage::factory throwing "Invalid or virtual namespace -1 given."
-               // For SpecialPages et al, default to action=view.
-               if ( !$context->canUseWikiPage() ) {
-                       return 'view';
-               }
-
-               $action = Action::factory( $actionName, $context->getWikiPage(), $context );
-               if ( $action instanceof Action ) {
-                       return $action->getName();
-               }
-
-               return 'nosuchaction';
-       }
-
-       /**
-        * Check if a given action is recognised, even if it's disabled
-        *
-        * @param string $name name of an action
-        * @return Bool
-        */
-       final public static function exists( $name ) {
-               return self::getClass( $name, array() ) !== null;
-       }
-
-       /**
-        * Get the IContextSource in use here
-        * @return IContextSource
-        */
-       final public function getContext() {
-               if ( $this->context instanceof IContextSource ) {
-                       return $this->context;
-               } elseif ( $this->page instanceof Article ) {
-                       // NOTE: $this->page can be a WikiPage, which does not have a context.
-                       wfDebug( __METHOD__ . ': no context known, falling back to Article\'s context.' );
-                       return $this->page->getContext();
-               }
-
-               wfWarn( __METHOD__ . ': no context known, falling back to RequestContext::getMain().' );
-               return RequestContext::getMain();
-       }
-
-       /**
-        * Get the WebRequest being used for this instance
-        *
-        * @return WebRequest
-        */
-       final public function getRequest() {
-               return $this->getContext()->getRequest();
-       }
-
-       /**
-        * Get the OutputPage being used for this instance
-        *
-        * @return OutputPage
-        */
-       final public function getOutput() {
-               return $this->getContext()->getOutput();
-       }
-
-       /**
-        * Shortcut to get the User being used for this instance
-        *
-        * @return User
-        */
-       final public function getUser() {
-               return $this->getContext()->getUser();
-       }
-
-       /**
-        * Shortcut to get the Skin being used for this instance
-        *
-        * @return Skin
-        */
-       final public function getSkin() {
-               return $this->getContext()->getSkin();
-       }
-
-       /**
-        * Shortcut to get the user Language being used for this instance
-        *
-        * @return Language
-        */
-       final public function getLanguage() {
-               return $this->getContext()->getLanguage();
-       }
-
-       /**
-        * Shortcut to get the user Language being used for this instance
-        *
-        * @deprecated since 1.19 Use getLanguage instead
-        * @return Language
-        */
-       final public function getLang() {
-               wfDeprecated( __METHOD__, '1.19' );
-               return $this->getLanguage();
-       }
-
-       /**
-        * Shortcut to get the Title object from the page
-        * @return Title
-        */
-       final public function getTitle() {
-               return $this->page->getTitle();
-       }
-
-       /**
-        * Get a Message object with context set
-        * Parameters are the same as wfMessage()
-        *
-        * @return Message object
-        */
-       final public function msg() {
-               $params = func_get_args();
-               return call_user_func_array( array( $this->getContext(), 'msg' ), $params );
-       }
-
-       /**
-        * Constructor.
-        *
-        * Only public since 1.21
-        *
-        * @param $page Page
-        * @param $context IContextSource
-        */
-       public function __construct( Page $page, IContextSource $context = null ) {
-               if ( $context === null ) {
-                       wfWarn( __METHOD__ . ' called without providing a Context object.' );
-                       // NOTE: We could try to initialize $context using $page->getContext(),
-                       //      if $page is an Article. That however seems to not work seamlessly.
-               }
-
-               $this->page = $page;
-               $this->context = $context;
-       }
-
-       /**
-        * Return the name of the action this object responds to
-        * @return String lowercase
-        */
-       abstract public function getName();
-
-       /**
-        * Get the permission required to perform this action.  Often, but not always,
-        * the same as the action name
-        * @return String|null
-        */
-       public function getRestriction() {
-               return null;
-       }
-
-       /**
-        * Checks if the given user (identified by an object) can perform this action.  Can be
-        * overridden by sub-classes with more complicated permissions schemes.  Failures here
-        * must throw subclasses of ErrorPageError
-        *
-        * @param $user User: the user to check, or null to use the context user
-        * @throws UserBlockedError|ReadOnlyError|PermissionsError
-        * @return bool True on success
-        */
-       protected function checkCanExecute( User $user ) {
-               $right = $this->getRestriction();
-               if ( $right !== null ) {
-                       $errors = $this->getTitle()->getUserPermissionsErrors( $right, $user );
-                       if ( count( $errors ) ) {
-                               throw new PermissionsError( $right, $errors );
-                       }
-               }
-
-               if ( $this->requiresUnblock() && $user->isBlocked() ) {
-                       $block = $user->getBlock();
-                       throw new UserBlockedError( $block );
-               }
-
-               // This should be checked at the end so that the user won't think the
-               // error is only temporary when he also don't have the rights to execute
-               // this action
-               if ( $this->requiresWrite() && wfReadOnly() ) {
-                       throw new ReadOnlyError();
-               }
-               return true;
-       }
-
-       /**
-        * Whether this action requires the wiki not to be locked
-        * @return Bool
-        */
-       public function requiresWrite() {
-               return true;
-       }
-
-       /**
-        * Whether this action can still be executed by a blocked user
-        * @return Bool
-        */
-       public function requiresUnblock() {
-               return true;
-       }
-
-       /**
-        * Set output headers for noindexing etc.  This function will not be called through
-        * the execute() entry point, so only put UI-related stuff in here.
-        */
-       protected function setHeaders() {
-               $out = $this->getOutput();
-               $out->setRobotPolicy( "noindex,nofollow" );
-               $out->setPageTitle( $this->getPageTitle() );
-               $this->getOutput()->setSubtitle( $this->getDescription() );
-               $out->setArticleRelated( true );
-       }
-
-       /**
-        * Returns the name that goes in the \<h1\> page title
-        *
-        * @return String
-        */
-       protected function getPageTitle() {
-               return $this->getTitle()->getPrefixedText();
-       }
-
-       /**
-        * Returns the description that goes below the \<h1\> tag
-        *
-        * @return String
-        */
-       protected function getDescription() {
-               return $this->msg( strtolower( $this->getName() ) )->escaped();
-       }
-
-       /**
-        * The main action entry point.  Do all output for display and send it to the context
-        * output.  Do not use globals $wgOut, $wgRequest, etc, in implementations; use
-        * $this->getOutput(), etc.
-        * @throws ErrorPageError
-        */
-       abstract public function show();
-
-       /**
-        * Execute the action in a silent fashion: do not display anything or release any errors.
-        * @return Bool whether execution was successful
-        */
-       abstract public function execute();
-}
-
-/**
- * An action which shows a form and does something based on the input from the form
- */
-abstract class FormAction extends Action {
-
-       /**
-        * Get an HTMLForm descriptor array
-        * @return Array
-        */
-       abstract protected function getFormFields();
-
-       /**
-        * Add pre- or post-text to the form
-        * @return String HTML which will be sent to $form->addPreText()
-        */
-       protected function preText() {
-               return '';
-       }
-
-       /**
-        * @return string
-        */
-       protected function postText() {
-               return '';
-       }
-
-       /**
-        * Play with the HTMLForm if you need to more substantially
-        * @param $form HTMLForm
-        */
-       protected function alterForm( HTMLForm $form ) {
-       }
-
-       /**
-        * Get the HTMLForm to control behavior
-        * @return HTMLForm|null
-        */
-       protected function getForm() {
-               $this->fields = $this->getFormFields();
-
-               // Give hooks a chance to alter the form, adding extra fields or text etc
-               wfRunHooks( 'ActionModifyFormFields', array( $this->getName(), &$this->fields, $this->page ) );
-
-               $form = new HTMLForm( $this->fields, $this->getContext(), $this->getName() );
-               $form->setSubmitCallback( array( $this, 'onSubmit' ) );
-
-               // Retain query parameters (uselang etc)
-               $form->addHiddenField( 'action', $this->getName() ); // Might not be the same as the query string
-               $params = array_diff_key(
-                       $this->getRequest()->getQueryValues(),
-                       array( 'action' => null, 'title' => null )
-               );
-               $form->addHiddenField( 'redirectparams', wfArrayToCgi( $params ) );
-
-               $form->addPreText( $this->preText() );
-               $form->addPostText( $this->postText() );
-               $this->alterForm( $form );
-
-               // Give hooks a chance to alter the form, adding extra fields or text etc
-               wfRunHooks( 'ActionBeforeFormDisplay', array( $this->getName(), &$form, $this->page ) );
-
-               return $form;
-       }
-
-       /**
-        * Process the form on POST submission.  If you return false from getFormFields(),
-        * this will obviously never be reached.  If you don't want to do anything with the
-        * form, just return false here
-        * @param  $data Array
-        * @return Bool|Array true for success, false for didn't-try, array of errors on failure
-        */
-       abstract public function onSubmit( $data );
-
-       /**
-        * Do something exciting on successful processing of the form.  This might be to show
-        * a confirmation message (watch, rollback, etc) or to redirect somewhere else (edit,
-        * protect, etc).
-        */
-       abstract public function onSuccess();
-
-       /**
-        * The basic pattern for actions is to display some sort of HTMLForm UI, maybe with
-        * some stuff underneath (history etc); to do some processing on submission of that
-        * form (delete, protect, etc) and to do something exciting on 'success', be that
-        * display something new or redirect to somewhere.  Some actions have more exotic
-        * behavior, but that's what subclassing is for :D
-        */
-       public function show() {
-               $this->setHeaders();
-
-               // This will throw exceptions if there's a problem
-               $this->checkCanExecute( $this->getUser() );
-
-               $form = $this->getForm();
-               if ( $form->show() ) {
-                       $this->onSuccess();
-               }
-       }
-
-       /**
-        * @see Action::execute()
-        *
-        * @param $data array|null
-        * @param $captureErrors bool
-        * @throws ErrorPageError|Exception
-        * @return bool
-        */
-       public function execute( array $data = null, $captureErrors = true ) {
-               try {
-                       // Set a new context so output doesn't leak.
-                       $this->context = clone $this->getContext();
-
-                       // This will throw exceptions if there's a problem
-                       $this->checkCanExecute( $this->getUser() );
-
-                       $fields = array();
-                       foreach ( $this->fields as $key => $params ) {
-                               if ( isset( $data[$key] ) ) {
-                                       $fields[$key] = $data[$key];
-                               } elseif ( isset( $params['default'] ) ) {
-                                       $fields[$key] = $params['default'];
-                               } else {
-                                       $fields[$key] = null;
-                               }
-                       }
-                       $status = $this->onSubmit( $fields );
-                       if ( $status === true ) {
-                               // This might do permanent stuff
-                               $this->onSuccess();
-                               return true;
-                       } else {
-                               return false;
-                       }
-               }
-               catch ( ErrorPageError $e ) {
-                       if ( $captureErrors ) {
-                               return false;
-                       } else {
-                               throw $e;
-                       }
-               }
-       }
-}
-
-/**
- * An action which just does something, without showing a form first.
- */
-abstract class FormlessAction extends Action {
-
-       /**
-        * Show something on GET request.
-        * @return String|null will be added to the HTMLForm if present, or just added to the
-        *     output if not.  Return null to not add anything
-        */
-       abstract public function onView();
-
-       /**
-        * We don't want an HTMLForm
-        * @return bool
-        */
-       protected function getFormFields() {
-               return false;
-       }
-
-       /**
-        * @param $data Array
-        * @return bool
-        */
-       public function onSubmit( $data ) {
-               return false;
-       }
-
-       /**
-        * @return bool
-        */
-       public function onSuccess() {
-               return false;
-       }
-
-       public function show() {
-               $this->setHeaders();
-
-               // This will throw exceptions if there's a problem
-               $this->checkCanExecute( $this->getUser() );
-
-               $this->getOutput()->addHTML( $this->onView() );
-       }
-
-       /**
-        * Execute the action silently, not giving any output.  Since these actions don't have
-        * forms, they probably won't have any data, but some (eg rollback) may do
-        * @param array $data values that would normally be in the GET request
-        * @param bool $captureErrors whether to catch exceptions and just return false
-        * @throws ErrorPageError|Exception
-        * @return Bool whether execution was successful
-        */
-       public function execute( array $data = null, $captureErrors = true ) {
-               try {
-                       // Set a new context so output doesn't leak.
-                       $this->context = clone $this->getContext();
-                       if ( is_array( $data ) ) {
-                               $this->context->setRequest( new FauxRequest( $data, false ) );
-                       }
-
-                       // This will throw exceptions if there's a problem
-                       $this->checkCanExecute( $this->getUser() );
-
-                       $this->onView();
-                       return true;
-               }
-               catch ( ErrorPageError $e ) {
-                       if ( $captureErrors ) {
-                               return false;
-                       } else {
-                               throw $e;
-                       }
-               }
-       }
-}
index c7b0c97..217744e 100644 (file)
@@ -3,7 +3,7 @@
  * Authentication plugin interface
  *
  * Copyright © 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * 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
index 3bd398d..a9080b2 100644 (file)
@@ -29,7 +29,6 @@ global $wgAutoloadLocalClasses;
 
 $wgAutoloadLocalClasses = array(
        # Includes
-       'Action' => 'includes/Action.php',
        'AjaxDispatcher' => 'includes/AjaxDispatcher.php',
        'AjaxResponse' => 'includes/AjaxResponse.php',
        'AlphabeticPager' => 'includes/Pager.php',
@@ -80,8 +79,6 @@ $wgAutoloadLocalClasses = array(
        'FeedUtils' => 'includes/FeedUtils.php',
        'FileDeleteForm' => 'includes/FileDeleteForm.php',
        'ForkController' => 'includes/ForkController.php',
-       'FormlessAction' => 'includes/Action.php',
-       'FormAction' => 'includes/Action.php',
        'FormOptions' => 'includes/FormOptions.php',
        'FormSpecialPage' => 'includes/specialpage/FormSpecialPage.php',
        'GitInfo' => 'includes/GitInfo.php',
@@ -99,7 +96,8 @@ $wgAutoloadLocalClasses = array(
        'HTMLFloatField' => 'includes/htmlform/HTMLFloatField.php',
        'HTMLForm' => 'includes/htmlform/HTMLForm.php',
        'HTMLFormField' => 'includes/htmlform/HTMLFormField.php',
-       'HTMLFormFieldRequiredOptionsException' => 'includes/htmlform/HTMLFormFieldRequiredOptionsException.php',
+       'HTMLFormFieldRequiredOptionsException' =>
+               'includes/htmlform/HTMLFormFieldRequiredOptionsException.php',
        'HTMLHiddenField' => 'includes/htmlform/HTMLHiddenField.php',
        'HTMLInfoField' => 'includes/htmlform/HTMLInfoField.php',
        'HTMLIntField' => 'includes/htmlform/HTMLIntField.php',
@@ -141,6 +139,7 @@ $wgAutoloadLocalClasses = array(
        'MailAddress' => 'includes/UserMailer.php',
        'MediaWiki' => 'includes/Wiki.php',
        'MediaWiki_I18N' => 'includes/SkinTemplate.php',
+       'MediaWikiVersionFetcher' => 'includes/MediaWikiVersionFetcher.php',
        'Message' => 'includes/Message.php',
        'MessageBlobStore' => 'includes/MessageBlobStore.php',
        'MimeMagic' => 'includes/MimeMagic.php',
@@ -237,10 +236,13 @@ $wgAutoloadLocalClasses = array(
        'XmlSelect' => 'includes/Xml.php',
 
        # includes/actions
+       'Action' => 'includes/actions/Action.php',
        'CachedAction' => 'includes/actions/CachedAction.php',
        'CreditsAction' => 'includes/actions/CreditsAction.php',
        'DeleteAction' => 'includes/actions/DeleteAction.php',
        'EditAction' => 'includes/actions/EditAction.php',
+       'FormlessAction' => 'includes/actions/FormlessAction.php',
+       'FormAction' => 'includes/actions/FormAction.php',
        'HistoryAction' => 'includes/actions/HistoryAction.php',
        'HistoryPage' => 'includes/actions/HistoryAction.php',
        'HistoryPager' => 'includes/actions/HistoryAction.php',
@@ -272,6 +274,7 @@ $wgAutoloadLocalClasses = array(
        'ApiEmailUser' => 'includes/api/ApiEmailUser.php',
        'ApiExpandTemplates' => 'includes/api/ApiExpandTemplates.php',
        'ApiFeedContributions' => 'includes/api/ApiFeedContributions.php',
+       'ApiFeedRecentChanges' => 'includes/api/ApiFeedRecentChanges.php',
        'ApiFeedWatchlist' => 'includes/api/ApiFeedWatchlist.php',
        'ApiFileRevert' => 'includes/api/ApiFileRevert.php',
        'ApiFormatBase' => 'includes/api/ApiFormatBase.php',
@@ -358,6 +361,7 @@ $wgAutoloadLocalClasses = array(
        'ApiRevisionDelete' => 'includes/api/ApiRevisionDelete.php',
        'ApiRollback' => 'includes/api/ApiRollback.php',
        'ApiRsd' => 'includes/api/ApiRsd.php',
+       'ApiRunJobs' => 'includes/api/ApiRunJobs.php',
        'ApiSetNotificationTimestamp' => 'includes/api/ApiSetNotificationTimestamp.php',
        'ApiTokens' => 'includes/api/ApiTokens.php',
        'ApiUnblock' => 'includes/api/ApiUnblock.php',
@@ -390,12 +394,17 @@ $wgAutoloadLocalClasses = array(
        'EnhancedChangesList' => 'includes/changes/EnhancedChangesList.php',
        'OldChangesList' => 'includes/changes/OldChangesList.php',
        'RCCacheEntry' => 'includes/changes/RCCacheEntry.php',
+       'RCCacheEntryFactory' => 'includes/changes/RCCacheEntryFactory.php',
        'RecentChange' => 'includes/changes/RecentChange.php',
 
        # includes/clientpool
        'RedisConnectionPool' => 'includes/clientpool/RedisConnectionPool.php',
        'RedisConnRef' => 'includes/clientpool/RedisConnectionPool.php',
 
+       # includes/composer
+       'ComposerPackageModifier' => 'includes/composer/ComposerPackageModifier.php',
+       'ComposerVersionNormalizer' => 'includes/composer/ComposerVersionNormalizer.php',
+
        # includes/config
        'Config' => 'includes/config/Config.php',
        'GlobalConfig' => 'includes/config/GlobalConfig.php',
@@ -443,6 +452,7 @@ $wgAutoloadLocalClasses = array(
        'DBConnectionError' => 'includes/db/DatabaseError.php',
        'DBConnRef' => 'includes/db/LoadBalancer.php',
        'DBError' => 'includes/db/DatabaseError.php',
+       'DBExpectedError' => 'includes/db/DatabaseError.php',
        'DBObject' => 'includes/db/DatabaseUtility.php',
        'IDatabase'  => 'includes/db/Database.php',
        'IORMRow' => 'includes/db/IORMRow.php',
index 0736c50..a5e5364 100644 (file)
@@ -67,10 +67,12 @@ class ChangesFeed {
        /**
         * Generates feed's content
         *
-        * @param $feed ChannelFeed subclass object (generally the one returned by getFeedObject())
-        * @param $rows ResultWrapper object with rows in recentchanges table
-        * @param $lastmod Integer: timestamp of the last item in the recentchanges table (only used for the cache key)
-        * @param $opts FormOptions as in SpecialRecentChanges::getDefaultOptions()
+        * @param ChannelFeed $feed ChannelFeed subclass object (generally the one returned
+        *   by getFeedObject())
+        * @param ResultWrapper $rows ResultWrapper object with rows in recentchanges table
+        * @param int $lastmod Timestamp of the last item in the recentchanges table (only
+        *   used for the cache key)
+        * @param FormOptions $opts As in SpecialRecentChanges::getDefaultOptions()
         * @return null|bool True or null
         */
        public function execute( $feed, $rows, $lastmod, $opts ) {
@@ -160,14 +162,28 @@ class ChangesFeed {
        }
 
        /**
-        * Generate the feed items given a row from the database.
+        * Generate the feed items given a row from the database, printing the feed.
         * @param $rows DatabaseBase resource with recentchanges rows
         * @param $feed Feed object
         */
        public static function generateFeed( $rows, &$feed ) {
                wfProfileIn( __METHOD__ );
-
+               $items = self::buildItems( $rows );
                $feed->outHeader();
+               foreach ( $items as $item ) {
+                       $feed->outItem( $item );
+               }
+               $feed->outFooter();
+               wfProfileOut( __METHOD__ );
+       }
+
+       /**
+        * Generate the feed items given a row from the database.
+        * @param $rows DatabaseBase resource with recentchanges rows
+        */
+       public static function buildItems( $rows ) {
+               wfProfileIn( __METHOD__ );
+               $items = array();
 
                # Merge adjacent edits by one user
                $sorted = array();
@@ -187,7 +203,10 @@ class ChangesFeed {
 
                foreach ( $sorted as $obj ) {
                        $title = Title::makeTitle( $obj->rc_namespace, $obj->rc_title );
-                       $talkpage = MWNamespace::canTalk( $obj->rc_namespace ) ? $title->getTalkPage()->getFullURL() : '';
+                       $talkpage = MWNamespace::canTalk( $obj->rc_namespace )
+                               ? $title->getTalkPage()->getFullURL()
+                               : '';
+
                        // Skip items with deleted content (avoids partially complete/inconsistent output)
                        if ( $obj->rc_deleted ) {
                                continue;
@@ -203,7 +222,7 @@ class ChangesFeed {
                                $url = $title->getFullURL();
                        }
 
-                       $item = new FeedItem(
+                       $items[] = new FeedItem(
                                $title->getPrefixedText(),
                                FeedUtils::formatDiff( $obj ),
                                $url,
@@ -212,10 +231,9 @@ class ChangesFeed {
                                        ? wfMessage( 'rev-deleted-user' )->escaped() : $obj->rc_user_text,
                                $talkpage
                        );
-                       $feed->outItem( $item );
                }
-               $feed->outFooter();
+
                wfProfileOut( __METHOD__ );
+               return $items;
        }
-
 }
index 716baef..50db6c7 100644 (file)
@@ -15,7 +15,7 @@
  * performed in LocalSettings.php.
  *
  * Documentation is in the source and on:
- * http://www.mediawiki.org/wiki/Manual:Configuration_settings
+ * https://www.mediawiki.org/wiki/Manual:Configuration_settings
  *
  * @warning  Note: this (and other things) will break if the autoloader is not
  * enabled. Please include includes/AutoLoader.php before including this file.
@@ -2256,7 +2256,7 @@ $wgInvalidateCacheOnLocalSettingsChange = true;
  * although they are referred to as Squid settings for historical reasons.
  *
  * Achieving a high hit ratio with an HTTP proxy requires special
- * configuration. See http://www.mediawiki.org/wiki/Manual:Squid_caching for
+ * configuration. See https://www.mediawiki.org/wiki/Manual:Squid_caching for
  * more details.
  *
  * @{
@@ -2264,7 +2264,7 @@ $wgInvalidateCacheOnLocalSettingsChange = true;
 
 /**
  * Enable/disable Squid.
- * See http://www.mediawiki.org/wiki/Manual:Squid_caching
+ * See https://www.mediawiki.org/wiki/Manual:Squid_caching
  */
 $wgUseSquid = false;
 
@@ -3491,9 +3491,21 @@ $wgLegalTitleChars = " %!\"$&'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF+";
 
 /**
  * The interwiki prefix of the current wiki, or false if it doesn't have one.
+ *
+ * @deprecated since 1.23; use $wgLocalInterwikis instead
  */
 $wgLocalInterwiki = false;
 
+/**
+ * Array for multiple $wgLocalInterwiki values, in case there are several
+ * interwiki prefixes that point to the current wiki. If $wgLocalInterwiki is
+ * set, its value is prepended to this array, for backwards compatibility.
+ *
+ * Note, recent changes feeds use only the first entry in this array (or
+ * $wgLocalInterwiki, if it is set). See $wgRCFeeds
+ */
+$wgLocalInterwikis = array();
+
 /**
  * Expiry time for cache of interwiki table
  */
@@ -3915,7 +3927,7 @@ $wgTranscludeCacheExpiry = 3600;
  *         if $wgUseCommaCount is false, it will be 'link', if it is true
  *         it will be 'comma'
  *
- * See also See http://www.mediawiki.org/wiki/Manual:Article_count
+ * See also See https://www.mediawiki.org/wiki/Manual:Article_count
  *
  * Retroactively changing this variable will not affect the existing count,
  * to update it, you will need to run the maintenance/updateArticleCount.php
@@ -4032,7 +4044,6 @@ $wgDefaultUserOptions = array(
        'minordefault' => 0,
        'newpageshidepatrolled' => 0,
        'nickname' => '',
-       'noconvertlink' => 0,
        'norollbackdiff' => 0,
        'numberheadings' => 0,
        'previewonfirst' => 0,
@@ -4162,7 +4173,7 @@ $wgBlockDisablesLogin = false;
  *
  * @note Also that this will only protect _pages in the wiki_. Uploaded files
  * will remain readable. You can use img_auth.php to protect uploaded files,
- * see http://www.mediawiki.org/wiki/Manual:Image_Authorization
+ * see https://www.mediawiki.org/wiki/Manual:Image_Authorization
  */
 $wgWhitelistRead = false;
 
@@ -4739,6 +4750,8 @@ $wgRateLimits = array(
 
 /**
  * Set to a filename to log rate limiter hits.
+ *
+ * @deprecated since 1.23, use $wgDebugLogGroups['ratelimit'] instead
  */
 $wgRateLimitLog = null;
 
@@ -4897,7 +4910,7 @@ $wgUseTeX = false;
  */
 
 /**
- * Filename for debug logging. See http://www.mediawiki.org/wiki/How_to_debug
+ * Filename for debug logging. See https://www.mediawiki.org/wiki/How_to_debug
  * The debug log file should be not be publicly accessible if it is used, as it
  * may contain private data.
  */
@@ -4951,10 +4964,12 @@ $wgDebugDumpSql = false;
  * of the regular $wgDebugLogFile. Useful for enabling selective logging
  * in production.
  *
- * Log destinations may be string values specifying a filename or URI, or they
- * may be filename or an associative array mapping 'destination' to the desired
- * filename. The associative array may also contain a 'sample' key with an
- * integer value, specifying a sampling factor.
+ * Log destinations may be one of the following:
+ * - false to completely remove from the output, including from $wgDebugLogFile.
+ * - string values specifying a filename or URI.
+ * - associative array mapping 'destination' key to the desired filename or URI.
+ *   The associative array may also contain a 'sample' key with an integer value,
+ *   specifying a sampling factor.
  *
  * @par Example:
  * @code
@@ -5011,6 +5026,11 @@ $wgShowExceptionDetails = false;
 
 /**
  * If true, show a backtrace for database errors
+ *
+ * @note This setting only applies when connection errors and query errors are
+ * reported in the normal manner. $wgShowExceptionDetails applies in other cases,
+ * including those in which an uncaught exception is thrown from within the
+ * exception handler.
  */
 $wgShowDBErrorBacktrace = false;
 
@@ -5102,11 +5122,6 @@ $wgUDPProfilerPort = '3811';
  */
 $wgUDPProfilerFormatString = "%s - %d %f %f %f %f %s\n";
 
-/**
- * Detects non-matching wfProfileIn/wfProfileOut calls
- */
-$wgDebugProfiling = false;
-
 /**
  * Output debug message on every wfProfileIn/wfProfileOut
  */
@@ -5182,7 +5197,7 @@ $wgParserTestFiles = array(
  *
  * Something like this:
  * $wgParserTestRemote = array(
- *     'api-url' => 'http://www.mediawiki.org/w/api.php',
+ *     'api-url' => 'https://www.mediawiki.org/w/api.php',
  *     'repo'    => 'MediaWiki',
  *     'suite'   => 'ParserTests',
  *     'path'    => '/trunk/phase3', // not used client-side; for reference
@@ -5575,8 +5590,9 @@ $wgRC2UDPPort = false;
 $wgRC2UDPPrefix = '';
 
 /**
- * If this is set to true, $wgLocalInterwiki will be prepended to links in the
- * IRC feed. If this is set to a string, that string will be used as the prefix.
+ * If this is set to true, the first entry in the $wgLocalInterwikis array (or
+ * the value of $wgLocalInterwiki, if set) will be prepended to links in the IRC
+ * feed. If this is set to a string, that string will be used as the prefix.
  *
  * @deprecated since 1.22, use $wgRCFeeds
  */
@@ -5604,11 +5620,12 @@ $wgRC2UDPOmitBots = false;
  *   * 'omit_bots' -- whether the bot edits should be in the feed
  *  The IRC-specific options are:
  *   * 'add_interwiki_prefix' -- whether the titles should be prefixed with
- *     $wgLocalInterwiki.
+ *     the first entry in the $wgLocalInterwikis array (or the value of
+ *     $wgLocalInterwiki, if set)
  *  The JSON-specific options are:
  *   * 'channel' -- if set, the 'channel' parameter is also set in JSON values.
  *
- *  To ensure backwards-compatability, whenever $wgRC2UDPAddress is set, a
+ *  To ensure backwards-compatibility, whenever $wgRC2UDPAddress is set, a
  *  'default' feed will be created reusing the deprecated $wgRC2UDP* variables.
  *
  * @example $wgRCFeeds['example'] = array(
@@ -6588,7 +6605,7 @@ $wgExemptFromUserRobotsControl = null;
  * Enable the MediaWiki API for convenient access to
  * machine-readable data via api.php
  *
- * See http://www.mediawiki.org/wiki/API
+ * See https://www.mediawiki.org/wiki/API
  */
 $wgEnableAPI = true;
 
index 639ba28..56fe452 100644 (file)
@@ -3,7 +3,7 @@
  * Base classes for dumps and export
  *
  * Copyright © 2003, 2005, 2006 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * 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
index 635b04e..d5a9553 100644 (file)
@@ -6,7 +6,7 @@
  * Available feeds are defined in Defines.php
  *
  * Copyright © 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * 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
index 6785d0c..a6f936f 100644 (file)
@@ -1064,6 +1064,9 @@ function wfDebugLog( $logGroup, $text, $dest = 'all' ) {
        }
 
        $logConfig = $wgDebugLogGroups[$logGroup];
+       if ( $logConfig === false ) {
+               return;
+       }
        if ( is_array( $logConfig ) ) {
                if ( isset( $logConfig['sample'] ) && mt_rand( 1, $logConfig['sample'] ) !== 1 ) {
                        return;
index e447e47..b18e257 100644 (file)
@@ -3,7 +3,7 @@
  * MediaWiki page data importer.
  *
  * Copyright © 2003,2005 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * 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
diff --git a/includes/MediaWikiVersionFetcher.php b/includes/MediaWikiVersionFetcher.php
new file mode 100644 (file)
index 0000000..1d59ec3
--- /dev/null
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * Provides access to MediaWiki's version without requiring MediaWiki (or anything else)
+ * being loaded first.
+ *
+ * @licence GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+class MediaWikiVersionFetcher {
+
+       /**
+        * Returns the MediaWiki version, in the format used by MediaWiki's wgVersion global.
+        *
+        * @return string
+        * @throws RuntimeException
+        */
+       public function fetchVersion() {
+               $defaultSettings = file_get_contents( __DIR__ . '/DefaultSettings.php' );
+
+               $matches = array();
+               preg_match( "/wgVersion = '([0-9a-zA-Z\.]+)';/", $defaultSettings, $matches );
+
+               if ( count( $matches ) !== 2 ) {
+                       throw new RuntimeException( 'Could not extract the MediaWiki version from DefaultSettings.php' );
+               }
+
+               return $matches[1];
+       }
+
+}
\ No newline at end of file
index dd22844..7c9b095 100644 (file)
  * @since 1.17
  */
 class Message {
+
        /**
         * In which language to get this message. True, which is the default,
         * means the current interface language, false content language.
+        *
+        * @var bool
         */
        protected $interface = true;
 
@@ -172,12 +175,12 @@ class Message {
        protected $language = null;
 
        /**
-        * The message key.
+        * @var string|string[] The message key or array of keys.
         */
        protected $key;
 
        /**
-        * List of parameters which will be substituted into the message.
+        * @var array List of parameters which will be substituted into the message.
         */
        protected $parameters = array();
 
@@ -189,21 +192,23 @@ class Message {
         * * block-parse
         * * parse (default)
         * * plain
+        *
+        * @var string
         */
        protected $format = 'parse';
 
        /**
-        * Whether database can be used.
+        * @var bool Whether database can be used.
         */
        protected $useDatabase = true;
 
        /**
-        * Title object to use as context
+        * @var Title Title object to use as context.
         */
        protected $title = null;
 
        /**
-        * Content object representing the message
+        * @var Content Content object representing the message.
         */
        protected $content = null;
 
@@ -213,11 +218,11 @@ class Message {
        protected $message;
 
        /**
-        * Constructor.
         * @since 1.17
-        * @param $key: message key, or array of message keys to try and use the first non-empty message for
-        * @param array $params message parameters
-        * @return Message: $this
+        *
+        * @param string|string[] $key Message key or array of message keys to try and use the first
+        * non-empty message for.
+        * @param array $params Message parameters.
         */
        public function __construct( $key, $params = array() ) {
                global $wgLang;
@@ -227,7 +232,7 @@ class Message {
        }
 
        /**
-        * Returns the message key
+        * Returns the message key or the first from an array of message keys.
         *
         * @since 1.21
         *
@@ -244,18 +249,18 @@ class Message {
        }
 
        /**
-        * Returns the message parameters
+        * Returns the message parameters.
         *
         * @since 1.21
         *
-        * @return string[]
+        * @return array
         */
        public function getParams() {
                return $this->parameters;
        }
 
        /**
-        * Returns the message format
+        * Returns the message format.
         *
         * @since 1.21
         *
@@ -269,10 +274,13 @@ class Message {
         * Factory function that is just wrapper for the real constructor. It is
         * intended to be used instead of the real constructor, because it allows
         * chaining method calls, while new objects don't.
+        *
         * @since 1.17
-        * @param string $key message key
-        * @param Varargs: parameters as Strings
-        * @return Message: $this
+        *
+        * @param string|string[] $key Message key or array of keys.
+        * @param mixed [$param,...] Parameters as strings.
+        *
+        * @return Message
         */
        public static function newFromKey( $key /*...*/ ) {
                $params = func_get_args();
@@ -284,9 +292,13 @@ class Message {
         * Factory function accepting multiple message keys and returning a message instance
         * for the first message which is non-empty. If all messages are empty then an
         * instance of the first message key is returned.
+        *
         * @since 1.18
-        * @param Varargs: message keys (or first arg as an array of all the message keys)
-        * @return Message: $this
+        *
+        * @param string|string[] [$keys,...] Message keys, or first argument as an array of all the
+        * message keys.
+        *
+        * @return Message
         */
        public static function newFallbackSequence( /*...*/ ) {
                $keys = func_get_args();
@@ -304,9 +316,13 @@ class Message {
 
        /**
         * Adds parameters to the parameter list of this message.
+        *
         * @since 1.17
-        * @param Varargs: parameters as Strings, or a single argument that is an array of Strings
-        * @return Message: $this
+        *
+        * @param mixed [$params,...] Parameters as strings, or a single argument that is
+        * an array of strings.
+        *
+        * @return Message $this
         */
        public function params( /*...*/ ) {
                $args = func_get_args();
@@ -323,9 +339,13 @@ class Message {
         * In other words the parsing process cannot access the contents
         * of this type of parameter, and you need to make sure it is
         * sanitized beforehand.  The parser will see "$n", instead.
+        *
         * @since 1.17
-        * @param Varargs: raw parameters as Strings (or single argument that is an array of raw parameters)
-        * @return Message: $this
+        *
+        * @param mixed [$params,...] Raw parameters as strings, or a single argument that is
+        * an array of raw parameters.
+        *
+        * @return Message $this
         */
        public function rawParams( /*...*/ ) {
                $params = func_get_args();
@@ -341,9 +361,13 @@ class Message {
        /**
         * Add parameters that are numeric and will be passed through
         * Language::formatNum before substitution
+        *
         * @since 1.18
-        * @param Varargs: numeric parameters (or single argument that is array of numeric parameters)
-        * @return Message: $this
+        *
+        * @param mixed [$param,...] Numeric parameters, or a single argument that is
+        * an array of numeric parameters.
+        *
+        * @return Message $this
         */
        public function numParams( /*...*/ ) {
                $params = func_get_args();
@@ -359,9 +383,13 @@ class Message {
        /**
         * Add parameters that are durations of time and will be passed through
         * Language::formatDuration before substitution
+        *
         * @since 1.22
-        * @param Varargs: numeric parameters (or single argument that is array of numeric parameters)
-        * @return Message: $this
+        *
+        * @param int|int[] [$param,...] Duration parameters, or a single argument that is
+        * an array of duration parameters.
+        *
+        * @return Message $this
         */
        public function durationParams( /*...*/ ) {
                $params = func_get_args();
@@ -377,9 +405,13 @@ class Message {
        /**
         * Add parameters that are expiration times and will be passed through
         * Language::formatExpiry before substitution
+        *
         * @since 1.22
-        * @param Varargs: numeric parameters (or single argument that is array of numeric parameters)
-        * @return Message: $this
+        *
+        * @param string|string[] [$param,...] Expiry parameters, or a single argument that is
+        * an array of expiry parameters.
+        *
+        * @return Message $this
         */
        public function expiryParams( /*...*/ ) {
                $params = func_get_args();
@@ -395,9 +427,13 @@ class Message {
        /**
         * Add parameters that are time periods and will be passed through
         * Language::formatTimePeriod before substitution
+        *
         * @since 1.22
-        * @param Varargs: numeric parameters (or single argument that is array of numeric parameters)
-        * @return Message: $this
+        *
+        * @param number|number[] [$param,...] Time period parameters, or a single argument that is
+        * an array of time period parameters.
+        *
+        * @return Message $this
         */
        public function timeperiodParams( /*...*/ ) {
                $params = func_get_args();
@@ -413,9 +449,13 @@ class Message {
        /**
         * Add parameters that are file sizes and will be passed through
         * Language::formatSize before substitution
+        *
         * @since 1.22
-        * @param Varargs: numeric parameters (or single argument that is array of numeric parameters)
-        * @return Message: $this
+        *
+        * @param int|int[] [$param,...] Size parameters, or a single argument that is
+        * an array of size parameters.
+        *
+        * @return Message $this
         */
        public function sizeParams( /*...*/ ) {
                $params = func_get_args();
@@ -431,9 +471,13 @@ class Message {
        /**
         * Add parameters that are bitrates and will be passed through
         * Language::formatBitrate before substitution
+        *
         * @since 1.22
-        * @param Varargs: numeric parameters (or single argument that is array of numeric parameters)
-        * @return Message: $this
+        *
+        * @param int|int[] [$param,...] Bit rate parameters, or a single argument that is
+        * an array of bit rate parameters.
+        *
+        * @return Message $this
         */
        public function bitrateParams( /*...*/ ) {
                $params = func_get_args();
@@ -448,9 +492,12 @@ class Message {
 
        /**
         * Set the language and the title from a context object
+        *
         * @since 1.19
+        *
         * @param $context IContextSource
-        * @return Message: $this
+        *
+        * @return Message $this
         */
        public function setContext( IContextSource $context ) {
                $this->inLanguage( $context->getLanguage() );
@@ -464,10 +511,13 @@ class Message {
         * Request the message in any language that is supported.
         * As a side effect interface message status is unconditionally
         * turned off.
+        *
         * @since 1.17
-        * @param $lang Mixed: language code or Language object.
+        *
+        * @param Language|string $lang Language code or Language object.
+        *
+        * @return Message $this
         * @throws MWException
-        * @return Message: $this
         */
        public function inLanguage( $lang ) {
                if ( $lang instanceof Language || $lang instanceof StubUserLang ) {
@@ -489,9 +539,11 @@ class Message {
        /**
         * Request the message in the wiki's content language,
         * unless it is disabled for this message.
+        *
         * @since 1.17
         * @see $wgForceUIMsgAsContentMsg
-        * @return Message: $this
+        *
+        * @return Message $this
         */
        public function inContentLanguage() {
                global $wgForceUIMsgAsContentMsg;
@@ -508,31 +560,40 @@ class Message {
        /**
         * Allows manipulating the interface message flag directly.
         * Can be used to restore the flag after setting a language.
-        * @param $value bool
-        * @return Message: $this
+        *
         * @since 1.20
+        *
+        * @param bool $interface
+        *
+        * @return Message $this
         */
-       public function setInterfaceMessageFlag( $value ) {
-               $this->interface = (bool)$value;
+       public function setInterfaceMessageFlag( $interface ) {
+               $this->interface = (bool)$interface;
                return $this;
        }
 
        /**
         * Enable or disable database use.
+        *
         * @since 1.17
-        * @param $value Boolean
-        * @return Message: $this
+        *
+        * @param bool $useDatabase
+        *
+        * @return Message $this
         */
-       public function useDatabase( $value ) {
-               $this->useDatabase = (bool)$value;
+       public function useDatabase( $useDatabase ) {
+               $this->useDatabase = (bool)$useDatabase;
                return $this;
        }
 
        /**
         * Set the Title object to use as context when transforming the message
+        *
         * @since 1.18
+        *
         * @param $title Title object
-        * @return Message: $this
+        *
+        * @return Message $this
         */
        public function title( $title ) {
                $this->title = $title;
@@ -541,6 +602,7 @@ class Message {
 
        /**
         * Returns the message as a Content object.
+        *
         * @return Content
         */
        public function content() {
@@ -553,8 +615,10 @@ class Message {
 
        /**
         * Returns the message parsed from wikitext to HTML.
+        *
         * @since 1.17
-        * @return String: HTML
+        *
+        * @return string HTML
         */
        public function toString() {
                $string = $this->fetchMessage();
@@ -605,8 +669,10 @@ class Message {
         * Magic method implementation of the above (for PHP >= 5.2.0), so we can do, eg:
         *     $foo = Message::get( $key );
         *     $string = "<abbr>$foo</abbr>";
+        *
         * @since 1.18
-        * @return String
+        *
+        * @return string
         */
        public function __toString() {
                // PHP doesn't allow __toString to throw exceptions and will
@@ -630,9 +696,11 @@ class Message {
        }
 
        /**
-        * Fully parse the text from wikitext to HTML
+        * Fully parse the text from wikitext to HTML.
+        *
         * @since 1.17
-        * @return String parsed HTML
+        *
+        * @return string Parsed HTML.
         */
        public function parse() {
                $this->format = 'parse';
@@ -641,8 +709,10 @@ class Message {
 
        /**
         * Returns the message text. {{-transformation is done.
+        *
         * @since 1.17
-        * @return String: Unescaped message text.
+        *
+        * @return string Unescaped message text.
         */
        public function text() {
                $this->format = 'text';
@@ -651,8 +721,10 @@ class Message {
 
        /**
         * Returns the message text as-is, only parameters are substituted.
+        *
         * @since 1.17
-        * @return String: Unescaped untransformed message text.
+        *
+        * @return string Unescaped untransformed message text.
         */
        public function plain() {
                $this->format = 'plain';
@@ -661,8 +733,10 @@ class Message {
 
        /**
         * Returns the parsed message text which is always surrounded by a block element.
+        *
         * @since 1.17
-        * @return String: HTML
+        *
+        * @return string HTML
         */
        public function parseAsBlock() {
                $this->format = 'block-parse';
@@ -672,8 +746,10 @@ class Message {
        /**
         * Returns the message text. {{-transformation is done and the result
         * is escaped excluding any raw parameters.
+        *
         * @since 1.17
-        * @return String: Escaped message text.
+        *
+        * @return string Escaped message text.
         */
        public function escaped() {
                $this->format = 'escaped';
@@ -682,8 +758,10 @@ class Message {
 
        /**
         * Check whether a message key has been defined currently.
+        *
         * @since 1.17
-        * @return Bool: true if it is and false if not.
+        *
+        * @return bool
         */
        public function exists() {
                return $this->fetchMessage() !== false;
@@ -691,9 +769,11 @@ class Message {
 
        /**
         * Check whether a message does not exist, or is an empty string
+        *
         * @since 1.18
-        * @return Bool: true if is is and false if not
         * @todo FIXME: Merge with isDisabled()?
+        *
+        * @return bool
         */
        public function isBlank() {
                $message = $this->fetchMessage();
@@ -701,9 +781,11 @@ class Message {
        }
 
        /**
-        * Check whether a message does not exist, is an empty string, or is "-"
+        * Check whether a message does not exist, is an empty string, or is "-".
+        *
         * @since 1.18
-        * @return Bool: true if it is and false if not
+        *
+        * @return bool
         */
        public function isDisabled() {
                $message = $this->fetchMessage();
@@ -712,72 +794,89 @@ class Message {
 
        /**
         * @since 1.17
-        * @param $value
-        * @return array
+        *
+        * @param mixed $raw
+        *
+        * @return array Array with a single "raw" key.
         */
-       public static function rawParam( $value ) {
-               return array( 'raw' => $value );
+       public static function rawParam( $raw ) {
+               return array( 'raw' => $raw );
        }
 
        /**
         * @since 1.18
-        * @param $value
-        * @return array
+        *
+        * @param mixed $num
+        *
+        * @return array Array with a single "num" key.
         */
-       public static function numParam( $value ) {
-               return array( 'num' => $value );
+       public static function numParam( $num ) {
+               return array( 'num' => $num );
        }
 
        /**
         * @since 1.22
-        * @param $value
-        * @return array
+        *
+        * @param int $duration
+        *
+        * @return int[] Array with a single "duration" key.
         */
-       public static function durationParam( $value ) {
-               return array( 'duration' => $value );
+       public static function durationParam( $duration ) {
+               return array( 'duration' => $duration );
        }
 
        /**
         * @since 1.22
-        * @param $value
-        * @return array
+        *
+        * @param string $expiry
+        *
+        * @return string[] Array with a single "expiry" key.
         */
-       public static function expiryParam( $value ) {
-               return array( 'expiry' => $value );
+       public static function expiryParam( $expiry ) {
+               return array( 'expiry' => $expiry );
        }
 
        /**
         * @since 1.22
-        * @param $value
-        * @return array
+        *
+        * @param number $period
+        *
+        * @return number[] Array with a single "period" key.
         */
-       public static function timeperiodParam( $value ) {
-               return array( 'period' => $value );
+       public static function timeperiodParam( $period ) {
+               return array( 'period' => $period );
        }
 
        /**
         * @since 1.22
-        * @param $value
-        * @return array
+        *
+        * @param int $size
+        *
+        * @return int[] Array with a single "size" key.
         */
-       public static function sizeParam( $value ) {
-               return array( 'size' => $value );
+       public static function sizeParam( $size ) {
+               return array( 'size' => $size );
        }
 
        /**
         * @since 1.22
-        * @param $value
-        * @return array
+        *
+        * @param int $bitrate
+        *
+        * @return int[] Array with a single "bitrate" key.
         */
-       public static function bitrateParam( $value ) {
-               return array( 'bitrate' => $value );
+       public static function bitrateParam( $bitrate ) {
+               return array( 'bitrate' => $bitrate );
        }
 
        /**
         * Substitutes any parameters into the message text.
+        *
         * @since 1.17
-        * @param string $message the message text
-        * @param string $type either before or after
+        *
+        * @param string $message The message text.
+        * @param string $type Either "before" or "after".
+        *
         * @return String
         */
        protected function replaceParameters( $message, $type = 'before' ) {
@@ -794,9 +893,12 @@ class Message {
 
        /**
         * Extracts the parameter type and preprocessed the value if needed.
+        *
         * @since 1.18
-        * @param string|array $param Parameter as defined in this class.
-        * @return Tuple(type, value)
+        *
+        * @param mixed $param Parameter as defined in this class.
+        *
+        * @return array Array with the parameter type (either "before" or "after") and the value.
         */
        protected function extractParam( $param ) {
                if ( is_array( $param ) ) {
@@ -837,9 +939,12 @@ class Message {
 
        /**
         * Wrapper for what ever method we use to parse wikitext.
+        *
         * @since 1.17
-        * @param string $string Wikitext message contents
-        * @return string Wikitext parsed into HTML
+        *
+        * @param string $string Wikitext message contents.
+        *
+        * @return string Wikitext parsed into HTML.
         */
        protected function parseText( $string ) {
                $out = MessageCache::singleton()->parse( $string, $this->title, /*linestart*/true, $this->interface, $this->language );
@@ -848,8 +953,11 @@ class Message {
 
        /**
         * Wrapper for what ever method we use to {{-transform wikitext.
+        *
         * @since 1.17
-        * @param string $string Wikitext message contents
+        *
+        * @param string $string Wikitext message contents.
+        *
         * @return string Wikitext with {{-constructs replaced with their values.
         */
        protected function transformText( $string ) {
@@ -857,10 +965,12 @@ class Message {
        }
 
        /**
-        * Wrapper for what ever method we use to get message contents
+        * Wrapper for what ever method we use to get message contents.
+        *
         * @since 1.17
-        * @throws MWException
+        *
         * @return string
+        * @throws MWException If message key array is empty.
         */
        protected function fetchMessage() {
                if ( !isset( $this->message ) ) {
@@ -899,13 +1009,15 @@ class Message {
  * @since 1.21
  */
 class RawMessage extends Message {
+
        /**
         * Call the parent constructor, then store the key as
         * the message.
         *
-        * @param string $key Message to use
-        * @param array $params Parameters for the message
         * @see Message::__construct
+        *
+        * @param string|string[] $key Message to use.
+        * @param array $params Parameters for the message.
         */
        public function __construct( $key, $params = array() ) {
                parent::__construct( $key, $params );
@@ -925,4 +1037,5 @@ class RawMessage extends Message {
                }
                return $this->message;
        }
+
 }
index e6d6ebf..60aa33c 100644 (file)
@@ -97,9 +97,9 @@ function wfPHPVersionError( $type ) {
                </p>
                <p>
                        If for some reason you are unable to upgrade your PHP version, you will need to
-                       <a href="http://www.mediawiki.org/wiki/Download">download</a> an older version
+                       <a href="https://www.mediawiki.org/wiki/Download">download</a> an older version
                        of MediaWiki from our website.  See our
-                       <a href="http://www.mediawiki.org/wiki/Compatibility#PHP">compatibility page</a>
+                       <a href="https://www.mediawiki.org/wiki/Compatibility#PHP">compatibility page</a>
                        for details of which versions are compatible with prior versions of PHP.
                </p>
                </div>
index 435e09e..d367e4d 100644 (file)
@@ -27,7 +27,7 @@
  *
  * $router->add( "/wiki/$1" );
  *   - Matches /wiki/Foo style urls and extracts the title
- * $router->add( array( 'edit' => "/edit/$1" ), array( 'action' => '$key' ) );
+ * $router->add( array( 'edit' => "/edit/$key" ), array( 'action' => '$key' ) );
  *   - Matches /edit/Foo style urls and sets action=edit
  * $router->add( '/$2/$1',
  *   array( 'variant' => '$2' ),
index b4f14c2..85c4c79 100644 (file)
@@ -91,6 +91,13 @@ abstract class PoolCounter {
                return new $class( $conf, $type, $key );
        }
 
+       /**
+        * @return string
+        */
+       public function getKey() {
+               return $this->key;
+       }
+
        /**
         * I want to do this task and I need to do it myself.
         *
@@ -175,7 +182,7 @@ abstract class PoolCounterWork {
         * Do something with the error, like showing it to the user.
         * @return bool
         */
-       function error( $status ) {
+       public function error( $status ) {
                return false;
        }
 
@@ -185,8 +192,10 @@ abstract class PoolCounterWork {
         * @param $status Status
         * @return void
         */
-       function logError( $status ) {
-               wfDebugLog( 'poolcounter', "Pool key '{$this->key}':"
+       public function logError( $status ) {
+               $key = $this->poolCounter->getKey();
+
+               wfDebugLog( 'poolcounter', "Pool key '$key': "
                        . $status->getMessage()->inLanguage( 'en' )->useDatabase( false )->text() );
        }
 
@@ -314,14 +323,14 @@ class PoolCounterWorkViaCallback extends PoolCounterWork {
                return false;
        }
 
-       function fallback() {
+       public function fallback() {
                if ( $this->fallback ) {
                        return call_user_func_array( $this->fallback, array() );
                }
                return false;
        }
 
-       function error( $status ) {
+       public function error( $status ) {
                if ( $this->error ) {
                        return call_user_func_array( $this->error, array( $status ) );
                }
index 9a16383..10aa99d 100644 (file)
@@ -193,7 +193,7 @@ class Preferences {
         */
        static function profilePreferences( $user, IContextSource $context, &$defaultPreferences ) {
                global $wgAuth, $wgContLang, $wgParser, $wgCookieExpiration, $wgLanguageCode,
-                       $wgDisableTitleConversion, $wgDisableLangConversion, $wgMaxSigChars,
+                       $wgDisableLangConversion, $wgMaxSigChars,
                        $wgEnableEmail, $wgEmailConfirmToEdit, $wgEnableUserEmail, $wgEmailAuthentication,
                        $wgEnotifWatchlist, $wgEnotifUserTalk, $wgEnotifRevealEditorAddress,
                        $wgSecureLogin;
@@ -381,14 +381,6 @@ class Preferences {
                                                'section' => 'personal/i18n',
                                                'help-message' => 'prefs-help-variant',
                                        );
-
-                                       if ( !$wgDisableTitleConversion ) {
-                                               $defaultPreferences['noconvertlink'] = array(
-                                                       'type' => 'toggle',
-                                                       'section' => 'personal/i18n',
-                                                       'label-message' => 'tog-noconvertlink',
-                                               );
-                                       }
                                } else {
                                        $defaultPreferences["variant-$langCode"] = array(
                                                'type' => 'api',
index d6cc8a3..bcb88e9 100644 (file)
@@ -3,7 +3,7 @@
  * Page protection
  *
  * Copyright © 2005 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * 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
index 0de8cda..90548fe 100644 (file)
@@ -3,7 +3,7 @@
  * HTML sanitizer for %MediaWiki.
  *
  * Copyright © 2002-2005 Brion Vibber <brion@pobox.com> et al
- * http://www.mediawiki.org/
+ * 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
index 35da714..777ca37 100644 (file)
@@ -265,6 +265,10 @@ if ( $wgSkipSkin ) {
        $wgSkipSkins[] = $wgSkipSkin;
 }
 
+if ( $wgLocalInterwiki ) {
+       array_unshift( $wgLocalInterwikis, $wgLocalInterwiki );
+}
+
 # Set default shared prefix
 if ( $wgSharedPrefix === false ) {
        $wgSharedPrefix = $wgDBprefix;
@@ -452,6 +456,11 @@ if ( !$wgHTCPRouting && $wgHTCPMulticastAddress ) {
        );
 }
 
+// Back compatibility for $wgRateLimitLog deprecated with 1.23
+if ( $wgRateLimitLog && ! array_key_exists( 'ratelimit', $wgDebugLogGroups ) ) {
+       $wgDebugLogGroups['ratelimit'] = $wgRateLimitLog;
+}
+
 wfProfileOut( $fname . '-defaults2' );
 wfProfileIn( $fname . '-misc1' );
 
index 4f0e1fe..32f0ed3 100644 (file)
@@ -104,7 +104,11 @@ class SkinTemplate extends Skin {
         * @param $out OutputPage
         */
        function setupSkinUserCss( OutputPage $out ) {
-               $out->addModuleStyles( array( 'mediawiki.legacy.shared', 'mediawiki.legacy.commonPrint' ) );
+               $out->addModuleStyles( array(
+                       'mediawiki.legacy.shared',
+                       'mediawiki.legacy.commonPrint',
+                       'mediawiki.ui.button'
+               ) );
        }
 
        /**
@@ -398,6 +402,8 @@ class SkinTemplate extends Skin {
                // that interface elements are in a different language.
                $tpl->set( 'userlangattributes', '' );
                $tpl->set( 'specialpageattributes', '' ); # obsolete
+               // Used by VectorBeta to insert HTML before content but after the heading for the page title. Defaults to empty string.
+               $tpl->set( 'prebodyhtml', '' );
 
                if ( $userLangCode !== $wgContLang->getHtmlCode() || $userLangDir !== $wgContLang->getDir() ) {
                        $escUserlang = htmlspecialchars( $userLangCode );
@@ -1596,7 +1602,7 @@ abstract class BaseTemplate extends QuickTemplate {
                        if ( isset( $plink['active'] ) ) {
                                $ptool['active'] = $plink['active'];
                        }
-                       foreach ( array( 'href', 'class', 'text' ) as $k ) {
+                       foreach ( array( 'href', 'class', 'text', 'dir' ) as $k ) {
                                if ( isset( $plink[$k] ) ) {
                                        $ptool['links'][0][$k] = $plink[$k];
                                }
@@ -1734,6 +1740,19 @@ abstract class BaseTemplate extends QuickTemplate {
                return $boxes;
        }
 
+       /**
+        * @param string $name
+        */
+       protected function renderAfterPortlet( $name ) {
+               $content = '';
+               wfRunHooks( 'BaseTemplateAfterPortlet', array( $this, $name, &$content ) );
+
+               if ( $content !== '' ) {
+                       echo "<div class='after-portlet after-portlet-$name'>$content</div>";
+               }
+
+       }
+
        /**
         * Makes a link, usually used by makeListItem to generate a link for an item
         * in a list used in navigation lists, portlets, portals, sidebars, etc...
@@ -1840,7 +1859,7 @@ abstract class BaseTemplate extends QuickTemplate {
         *
         * @param $key string, usually a key from the list you are generating this link from.
         * @param $item array, of list item data containing some of a specific set of keys.
-        * The "id" and "class" keys will be used as attributes for the list item,
+        * The "id", "class" and "itemtitle" keys will be used as attributes for the list item,
         * if "active" contains a value of true a "active" class will also be appended to class.
         *
         * @param $options array
@@ -1857,7 +1876,8 @@ abstract class BaseTemplate extends QuickTemplate {
         * list item directly so they will not be passed to makeLink
         * (however the link will still support a tooltip and accesskey from it)
         * If you need an id or class on a single link you should include a "links"
-        * array with just one link item inside of it.
+        * array with just one link item inside of it. If you want to add a title
+        * to the list item itself, you can set "itemtitle" to the value.
         * $options is also passed on to makeLink calls
         *
         * @return string
@@ -1871,7 +1891,7 @@ abstract class BaseTemplate extends QuickTemplate {
                } else {
                        $link = $item;
                        // These keys are used by makeListItem and shouldn't be passed on to the link
-                       foreach ( array( 'id', 'class', 'active', 'tag' ) as $k ) {
+                       foreach ( array( 'id', 'class', 'active', 'tag', 'itemtitle' ) as $k ) {
                                unset( $link[$k] );
                        }
                        if ( isset( $item['id'] ) && !isset( $item['single-id'] ) ) {
@@ -1896,6 +1916,9 @@ abstract class BaseTemplate extends QuickTemplate {
                        $attrs['class'] .= ' active';
                        $attrs['class'] = trim( $attrs['class'] );
                }
+               if ( isset( $item['itemtitle'] ) ) {
+                       $attrs['title'] = $item['itemtitle'];
+               }
                return Html::rawElement( isset( $options['tag'] ) ? $options['tag'] : 'li', $attrs, $html );
        }
 
index a705aaa..c85a006 100644 (file)
@@ -3200,7 +3200,7 @@ class Title {
         * @return Bool true on success
         */
        private function secureAndSplit() {
-               global $wgContLang, $wgLocalInterwiki;
+               global $wgContLang, $wgLocalInterwikis;
 
                # Initialisation
                $this->mInterwiki = '';
@@ -3273,17 +3273,17 @@ class Title {
                                        $this->mInterwiki = $wgContLang->lc( $p );
 
                                        # Redundant interwiki prefix to the local wiki
-                                       if ( $wgLocalInterwiki !== false
-                                               && 0 == strcasecmp( $this->mInterwiki, $wgLocalInterwiki )
-                                       ) {
-                                               if ( $dbkey == '' ) {
-                                                       # Can't have an empty self-link
-                                                       return false;
+                                       foreach ( $wgLocalInterwikis as $localIW ) {
+                                               if ( 0 == strcasecmp( $this->mInterwiki, $localIW ) ) {
+                                                       if ( $dbkey == '' ) {
+                                                               # Can't have an empty self-link
+                                                               return false;
+                                                       }
+                                                       $this->mInterwiki = '';
+                                                       $firstPass = false;
+                                                       # Do another namespace split...
+                                                       continue 2;
                                                }
-                                               $this->mInterwiki = '';
-                                               $firstPass = false;
-                                               # Do another namespace split...
-                                               continue;
                                        }
 
                                        # If there's an initial colon after the interwiki, that also
index 4b57dd2..6d9f372 100644 (file)
@@ -1056,7 +1056,8 @@ class User {
                        # Get the token from DB/cache and clean it up to remove garbage padding.
                        # This deals with historical problems with bugs and the default column value.
                        $token = rtrim( $proposedUser->getToken( false ) ); // correct token
-                       $passwordCorrect = ( strlen( $token ) && $token === $request->getCookie( 'Token' ) );
+                       // Make comparison in constant time (bug 61346)
+                       $passwordCorrect = strlen( $token ) && $this->compareSecrets( $token, $request->getCookie( 'Token' ) );
                        $from = 'cookie';
                } else {
                        // No session or persistent login cookie
@@ -1075,6 +1076,25 @@ class User {
                }
        }
 
+       /**
+        * A comparison of two strings, not vulnerable to timing attacks
+        * @param string $answer the secret string that you are comparing against.
+        * @param string $test compare this string to the $answer.
+        * @return bool True if the strings are the same, false otherwise
+        */
+       protected function compareSecrets( $answer, $test ) {
+               if ( strlen( $answer ) !== strlen( $test ) ) {
+                       $passwordCorrect = false;
+               } else {
+                       $result = 0;
+                       for ( $i = 0; $i < strlen( $answer ); $i++ ) {
+                               $result |= ord( $answer{$i} ) ^ ord( $test{$i} );
+                       }
+                       $passwordCorrect = ( $result == 0 );
+               }
+               return $passwordCorrect;
+       }
+
        /**
         * Load user and user_group data from the database.
         * $this->mId must be set, this is how the user is identified.
@@ -1582,7 +1602,7 @@ class User {
                        return false;
                }
 
-               global $wgMemc, $wgRateLimitLog;
+               global $wgMemc;
                wfProfileIn( __METHOD__ );
 
                $limits = $wgRateLimits[$action];
@@ -1645,12 +1665,7 @@ class User {
                        // Already pinged?
                        if ( $count ) {
                                if ( $count >= $max ) {
-                                       wfDebug( __METHOD__ . ": tripped! $key at $count $summary\n" );
-                                       if ( $wgRateLimitLog ) {
-                                               wfSuppressWarnings();
-                                               file_put_contents( $wgRateLimitLog, wfTimestamp( TS_MW ) . ' ' . wfWikiID() . ': ' . $this->getName() . " tripped $key at $count $summary\n", FILE_APPEND );
-                                               wfRestoreWarnings();
-                                       }
+                                       wfDebugLog( 'ratelimit', $this->getName() . " tripped! $key at $count $summary");
                                        $triggered = true;
                                } else {
                                        wfDebug( __METHOD__ . ": ok. $key at $count $summary\n" );
@@ -4721,28 +4736,35 @@ class User {
                        // Don't bother storing default values
                        $defaultOption = self::getDefaultOption( $key );
                        if ( ( is_null( $defaultOption ) &&
-                                       !( $value === false || is_null( $value ) ) ) ||
-                                       $value != $defaultOption ) {
+                               !( $value === false || is_null( $value ) ) ) ||
+                               $value != $defaultOption
+                       ) {
                                $insert_rows[] = array(
-                                               'up_user' => $userId,
-                                               'up_property' => $key,
-                                               'up_value' => $value,
-                                       );
+                                       'up_user' => $userId,
+                                       'up_property' => $key,
+                                       'up_value' => $value,
+                               );
                        }
                }
 
                $dbw = wfGetDB( DB_MASTER );
-               $hasRows = $dbw->selectField( 'user_properties', '1',
-                       array( 'up_user' => $userId ), __METHOD__ );
-
-               if ( $hasRows ) {
-                       // Only do this delete if there is something there. A very large portion of
+               // Find and delete any prior preference rows...
+               $res = $dbw->select( 'user_properties',
+                       array( 'up_property' ), array( 'up_user' => $userId ), __METHOD__ );
+               $priorKeys = array();
+               foreach ( $res as $row ) {
+                       $priorKeys[] = $row->up_property;
+               }
+               if ( count( $priorKeys ) ) {
+                       // Do the DELETE by PRIMARY KEY for prior rows. A very large portion of
                        // calls to this function are for setting 'rememberpassword' for new accounts.
-                       // Doing this delete for new accounts with no rows in the table rougly causes
-                       // gap locks on [max user ID,+infinity) which causes high contention since many
-                       // updates will pile up on each other since they are for higher (newer) user IDs.
-                       $dbw->delete( 'user_properties', array( 'up_user' => $userId ), __METHOD__ );
+                       // Doing a blanket per-user DELETE for new accounts with no rows in the table
+                       // causes gap locks on [max user ID,+infinity) which causes high contention since
+                       // updates will pile up on each other as they are for higher (newer) user IDs.
+                       $dbw->delete( 'user_properties',
+                               array( 'up_user' => $userId, 'up_property' => $priorKeys ), __METHOD__ );
                }
+               // Insert the new preference rows
                $dbw->insert( 'user_properties', $insert_rows, __METHOD__, array( 'IGNORE' ) );
        }
 
index 399facf..01366f4 100644 (file)
@@ -3,7 +3,7 @@
  * Deal with importing all those nasty globals and things
  *
  * Copyright © 2003 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * 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
index 58c953a..eb79134 100644 (file)
@@ -126,8 +126,8 @@ if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
 
        # LocalSettings.php is the per site customization file. If it does not exist
        # the wiki installer needs to be launched or the generated file uploaded to
-       # the root wiki directory
-       if ( !file_exists( MW_CONFIG_FILE ) ) {
+       # the root wiki directory. Give a hint, if it is not readable by the server.
+       if ( !is_readable( MW_CONFIG_FILE ) ) {
                require_once "$IP/includes/templates/NoLocalSettings.php";
                die();
        }
index 99857d9..d78d7cb 100644 (file)
@@ -448,6 +448,7 @@ class MediaWiki {
                        if ( function_exists( 'fastcgi_finish_request' ) ) {
                                fastcgi_finish_request();
                        }
+                       $this->triggerJobs();
                        $this->restInPeace();
                } catch ( Exception $e ) {
                        MWExceptionHandler::handle( $e );
@@ -583,6 +584,7 @@ class MediaWiki {
                        wfProfileOut( 'main-try-filecache' );
                }
 
+               // Actually do the work of the request and build up any output
                $this->performRequest();
 
                // Now commit any transactions, so that unreported errors after
@@ -602,9 +604,6 @@ class MediaWiki {
                // Do any deferred jobs
                DeferredUpdates::doUpdates( 'commit' );
 
-               // Execute a job from the queue
-               $this->doJobs();
-
                // Log profiling data, e.g. in the database or UDP
                wfLogProfilingData();
 
@@ -617,15 +616,19 @@ class MediaWiki {
        }
 
        /**
-        * Do a job from the job queue
+        * Potentially open a socket and sent an HTTP request back to the server
+        * to run a specified number of jobs. This registers a callback to cleanup
+        * the socket once it's done.
         */
-       private function doJobs() {
-               global $wgJobRunRate, $wgPhpCli, $IP;
+       protected function triggerJobs() {
+               global $wgJobRunRate, $wgServer, $wgScriptPath, $wgScriptExtension, $wgEnableAPI;
 
                if ( $wgJobRunRate <= 0 || wfReadOnly() ) {
                        return;
                }
 
+               $section = new ProfileSection( __METHOD__ );
+
                if ( $wgJobRunRate < 1 ) {
                        $max = mt_getrandmax();
                        if ( mt_rand( 0, $max ) > $max * $wgJobRunRate ) {
@@ -636,51 +639,51 @@ class MediaWiki {
                        $n = intval( $wgJobRunRate );
                }
 
-               if ( !wfShellExecDisabled() && is_executable( $wgPhpCli ) ) {
-                       // Start a background process to run some of the jobs
-                       wfProfileIn( __METHOD__ . '-exec' );
-                       $retVal = 1;
-                       $cmd = wfShellWikiCmd( "$IP/maintenance/runJobs.php",
-                               array( '--wiki', wfWikiID(), '--maxjobs', $n ) );
-                       $cmd .= " >" . wfGetNull() . " 2>&1"; // don't hang PHP on pipes
-                       if ( wfIsWindows() ) {
-                               // Using START makes this async and also works around a bug where using
-                               // wfShellExec() with a quoted script name causes a filename syntax error.
-                               $cmd = "START /B \"bg\" $cmd";
-                       } else {
-                               $cmd = "$cmd &";
-                       }
-                       wfShellExec( $cmd, $retVal );
-                       wfProfileOut( __METHOD__ . '-exec' );
+               $query = array( 'action' => 'runjobs',
+                       'tasks' => 'jobs', 'maxjobs' => $n, 'sigexpiry' => time() + 5 );
+               $query['signature'] = ApiRunJobs::getQuerySignature( $query );
+
+               if ( !$wgEnableAPI ) {
+                       // Fall back to running the job here while the user waits
+                       ApiRunJobs::executeJobs( $n );
+                       return;
+               }
+
+               $errno = $errstr = null;
+               $info = wfParseUrl( $wgServer );
+               wfSuppressWarnings();
+               $sock = fsockopen(
+                       $info['host'],
+                       isset( $info['port'] ) ? $info['port'] : 80,
+                       $errno,
+                       $errstr
+               );
+               wfRestoreWarnings();
+               if ( !$sock ) {
+                       wfDebugLog( 'runJobs', "Failed to start cron API (socket error $errno): $errstr\n" );
+                       // Fall back to running the job here while the user waits
+                       ApiRunJobs::executeJobs( $n );
+                       return;
+               }
+
+               $url = wfAppendQuery( "{$wgScriptPath}/api{$wgScriptExtension}", $query );
+               $req = "POST $url HTTP/1.1\r\nHost: {$info['host']}\r\nConnection: Close\r\n\r\n";
+
+               wfDebugLog( 'runJobs', "Running $n job(s) via '$url'\n" );
+               // Send a cron API request to be performed in the background.
+               // Give up if this takes too long to send (which should be rare).
+               stream_set_timeout( $sock, 1 );
+               $bytes = fwrite( $sock, $req );
+               if ( $bytes !== strlen( $req ) ) {
+                       wfDebugLog( 'runJobs', "Failed to start cron API (socket write error)\n" );
                } else {
-                       try {
-                               // Fallback to running the jobs here while the user waits
-                               $group = JobQueueGroup::singleton();
-                               do {
-                                       $job = $group->pop( JobQueueGroup::USE_CACHE ); // job from any queue
-                                       if ( $job ) {
-                                               $output = $job->toString() . "\n";
-                                               $t = - microtime( true );
-                                               wfProfileIn( __METHOD__ . '-' . get_class( $job ) );
-                                               $success = $job->run();
-                                               wfProfileOut( __METHOD__ . '-' . get_class( $job ) );
-                                               $group->ack( $job ); // done
-                                               $t += microtime( true );
-                                               $t = round( $t * 1000 );
-                                               if ( $success === false ) {
-                                                       $output .= "Error: " . $job->getLastError() . ", Time: $t ms\n";
-                                               } else {
-                                                       $output .= "Success, Time: $t ms\n";
-                                               }
-                                               wfDebugLog( 'jobqueue', $output );
-                                       }
-                               } while ( --$n && $job );
-                       } catch ( MWException $e ) {
-                               // We don't want exceptions thrown during job execution to
-                               // be reported to the user since the output is already sent.
-                               // Instead we just log them.
-                               MWExceptionHandler::logException( $e );
+                       // Do not wait for the response (the script should handle client aborts).
+                       // Make sure that we don't close before that script reaches ignore_user_abort().
+                       $status = fgets( $sock );
+                       if ( !preg_match( '#^HTTP/\d\.\d 202 #', $status ) ) {
+                               wfDebugLog( 'runJobs', "Failed to start cron API: received '$status'\n" );
                        }
                }
+               fclose( $sock );
        }
 }
index da4416d..4739753 100644 (file)
@@ -127,7 +127,7 @@ class WikiMap {
 class WikiReference {
        private $mMinor; ///< 'en', 'meta', 'mediawiki', etc
        private $mMajor; ///< 'wiki', 'wiktionary', etc
-       private $mCanonicalServer; ///< canonical server URL, e.g. 'http://www.mediawiki.org'
+       private $mCanonicalServer; ///< canonical server URL, e.g. 'https://www.mediawiki.org'
        private $mServer; ///< server URL, may be protocol-relative, e.g. '//www.mediawiki.org'
        private $mPath;   ///< path, '/wiki/$1'
 
index 3de0475..b4aa303 100644 (file)
@@ -1568,7 +1568,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @param $flags Int
         * @return Int updated $flags
         */
-       function checkFlags( $flags ) {
+       public function checkFlags( $flags ) {
                if ( !( $flags & EDIT_NEW ) && !( $flags & EDIT_UPDATE ) ) {
                        if ( $this->exists() ) {
                                $flags |= EDIT_UPDATE;
@@ -2945,6 +2945,29 @@ class WikiPage implements Page, IDBAccessObject {
                        return array( array( 'notvisiblerev' ) );
                }
 
+               // Set patrolling and bot flag on the edits, which gets rollbacked.
+               // This is done before the rollback edit to have patrolling also on failure (bug 62157).
+               $set = array();
+               if ( $bot && $guser->isAllowed( 'markbotedits' ) ) {
+                       // Mark all reverted edits as bot
+                       $set['rc_bot'] = 1;
+               }
+
+               if ( $wgUseRCPatrol ) {
+                       // Mark all reverted edits as patrolled
+                       $set['rc_patrolled'] = 1;
+               }
+
+               if ( count( $set ) ) {
+                       $dbw->update( 'recentchanges', $set,
+                               array( /* WHERE */
+                                       'rc_cur_id' => $current->getPage(),
+                                       'rc_user_text' => $current->getUserText(),
+                                       'rc_timestamp > ' . $dbw->addQuotes( $s->rev_timestamp ),
+                               ), __METHOD__
+                       );
+               }
+
                // Generate the edit summary if necessary
                $target = Revision::newFromId( $s->rev_id );
                if ( empty( $summary ) ) {
@@ -3001,27 +3024,6 @@ class WikiPage implements Page, IDBAccessObject {
                        ) );
                }
 
-               $set = array();
-               if ( $bot && $guser->isAllowed( 'markbotedits' ) ) {
-                       // Mark all reverted edits as bot
-                       $set['rc_bot'] = 1;
-               }
-
-               if ( $wgUseRCPatrol ) {
-                       // Mark all reverted edits as patrolled
-                       $set['rc_patrolled'] = 1;
-               }
-
-               if ( count( $set ) ) {
-                       $dbw->update( 'recentchanges', $set,
-                               array( /* WHERE */
-                                       'rc_cur_id' => $current->getPage(),
-                                       'rc_user_text' => $current->getUserText(),
-                                       'rc_timestamp > ' . $dbw->addQuotes( $s->rev_timestamp ),
-                               ), __METHOD__
-                       );
-               }
-
                $revId = $status->value['revision']->getId();
 
                wfRunHooks( 'ArticleRollbackComplete', array( $this, $guser, $target, $current ) );
@@ -3508,7 +3510,7 @@ class PoolWorkArticleView extends PoolCounterWork {
         * @param $parserOptions parserOptions to use for the parse operation
         * @param $content Content|String: content to parse or null to load it; may also be given as a wikitext string, for BC
         */
-       function __construct( Page $page, ParserOptions $parserOptions, $revid, $useParserCache, $content = null ) {
+       public function __construct( Page $page, ParserOptions $parserOptions, $revid, $useParserCache, $content = null ) {
                if ( is_string( $content ) ) { // BC: old style call
                        $modelId = $page->getRevision()->getContentModel();
                        $format = $page->getRevision()->getContentFormat();
@@ -3554,7 +3556,7 @@ class PoolWorkArticleView extends PoolCounterWork {
        /**
         * @return bool
         */
-       function doWork() {
+       public function doWork() {
                global $wgUseFileCache;
 
                // @todo several of the methods called on $this->page are not declared in Page, but present
@@ -3617,7 +3619,7 @@ class PoolWorkArticleView extends PoolCounterWork {
        /**
         * @return bool
         */
-       function getCachedWork() {
+       public function getCachedWork() {
                $this->parserOutput = ParserCache::singleton()->get( $this->page, $this->parserOptions );
 
                if ( $this->parserOutput === false ) {
@@ -3632,7 +3634,7 @@ class PoolWorkArticleView extends PoolCounterWork {
        /**
         * @return bool
         */
-       function fallback() {
+       public function fallback() {
                $this->parserOutput = ParserCache::singleton()->getDirty( $this->page, $this->parserOptions );
 
                if ( $this->parserOutput === false ) {
@@ -3651,7 +3653,7 @@ class PoolWorkArticleView extends PoolCounterWork {
         * @param $status Status
         * @return bool
         */
-       function error( $status ) {
+       public function error( $status ) {
                $this->error = $status;
                return false;
        }
diff --git a/includes/actions/Action.php b/includes/actions/Action.php
new file mode 100644 (file)
index 0000000..1180c5e
--- /dev/null
@@ -0,0 +1,380 @@
+<?php
+/**
+ * Base classes for actions done on pages.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ * @file
+ */
+
+/**
+ * @defgroup Actions Action done on pages
+ */
+
+/**
+ * Actions are things which can be done to pages (edit, delete, rollback, etc).  They
+ * are distinct from Special Pages because an action must apply to exactly one page.
+ *
+ * To add an action in an extension, create a subclass of Action, and add the key to
+ * $wgActions.  There is also the deprecated UnknownAction hook
+ *
+ * Actions generally fall into two groups: the show-a-form-then-do-something-with-the-input
+ * format (protect, delete, move, etc), and the just-do-something format (watch, rollback,
+ * patrol, etc). The FormAction and FormlessAction classes represent these two groups.
+ */
+abstract class Action {
+
+       /**
+        * Page on which we're performing the action
+        * @var WikiPage|Article|ImagePage|CategoryPage|Page $page
+        */
+       protected $page;
+
+       /**
+        * IContextSource if specified; otherwise we'll use the Context from the Page
+        * @var IContextSource $context
+        */
+       protected $context;
+
+       /**
+        * The fields used to create the HTMLForm
+        * @var Array $fields
+        */
+       protected $fields;
+
+       /**
+        * Get the Action subclass which should be used to handle this action, false if
+        * the action is disabled, or null if it's not recognised
+        * @param $action String
+        * @param $overrides Array
+        * @return bool|null|string|callable
+        */
+       final private static function getClass( $action, array $overrides ) {
+               global $wgActions;
+               $action = strtolower( $action );
+
+               if ( !isset( $wgActions[$action] ) ) {
+                       return null;
+               }
+
+               if ( $wgActions[$action] === false ) {
+                       return false;
+               } elseif ( $wgActions[$action] === true && isset( $overrides[$action] ) ) {
+                       return $overrides[$action];
+               } elseif ( $wgActions[$action] === true ) {
+                       return ucfirst( $action ) . 'Action';
+               } else {
+                       return $wgActions[$action];
+               }
+       }
+
+       /**
+        * Get an appropriate Action subclass for the given action
+        * @param $action String
+        * @param $page Page
+        * @param $context IContextSource
+        * @return Action|bool|null false if the action is disabled, null
+        *     if it is not recognised
+        */
+       final public static function factory( $action, Page $page, IContextSource $context = null ) {
+               $classOrCallable = self::getClass( $action, $page->getActionOverrides() );
+
+               if ( is_string( $classOrCallable ) ) {
+                       $obj = new $classOrCallable( $page, $context );
+                       return $obj;
+               }
+
+               if ( is_callable( $classOrCallable ) ) {
+                       return call_user_func_array( $classOrCallable, array( $page, $context ) );
+               }
+
+               return $classOrCallable;
+       }
+
+       /**
+        * Get the action that will be executed, not necessarily the one passed
+        * passed through the "action" request parameter. Actions disabled in
+        * $wgActions will be replaced by "nosuchaction".
+        *
+        * @since 1.19
+        * @param $context IContextSource
+        * @return string: action name
+        */
+       final public static function getActionName( IContextSource $context ) {
+               global $wgActions;
+
+               $request = $context->getRequest();
+               $actionName = $request->getVal( 'action', 'view' );
+
+               // Check for disabled actions
+               if ( isset( $wgActions[$actionName] ) && $wgActions[$actionName] === false ) {
+                       $actionName = 'nosuchaction';
+               }
+
+               // Workaround for bug #20966: inability of IE to provide an action dependent
+               // on which submit button is clicked.
+               if ( $actionName === 'historysubmit' ) {
+                       if ( $request->getBool( 'revisiondelete' ) ) {
+                               $actionName = 'revisiondelete';
+                       } else {
+                               $actionName = 'view';
+                       }
+               } elseif ( $actionName == 'editredlink' ) {
+                       $actionName = 'edit';
+               }
+
+               // Trying to get a WikiPage for NS_SPECIAL etc. will result
+               // in WikiPage::factory throwing "Invalid or virtual namespace -1 given."
+               // For SpecialPages et al, default to action=view.
+               if ( !$context->canUseWikiPage() ) {
+                       return 'view';
+               }
+
+               $action = Action::factory( $actionName, $context->getWikiPage(), $context );
+               if ( $action instanceof Action ) {
+                       return $action->getName();
+               }
+
+               return 'nosuchaction';
+       }
+
+       /**
+        * Check if a given action is recognised, even if it's disabled
+        *
+        * @param string $name name of an action
+        * @return Bool
+        */
+       final public static function exists( $name ) {
+               return self::getClass( $name, array() ) !== null;
+       }
+
+       /**
+        * Get the IContextSource in use here
+        * @return IContextSource
+        */
+       final public function getContext() {
+               if ( $this->context instanceof IContextSource ) {
+                       return $this->context;
+               } elseif ( $this->page instanceof Article ) {
+                       // NOTE: $this->page can be a WikiPage, which does not have a context.
+                       wfDebug( __METHOD__ . ': no context known, falling back to Article\'s context.' );
+                       return $this->page->getContext();
+               }
+
+               wfWarn( __METHOD__ . ': no context known, falling back to RequestContext::getMain().' );
+               return RequestContext::getMain();
+       }
+
+       /**
+        * Get the WebRequest being used for this instance
+        *
+        * @return WebRequest
+        */
+       final public function getRequest() {
+               return $this->getContext()->getRequest();
+       }
+
+       /**
+        * Get the OutputPage being used for this instance
+        *
+        * @return OutputPage
+        */
+       final public function getOutput() {
+               return $this->getContext()->getOutput();
+       }
+
+       /**
+        * Shortcut to get the User being used for this instance
+        *
+        * @return User
+        */
+       final public function getUser() {
+               return $this->getContext()->getUser();
+       }
+
+       /**
+        * Shortcut to get the Skin being used for this instance
+        *
+        * @return Skin
+        */
+       final public function getSkin() {
+               return $this->getContext()->getSkin();
+       }
+
+       /**
+        * Shortcut to get the user Language being used for this instance
+        *
+        * @return Language
+        */
+       final public function getLanguage() {
+               return $this->getContext()->getLanguage();
+       }
+
+       /**
+        * Shortcut to get the user Language being used for this instance
+        *
+        * @deprecated since 1.19 Use getLanguage instead
+        * @return Language
+        */
+       final public function getLang() {
+               wfDeprecated( __METHOD__, '1.19' );
+               return $this->getLanguage();
+       }
+
+       /**
+        * Shortcut to get the Title object from the page
+        * @return Title
+        */
+       final public function getTitle() {
+               return $this->page->getTitle();
+       }
+
+       /**
+        * Get a Message object with context set
+        * Parameters are the same as wfMessage()
+        *
+        * @return Message object
+        */
+       final public function msg() {
+               $params = func_get_args();
+               return call_user_func_array( array( $this->getContext(), 'msg' ), $params );
+       }
+
+       /**
+        * Constructor.
+        *
+        * Only public since 1.21
+        *
+        * @param $page Page
+        * @param $context IContextSource
+        */
+       public function __construct( Page $page, IContextSource $context = null ) {
+               if ( $context === null ) {
+                       wfWarn( __METHOD__ . ' called without providing a Context object.' );
+                       // NOTE: We could try to initialize $context using $page->getContext(),
+                       //      if $page is an Article. That however seems to not work seamlessly.
+               }
+
+               $this->page = $page;
+               $this->context = $context;
+       }
+
+       /**
+        * Return the name of the action this object responds to
+        * @return String lowercase
+        */
+       abstract public function getName();
+
+       /**
+        * Get the permission required to perform this action.  Often, but not always,
+        * the same as the action name
+        * @return String|null
+        */
+       public function getRestriction() {
+               return null;
+       }
+
+       /**
+        * Checks if the given user (identified by an object) can perform this action.  Can be
+        * overridden by sub-classes with more complicated permissions schemes.  Failures here
+        * must throw subclasses of ErrorPageError
+        *
+        * @param $user User: the user to check, or null to use the context user
+        * @throws UserBlockedError|ReadOnlyError|PermissionsError
+        * @return bool True on success
+        */
+       protected function checkCanExecute( User $user ) {
+               $right = $this->getRestriction();
+               if ( $right !== null ) {
+                       $errors = $this->getTitle()->getUserPermissionsErrors( $right, $user );
+                       if ( count( $errors ) ) {
+                               throw new PermissionsError( $right, $errors );
+                       }
+               }
+
+               if ( $this->requiresUnblock() && $user->isBlocked() ) {
+                       $block = $user->getBlock();
+                       throw new UserBlockedError( $block );
+               }
+
+               // This should be checked at the end so that the user won't think the
+               // error is only temporary when he also don't have the rights to execute
+               // this action
+               if ( $this->requiresWrite() && wfReadOnly() ) {
+                       throw new ReadOnlyError();
+               }
+               return true;
+       }
+
+       /**
+        * Whether this action requires the wiki not to be locked
+        * @return Bool
+        */
+       public function requiresWrite() {
+               return true;
+       }
+
+       /**
+        * Whether this action can still be executed by a blocked user
+        * @return Bool
+        */
+       public function requiresUnblock() {
+               return true;
+       }
+
+       /**
+        * Set output headers for noindexing etc.  This function will not be called through
+        * the execute() entry point, so only put UI-related stuff in here.
+        */
+       protected function setHeaders() {
+               $out = $this->getOutput();
+               $out->setRobotPolicy( "noindex,nofollow" );
+               $out->setPageTitle( $this->getPageTitle() );
+               $this->getOutput()->setSubtitle( $this->getDescription() );
+               $out->setArticleRelated( true );
+       }
+
+       /**
+        * Returns the name that goes in the \<h1\> page title
+        *
+        * @return String
+        */
+       protected function getPageTitle() {
+               return $this->getTitle()->getPrefixedText();
+       }
+
+       /**
+        * Returns the description that goes below the \<h1\> tag
+        *
+        * @return String
+        */
+       protected function getDescription() {
+               return $this->msg( strtolower( $this->getName() ) )->escaped();
+       }
+
+       /**
+        * The main action entry point.  Do all output for display and send it to the context
+        * output.  Do not use globals $wgOut, $wgRequest, etc, in implementations; use
+        * $this->getOutput(), etc.
+        * @throws ErrorPageError
+        */
+       abstract public function show();
+
+       /**
+        * Execute the action in a silent fashion: do not display anything or release any errors.
+        * @return Bool whether execution was successful
+        */
+       abstract public function execute();
+}
diff --git a/includes/actions/FormAction.php b/includes/actions/FormAction.php
new file mode 100644 (file)
index 0000000..974ee94
--- /dev/null
@@ -0,0 +1,168 @@
+<?php
+/**
+ * Base classes for actions done on pages.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ * @file
+ */
+
+/**
+ * @defgroup Actions Action done on pages
+ */
+
+/**
+ * An action which shows a form and does something based on the input from the form
+ */
+abstract class FormAction extends Action {
+
+       /**
+        * Get an HTMLForm descriptor array
+        * @return Array
+        */
+       abstract protected function getFormFields();
+
+       /**
+        * Add pre- or post-text to the form
+        * @return String HTML which will be sent to $form->addPreText()
+        */
+       protected function preText() {
+               return '';
+       }
+
+       /**
+        * @return string
+        */
+       protected function postText() {
+               return '';
+       }
+
+       /**
+        * Play with the HTMLForm if you need to more substantially
+        * @param $form HTMLForm
+        */
+       protected function alterForm( HTMLForm $form ) {
+       }
+
+       /**
+        * Get the HTMLForm to control behavior
+        * @return HTMLForm|null
+        */
+       protected function getForm() {
+               $this->fields = $this->getFormFields();
+
+               // Give hooks a chance to alter the form, adding extra fields or text etc
+               wfRunHooks( 'ActionModifyFormFields', array( $this->getName(), &$this->fields, $this->page ) );
+
+               $form = new HTMLForm( $this->fields, $this->getContext(), $this->getName() );
+               $form->setSubmitCallback( array( $this, 'onSubmit' ) );
+
+               // Retain query parameters (uselang etc)
+               $form->addHiddenField( 'action', $this->getName() ); // Might not be the same as the query string
+               $params = array_diff_key(
+                       $this->getRequest()->getQueryValues(),
+                       array( 'action' => null, 'title' => null )
+               );
+               $form->addHiddenField( 'redirectparams', wfArrayToCgi( $params ) );
+
+               $form->addPreText( $this->preText() );
+               $form->addPostText( $this->postText() );
+               $this->alterForm( $form );
+
+               // Give hooks a chance to alter the form, adding extra fields or text etc
+               wfRunHooks( 'ActionBeforeFormDisplay', array( $this->getName(), &$form, $this->page ) );
+
+               return $form;
+       }
+
+       /**
+        * Process the form on POST submission.  If you return false from getFormFields(),
+        * this will obviously never be reached.  If you don't want to do anything with the
+        * form, just return false here
+        * @param  $data Array
+        * @return Bool|Array true for success, false for didn't-try, array of errors on failure
+        */
+       abstract public function onSubmit( $data );
+
+       /**
+        * Do something exciting on successful processing of the form.  This might be to show
+        * a confirmation message (watch, rollback, etc) or to redirect somewhere else (edit,
+        * protect, etc).
+        */
+       abstract public function onSuccess();
+
+       /**
+        * The basic pattern for actions is to display some sort of HTMLForm UI, maybe with
+        * some stuff underneath (history etc); to do some processing on submission of that
+        * form (delete, protect, etc) and to do something exciting on 'success', be that
+        * display something new or redirect to somewhere.  Some actions have more exotic
+        * behavior, but that's what subclassing is for :D
+        */
+       public function show() {
+               $this->setHeaders();
+
+               // This will throw exceptions if there's a problem
+               $this->checkCanExecute( $this->getUser() );
+
+               $form = $this->getForm();
+               if ( $form->show() ) {
+                       $this->onSuccess();
+               }
+       }
+
+       /**
+        * @see Action::execute()
+        *
+        * @param $data array|null
+        * @param $captureErrors bool
+        * @throws ErrorPageError|Exception
+        * @return bool
+        */
+       public function execute( array $data = null, $captureErrors = true ) {
+               try {
+                       // Set a new context so output doesn't leak.
+                       $this->context = clone $this->getContext();
+
+                       // This will throw exceptions if there's a problem
+                       $this->checkCanExecute( $this->getUser() );
+
+                       $fields = array();
+                       foreach ( $this->fields as $key => $params ) {
+                               if ( isset( $data[$key] ) ) {
+                                       $fields[$key] = $data[$key];
+                               } elseif ( isset( $params['default'] ) ) {
+                                       $fields[$key] = $params['default'];
+                               } else {
+                                       $fields[$key] = null;
+                               }
+                       }
+                       $status = $this->onSubmit( $fields );
+                       if ( $status === true ) {
+                               // This might do permanent stuff
+                               $this->onSuccess();
+                               return true;
+                       } else {
+                               return false;
+                       }
+               }
+               catch ( ErrorPageError $e ) {
+                       if ( $captureErrors ) {
+                               return false;
+                       } else {
+                               throw $e;
+                       }
+               }
+       }
+}
diff --git a/includes/actions/FormlessAction.php b/includes/actions/FormlessAction.php
new file mode 100644 (file)
index 0000000..6cab4d1
--- /dev/null
@@ -0,0 +1,100 @@
+<?php
+/**
+ * Base classes for actions done on pages.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ * @file
+ */
+
+/**
+ * @defgroup Actions Action done on pages
+ */
+
+/**
+ * An action which just does something, without showing a form first.
+ */
+abstract class FormlessAction extends Action {
+
+       /**
+        * Show something on GET request.
+        * @return String|null will be added to the HTMLForm if present, or just added to the
+        *     output if not.  Return null to not add anything
+        */
+       abstract public function onView();
+
+       /**
+        * We don't want an HTMLForm
+        * @return bool
+        */
+       protected function getFormFields() {
+               return false;
+       }
+
+       /**
+        * @param $data Array
+        * @return bool
+        */
+       public function onSubmit( $data ) {
+               return false;
+       }
+
+       /**
+        * @return bool
+        */
+       public function onSuccess() {
+               return false;
+       }
+
+       public function show() {
+               $this->setHeaders();
+
+               // This will throw exceptions if there's a problem
+               $this->checkCanExecute( $this->getUser() );
+
+               $this->getOutput()->addHTML( $this->onView() );
+       }
+
+       /**
+        * Execute the action silently, not giving any output.  Since these actions don't have
+        * forms, they probably won't have any data, but some (eg rollback) may do
+        * @param array $data values that would normally be in the GET request
+        * @param bool $captureErrors whether to catch exceptions and just return false
+        * @throws ErrorPageError|Exception
+        * @return Bool whether execution was successful
+        */
+       public function execute( array $data = null, $captureErrors = true ) {
+               try {
+                       // Set a new context so output doesn't leak.
+                       $this->context = clone $this->getContext();
+                       if ( is_array( $data ) ) {
+                               $this->context->setRequest( new FauxRequest( $data, false ) );
+                       }
+
+                       // This will throw exceptions if there's a problem
+                       $this->checkCanExecute( $this->getUser() );
+
+                       $this->onView();
+                       return true;
+               }
+               catch ( ErrorPageError $e ) {
+                       if ( $captureErrors ) {
+                               return false;
+                       } else {
+                               throw $e;
+                       }
+               }
+       }
+}
index 332fa9e..364300e 100644 (file)
@@ -222,7 +222,7 @@ class ApiBlock extends ApiBase {
        }
 
        public function getDescription() {
-               return 'Block a user';
+               return 'Block a user.';
        }
 
        public function getPossibleErrors() {
index 237e8c8..c1bbea7 100644 (file)
@@ -157,8 +157,8 @@ class ApiComparePages extends ApiBase {
 
        public function getDescription() {
                return array(
-                       'Get the difference between 2 pages',
-                       'You must pass a revision number or a page title or a page ID id for each part (1 and 2)'
+                       'Get the difference between 2 pages.',
+                       'You must pass a revision number or a page title or a page ID id for each part (1 and 2).'
                );
        }
 
index c09cad3..acc2eb8 100644 (file)
@@ -240,7 +240,7 @@ class ApiDelete extends ApiBase {
        }
 
        public function getDescription() {
-               return 'Delete a page';
+               return 'Delete a page.';
        }
 
        public function getPossibleErrors() {
index e5ef3b7..6ea5d20 100644 (file)
@@ -53,7 +53,7 @@ class ApiDisabled extends ApiBase {
        }
 
        public function getDescription() {
-               return 'This module has been disabled';
+               return 'This module has been disabled.';
        }
 
        public function getExamples() {
index d5c789c..28ed5e4 100644 (file)
@@ -108,7 +108,7 @@ class ApiExpandTemplates extends ApiBase {
        }
 
        public function getDescription() {
-               return 'Expands all templates in wikitext';
+               return 'Expands all templates in wikitext.';
        }
 
        public function getPossibleErrors() {
index f90ba98..4173402 100644 (file)
@@ -78,6 +78,7 @@ class ApiFeedContributions extends ApiBase {
                        'tagFilter' => $params['tagfilter'],
                        'deletedOnly' => $params['deletedonly'],
                        'topOnly' => $params['toponly'],
+                       'newOnly' => $params['newonly'],
                        'showSizeDiff' => $params['showsizediff'],
                ) );
 
@@ -186,6 +187,7 @@ class ApiFeedContributions extends ApiBase {
                        ),
                        'deletedonly' => false,
                        'toponly' => false,
+                       'newonly' => false,
                        'showsizediff' => false,
                );
        }
@@ -200,12 +202,13 @@ class ApiFeedContributions extends ApiBase {
                        'tagfilter' => 'Filter contributions that have these tags',
                        'deletedonly' => 'Show only deleted contributions',
                        'toponly' => 'Only show edits that are latest revisions',
+                       'newonly' => 'Only show edits that are page creations',
                        'showsizediff' => 'Show the size difference between revisions. Disabled in Miser Mode',
                );
        }
 
        public function getDescription() {
-               return 'Returns a user contributions feed';
+               return 'Returns a user contributions feed.';
        }
 
        public function getPossibleErrors() {
diff --git a/includes/api/ApiFeedRecentChanges.php b/includes/api/ApiFeedRecentChanges.php
new file mode 100644 (file)
index 0000000..f1c1bf3
--- /dev/null
@@ -0,0 +1,203 @@
+<?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
+ * @since 1.23
+ */
+
+/**
+ * Recent changes feed.
+ *
+ * @ingroup API
+ */
+class ApiFeedRecentChanges extends ApiBase {
+
+       /**
+        * This module uses a custom feed wrapper printer.
+        *
+        * @return ApiFormatFeedWrapper
+        */
+       public function getCustomPrinter() {
+               return new ApiFormatFeedWrapper( $this->getMain() );
+       }
+
+       /**
+        * Format the rows (generated by SpecialRecentchanges or SpecialRecentchangeslinked)
+        * as an RSS/Atom feed.
+        */
+       public function execute() {
+               global $wgFeed, $wgFeedClasses;
+
+               $this->params = $this->extractRequestParams();
+
+               if ( !$wgFeed ) {
+                       $this->dieUsage( 'Syndication feeds are not available', 'feed-unavailable' );
+               }
+
+               if ( !isset( $wgFeedClasses[$this->params['feedformat']] ) ) {
+                       $this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' );
+               }
+
+               $feedFormat = $this->params['feedformat'];
+               $specialClass = $this->params['target'] !== null
+                       ? 'SpecialRecentchangeslinked'
+                       : 'SpecialRecentchanges';
+
+               $formatter = $this->getFeedObject( $feedFormat, $specialClass );
+
+               // Everything is passed implicitly via $wgRequest… :(
+               // The row-getting functionality should maybe be factored out of ChangesListSpecialPage too…
+               $rc = new $specialClass();
+               $rows = $rc->getRows();
+
+               $feedItems = $rows ? ChangesFeed::buildItems( $rows ) : array();
+
+               ApiFormatFeedWrapper::setResult( $this->getResult(), $formatter, $feedItems );
+       }
+
+       /**
+        * Return a ChannelFeed object.
+        *
+        * @param string $feedFormat Feed's format (either 'rss' or 'atom')
+        * @param string $specialClass Relevant special page name (either 'SpecialRecentchanges' or
+        *     'SpecialRecentchangeslinked')
+        * @return ChannelFeed
+        */
+       public function getFeedObject( $feedFormat, $specialClass ) {
+               if ( $specialClass === 'SpecialRecentchangeslinked' ) {
+                       $title = Title::newFromText( $this->params['target'] );
+                       $feed = new ChangesFeed( $feedFormat, false );
+                       $feedObj = $feed->getFeedObject(
+                               $this->msg( 'recentchangeslinked-title', $title->getPrefixedText() )
+                                       ->inContentLanguage()->text(),
+                               $this->msg( 'recentchangeslinked-feed' )->inContentLanguage()->text(),
+                               SpecialPage::getTitleFor( 'Recentchangeslinked' )->getFullURL()
+                       );
+               } else {
+                       $feed = new ChangesFeed( $feedFormat, 'rcfeed' );
+                       $feedObj = $feed->getFeedObject(
+                               $this->msg( 'recentchanges' )->inContentLanguage()->text(),
+                               $this->msg( 'recentchanges-feed-description' )->inContentLanguage()->text(),
+                               SpecialPage::getTitleFor( 'Recentchanges' )->getFullURL()
+                       );
+               }
+
+               return $feedObj;
+       }
+
+       public function getAllowedParams() {
+               global $wgFeedClasses, $wgAllowCategorizedRecentChanges, $wgFeedLimit;
+               $feedFormatNames = array_keys( $wgFeedClasses );
+
+               $ret = array(
+                       'feedformat' => array(
+                               ApiBase::PARAM_DFLT => 'rss',
+                               ApiBase::PARAM_TYPE => $feedFormatNames,
+                       ),
+
+                       'namespace' => array(
+                               ApiBase::PARAM_TYPE => 'namespace',
+                       ),
+                       'invert' => false,
+                       'associated' => false,
+
+                       'days' => array(
+                               ApiBase::PARAM_DFLT => 7,
+                               ApiBase::PARAM_MIN => 1,
+                               ApiBase::PARAM_TYPE => 'integer',
+                       ),
+                       'limit' => array(
+                               ApiBase::PARAM_DFLT => 50,
+                               ApiBase::PARAM_MIN => 1,
+                               ApiBase::PARAM_MAX => $wgFeedLimit,
+                               ApiBase::PARAM_TYPE => 'integer',
+                       ),
+                       'from' => array(
+                               ApiBase::PARAM_TYPE => 'timestamp',
+                       ),
+
+                       'hideminor' => false,
+                       'hidebots' => false,
+                       'hideanons' => false,
+                       'hideliu' => false,
+                       'hidepatrolled' => false,
+                       'hidemyself' => false,
+
+                       'tagfilter' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                       ),
+
+                       'target' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                       ),
+                       'showlinkedto' => false,
+               );
+
+               if ( $wgAllowCategorizedRecentChanges ) {
+                       $ret += array(
+                               'categories' => array(
+                                       ApiBase::PARAM_TYPE => 'string',
+                                       ApiBase::PARAM_ISMULTI => true,
+                               ),
+                               'categories_any' => false,
+                       );
+               }
+
+               return $ret;
+       }
+
+       public function getParamDescription() {
+               return array(
+                       'feedformat' => 'The format of the feed',
+                       'namespace' => 'Namespace to limit the results to',
+                       'invert' => 'All namespaces but the selected one',
+                       'associated' => 'Include associated (talk or main) namespace',
+                       'days' => 'Days to limit the results to',
+                       'limit' => 'Maximum number of results to return',
+                       'from' => 'Show changes since then',
+                       'hideminor' => 'Hide minor changes',
+                       'hidebots' => 'Hide changes made by bots',
+                       'hideanons' => 'Hide changes made by anonymous users',
+                       'hideliu' => 'Hide changes made by registered users',
+                       'hidepatrolled' => 'Hide patrolled changes',
+                       'hidemyself' => 'Hide changes made by yourself',
+                       'tagfilter' => 'Filter by tag',
+                       'target' => 'Show only changes on pages linked from this page',
+                       'showlinkedto' => 'Show changes on pages linked to the selected page instead',
+                       'categories' => 'Show only changes on pages in all of these categories',
+                       'categories_any' => 'Show only changes on pages in any of the categories instead',
+               );
+       }
+
+       public function getDescription() {
+               return 'Returns a recent changes feed';
+       }
+
+       public function getPossibleErrors() {
+               return array_merge( parent::getPossibleErrors(), array(
+                       array( 'code' => 'feed-unavailable', 'info' => 'Syndication feeds are not available' ),
+                       array( 'code' => 'feed-invalid', 'info' => 'Invalid subscription feed type' ),
+               ) );
+       }
+
+       public function getExamples() {
+               return array(
+                       'api.php?action=feedrecentchanges',
+                       'api.php?action=feedrecentchanges&days=30'
+               );
+       }
+}
index 84c1fae..4770365 100644 (file)
@@ -266,7 +266,7 @@ class ApiFeedWatchlist extends ApiBase {
        }
 
        public function getDescription() {
-               return 'Returns a watchlist feed';
+               return 'Returns a watchlist feed.';
        }
 
        public function getPossibleErrors() {
index a3fa5f9..1941fbd 100644 (file)
@@ -167,7 +167,7 @@ class ApiFileRevert extends ApiBase {
 
        public function getDescription() {
                return array(
-                       'Revert a file to an old version'
+                       'Revert a file to an old version.'
                );
        }
 
index 63a5502..3c924bc 100644 (file)
@@ -271,12 +271,22 @@ See the <a href='https://www.mediawiki.org/wiki/API'>complete documentation</a>,
                // 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 );
+
                // identify requests to api.php
-               $text = preg_replace( "#api\\.php\\?[^ <\n\t]+#", '<a href="\\0">\\0</a>', $text );
+               $text = preg_replace( '#^(\s*)(api\.php\?[^ <\n\t]+)$#m', '\1<a href="\2">\2</a>', $text );
                if ( $this->mHelp ) {
-                       // make strings inside * bold
-                       $text = preg_replace( "#\\*[^<>\n]+\\*#", '<b>\\0</b>', $text );
+                       // make lines inside * bold
+                       $text = preg_replace( '#^(\s*)(\*[^<>\n]+\*)(\s*)$#m', '$1<b>$2</b>$3', $text );
                }
+
+               // Armor links (bug 61362)
+               $masked = array();
+               $text = preg_replace_callback( '#<a .*?</a>#', function ( $matches ) use ( &$masked ) {
+                       $sha = sha1( $matches[0] );
+                       $masked[$sha] = $matches[0];
+                       return "<$sha>";
+               }, $text );
+
                // identify URLs
                $protos = wfUrlProtocolsWithoutProtRel();
                // This regex hacks around bug 13218 (&quot; included in the URL)
@@ -286,6 +296,12 @@ See the <a href='https://www.mediawiki.org/wiki/API'>complete documentation</a>,
                        $text
                );
 
+               // Unarmor links
+               $text = preg_replace_callback( '#<([0-9a-f]{40})>#', function ( $matches ) use ( &$masked ) {
+                       $sha = $matches[1];
+                       return isset( $masked[$sha] ) ? $masked[$sha] : $matches[0];
+               }, $text );
+
                /**
                 * Temporary fix for bad links in help messages. As a special case,
                 * XML-escaped metachars are de-escaped one level in the help message
index 5b1f29c..e584d0d 100644 (file)
@@ -152,7 +152,7 @@ class ApiHelp extends ApiBase {
        }
 
        public function getDescription() {
-               return 'Display this help screen. Or the help screen for the specified module';
+               return 'Display this help screen. Or the help screen for the specified module.';
        }
 
        public function getExamples() {
index 5d2ee6f..b8e16ab 100644 (file)
@@ -203,7 +203,7 @@ class ApiImageRotate extends ApiBase {
        }
 
        public function getDescription() {
-               return 'Rotate one or more images';
+               return 'Rotate one or more images.';
        }
 
        public function needsToken() {
index fe3143e..cba2134 100644 (file)
@@ -261,7 +261,7 @@ class ApiLogin extends ApiBase {
                        'In the event of a successful log-in, a cookie will be attached to your session.',
                        'In the event of a failed log-in, you will not be able to attempt another log-in',
                        'through this method for 5 seconds. This is to prevent password guessing by',
-                       'automated password crackers'
+                       'automated password crackers.'
                );
        }
 
index 2ba92a6..c8b3882 100644 (file)
@@ -59,7 +59,7 @@ class ApiLogout extends ApiBase {
        }
 
        public function getDescription() {
-               return 'Log out and clear session data';
+               return 'Log out and clear session data.';
        }
 
        public function getExamples() {
index 2684f51..8f270dc 100644 (file)
@@ -56,6 +56,7 @@ class ApiMain extends ApiBase {
                'parse' => 'ApiParse',
                'opensearch' => 'ApiOpenSearch',
                'feedcontributions' => 'ApiFeedContributions',
+               'feedrecentchanges' => 'ApiFeedRecentChanges',
                'feedwatchlist' => 'ApiFeedWatchlist',
                'help' => 'ApiHelp',
                'paraminfo' => 'ApiParamInfo',
@@ -67,6 +68,7 @@ class ApiMain extends ApiBase {
                'purge' => 'ApiPurge',
                'setnotificationtimestamp' => 'ApiSetNotificationTimestamp',
                'rollback' => 'ApiRollback',
+               'runjobs' => 'ApiRunJobs',
                'delete' => 'ApiDelete',
                'undelete' => 'ApiUndelete',
                'protect' => 'ApiProtect',
@@ -361,37 +363,7 @@ class ApiMain extends ApiBase {
                try {
                        $this->executeAction();
                } catch ( Exception $e ) {
-                       // Allow extra cleanup and logging
-                       wfRunHooks( 'ApiMain::onException', array( $this, $e ) );
-
-                       // Log it
-                       if ( !( $e instanceof UsageException ) ) {
-                               MWExceptionHandler::logException( $e );
-                       }
-
-                       // Handle any kind of exception by outputting properly formatted error message.
-                       // If this fails, an unhandled exception should be thrown so that global error
-                       // handler will process and log it.
-
-                       $errCode = $this->substituteResultWithError( $e );
-
-                       // Error results should not be cached
-                       $this->setCacheMode( 'private' );
-
-                       $response = $this->getRequest()->response();
-                       $headerStr = 'MediaWiki-API-Error: ' . $errCode;
-                       if ( $e->getCode() === 0 ) {
-                               $response->header( $headerStr );
-                       } else {
-                               $response->header( $headerStr, true, $e->getCode() );
-                       }
-
-                       // Reset and print just the error message
-                       ob_clean();
-
-                       // If the error occurred during printing, do a printer->profileOut()
-                       $this->mPrinter->safeProfileOut();
-                       $this->printResult( true );
+                       $this->handleException( $e );
                }
 
                // Log the request whether or not there was an error
@@ -408,6 +380,73 @@ class ApiMain extends ApiBase {
                ob_end_flush();
        }
 
+       /**
+        * Handle an exception as an API response
+        *
+        * @since 1.23
+        * @param Exception $e
+        */
+       protected function handleException( Exception $e ) {
+               // Allow extra cleanup and logging
+               wfRunHooks( 'ApiMain::onException', array( $this, $e ) );
+
+               // Log it
+               if ( !( $e instanceof UsageException ) ) {
+                       MWExceptionHandler::logException( $e );
+               }
+
+               // Handle any kind of exception by outputting properly formatted error message.
+               // If this fails, an unhandled exception should be thrown so that global error
+               // handler will process and log it.
+
+               $errCode = $this->substituteResultWithError( $e );
+
+               // Error results should not be cached
+               $this->setCacheMode( 'private' );
+
+               $response = $this->getRequest()->response();
+               $headerStr = 'MediaWiki-API-Error: ' . $errCode;
+               if ( $e->getCode() === 0 ) {
+                       $response->header( $headerStr );
+               } else {
+                       $response->header( $headerStr, true, $e->getCode() );
+               }
+
+               // Reset and print just the error message
+               ob_clean();
+
+               // If the error occurred during printing, do a printer->profileOut()
+               $this->mPrinter->safeProfileOut();
+               $this->printResult( true );
+       }
+
+       /**
+        * Handle an exception from the ApiBeforeMain hook.
+        *
+        * This tries to print the exception as an API response, to be more
+        * friendly to clients. If it fails, it will rethrow the exception.
+        *
+        * @since 1.23
+        * @param Exception $e
+        */
+       public static function handleApiBeforeMainException( Exception $e ) {
+               ob_start();
+
+               try {
+                       $main = new self( RequestContext::getMain(), false );
+                       $main->handleException( $e );
+               } catch ( Exception $e2 ) {
+                       // Nope, even that didn't work. Punt.
+                       throw $e;
+               }
+
+               // Log the request and reset cache headers
+               $main->logRequest( 0 );
+               $main->sendCacheHeaders();
+
+               ob_end_flush();
+       }
+
        /**
         * Check the &origin= query parameter against the Origin: HTTP header and respond appropriately.
         *
@@ -1110,14 +1149,14 @@ class ApiMain extends ApiBase {
                        '',
                        'Status:                All features shown on this page should be working, but the API',
                        '                       is still in active development, and may change at any time.',
-                       '                       Make sure to monitor our mailing list for any updates',
+                       '                       Make sure to monitor our mailing list for any updates.',
                        '',
                        'Erroneous requests:    When erroneous requests are sent to the API, a HTTP header will be sent',
                        '                       with the key "MediaWiki-API-Error" and then both the value of the',
-                       '                       header and the error code sent back will be set to the same value',
+                       '                       header and the error code sent back will be set to the same value.',
                        '',
                        '                       In the case of an invalid action being passed, these will have a value',
-                       '                       of "unknown_action"',
+                       '                       of "unknown_action".',
                        '',
                        '                       For more information see https://www.mediawiki.org' .
                                '/wiki/API:Errors_and_warnings',
@@ -1161,12 +1200,11 @@ class ApiMain extends ApiBase {
        protected function getCredits() {
                return array(
                        'API developers:',
-                       '    Roan Kattouw - roan . kattouw @ gmail . com (lead developer Sep 2007-2009)',
-                       '    Victor Vasiliev - vasilvv @ gmail . com',
-                       '    Bryan Tong Minh - bryan . tongminh @ gmail . com',
-                       '    Sam Reed - sam @ reedyboy . net',
-                       '    Yuri Astrakhan - yuri . astrakhan @ gmail . com (creator, lead ' .
-                               'developer Sep 2006-Sep 2007, 2012-present)',
+                       '    Roan Kattouw (lead developer Sep 2007-2009)',
+                       '    Victor Vasiliev',
+                       '    Bryan Tong Minh',
+                       '    Sam Reed',
+                       '    Yuri Astrakhan (creator, lead developer Sep 2006-Sep 2007, 2012-present)',
                        '',
                        'Please send your comments, suggestions and questions to mediawiki-api@lists.wikimedia.org',
                        'or file a bug report at https://bugzilla.wikimedia.org/'
index 20ac48a..10b655f 100644 (file)
@@ -272,7 +272,7 @@ class ApiMove extends ApiBase {
        }
 
        public function getDescription() {
-               return 'Move a page';
+               return 'Move a page.';
        }
 
        public function getPossibleErrors() {
index 4b8578b..f2bf754 100644 (file)
@@ -125,7 +125,7 @@ class ApiOpenSearch extends ApiBase {
        }
 
        public function getDescription() {
-               return 'Search the wiki using the OpenSearch protocol';
+               return 'Search the wiki using the OpenSearch protocol.';
        }
 
        public function getExamples() {
index fb441a3..86d051a 100644 (file)
@@ -174,10 +174,11 @@ class ApiOptions extends ApiBase {
                        'token' => 'An options token previously obtained through the action=tokens',
                        'reset' => 'Resets preferences to the site defaults',
                        'resetkinds' => 'List of types of options to reset when the "reset" option is set',
-                       'change' => 'List of changes, formatted name=value (e.g. skin=vector), ' .
-                               'value cannot contain pipe characters. If no value is given (not ' .
+                       'change' => array( 'List of changes, formatted name=value (e.g. skin=vector), ' .
+                               'value cannot contain pipe characters. If no value is given (not ',
                                'even an equals sign), e.g., optionname|otheroption|..., the ' .
-                               'option will be reset to its default value',
+                               'option will be reset to its default value'
+                       ),
                        'optionname' => 'A name of a option which should have an optionvalue set',
                        'optionvalue' => 'A value of the option specified by the optionname, ' .
                                'can contain pipe characters',
@@ -186,7 +187,7 @@ class ApiOptions extends ApiBase {
 
        public function getDescription() {
                return array(
-                       'Change preferences of the current user',
+                       'Change preferences of the current user.',
                        'Only options which are registered in core or in one of installed extensions,',
                        'or as options with keys prefixed with \'userjs-\' (intended to be used by user',
                        'scripts), can be set.'
index 2b4710a..5092af0 100644 (file)
@@ -349,7 +349,7 @@ class ApiParamInfo extends ApiBase {
        }
 
        public function getDescription() {
-               return 'Obtain information about certain API parameters and errors';
+               return 'Obtain information about certain API parameters and errors.';
        }
 
        public function getExamples() {
index 47ad80f..ce52565 100644 (file)
@@ -818,9 +818,9 @@ class ApiParse extends ApiBase {
                $p = $this->getModulePrefix();
 
                return array(
-                       'Parses content and returns parser output',
+                       'Parses content and returns parser output.',
                        'See the various prop-Modules of action=query to get information from the current' .
-                               'version of a page',
+                               'version of a page.',
                        'There are several ways to specify the text to parse:',
                        "1) Specify a page or revision, using {$p}page, {$p}pageid, or {$p}oldid.",
                        "2) Specify content explicitly, using {$p}text, {$p}title, and {$p}contentmodel.",
index 46bd94e..00297ec 100644 (file)
@@ -109,7 +109,7 @@ class ApiPatrol extends ApiBase {
        }
 
        public function getDescription() {
-               return 'Patrol a page or revision';
+               return 'Patrol a page or revision.';
        }
 
        public function getPossibleErrors() {
index 644e97e..27f0f1e 100644 (file)
@@ -212,7 +212,7 @@ class ApiProtect extends ApiBase {
        }
 
        public function getDescription() {
-               return 'Change the protection level of a page';
+               return 'Change the protection level of a page.';
        }
 
        public function getPossibleErrors() {
index 49ab591..c6ae611 100644 (file)
@@ -736,7 +736,7 @@ class ApiQuery extends ApiBase {
                                'from the MediaWiki databases,',
                        'and is loosely based on the old query.php interface.',
                        'All data modifications will first have to use query to acquire a ' .
-                               'token to prevent abuse from malicious sites'
+                               'token to prevent abuse from malicious sites.'
                );
        }
 
index 44bf0cb..8a1810b 100644 (file)
@@ -225,7 +225,7 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
        }
 
        public function getDescription() {
-               return 'Enumerate all categories';
+               return 'Enumerate all categories.';
        }
 
        public function getExamples() {
index 4095bd8..0591fa9 100644 (file)
@@ -394,7 +394,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
        }
 
        public function getDescription() {
-               return 'Enumerate all images sequentially';
+               return 'Enumerate all images sequentially.';
        }
 
        public function getPossibleErrors() {
index 6b1d5a2..09f40fd 100644 (file)
@@ -285,7 +285,7 @@ class ApiQueryAllMessages extends ApiQueryBase {
        }
 
        public function getDescription() {
-               return 'Return messages from this site';
+               return 'Return messages from this site.';
        }
 
        public function getExamples() {
index 501154a..8ae8f3e 100644 (file)
@@ -341,7 +341,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
        }
 
        public function getDescription() {
-               return 'Enumerate all pages sequentially in a given namespace';
+               return 'Enumerate all pages sequentially in a given namespace.';
        }
 
        public function getPossibleErrors() {
index 748dbaf..7915118 100644 (file)
@@ -438,7 +438,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
        }
 
        public function getDescription() {
-               return 'Enumerate all registered users';
+               return 'Enumerate all registered users.';
        }
 
        public function getPossibleErrors() {
index bda1e03..9502d11 100644 (file)
@@ -534,13 +534,13 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
        public function getDescription() {
                switch ( $this->getModuleName() ) {
                        case 'backlinks':
-                               return 'Find all pages that link to the given page';
+                               return 'Find all pages that link to the given page.';
                        case 'embeddedin':
-                               return 'Find all pages that embed (transclude) the given title';
+                               return 'Find all pages that embed (transclude) the given title.';
                        case 'imageusage':
                                return 'Find all pages that use the given image title.';
                        default:
-                               ApiBase::dieDebug( __METHOD__, 'Unknown module name' );
+                               ApiBase::dieDebug( __METHOD__, 'Unknown module name.' );
                }
        }
 
index 47768cb..6cc0183 100644 (file)
@@ -408,7 +408,7 @@ class ApiQueryBlocks extends ApiQueryBase {
        }
 
        public function getDescription() {
-               return 'List all blocked users and IP addresses';
+               return 'List all blocked users and IP addresses.';
        }
 
        public function getPossibleErrors() {
index c5b12b3..30d7449 100644 (file)
@@ -254,7 +254,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
        }
 
        public function getDescription() {
-               return 'List all categories the page(s) belong to';
+               return 'List all categories the page(s) belong to.';
        }
 
        public function getPossibleErrors() {
index 574ef6e..d0e3a36 100644 (file)
@@ -143,7 +143,7 @@ class ApiQueryCategoryInfo extends ApiQueryBase {
        }
 
        public function getDescription() {
-               return 'Returns information about the given categories';
+               return 'Returns information about the given categories.';
        }
 
        public function getExamples() {
index f7bd59a..4e942d6 100644 (file)
@@ -401,7 +401,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
        }
 
        public function getDescription() {
-               return 'List all pages in a given category';
+               return 'List all pages in a given category.';
        }
 
        public function getPossibleErrors() {
index 37fb489..912ac02 100644 (file)
@@ -275,7 +275,7 @@ class ApiQueryContributors extends ApiQueryBase {
 
        public function getDescription() {
                return 'Get the list of logged-in contributors and ' .
-                       'the count of anonymous contributors to a page';
+                       'the count of anonymous contributors to a page.';
        }
 
        public function getExamples() {
index 365fe3f..f738c50 100644 (file)
@@ -492,12 +492,12 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                return array(
                        'List deleted revisions.',
                        'Operates in three modes:',
-                       ' 1) List deleted revisions for the given title(s), sorted by timestamp',
-                       ' 2) List deleted contributions for the given user, sorted by timestamp (no titles specified)',
+                       ' 1) List deleted revisions for the given title(s), sorted by timestamp.',
+                       ' 2) List deleted contributions for the given user, sorted by timestamp (no titles specified).',
                        " 3) List all deleted revisions in the given namespace, sorted by title and timestamp',
-                       '    (no titles specified, {$p}user not set)",
+                       '    (no titles specified, {$p}user not set).",
                        'Certain parameters only apply to some modes and are ignored in others.',
-                       'For instance, a parameter marked (1) only applies to mode 1 and is ignored in modes 2 and 3',
+                       'For instance, a parameter marked (1) only applies to mode 1 and is ignored in modes 2 and 3.',
                );
        }
 
index 1854694..3105f91 100644 (file)
@@ -200,7 +200,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
        }
 
        public function getDescription() {
-               return 'List all files that are duplicates of the given file(s) based on hash values';
+               return 'List all files that are duplicates of the given file(s) based on hash values.';
        }
 
        public function getExamples() {
index d220817..f09fbd5 100644 (file)
@@ -257,7 +257,7 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
        }
 
        public function getDescription() {
-               return 'Enumerate pages that contain a given URL';
+               return 'Enumerate pages that contain a given URL.';
        }
 
        public function getPossibleErrors() {
index 5803ea7..f7a0958 100644 (file)
@@ -150,7 +150,7 @@ class ApiQueryExternalLinks extends ApiQueryBase {
        }
 
        public function getDescription() {
-               return 'Returns all external URLs (not interwikis) from the given page(s)';
+               return 'Returns all external URLs (not interwikis) from the given page(s).';
        }
 
        public function getPossibleErrors() {
index bcbc642..e12d927 100644 (file)
@@ -367,7 +367,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
        }
 
        public function getDescription() {
-               return 'Enumerate all deleted files sequentially';
+               return 'Enumerate all deleted files sequentially.';
        }
 
        public function getPossibleErrors() {
index 03a72a6..e4cecd5 100644 (file)
@@ -231,7 +231,7 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
                return array( 'Find all pages that link to the given interwiki link.',
                        'Can be used to find all links with a prefix, or',
                        'all links to a title (with a given prefix).',
-                       'Using neither parameter is effectively "All IW Links"',
+                       'Using neither parameter is effectively "All IW Links".',
                );
        }
 
index be64d36..a7b69a0 100644 (file)
@@ -185,7 +185,7 @@ class ApiQueryIWLinks extends ApiQueryBase {
        }
 
        public function getDescription() {
-               return 'Returns all interwiki links from the given page(s)';
+               return 'Returns all interwiki links from the given page(s).';
        }
 
        public function getPossibleErrors() {
index 95c1420..369d4c9 100644 (file)
@@ -873,7 +873,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
        }
 
        public function getDescription() {
-               return 'Returns image information and upload history';
+               return 'Returns image information and upload history.';
        }
 
        public function getPossibleErrors() {
index a32fb9e..a66ad40 100644 (file)
@@ -180,7 +180,7 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
        }
 
        public function getDescription() {
-               return 'Returns all images contained on the given page(s)';
+               return 'Returns all images contained on the given page(s).';
        }
 
        public function getExamples() {
index 5a45a28..8e155f2 100644 (file)
@@ -213,7 +213,7 @@ class ApiQueryLangLinks extends ApiQueryBase {
        }
 
        public function getDescription() {
-               return 'Returns all interlanguage links from the given page(s)';
+               return 'Returns all interlanguage links from the given page(s).';
        }
 
        public function getPossibleErrors() {
index 1eecbe2..dd816cf 100644 (file)
@@ -233,7 +233,7 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
        }
 
        public function getDescription() {
-               return "Returns all {$this->description}s from the given page(s)";
+               return "Returns all {$this->description}s from the given page(s).";
        }
 
        public function getExamples() {
index 848c6ce..b607ca5 100644 (file)
@@ -103,7 +103,26 @@ class ApiQueryLogEvents extends ApiQueryBase {
                }
 
                if ( !is_null( $params['action'] ) ) {
-                       list( $type, $action ) = explode( '/', $params['action'] );
+                       // Do validation of action param, list of allowed actions can contains wildcards
+                       // Allow the param, when the actions is in the list or a wildcard version is listed.
+                       $logAction = $params['action'];
+                       if ( strpos( $logAction, '/' ) === false ) {
+                               // all items in the list have a slash
+                               $valid = false;
+                       } else {
+                               $logActions = array_flip( $this->getAllowedLogActions() );
+                               list( $type, $action ) = explode( '/', $logAction, 2 );
+                               $valid = isset( $logActions[$logAction] ) || isset( $logActions[$type . '/*'] );
+                       }
+
+                       if ( !$valid ) {
+                               $valueName = $this->encodeParamName( 'action' );
+                               $this->dieUsage(
+                                       "Unrecognized value for parameter '$valueName': {$logAction}",
+                                       "unknown_$valueName"
+                               );
+                       }
+
                        $this->addWhereFld( 'log_type', $type );
                        $this->addWhereFld( 'log_action', $action );
                } elseif ( !is_null( $params['type'] ) ) {
@@ -404,6 +423,12 @@ class ApiQueryLogEvents extends ApiQueryBase {
                return $vals;
        }
 
+       private function getAllowedLogActions() {
+               global $wgLogActions, $wgLogActionsHandlers;
+
+               return array_keys( array_merge( $wgLogActions, $wgLogActionsHandlers ) );
+       }
+
        public function getCacheMode( $params ) {
                if ( $this->userCanSeeRevDel() ) {
                        return 'private';
@@ -420,8 +445,8 @@ class ApiQueryLogEvents extends ApiQueryBase {
                }
        }
 
-       public function getAllowedParams() {
-               global $wgLogTypes, $wgLogActions, $wgLogActionsHandlers;
+       public function getAllowedParams( $flags = 0 ) {
+               global $wgLogTypes;
 
                return array(
                        'prop' => array(
@@ -444,7 +469,10 @@ class ApiQueryLogEvents extends ApiQueryBase {
                                ApiBase::PARAM_TYPE => $wgLogTypes
                        ),
                        'action' => array(
-                               ApiBase::PARAM_TYPE => array_keys( array_merge( $wgLogActions, $wgLogActionsHandlers ) )
+                               // validation on request is done in execute()
+                               ApiBase::PARAM_TYPE => ( $flags & ApiBase::GET_VALUES_FOR_HELP )
+                                       ? $this->getAllowedLogActions()
+                                       : null
                        ),
                        'start' => array(
                                ApiBase::PARAM_TYPE => 'timestamp'
@@ -491,7 +519,10 @@ class ApiQueryLogEvents extends ApiQueryBase {
                                ' tags           - Lists tags for the event',
                        ),
                        'type' => 'Filter log entries to only this type',
-                       'action' => "Filter log actions to only this type. Overrides {$p}type",
+                       'action' => array(
+                               "Filter log actions to only this action. Overrides {$p}type",
+                               "Wildcard actions like 'action/*' allows to specify any string for the asterisk"
+                       ),
                        'start' => 'The timestamp to start enumerating from',
                        'end' => 'The timestamp to end enumerating',
                        'dir' => $this->getDirectionDescription( $p ),
@@ -561,7 +592,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
        }
 
        public function getDescription() {
-               return 'Get events from logs';
+               return 'Get events from logs.';
        }
 
        public function getPossibleErrors() {
index 5438175..c387475 100644 (file)
@@ -102,7 +102,7 @@ class ApiQueryPagePropNames extends ApiQueryBase {
        }
 
        public function getDescription() {
-               return 'List all page prop names in use on the wiki';
+               return 'List all page prop names in use on the wiki.';
        }
 
        public function getExamples() {
index e51c7ab..52be5ca 100644 (file)
@@ -141,7 +141,7 @@ class ApiQueryPageProps extends ApiQueryBase {
        }
 
        public function getDescription() {
-               return 'Get various properties defined in the page content';
+               return 'Get various properties defined in the page content.';
        }
 
        public function getExamples() {
index e68eb56..df07249 100644 (file)
@@ -174,7 +174,7 @@ class ApiQueryPagesWithProp extends ApiQueryGeneratorBase {
        }
 
        public function getDescription() {
-               return 'List all pages using a given page prop';
+               return 'List all pages using a given page prop.';
        }
 
        public function getExamples() {
index ea350ad..9cdd6b9 100644 (file)
@@ -258,7 +258,7 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
        }
 
        public function getDescription() {
-               return 'List all titles protected from creation';
+               return 'List all titles protected from creation.';
        }
 
        public function getExamples() {
index 88af62b..2fc2676 100644 (file)
@@ -203,7 +203,7 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
        }
 
        public function getDescription() {
-               return 'Get a list provided by a QueryPage-based special page';
+               return 'Get a list provided by a QueryPage-based special page.';
        }
 
        public function getPossibleErrors() {
index 0d54ffe..5f85e0e 100644 (file)
@@ -185,13 +185,13 @@ class ApiQueryRandom extends ApiQueryGeneratorBase {
 
        public function getDescription() {
                return array(
-                       'Get a set of random pages',
+                       'Get a set of random pages.',
                        'NOTE: Pages are listed in a fixed sequence, only the starting point is random.',
                        '      This means that if, for example, "Main Page" is the first random page on',
                        '      your list, "List of fictional monkeys" will *always* be second, "List of',
-                       '      people on stamps of Vanuatu" third, etc',
+                       '      people on stamps of Vanuatu" third, etc.',
                        'NOTE: If the number of pages in the namespace is lower than rnlimit, you will',
-                       '      get fewer pages. You will not get the same page twice'
+                       '      get fewer pages. You will not get the same page twice.'
                );
        }
 
index 6ccc288..0284916 100644 (file)
@@ -281,8 +281,8 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        /* Add fields to our query if they are specified as a needed parameter. */
                        $this->addFieldsIf( array( 'rc_this_oldid', 'rc_last_oldid' ), $this->fld_ids );
                        $this->addFieldsIf( 'rc_comment', $this->fld_comment || $this->fld_parsedcomment );
-                       $this->addFieldsIf( 'rc_user', $this->fld_user );
-                       $this->addFieldsIf( 'rc_user_text', $this->fld_user || $this->fld_userid );
+                       $this->addFieldsIf( 'rc_user', $this->fld_user || $this->fld_userid );
+                       $this->addFieldsIf( 'rc_user_text', $this->fld_user );
                        $this->addFieldsIf( array( 'rc_minor', 'rc_type', 'rc_bot' ), $this->fld_flags );
                        $this->addFieldsIf( array( 'rc_old_len', 'rc_new_len' ), $this->fld_sizes );
                        $this->addFieldsIf( 'rc_patrolled', $this->fld_patrolled );
@@ -892,7 +892,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
        }
 
        public function getDescription() {
-               return 'Enumerate recent changes';
+               return 'Enumerate recent changes.';
        }
 
        public function getPossibleErrors() {
index c046109..1deb1f8 100644 (file)
@@ -249,7 +249,7 @@ class ApiQueryRedirects extends ApiQueryGeneratorBase {
        }
 
        public function getDescription() {
-               return 'Returns all redirects to the given page(s)';
+               return 'Returns all redirects to the given page(s).';
        }
 
        public function getExamples() {
index 65cb16d..033976f 100644 (file)
@@ -874,12 +874,12 @@ class ApiQueryRevisions extends ApiQueryBase {
 
        public function getDescription() {
                return array(
-                       'Get revision information',
+                       'Get revision information.',
                        'May be used in several ways:',
-                       ' 1) Get data about a set of pages (last revision), by setting titles or pageids parameter',
-                       ' 2) Get revisions for one given page, by using titles/pageids with start/end/limit params',
-                       ' 3) Get data about a set of revisions by setting their IDs with revids parameter',
-                       'All parameters marked as (enum) may only be used with a single page (#2)'
+                       ' 1) Get data about a set of pages (last revision), by setting titles or pageids parameter.',
+                       ' 2) Get revisions for one given page, by using titles/pageids with start/end/limit params.',
+                       ' 3) Get data about a set of revisions by setting their IDs with revids parameter.',
+                       'All parameters marked as (enum) may only be used with a single page (#2).'
                );
        }
 
index 1132a60..fcaaf10 100644 (file)
@@ -416,7 +416,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
        }
 
        public function getDescription() {
-               return 'Perform a full text search';
+               return 'Perform a full text search.';
        }
 
        public function getPossibleErrors() {
index a078013..1cd8d98 100644 (file)
@@ -821,7 +821,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        public function getDescription() {
-               return 'Return general information about the site';
+               return 'Return general information about the site.';
        }
 
        public function getPossibleErrors() {
index 248b3d8..3595cf9 100644 (file)
@@ -129,7 +129,7 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
        }
 
        public function getDescription() {
-               return 'Returns image information for stashed images';
+               return 'Returns image information for stashed images.';
        }
 
        public function getExamples() {
index 33116ce..9e2559f 100644 (file)
@@ -188,7 +188,7 @@ class ApiQueryTags extends ApiQueryBase {
        }
 
        public function getDescription() {
-               return 'List change tags';
+               return 'List change tags.';
        }
 
        public function getExamples() {
index b492d9a..b58a951 100644 (file)
@@ -56,6 +56,11 @@ class ApiQueryContributions extends ApiQueryBase {
                $this->fld_patrolled = isset( $prop['patrolled'] );
                $this->fld_tags = isset( $prop['tags'] );
 
+               // Most of this code will use the 'contributions' group DB, which can map to slaves
+               // with extra user based indexes or partioning by user. The additional metadata
+               // queries should use a regular slave since the lookup pattern is not all by user.
+               $dbSecondary = $this->getDB(); // any random slave
+
                // TODO: if the query is going only against the revision table, should this be done?
                $this->selectNamedDB( 'contributions', DB_SLAVE, 'contributions' );
 
@@ -90,7 +95,7 @@ class ApiQueryContributions extends ApiQueryBase {
                                        $revIds[] = $row->rev_parent_id;
                                }
                        }
-                       $this->parentLens = Revision::getParentLengths( $this->getDB(), $revIds );
+                       $this->parentLens = Revision::getParentLengths( $dbSecondary, $revIds );
                        $res->rewind(); // reset
                }
 
@@ -207,10 +212,16 @@ class ApiQueryContributions extends ApiQueryBase {
                $this->addWhereFld( 'page_namespace', $this->params['namespace'] );
 
                $show = $this->params['show'];
+               if ( $this->params['toponly'] ) { // deprecated/old param
+                       $show[] = 'top';
+               }
                if ( !is_null( $show ) ) {
                        $show = array_flip( $show );
+
                        if ( ( isset( $show['minor'] ) && isset( $show['!minor'] ) )
                                || ( isset( $show['patrolled'] ) && isset( $show['!patrolled'] ) )
+                               || ( isset( $show['top'] ) && isset( $show['!top'] ) )
+                               || ( isset( $show['new'] ) && isset( $show['!new'] ) )
                        ) {
                                $this->dieUsageMsg( 'show' );
                        }
@@ -219,6 +230,10 @@ class ApiQueryContributions extends ApiQueryBase {
                        $this->addWhereIf( 'rev_minor_edit != 0', isset( $show['minor'] ) );
                        $this->addWhereIf( 'rc_patrolled = 0', isset( $show['!patrolled'] ) );
                        $this->addWhereIf( 'rc_patrolled != 0', isset( $show['patrolled'] ) );
+                       $this->addWhereIf( 'rev_id != page_latest', isset( $show['!top'] ) );
+                       $this->addWhereIf( 'rev_id = page_latest', isset( $show['top'] ) );
+                       $this->addWhereIf( 'rev_parent_id != 0', isset( $show['!new'] ) );
+                       $this->addWhereIf( 'rev_parent_id = 0', isset( $show['new'] ) );
                }
                $this->addOption( 'LIMIT', $this->params['limit'] + 1 );
                $index = array( 'revision' => 'usertext_timestamp' );
@@ -294,10 +309,6 @@ class ApiQueryContributions extends ApiQueryBase {
                        $this->addWhereFld( 'ct_tag', $this->params['tag'] );
                }
 
-               if ( $this->params['toponly'] ) {
-                       $this->addWhere( 'rev_id = page_latest' );
-               }
-
                $this->addOption( 'USE INDEX', $index );
        }
 
@@ -477,10 +488,17 @@ class ApiQueryContributions extends ApiQueryBase {
                                        '!minor',
                                        'patrolled',
                                        '!patrolled',
+                                       'top',
+                                       '!top',
+                                       'new',
+                                       '!new',
                                )
                        ),
                        'tag' => null,
-                       'toponly' => false,
+                       'toponly' => array(
+                               ApiBase::PARAM_DFLT => false,
+                               ApiBase::PARAM_DEPRECATED => true,
+                       ),
                );
        }
 
@@ -583,7 +601,7 @@ class ApiQueryContributions extends ApiQueryBase {
        }
 
        public function getDescription() {
-               return 'Get all edits by a user';
+               return 'Get all edits by a user.';
        }
 
        public function getPossibleErrors() {
index 37cf483..200b03b 100644 (file)
@@ -299,7 +299,7 @@ class ApiQueryUserInfo extends ApiQueryBase {
        }
 
        public function getDescription() {
-               return 'Get information about the current user';
+               return 'Get information about the current user.';
        }
 
        public function getExamples() {
index cd4a8fc..d98cc39 100644 (file)
@@ -387,7 +387,7 @@ class ApiQueryUsers extends ApiQueryBase {
        }
 
        public function getDescription() {
-               return 'Get information about a list of users';
+               return 'Get information about a list of users.';
        }
 
        public function getExamples() {
index b7dc865..6baa87d 100644 (file)
@@ -674,7 +674,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
        }
 
        public function getDescription() {
-               return "Get all recent changes to pages in the logged in user's watchlist";
+               return "Get all recent changes to pages in the logged in user's watchlist.";
        }
 
        public function getPossibleErrors() {
index b53bea1..f45d0e4 100644 (file)
@@ -205,7 +205,7 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
        }
 
        public function getDescription() {
-               return "Get all pages on the logged in user's watchlist";
+               return "Get all pages on the logged in user's watchlist.";
        }
 
        public function getPossibleErrors() {
index 05457b3..1400b0d 100644 (file)
@@ -217,7 +217,7 @@ class ApiRevisionDelete extends ApiBase {
        }
 
        public function getDescription() {
-               return 'Delete/undelete revisions';
+               return 'Delete/undelete revisions.';
        }
 
        public function getPossibleErrors() {
index 2a372e4..70a2fec 100644 (file)
@@ -141,7 +141,7 @@ class ApiRollback extends ApiBase {
        public function getDescription() {
                return array(
                        'Undo the last edit to the page. If the last user who edited the page made',
-                       'multiple edits in a row, they will all be rolled back'
+                       'multiple edits in a row, they will all be rolled back.'
                );
        }
 
index e01f0fa..285177c 100644 (file)
@@ -60,7 +60,7 @@ class ApiRsd extends ApiBase {
        }
 
        public function getDescription() {
-               return 'Export an RSD (Really Simple Discovery) schema';
+               return 'Export an RSD (Really Simple Discovery) schema.';
        }
 
        public function getExamples() {
diff --git a/includes/api/ApiRunJobs.php b/includes/api/ApiRunJobs.php
new file mode 100644 (file)
index 0000000..05327c8
--- /dev/null
@@ -0,0 +1,172 @@
+<?php
+/**
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * This is a simple class to handle action=runjobs and is only used internally
+ *
+ * @note: this does not requre "write mode" nor tokens due to the signature check
+ *
+ * @ingroup API
+ */
+class ApiRunJobs extends ApiBase {
+       public function execute() {
+               if ( wfReadOnly() ) {
+                       $this->dieUsage( 'Wiki is in read-only mode', 'read_only', 400 );
+               }
+
+               $params = $this->extractRequestParams();
+               $squery = $this->getRequest()->getValues();
+               unset( $squery['signature'] );
+               $cSig = self::getQuerySignature( $squery );
+               $rSig = $params['signature'];
+
+               // Time-insensitive signature verification
+               if ( strlen( $rSig ) !== strlen( $cSig ) ) {
+                       $verified = false;
+               } else {
+                       $result = 0;
+                       for ( $i = 0; $i < strlen( $cSig ); $i++ ) {
+                               $result |= ord( $cSig{$i} ) ^ ord( $rSig{$i} );
+                       }
+                       $verified = ( $result == 0 );
+               }
+
+               if ( !$verified || $params['sigexpiry'] < time() ) {
+                       $this->dieUsage( 'Invalid or stale signature provided', 'bad_signature', 400 );
+               }
+
+               // Client will usually disconnect before checking the response,
+               // but it needs to know when it is safe to disconnect. Until this
+               // reaches ignore_user_abort(), it is not safe as the jobs won't run.
+               ignore_user_abort( true ); // jobs may take a bit of time
+               header( "HTTP/1.0 202 Accepted" );
+               ob_flush();
+        flush();
+               // Once the client receives this response, it can disconnect
+
+               // Do all of the specified tasks...
+               if ( in_array( 'jobs', $params['tasks'] ) ) {
+                       self::executeJobs( $params['maxjobs'] );
+               }
+       }
+
+       /**
+        * @param array $query
+        * @return string
+        */
+       public static function getQuerySignature( array $query ) {
+               global $wgSecretKey;
+
+               ksort( $query ); // stable order
+               return hash_hmac( 'sha1', wfArrayToCgi( $query ), $wgSecretKey );
+       }
+
+       /**
+        * Run jobs from the job queue
+        *
+        * @note: also called from Wiki.php
+        *
+        * @param integer $maxJobs Maximum number of jobs to run
+        * @return void
+        */
+       public static function executeJobs( $maxJobs ) {
+               $n = $maxJobs; // number of jobs to run
+               if ( $n < 1 ) {
+                       return;
+               }
+               try {
+                       $group = JobQueueGroup::singleton();
+                       $count = $group->executeReadyPeriodicTasks();
+                       if ( $count > 0 ) {
+                               wfDebugLog( 'jobqueue', "Executed $count periodic queue task(s)." );
+                       }
+
+                       do {
+                               $job = $group->pop( JobQueueGroup::TYPE_DEFAULT, JobQueueGroup::USE_CACHE ); // job from any queue
+                               if ( $job ) {
+                                       $output = $job->toString() . "\n";
+                                       $t = - microtime( true );
+                                       wfProfileIn( __METHOD__ . '-' . get_class( $job ) );
+                                       $success = $job->run();
+                                       wfProfileOut( __METHOD__ . '-' . get_class( $job ) );
+                                       $group->ack( $job ); // done
+                                       $t += microtime( true );
+                                       $t = round( $t * 1000 );
+                                       if ( $success === false ) {
+                                               $output .= "Error: " . $job->getLastError() . ", Time: $t ms\n";
+                                       } else {
+                                               $output .= "Success, Time: $t ms\n";
+                                       }
+                                       wfDebugLog( 'jobqueue', $output );
+                               }
+                       } while ( --$n && $job );
+               } catch ( MWException $e ) {
+                       // We don't want exceptions thrown during job execution to
+                       // be reported to the user since the output is already sent.
+                       // Instead we just log them.
+                       MWExceptionHandler::logException( $e );
+               }
+       }
+
+       public function mustBePosted() {
+               return true;
+       }
+
+       public function getAllowedParams() {
+               return array(
+                       'tasks' => array(
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_TYPE => array( 'jobs' )
+                       ),
+                       'maxjobs' => array(
+                               ApiBase::PARAM_TYPE => 'integer',
+                               ApiBase::PARAM_DFLT => 0
+                       ),
+                       'signature' =>  array(
+                               ApiBase::PROP_TYPE => 'string',
+                       ),
+                       'sigexpiry' => array(
+                               ApiBase::PARAM_TYPE => 'integer',
+                               ApiBase::PARAM_DFLT => 0 // ~epoch
+                       ),
+               );
+       }
+
+       public function getParamDescription() {
+               return array(
+                       'tasks' => 'List of task types to perform',
+                       'maxjobs' => 'Maximum number of jobs to run',
+                       'signature' => 'HMAC Signature that signs the request',
+                       'sigexpiry' => 'HMAC signature expiry as a UNIX timestamp'
+               );
+       }
+
+       public function getDescription() {
+               return 'Perform periodic tasks or run jobs from the queue.';
+       }
+
+       public function getExamples() {
+               return array(
+                       'api.php?action=runjobs&tasks=jobs&maxjobs=3' => 'Run up to 3 jobs from the queue',
+               );
+       }
+}
index 6862668..5e197db 100644 (file)
@@ -98,7 +98,7 @@ class ApiTokens extends ApiBase {
        }
 
        public function getDescription() {
-               return 'Gets tokens for data-modifying actions';
+               return 'Gets tokens for data-modifying actions.';
        }
 
        protected function getExamples() {
index 46e2f6e..f34d4df 100644 (file)
@@ -131,7 +131,7 @@ class ApiUnblock extends ApiBase {
        }
 
        public function getDescription() {
-               return 'Unblock a user';
+               return 'Unblock a user.';
        }
 
        public function getPossibleErrors() {
index 93cefef..332ed51 100644 (file)
@@ -143,7 +143,7 @@ class ApiUndelete extends ApiBase {
        public function getDescription() {
                return array(
                        'Restore certain revisions of a deleted page. A list of deleted revisions ',
-                       '(including timestamps) can be retrieved through list=deletedrevs'
+                       '(including timestamps) can be retrieved through list=deletedrevs.'
                );
        }
 
index 7d0d78e..c54e8ba 100644 (file)
@@ -819,7 +819,7 @@ class ApiUpload extends ApiBase {
                        ' * Have the MediaWiki server fetch a file from a URL, using the "url" parameter',
                        ' * Complete an earlier upload that failed due to warnings, using the "filekey" parameter',
                        'Note that the HTTP POST must be done as a file upload (i.e. using multipart/form-data) when',
-                       'sending the "file". Also you must get and send an edit token before doing any upload stuff'
+                       'sending the "file". Also you must get and send an edit token before doing any upload stuff.'
                );
        }
 
index 2bd7321..0bed859 100644 (file)
@@ -123,7 +123,7 @@ class ApiUserrights extends ApiBase {
        }
 
        public function getDescription() {
-               return 'Add/remove a user to/from groups';
+               return 'Add/remove a user to/from groups.';
        }
 
        public function needsToken() {
index 100ee96..6dfb1b4 100644 (file)
@@ -211,7 +211,7 @@ class ApiWatch extends ApiBase {
        }
 
        public function getDescription() {
-               return 'Add or remove pages from/to the current user\'s watchlist';
+               return 'Add or remove pages from/to the current user\'s watchlist.';
        }
 
        public function getPossibleErrors() {
index df60f02..feb6d7b 100644 (file)
  */
 
 class EnhancedChangesList extends ChangesList {
-       /** @var array Array of array of RCCacheEntry */
+
+       /**
+        * @var RCCacheEntryFactory
+        */
+       protected $cacheEntryFactory;
+
+       /**
+        * @var array Array of array of RCCacheEntry
+        */
        protected $rc_cache;
 
+       /**
+        * @param IContextSource|Skin $obj
+        */
+       public function __construct( $obj ) {
+               if ( $obj instanceof Skin ) {
+                       // @todo: deprecate constructing with Skin
+                       $context = $obj->getContext();
+               } else {
+                       if ( ! $obj instanceof IContextSource ) {
+                               throw new MWException( 'EnhancedChangesList must be constructed with a '
+                                       . 'context source or skin.' );
+                       }
+
+                       $context = $obj;
+               }
+
+               parent::__construct( $context );
+
+               // message is set by the parent ChangesList class
+               $this->cacheEntryFactory = new RCCacheEntryFactory(
+                       $context,
+                       $this->message
+               );
+       }
+
        /**
         * Add the JavaScript file for enhanced changeslist
         * @return string
@@ -73,127 +106,25 @@ class EnhancedChangesList extends ChangesList {
                        $this->lastdate = $date;
                }
 
-               # Create a specialised object
-               $cacheEntry = RCCacheEntry::newFromParent( $baseRC );
-
-               $curIdEq = array( 'curid' => $cacheEntry->mAttribs['rc_cur_id'] );
-
-               # Should patrol-related stuff be shown?
-               $cacheEntry->unpatrolled = $this->showAsUnpatrolled( $cacheEntry );
-
-               $showdifflinks = true;
-
-               # Make article link
-               $type = $cacheEntry->mAttribs['rc_type'];
-               $logType = $cacheEntry->mAttribs['rc_log_type'];
-
-               // Page moves, very old style, not supported anymore
-               if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
-                       $clink = '';
-               // New unpatrolled pages
-               } elseif ( $cacheEntry->unpatrolled && $type == RC_NEW ) {
-                       $clink = Linker::linkKnown( $cacheEntry->getTitle() );
-               // Log entries
-               } elseif ( $type == RC_LOG ) {
-                       if ( $logType ) {
-                               $logtitle = SpecialPage::getTitleFor( 'Log', $logType );
-                               $logpage = new LogPage( $logType );
-                               $logname = $logpage->getName()->escaped();
-                               $clink = $this->msg( 'parentheses' )
-                                       ->rawParams( Linker::linkKnown( $logtitle, $logname ) )->escaped();
-                       } else {
-                               $clink = Linker::link( $cacheEntry->getTitle() );
-                       }
-                       $watched = false;
-               // Log entries (old format) and special pages
-               } elseif ( $cacheEntry->mAttribs['rc_namespace'] == NS_SPECIAL ) {
-                       wfDebug( "Unexpected special page in recentchanges\n" );
-                       $clink = '';
-               // Edits
-               } else {
-                       $clink = Linker::linkKnown( $cacheEntry->getTitle() );
-               }
-
-               # Don't show unusable diff links
-               if ( !ChangesList::userCan( $cacheEntry, Revision::DELETED_TEXT, $this->getUser() ) ) {
-                       $showdifflinks = false;
-               }
-
-               $time = $this->getLanguage()->userTime( $cacheEntry->mAttribs['rc_timestamp'], $this->getUser() );
-
-               $cacheEntry->watched = $watched;
-               $cacheEntry->link = $clink;
-               $cacheEntry->timestamp = $time;
-               $cacheEntry->numberofWatchingusers = $baseRC->numberofWatchingusers;
-
-               # Make "cur" and "diff" links.  Do not use link(), it is too slow if
-               # called too many times (50% of CPU time on RecentChanges!).
-               $thisOldid = $cacheEntry->mAttribs['rc_this_oldid'];
-               $lastOldid = $cacheEntry->mAttribs['rc_last_oldid'];
-
-               $querycur = $curIdEq + array( 'diff' => '0', 'oldid' => $thisOldid );
-               $querydiff = $curIdEq + array( 'diff' => $thisOldid, 'oldid' => $lastOldid );
-
-               if ( !$showdifflinks ) {
-                       $curLink = $this->message['cur'];
-                       $diffLink = $this->message['diff'];
-               } elseif ( in_array( $type, array( RC_NEW, RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT ) ) ) {
-                       if ( $type != RC_NEW ) {
-                               $curLink = $this->message['cur'];
-                       } else {
-                               $curUrl = htmlspecialchars( $cacheEntry->getTitle()->getLinkURL( $querycur ) );
-                               $curLink = "<a href=\"$curUrl\" tabindex=\"{$baseRC->counter}\">{$this->message['cur']}</a>";
-                       }
-                       $diffLink = $this->message['diff'];
-               } else {
-                       $diffUrl = htmlspecialchars( $cacheEntry->getTitle()->getLinkURL( $querydiff ) );
-                       $curUrl = htmlspecialchars( $cacheEntry->getTitle()->getLinkURL( $querycur ) );
-                       $diffLink = "<a href=\"$diffUrl\" tabindex=\"{$baseRC->counter}\">{$this->message['diff']}</a>";
-                       $curLink = "<a href=\"$curUrl\" tabindex=\"{$baseRC->counter}\">{$this->message['cur']}</a>";
-               }
-
-               # Make "last" link
-               if ( !$showdifflinks || !$lastOldid ) {
-                       $lastLink = $this->message['last'];
-               } elseif ( in_array( $type, array( RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT ) ) ) {
-                       $lastLink = $this->message['last'];
-               } else {
-                       $lastLink = Linker::linkKnown( $cacheEntry->getTitle(), $this->message['last'],
-                               array(), $curIdEq + array( 'diff' => $thisOldid, 'oldid' => $lastOldid ) );
-               }
-
-               # Make user links
-               if ( $this->isDeleted( $cacheEntry, Revision::DELETED_USER ) ) {
-                       $cacheEntry->userlink = ' <span class="history-deleted">' .
-                               $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
-               } else {
-                       $cacheEntry->userlink = Linker::userLink(
-                               $cacheEntry->mAttribs['rc_user'],
-                               $cacheEntry->mAttribs['rc_user_text']
-                       );
-
-                       $cacheEntry->usertalklink = Linker::userToolLinks(
-                               $cacheEntry->mAttribs['rc_user'],
-                               $cacheEntry->mAttribs['rc_user_text']
-                       );
-               }
-
-               $cacheEntry->lastlink = $lastLink;
-               $cacheEntry->curlink = $curLink;
-               $cacheEntry->difflink = $diffLink;
+               $cacheEntry = $this->cacheEntryFactory->newFromRecentChange( $baseRC, $watched );
 
                # Put accumulated information into the cache, for later display
                # Page moves go on their own line
                $title = $cacheEntry->getTitle();
                $secureName = $title->getPrefixedDBkey();
 
+               $type = $cacheEntry->mAttribs['rc_type'];
+
                if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
                        # Use an @ character to prevent collision with page names
                        $this->rc_cache['@@' . ( $this->rcMoveIndex++ )] = array( $cacheEntry );
                } else {
                        # Logs are grouped by type
                        if ( $type == RC_LOG ) {
-                               $secureName = SpecialPage::getTitleFor( 'Log', $logType )->getPrefixedDBkey();
+                               $secureName = SpecialPage::getTitleFor(
+                                       'Log',
+                                       $cacheEntry->mAttribs['rc_log_type']
+                               )->getPrefixedDBkey();
                        }
                        if ( !isset( $this->rc_cache[$secureName] ) ) {
                                $this->rc_cache[$secureName] = array();
index 9cb1146..458f21a 100644 (file)
@@ -37,9 +37,6 @@ class OldChangesList extends ChangesList {
                # Should patrol-related stuff be shown?
                $unpatrolled = $this->showAsUnpatrolled( $rc );
 
-               $dateheader = ''; // $s now contains only <li>...</li>, for hooks' convenience.
-               $this->insertDateHeader( $dateheader, $rc->mAttribs['rc_timestamp'] );
-
                $s = '';
                $classes = array();
                // use mw-line-even/mw-line-odd class only if linenumber is given (feature from bug 14468)
@@ -128,6 +125,9 @@ class OldChangesList extends ChangesList {
 
                wfProfileOut( __METHOD__ );
 
+               $dateheader = ''; // $s now contains only <li>...</li>, for hooks' convenience.
+               $this->insertDateHeader( $dateheader, $rc->mAttribs['rc_timestamp'] );
+
                return "$dateheader<li class=\"" . implode( ' ', $classes ) . "\">" . $s . "</li>\n";
        }
 }
diff --git a/includes/changes/RCCacheEntryFactory.php b/includes/changes/RCCacheEntryFactory.php
new file mode 100644 (file)
index 0000000..49ce1b3
--- /dev/null
@@ -0,0 +1,278 @@
+<?php
+/**
+ * Creates a RCCacheEntry from a RecentChange to use in EnhancedChangesList
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+class RCCacheEntryFactory {
+
+       /* @var IContextSource */
+       private $context;
+
+       /* @var string[] */
+       private $messages;
+
+       /**
+        * @param IContextSource $context
+        * @param string[] $messages
+        */
+       public function __construct( IContextSource $context, $messages ) {
+               $this->context = $context;
+               $this->messages = $messages;
+       }
+
+       /**
+        * @param RecentChange $baseRC
+        * @param boolean $watched
+        *
+        * @return RCCacheEntry
+        */
+       public function newFromRecentChange( RecentChange $baseRC, $watched ) {
+               $user = $this->context->getUser();
+               $counter = $baseRC->counter;
+
+               $cacheEntry = RCCacheEntry::newFromParent( $baseRC );
+
+               // Should patrol-related stuff be shown?
+               $cacheEntry->unpatrolled = ChangesList::isUnpatrolled( $baseRC, $user );
+
+               $cacheEntry->watched = $cacheEntry->mAttribs['rc_type'] == RC_LOG ? false : $watched;
+               $cacheEntry->numberofWatchingusers = $baseRC->numberofWatchingusers;
+
+               $cacheEntry->link = $this->buildCLink( $cacheEntry );
+               $cacheEntry->timestamp = $this->buildTimestamp( $cacheEntry );
+
+               // Make "cur" and "diff" links.  Do not use link(), it is too slow if
+               // called too many times (50% of CPU time on RecentChanges!).
+               $showDiffLinks = $this->showDiffLinks( $cacheEntry, $user );
+
+               $cacheEntry->difflink = $this->buildDiffLink( $cacheEntry, $showDiffLinks, $counter );
+               $cacheEntry->curlink = $this->buildCurLink( $cacheEntry, $showDiffLinks, $counter );
+               $cacheEntry->lastlink = $this->buildLastLink( $cacheEntry, $showDiffLinks );
+
+               // Make user links
+               $cacheEntry->userlink = $this->getUserLink( $cacheEntry );
+
+               if ( !ChangesList::isDeleted( $cacheEntry, Revision::DELETED_USER ) ) {
+                       $cacheEntry->usertalklink = Linker::userToolLinks(
+                               $cacheEntry->mAttribs['rc_user'],
+                               $cacheEntry->mAttribs['rc_user_text']
+                       );
+               }
+
+               return $cacheEntry;
+       }
+
+       /**
+        * @param RecentChange $cacheEntry
+        * @param User $User
+        *
+        * @return boolean
+        */
+       private function showDiffLinks( RecentChange $cacheEntry, User $user ) {
+               return ChangesList::userCan( $cacheEntry, Revision::DELETED_TEXT, $user );
+       }
+
+       /**
+        * @param RecentChange $cacheEntry
+        *
+        * @return string
+        */
+       private function buildCLink( RecentChange $cacheEntry ) {
+               $type = $cacheEntry->mAttribs['rc_type'];
+
+               // Page moves, very old style, not supported anymore
+               if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
+                       $clink = '';
+               // New unpatrolled pages
+               } elseif ( $cacheEntry->unpatrolled && $type == RC_NEW ) {
+                       $clink = Linker::linkKnown( $cacheEntry->getTitle() );
+               // Log entries
+               } elseif ( $type == RC_LOG ) {
+                       $logType = $cacheEntry->mAttribs['rc_log_type'];
+
+                       if ( $logType ) {
+                               $clink = $this->getLogLink( $logType );
+                       } else {
+                               wfDebugLog( 'recentchanges', 'Unexpected log entry with no log type in recent changes' );
+                               $clink = Linker::link( $cacheEntry->getTitle() );
+                       }
+               // Log entries (old format) and special pages
+               } elseif ( $cacheEntry->mAttribs['rc_namespace'] == NS_SPECIAL ) {
+                       wfDebugLog( 'recentchanges', 'Unexpected special page in recentchanges' );
+                       $clink = '';
+               // Edits
+               } else {
+                       $clink = Linker::linkKnown( $cacheEntry->getTitle() );
+               }
+
+               return $clink;
+       }
+
+       private function getLogLink( $logType ) {
+               $logtitle = SpecialPage::getTitleFor( 'Log', $logType );
+               $logpage = new LogPage( $logType );
+               $logname = $logpage->getName()->escaped();
+
+               $logLink = $this->context->msg( 'parentheses' )
+                       ->rawParams( Linker::linkKnown( $logtitle, $logname ) )->escaped();
+
+               return $logLink;
+       }
+
+       /**
+        * @param RecentChange $cacheEntry
+        *
+        * @return string
+        */
+       private function buildTimestamp( RecentChange $cacheEntry ) {
+               return $this->context->getLanguage()->userTime(
+                       $cacheEntry->mAttribs['rc_timestamp'],
+                       $this->context->getUser()
+               );
+       }
+
+       /**
+        * @param RecentChange $recentChange
+        *
+        * @return array
+        */
+       private function buildCurQueryParams( RecentChange $recentChange ) {
+               return array(
+                       'curid' => $recentChange->mAttribs['rc_cur_id'],
+                       'diff' => 0,
+                       'oldid' => $recentChange->mAttribs['rc_this_oldid']
+               );
+       }
+
+       /**
+        * @param RecentChange $cacheEntry
+        * @param boolean $showDiffLinks
+        * @param int $counter
+        *
+        * @return string
+        */
+       private function buildCurLink( RecentChange $cacheEntry, $showDiffLinks, $counter ) {
+               $queryParams = $this->buildCurQueryParams( $cacheEntry );
+               $curMessage = $this->getMessage( 'cur' );
+               $logTypes = array( RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT );
+
+               if ( !$showDiffLinks || in_array( $cacheEntry->mAttribs['rc_type'], $logTypes ) ) {
+                       $curLink = $curMessage;
+               } else {
+                       $curUrl = htmlspecialchars( $cacheEntry->getTitle()->getLinkURL( $queryParams ) );
+                       $curLink = "<a href=\"$curUrl\" tabindex=\"$counter\">$curMessage</a>";
+               }
+
+               return $curLink;
+       }
+
+       /**
+        * @param RecentChange $recentChange
+        *
+        * @return array
+        */
+       private function buildDiffQueryParams( RecentChange $recentChange ) {
+               return array(
+                       'curid' => $recentChange->mAttribs['rc_cur_id'],
+                       'diff' => $recentChange->mAttribs['rc_this_oldid'],
+                       'oldid' => $recentChange->mAttribs['rc_last_oldid']
+               );
+       }
+
+       /**
+        * @param RecentChange $cacheEntry
+        * @param boolean $showDiffLinks
+        * @param int $counter
+        *
+        * @return string
+        */
+       private function buildDiffLink( RecentChange $cacheEntry, $showDiffLinks, $counter ) {
+               $queryParams = $this->buildDiffQueryParams( $cacheEntry );
+               $diffMessage = $this->getMessage( 'diff' );
+               $logTypes = array( RC_NEW, RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT );
+
+               if ( !$showDiffLinks ) {
+                       $diffLink = $diffMessage;
+               } elseif ( in_array( $cacheEntry->mAttribs['rc_type'], $logTypes ) ) {
+                       $diffLink = $diffMessage;
+               } else {
+                       $diffUrl = htmlspecialchars( $cacheEntry->getTitle()->getLinkURL( $queryParams ) );
+                       $diffLink = "<a href=\"$diffUrl\" tabindex=\"$counter\">$diffMessage</a>";
+               }
+
+               return $diffLink;
+       }
+
+       /**
+        * @param RecentChange $cacheEntry
+        * @param boolean $showDiffLinks
+        *
+        * @return string
+        */
+       private function buildLastLink( RecentChange $cacheEntry, $showDiffLinks ) {
+               $lastOldid = $cacheEntry->mAttribs['rc_last_oldid'];
+               $lastMessage = $this->getMessage( 'last' );
+               $type = $cacheEntry->mAttribs['rc_type'];
+               $logTypes = array( RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT );
+
+               // Make "last" link
+               if ( !$showDiffLinks || !$lastOldid || in_array( $type, $logTypes ) ) {
+                       $lastLink = $lastMessage;
+               } else {
+                       $lastLink = Linker::linkKnown(
+                               $cacheEntry->getTitle(),
+                               $lastMessage,
+                               array(),
+                               $this->buildDiffQueryParams( $cacheEntry )
+                       );
+               }
+
+               return $lastLink;
+       }
+
+       /**
+        * @param RecentChange $cacheEntry
+        *
+        * @return string
+        */
+       private function getUserLink( RecentChange $cacheEntry ) {
+               if ( ChangesList::isDeleted( $cacheEntry, Revision::DELETED_USER ) ) {
+                       $userLink = ' <span class="history-deleted">' .
+                               $this->context->msg( 'rev-deleted-user' )->escaped() . '</span>';
+               } else {
+                       $userLink = Linker::userLink(
+                               $cacheEntry->mAttribs['rc_user'],
+                               $cacheEntry->mAttribs['rc_user_text']
+                       );
+               }
+
+               return $userLink;
+       }
+
+       /**
+        * @param string $key
+        *
+        * @return string
+        */
+       private function getMessage( $key ) {
+               return $this->messages[$key];
+       }
+
+}
index 01ad724..072aa12 100644 (file)
@@ -52,7 +52,6 @@
  * mExtra:
  *  prefixedDBkey   prefixed db key, used by external app via msg queue
  *  lastTimestamp   timestamp of previous entry, used in WHERE clause during update
- *  lang            the interwiki prefix, automatically set in save()
  *  oldSize         text size before the change
  *  newSize         text size after the change
  *  pageStatus      status of the page: created, deleted, moved, restored, changed
@@ -231,13 +230,12 @@ class RecentChange {
         * @param $noudp bool
         */
        public function save( $noudp = false ) {
-               global $wgLocalInterwiki, $wgPutIPinRC, $wgUseEnotif, $wgShowUpdatedMarker, $wgContLang;
+               global $wgPutIPinRC, $wgUseEnotif, $wgShowUpdatedMarker, $wgContLang;
 
                $dbw = wfGetDB( DB_MASTER );
                if ( !is_array( $this->mExtra ) ) {
                        $this->mExtra = array();
                }
-               $this->mExtra['lang'] = $wgLocalInterwiki;
 
                if ( !$wgPutIPinRC ) {
                        $this->mAttribs['rc_ip'] = '';
diff --git a/includes/composer/ComposerHookHandler.php b/includes/composer/ComposerHookHandler.php
new file mode 100644 (file)
index 0000000..5cf8a9b
--- /dev/null
@@ -0,0 +1,37 @@
+<?php
+
+use Composer\Package\Package;
+use Composer\Script\Event;
+
+$GLOBALS['IP'] = __DIR__ . '/../';
+require_once 'AutoLoader.php';
+
+/**
+ * @licence GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+class ComposerHookHandler {
+
+       public static function onPreUpdate( Event $event ) {
+               self::handleChangeEvent( $event );
+       }
+
+       public static function onPreInstall( Event $event ) {
+               self::handleChangeEvent( $event );
+       }
+
+       private static function handleChangeEvent( Event $event ) {
+               $package = $event->getComposer()->getPackage();
+
+               if ( $package instanceof Package ) {
+                       $packageModifier = new ComposerPackageModifier(
+                               $package,
+                               new ComposerVersionNormalizer(),
+                               new MediaWikiVersionFetcher()
+                       );
+
+                       $packageModifier->setProvidesMediaWiki();
+               }
+       }
+
+}
diff --git a/includes/composer/ComposerPackageModifier.php b/includes/composer/ComposerPackageModifier.php
new file mode 100644 (file)
index 0000000..ae8baf2
--- /dev/null
@@ -0,0 +1,57 @@
+<?php
+
+use Composer\Package\Link;
+use Composer\Package\LinkConstraint\VersionConstraint;
+use Composer\Package\Package;
+
+/**
+ * @licence GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+class ComposerPackageModifier {
+
+       const MEDIAWIKI_PACKAGE_NAME = 'mediawiki/mediawiki';
+
+       protected $package;
+       protected $versionNormalizer;
+       protected $versionFetcher;
+
+       public function __construct( Package $package, ComposerVersionNormalizer $versionNormalizer, MediaWikiVersionFetcher $versionFetcher ) {
+               $this->package = $package;
+               $this->versionNormalizer = $versionNormalizer;
+               $this->versionFetcher = $versionFetcher;
+       }
+
+       public function setProvidesMediaWiki() {
+               $this->setLinkAsProvides( $this->newMediaWikiLink() );
+       }
+
+       private function setLinkAsProvides( Link $link ) {
+               $this->package->setProvides( array( $link ) );
+       }
+
+       private function newMediaWikiLink() {
+               $version = $this->getMediaWikiVersionConstraint();
+
+               $link = new Link(
+                       '__root__',
+                       self::MEDIAWIKI_PACKAGE_NAME,
+                       $version,
+                       'provides',
+                       $version->getPrettyString()
+               );
+
+               return $link;
+       }
+
+       private function getMediaWikiVersionConstraint() {
+               $mvVersion = $this->versionFetcher->fetchVersion();
+               $mvVersion = $this->versionNormalizer->normalizeSuffix( $mvVersion );
+
+               $version = new VersionConstraint( '==', $this->versionNormalizer->normalizeLevelCount( $mvVersion ) );
+               $version->setPrettyString( $mvVersion );
+
+               return $version;
+       }
+
+}
diff --git a/includes/composer/ComposerVersionNormalizer.php b/includes/composer/ComposerVersionNormalizer.php
new file mode 100644 (file)
index 0000000..727e142
--- /dev/null
@@ -0,0 +1,67 @@
+<?php
+
+/**
+ * @licence GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+class ComposerVersionNormalizer {
+
+       /**
+        * Ensures there is a dash in between the version and the stability suffix.
+        *
+        * Examples:
+        * - 1.23RC => 1.23-RC
+        * - 1.23alpha => 1.23-alpha
+        * - 1.23alpha3 => 1.23-alpha3
+        * - 1.23-beta => 1.23-beta
+        *
+        * @param string $version
+        *
+        * @return string
+        * @throws InvalidArgumentException
+        */
+       public function normalizeSuffix( $version ) {
+               if ( !is_string( $version ) ) {
+                       throw new InvalidArgumentException( '$version must be a string' );
+               }
+
+               return preg_replace( '/^(\d[\d\.]*)([a-zA-Z]+)(\d*)$/', '$1-$2$3', $version, 1 );
+       }
+
+       /**
+        * Ensures the version has four levels.
+        * Version suffixes are supported, as long as they start with a dash.
+        *
+        * Examples:
+        * - 1.19 => 1.19.0.0
+        * - 1.19.2.3 => 1.19.2.3
+        * - 1.19-alpha => 1.19.0.0-alpha
+        * - 1337 => 1337.0.0.0
+        *
+        * @param string $version
+        *
+        * @return string
+        * @throws InvalidArgumentException
+        */
+       public function normalizeLevelCount( $version ) {
+               if ( !is_string( $version ) ) {
+                       throw new InvalidArgumentException( '$version must be a string' );
+               }
+
+               $dashPosition = strpos( $version, '-' );
+
+               if ( $dashPosition !== false ) {
+                       $suffix = substr( $version, $dashPosition );
+                       $version = substr( $version, 0, $dashPosition );
+               }
+
+               $version = implode( '.', array_pad( explode( '.', $version ), 4, '0' ) );
+
+               if ( $dashPosition !== false ) {
+                       $version .= $suffix;
+               }
+
+               return $version;
+       }
+
+}
\ No newline at end of file
index e1b1f01..f2f0c9d 100644 (file)
@@ -43,7 +43,7 @@ abstract class AbstractContent implements Content {
        protected $model_id;
 
        /**
-        * @param string|null $modelId
+        * @param string $modelId
         *
         * @since 1.21
         */
@@ -52,23 +52,21 @@ abstract class AbstractContent implements Content {
        }
 
        /**
-        * @see Content::getModel
-        *
         * @since 1.21
+        *
+        * @see Content::getModel
         */
        public function getModel() {
                return $this->model_id;
        }
 
        /**
-        * Throws an MWException if $model_id is not the id of the content model
-        * supported by this Content object.
-        *
         * @since 1.21
         *
         * @param string $modelId The model to check
         *
-        * @throws MWException
+        * @throws MWException If the provided ID is not the ID of the content model supported by this
+        * Content object.
         */
        protected function checkModelID( $modelId ) {
                if ( $modelId !== $this->model_id ) {
@@ -81,40 +79,40 @@ abstract class AbstractContent implements Content {
        }
 
        /**
-        * @see Content::getContentHandler
-        *
         * @since 1.21
+        *
+        * @see Content::getContentHandler
         */
        public function getContentHandler() {
                return ContentHandler::getForContent( $this );
        }
 
        /**
-        * @see Content::getDefaultFormat
-        *
         * @since 1.21
+        *
+        * @see Content::getDefaultFormat
         */
        public function getDefaultFormat() {
                return $this->getContentHandler()->getDefaultFormat();
        }
 
        /**
-        * @see Content::getSupportedFormats
-        *
         * @since 1.21
+        *
+        * @see Content::getSupportedFormats
         */
        public function getSupportedFormats() {
                return $this->getContentHandler()->getSupportedFormats();
        }
 
        /**
-        * @see Content::isSupportedFormat
+        * @since 1.21
         *
         * @param string $format
         *
-        * @since 1.21
+        * @return bool
         *
-        * @return boolean
+        * @see Content::isSupportedFormat
         */
        public function isSupportedFormat( $format ) {
                if ( !$format ) {
@@ -125,13 +123,11 @@ abstract class AbstractContent implements Content {
        }
 
        /**
-        * Throws an MWException if $this->isSupportedFormat( $format ) does not
-        * return true.
-        *
         * @since 1.21
         *
-        * @param string $format
-        * @throws MWException
+        * @param string $format The serialization format to check.
+        *
+        * @throws MWException If the format is not supported by this content handler.
         */
        protected function checkFormat( $format ) {
                if ( !$this->isSupportedFormat( $format ) ) {
@@ -143,48 +139,50 @@ abstract class AbstractContent implements Content {
        }
 
        /**
-        * @see Content::serialize
-        *
-        * @param string|null $format
-        *
         * @since 1.21
         *
+        * @param string $format
+        *
         * @return string
+        *
+        * @see Content::serialize
         */
        public function serialize( $format = null ) {
                return $this->getContentHandler()->serializeContent( $this, $format );
        }
 
        /**
-        * @see Content::isEmpty
-        *
         * @since 1.21
         *
-        * @return boolean
+        * @return bool
+        *
+        * @see Content::isEmpty
         */
        public function isEmpty() {
                return $this->getSize() === 0;
        }
 
        /**
-        * @see Content::isValid
+        * Subclasses may override this to implement (light weight) validation.
         *
         * @since 1.21
         *
-        * @return boolean
+        * @return bool Always true.
+        *
+        * @see Content::isValid
         */
        public function isValid() {
                return true;
        }
 
        /**
-        * @see Content::equals
-        *
         * @since 1.21
         *
-        * @param Content|null $that
+        * @param Content $that
         *
-        * @return boolean
+        * @return bool
+        *
+        * @see Content::equals
         */
        public function equals( Content $that = null ) {
                if ( is_null( $that ) ) {
@@ -214,26 +212,19 @@ abstract class AbstractContent implements Content {
         * Subclasses may override this to determine the secondary data updates more
         * efficiently, preferably without the need to generate a parser output object.
         *
-        * @see Content::getSecondaryDataUpdates()
+        * @since 1.21
         *
-        * @param $title Title The context for determining the necessary updates
-        * @param $old Content|null An optional Content object representing the
-        *    previous content, i.e. the content being replaced by this Content
-        *    object.
-        * @param $recursive boolean Whether to include recursive updates (default:
-        *    false).
-        * @param $parserOutput ParserOutput|null Optional ParserOutput object.
-        *    Provide if you have one handy, to avoid re-parsing of the content.
+        * @param Title $title
+        * @param Content $old
+        * @param bool $recursive
+        * @param ParserOutput $parserOutput
         *
-        * @return Array. A list of DataUpdate objects for putting information
-        *    about this content object somewhere.
+        * @return DataUpdate[]
         *
-        * @since 1.21
+        * @see Content::getSecondaryDataUpdates()
         */
-       public function getSecondaryDataUpdates( Title $title,
-               Content $old = null,
-               $recursive = true, ParserOutput $parserOutput = null
-       ) {
+       public function getSecondaryDataUpdates( Title $title, Content $old = null,
+               $recursive = true, ParserOutput $parserOutput = null ) {
                if ( $parserOutput === null ) {
                        $parserOutput = $this->getParserOutput( $title, null, null, false );
                }
@@ -242,9 +233,11 @@ abstract class AbstractContent implements Content {
        }
 
        /**
-        * @see Content::getRedirectChain
-        *
         * @since 1.21
+        *
+        * @return Title[]|null
+        *
+        * @see Content::getRedirectChain
         */
        public function getRedirectChain() {
                global $wgMaxRedirects;
@@ -277,19 +270,26 @@ abstract class AbstractContent implements Content {
        }
 
        /**
-        * @see Content::getRedirectTarget
+        * Subclasses that implement redirects should override this.
         *
         * @since 1.21
+        *
+        * @return null
+        *
+        * @see Content::getRedirectTarget
         */
        public function getRedirectTarget() {
                return null;
        }
 
        /**
-        * @see Content::getUltimateRedirectTarget
-        * @note: migrated here from Title::newFromRedirectRecurse
+        * @note Migrated here from Title::newFromRedirectRecurse.
         *
         * @since 1.21
+        *
+        * @return Title|null
+        *
+        * @see Content::getUltimateRedirectTarget
         */
        public function getUltimateRedirectTarget() {
                $titles = $this->getRedirectChain();
@@ -298,80 +298,93 @@ abstract class AbstractContent implements Content {
        }
 
        /**
-        * @see Content::isRedirect
-        *
         * @since 1.21
         *
         * @return bool
+        *
+        * @see Content::isRedirect
         */
        public function isRedirect() {
                return $this->getRedirectTarget() !== null;
        }
 
        /**
-        * @see Content::updateRedirect
-        *
         * This default implementation always returns $this.
-        *
-        * @param Title $target
+        * Subclasses that implement redirects should override this.
         *
         * @since 1.21
         *
+        * @param Title $target
+        *
         * @return Content $this
+        *
+        * @see Content::updateRedirect
         */
        public function updateRedirect( Title $target ) {
                return $this;
        }
 
        /**
-        * @see Content::getSection
-        *
         * @since 1.21
+        *
+        * @return null
+        *
+        * @see Content::getSection
         */
        public function getSection( $sectionId ) {
                return null;
        }
 
        /**
-        * @see Content::replaceSection
-        *
         * @since 1.21
+        *
+        * @return null
+        *
+        * @see Content::replaceSection
         */
        public function replaceSection( $section, Content $with, $sectionTitle = '' ) {
                return null;
        }
 
        /**
-        * @see Content::preSaveTransform
-        *
         * @since 1.21
+        *
+        * @return Content $this
+        *
+        * @see Content::preSaveTransform
         */
        public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
                return $this;
        }
 
        /**
-        * @see Content::addSectionHeader
-        *
         * @since 1.21
+        *
+        * @return Content $this
+        *
+        * @see Content::addSectionHeader
         */
        public function addSectionHeader( $header ) {
                return $this;
        }
 
        /**
-        * @see Content::preloadTransform
-        *
         * @since 1.21
+        *
+        * @return Content $this
+        *
+        * @see Content::preloadTransform
         */
        public function preloadTransform( Title $title, ParserOptions $popts ) {
                return $this;
        }
 
        /**
-        * @see Content::prepareSave
-        *
         * @since 1.21
+        *
+        * @return Status
+        *
+        * @see Content::prepareSave
         */
        public function prepareSave( WikiPage $page, $flags, $baseRevId, User $user ) {
                if ( $this->isValid() ) {
@@ -382,21 +395,16 @@ abstract class AbstractContent implements Content {
        }
 
        /**
-        * @see Content::getDeletionUpdates
-        *
         * @since 1.21
         *
-        * @param $page WikiPage the deleted page
-        * @param $parserOutput null|ParserOutput optional parser output object
-        *    for efficient access to meta-information about the content object.
-        *    Provide if you have one handy.
+        * @param WikiPage $page
+        * @param ParserOutput $parserOutput
         *
-        * @return array A list of DataUpdate instances that will clean up the
-        *    database after deletion.
+        * @return LinksDeletionUpdate[]
+        *
+        * @see Content::getDeletionUpdates
         */
-       public function getDeletionUpdates( WikiPage $page,
-               ParserOutput $parserOutput = null
-       ) {
+       public function getDeletionUpdates( WikiPage $page, ParserOutput $parserOutput = null ) {
                return array(
                        new LinksDeletionUpdate( $page ),
                );
@@ -406,30 +414,28 @@ abstract class AbstractContent implements Content {
         * This default implementation always returns false. Subclasses may override
         * this to supply matching logic.
         *
-        * @see Content::matchMagicWord
-        *
         * @since 1.21
         *
         * @param MagicWord $word
         *
-        * @return bool
+        * @return bool Always false.
+        *
+        * @see Content::matchMagicWord
         */
        public function matchMagicWord( MagicWord $word ) {
                return false;
        }
 
        /**
-        * @see Content::convert()
-        *
         * This base implementation calls the hook ConvertContent to enable custom conversions.
         * Subclasses may override this to implement conversion for "their" content model.
         *
-        * @param string $toModel the desired content model, use the CONTENT_MODEL_XXX flags.
-        * @param string $lossy flag, set to "lossy" to allow lossy conversion. If lossy conversion is
-        * not allowed, full round-trip conversion is expected to work without losing information.
+        * @param string $toModel
+        * @param string $lossy
+        *
+        * @return Content|bool
         *
-        * @return Content|bool A content object with the content model $toModel, or false if
-        * that conversion is not supported.
+        * @see Content::convert()
         */
        public function convert( $toModel, $lossy = '' ) {
                if ( $this->getModel() === $toModel ) {
index 947e348..075635d 100644 (file)
@@ -32,6 +32,7 @@
  * @ingroup Content
  */
 interface Content {
+
        /**
         * @since 1.21
         *
@@ -64,8 +65,9 @@ interface Content {
         *
         * @since 1.21
         *
-        * @param int $maxLength Maximum length of the summary text
-        * @return string The summary text
+        * @param int $maxLength Maximum length of the summary text.
+        *
+        * @return string The summary text.
         */
        public function getTextForSummary( $maxLength = 250 );
 
@@ -132,7 +134,7 @@ interface Content {
         *
         * @since 1.21
         *
-        * @return Array of supported serialization formats
+        * @return string[] List of supported serialization formats
         */
        public function getSupportedFormats();
 
@@ -147,7 +149,8 @@ interface Content {
         *
         * @since 1.21
         *
-        * @param string $format The format to check
+        * @param string $format The serialization format to check.
+        *
         * @return bool Whether the format is supported
         */
        public function isSupportedFormat( $format );
@@ -159,9 +162,9 @@ interface Content {
         *
         * @since 1.21
         *
-        * @param $format null|string The desired serialization format (or null for
-        *    the default format).
-        * @return string Serialized form of this Content object
+        * @param string $format The desired serialization format, or null for the default format.
+        *
+        * @return string Serialized form of this Content object.
         */
        public function serialize( $format = null );
 
@@ -184,7 +187,7 @@ interface Content {
         *
         * @since 1.21
         *
-        * @return boolean
+        * @return bool
         */
        public function isValid();
 
@@ -207,7 +210,8 @@ interface Content {
         *
         * @since 1.21
         *
-        * @param $that Content The Content object to compare to
+        * @param Content $that The Content object to compare to.
+        *
         * @return bool True if this Content object is equal to $that, false otherwise.
         */
        public function equals( Content $that = null );
@@ -242,7 +246,8 @@ interface Content {
         * @param bool $hasLinks If it is known whether this content contains
         *    links, provide this information here, to avoid redundant parsing to
         *    find out.
-        * @return boolean
+        *
+        * @return bool
         */
        public function isCountable( $hasLinks = null );
 
@@ -256,10 +261,10 @@ interface Content {
         *       generated parser output, implementations of this method
         *       may call ParserOutput::recordOption() on the output object.
         *
-        * @param $title Title The page title to use as a context for rendering
-        * @param $revId null|int The revision being rendered (optional)
-        * @param $options null|ParserOptions Any parser options
-        * @param $generateHtml Boolean Whether to generate HTML (default: true). If false,
+        * @param Title $title The page title to use as a context for rendering.
+        * @param int $revId Optional revision ID being rendered.
+        * @param ParserOptions $options Any parser options.
+        * @param bool $generateHtml Whether to generate HTML (default: true). If false,
         *        the result of calling getText() on the ParserOutput object returned by
         *        this method is undefined.
         *
@@ -267,8 +272,7 @@ interface Content {
         *
         * @return ParserOutput
         */
-       public function getParserOutput( Title $title,
-               $revId = null,
+       public function getParserOutput( Title $title, $revId = null,
                ParserOptions $options = null, $generateHtml = true );
 
        // TODO: make RenderOutput and RenderOptions base classes
@@ -288,24 +292,22 @@ interface Content {
         * Subclasses may implement this to determine the necessary updates more
         * efficiently, or make use of information about the old content.
         *
-        * @param $title Title The context for determining the necessary updates
-        * @param $old Content|null An optional Content object representing the
+        * @param Title $title The context for determining the necessary updates
+        * @param Content $old An optional Content object representing the
         *    previous content, i.e. the content being replaced by this Content
         *    object.
-        * @param $recursive boolean Whether to include recursive updates (default:
+        * @param bool $recursive Whether to include recursive updates (default:
         *    false).
-        * @param $parserOutput ParserOutput|null Optional ParserOutput object.
+        * @param ParserOutput $parserOutput Optional ParserOutput object.
         *    Provide if you have one handy, to avoid re-parsing of the content.
         *
-        * @return Array. A list of DataUpdate objects for putting information
+        * @return DataUpdate[] A list of DataUpdate objects for putting information
         *    about this content object somewhere.
         *
         * @since 1.21
         */
-       public function getSecondaryDataUpdates( Title $title,
-               Content $old = null,
-               $recursive = true, ParserOutput $parserOutput = null
-       );
+       public function getSecondaryDataUpdates( Title $title, Content $old = null,
+               $recursive = true, ParserOutput $parserOutput = null );
 
        /**
         * Construct the redirect destination from this content and return an
@@ -315,7 +317,7 @@ interface Content {
         *
         * @since 1.21
         *
-        * @return Array of Titles, with the destination last
+        * @return Title[]|null List of Titles, with the destination last.
         */
        public function getRedirectChain();
 
@@ -327,7 +329,7 @@ interface Content {
         *
         * @since 1.21
         *
-        * @return Title: The corresponding Title
+        * @return Title|null The corresponding Title.
         */
        public function getRedirectTarget();
 
@@ -344,7 +346,7 @@ interface Content {
         *
         * @since 1.21
         *
-        * @return Title
+        * @return Title|null
         */
        public function getUltimateRedirectTarget();
 
@@ -364,9 +366,9 @@ interface Content {
         *
         * @since 1.21
         *
-        * @param Title $target the new redirect target
+        * @param Title $target The new redirect target
         *
-        * @return Content a new Content object with the updated redirect (or $this
+        * @return Content A new Content object with the updated redirect (or $this
         *   if this Content object isn't a redirect)
         */
        public function updateRedirect( Title $target );
@@ -380,7 +382,8 @@ interface Content {
         *    The ID "0" retrieves the section before the first heading, "1" the
         *    text between the first heading (included) and the second heading
         *    (excluded), etc.
-        * @return Content|Boolean|null The section, or false if no such section
+        *
+        * @return Content|bool|null The section, or false if no such section
         *    exist, or null if sections are not supported.
         */
        public function getSection( $sectionId );
@@ -391,10 +394,11 @@ interface Content {
         *
         * @since 1.21
         *
-        * @param $section null/false or a section number (0, 1, 2, T1, T2...), or "new"
-        * @param $with Content: new content of the section
-        * @param string $sectionTitle new section's subject, only if $section is 'new'
-        * @return string Complete article text, or null if error
+        * @param mixed $section Null/false or a section number (0, 1, 2, T1, T2...), or "new"
+        * @param Content $with New content of the section
+        * @param string $sectionTitle New section's subject, only if $section is 'new'
+        *
+        * @return string|null Complete article text, or null if error
         */
        public function replaceSection( $section, Content $with, $sectionTitle = '' );
 
@@ -404,9 +408,10 @@ interface Content {
         *
         * @since 1.21
         *
-        * @param $title Title
-        * @param $user User
-        * @param $parserOptions null|ParserOptions
+        * @param Title $title
+        * @param User $user
+        * @param ParserOptions $parserOptions
+        *
         * @return Content
         */
        public function preSaveTransform( Title $title, User $user, ParserOptions $parserOptions );
@@ -418,7 +423,8 @@ interface Content {
         *
         * @since 1.21
         *
-        * @param $header string
+        * @param string $header
+        *
         * @return Content
         */
        public function addSectionHeader( $header );
@@ -429,8 +435,9 @@ interface Content {
         *
         * @since 1.21
         *
-        * @param $title Title
-        * @param $parserOptions null|ParserOptions
+        * @param Title $title
+        * @param ParserOptions $parserOptions
+        *
         * @return Content
         */
        public function preloadTransform( Title $title, ParserOptions $parserOptions );
@@ -451,15 +458,15 @@ interface Content {
         * @since 1.21
         *
         * @param WikiPage $page The page to be saved.
-        * @param int $flags bitfield for use with EDIT_XXX constants, see WikiPage::doEditContent()
-        * @param int $baseRevId the ID of the current revision
+        * @param int $flags Bitfield for use with EDIT_XXX constants, see WikiPage::doEditContent()
+        * @param int $baseRevId The ID of the current revision
         * @param User $user
         *
         * @return Status A status object indicating whether the content was
         *   successfully prepared for saving. If the returned status indicates
         *   an error, a rollback will be performed and the transaction aborted.
         *
-        * @see see WikiPage::doEditContent()
+        * @see WikiPage::doEditContent()
         */
        public function prepareSave( WikiPage $page, $flags, $baseRevId, User $user );
 
@@ -470,12 +477,12 @@ interface Content {
         *
         * @since 1.21
         *
-        * @param $page WikiPage the deleted page
-        * @param $parserOutput null|ParserOutput optional parser output object
+        * @param WikiPage $page The deleted page
+        * @param ParserOutput $parserOutput Optional parser output object
         *    for efficient access to meta-information about the content object.
         *    Provide if you have one handy.
         *
-        * @return array A list of DataUpdate instances that will clean up the
+        * @return DataUpdate[] A list of DataUpdate instances that will clean up the
         *    database after deletion.
         */
        public function getDeletionUpdates( WikiPage $page,
@@ -486,9 +493,9 @@ interface Content {
         *
         * @since 1.21
         *
-        * @param MagicWord $word the magic word to match
+        * @param MagicWord $word The magic word to match
         *
-        * @return bool whether this Content object matches the given magic word.
+        * @return bool Whether this Content object matches the given magic word.
         */
        public function matchMagicWord( MagicWord $word );
 
@@ -496,9 +503,10 @@ interface Content {
         * Converts this content object into another content object with the given content model,
         * if that is possible.
         *
-        * @param string $toModel the desired content model, use the CONTENT_MODEL_XXX flags.
-        * @param string $lossy flag, set to "lossy" to allow lossy conversion. If lossy conversion is
-        * not allowed, full round-trip conversion is expected to work without losing information.
+        * @param string $toModel The desired content model, use the CONTENT_MODEL_XXX flags.
+        * @param string $lossy Optional flag, set to "lossy" to allow lossy conversion. If lossy
+        * conversion is not allowed, full round-trip conversion is expected to work without losing
+        * information.
         *
         * @return Content|bool A content object with the content model $toModel, or false if
         * that conversion is not supported.
@@ -509,4 +517,5 @@ interface Content {
        //   [11:59] <vvv> Hooks are ugly; make CodeHighlighter interface and a
        //   config to set the class which handles syntax highlighting
        //   [12:00] <vvv> And default it to a DummyHighlighter
+
 }
index 7c51345..defa7da 100644 (file)
@@ -85,10 +85,11 @@ abstract class ContentHandler {
         *
         * @since 1.21
         *
-        * @param $content Content|null
-        * @return null|string the textual form of $content, if available
-        * @throws MWException if $content is not an instance of TextContent and
-        *   $wgContentHandlerTextFallback was set to 'fail'.
+        * @param Content $content
+        *
+        * @throws MWException If the content is not an instance of TextContent and
+        * wgContentHandlerTextFallback was set to 'fail'.
+        * @return string|null Textual form of the content, if available.
         */
        public static function getContentText( Content $content = null ) {
                global $wgContentHandlerTextFallback;
@@ -127,24 +128,21 @@ abstract class ContentHandler {
         *
         * @since 1.21
         *
-        * @param string $text the textual representation, will be
+        * @param string $text The textual representation, will be
         *    unserialized to create the Content object
-        * @param $title null|Title the title of the page this text belongs to.
+        * @param Title $title The title of the page this text belongs to.
         *    Required if $modelId is not provided.
-        * @param $modelId null|string the model to deserialize to. If not provided,
+        * @param string $modelId The model to deserialize to. If not provided,
         *    $title->getContentModel() is used.
-        * @param $format null|string the format to use for deserialization. If not
+        * @param string $format The format to use for deserialization. If not
         *    given, the model's default format is used.
         *
-        * @throws MWException
-        * @return Content a Content object representing $text
-        *
-        * @throws MWException if $model or $format is not supported or if $text can
-        *    not be unserialized using $format.
+        * @throws MWException If model ID or format is not supported or if the text can not be
+        * unserialized using the format.
+        * @return Content A Content object representing the text.
         */
        public static function makeContent( $text, Title $title = null,
-               $modelId = null, $format = null
-       ) {
+               $modelId = null, $format = null ) {
                if ( is_null( $modelId ) ) {
                        if ( is_null( $title ) ) {
                                throw new MWException( "Must provide a Title object or a content model ID." );
@@ -188,8 +186,9 @@ abstract class ContentHandler {
         *
         * @since 1.21
         *
-        * @param $title Title
-        * @return null|string default model name for the page given by $title
+        * @param Title $title
+        *
+        * @return string Default model name for the page given by $title
         */
        public static function getDefaultModelFor( Title $title ) {
                // NOTE: this method must not rely on $title->getContentModel() directly or indirectly,
@@ -253,7 +252,8 @@ abstract class ContentHandler {
         *
         * @since 1.21
         *
-        * @param $title Title
+        * @param Title $title
+        *
         * @return ContentHandler
         */
        public static function getForTitle( Title $title ) {
@@ -268,7 +268,8 @@ abstract class ContentHandler {
         *
         * @since 1.21
         *
-        * @param $content Content
+        * @param Content $content
+        *
         * @return ContentHandler
         */
        public static function getForContent( Content $content ) {
@@ -303,9 +304,9 @@ abstract class ContentHandler {
         *
         * @param string $modelId The ID of the content model for which to get a
         *    handler. Use CONTENT_MODEL_XXX constants.
-        * @return ContentHandler The ContentHandler singleton for handling the
-        *    model given by $modelId
-        * @throws MWException if no handler is known for $modelId.
+        *
+        * @throws MWException If no handler is known for the model ID.
+        * @return ContentHandler The ContentHandler singleton for handling the model given by the ID.
         */
        public static function getForModelID( $modelId ) {
                global $wgContentHandlers;
@@ -353,8 +354,8 @@ abstract class ContentHandler {
         * @param string $name The content model ID, as given by a CONTENT_MODEL_XXX
         *    constant or returned by Revision::getContentModel().
         *
+        * @throws MWException If the model ID isn't known.
         * @return string The content model's localized name.
-        * @throws MWException if the model id isn't known.
         */
        public static function getLocalizedName( $name ) {
                // Messages: content-model-wikitext, content-model-text,
@@ -389,7 +390,14 @@ abstract class ContentHandler {
 
        // ------------------------------------------------------------------------
 
+       /**
+        * @var string
+        */
        protected $mModelID;
+
+       /**
+        * @var string[]
+        */
        protected $mSupportedFormats;
 
        /**
@@ -398,7 +406,7 @@ abstract class ContentHandler {
         * provided as literals by subclass's constructors.
         *
         * @param string $modelId (use CONTENT_MODEL_XXX constants).
-        * @param array $formats List for supported serialization formats
+        * @param string[] $formats List for supported serialization formats
         *    (typically as MIME types)
         */
        public function __construct( $modelId, $formats ) {
@@ -415,8 +423,9 @@ abstract class ContentHandler {
         *
         * @since 1.21
         *
-        * @param $content Content The Content object to serialize
-        * @param $format null|String The desired serialization format
+        * @param Content $content The Content object to serialize
+        * @param string $format The desired serialization format
+        *
         * @return string Serialized form of the content
         */
        abstract public function serializeContent( Content $content, $format = null );
@@ -426,9 +435,10 @@ abstract class ContentHandler {
         *
         * @since 1.21
         *
-        * @param string $blob serialized form of the content
-        * @param $format null|String the format used for serialization
-        * @return Content the Content object created by deserializing $blob
+        * @param string $blob Serialized form of the content
+        * @param string $format The format used for serialization
+        *
+        * @return Content The Content object created by deserializing $blob
         */
        abstract public function unserializeContent( $blob, $format = null );
 
@@ -454,10 +464,10 @@ abstract class ContentHandler {
         *
         * @since 1.21
         *
-        * @param Title $destination the page to redirect to.
-        * @param string $text text to include in the redirect, if possible.
+        * @param Title $destination The page to redirect to.
+        * @param string $text Text to include in the redirect, if possible.
         *
-        * @return Content
+        * @return Content Always null.
         */
        public function makeRedirectContent( Title $destination, $text = '' ) {
                return null;
@@ -469,21 +479,19 @@ abstract class ContentHandler {
         *
         * @since 1.21
         *
-        * @return String The model ID
+        * @return string The model ID
         */
        public function getModelID() {
                return $this->mModelID;
        }
 
        /**
-        * Throws an MWException if $model_id is not the ID of the content model
-        * supported by this ContentHandler.
-        *
         * @since 1.21
         *
         * @param string $model_id The model to check
         *
-        * @throws MWException
+        * @throws MWException If the model ID is not the ID of the content model supported by this
+        * ContentHandler.
         */
        protected function checkModelID( $model_id ) {
                if ( $model_id !== $this->mModelID ) {
@@ -500,7 +508,7 @@ abstract class ContentHandler {
         *
         * @since 1.21
         *
-        * @return array of serialization formats as MIME type like strings
+        * @return string[] List of serialization formats as MIME type like strings
         */
        public function getSupportedFormats() {
                return $this->mSupportedFormats;
@@ -515,7 +523,7 @@ abstract class ContentHandler {
         *
         * @since 1.21
         *
-        * @return string the name of the default serialization format as a MIME type
+        * @return string The name of the default serialization format as a MIME type
         */
        public function getDefaultFormat() {
                return $this->mSupportedFormats[0];
@@ -530,11 +538,11 @@ abstract class ContentHandler {
         *
         * @since 1.21
         *
-        * @param string $format the serialization format to check
+        * @param string $format The serialization format to check
+        *
         * @return bool
         */
        public function isSupportedFormat( $format ) {
-
                if ( !$format ) {
                        return true; // this means "use the default"
                }
@@ -543,13 +551,11 @@ abstract class ContentHandler {
        }
 
        /**
-        * Throws an MWException if isSupportedFormat( $format ) is not true.
-        * Convenient for checking whether a format provided as a parameter is
-        * actually supported.
+        * Convenient for checking whether a format provided as a parameter is actually supported.
         *
-        * @param string $format the serialization format to check
+        * @param string $format The serialization format to check
         *
-        * @throws MWException
+        * @throws MWException If the format is not supported by this content handler.
         */
        protected function checkFormat( $format ) {
                if ( !$this->isSupportedFormat( $format ) ) {
@@ -568,7 +574,7 @@ abstract class ContentHandler {
         *
         * @since 1.21
         *
-        * @return Array
+        * @return array Always an empty array.
         */
        public function getActionOverrides() {
                return array();
@@ -579,21 +585,18 @@ abstract class ContentHandler {
         *
         * @since 1.21
         *
-        * @param $context IContextSource context to use, anything else will be
-        *    ignored
-        * @param $old Integer Old ID we want to show and diff with.
-        * @param int|string $new String either 'prev' or 'next'.
-        * @param $rcid Integer ??? FIXME (default 0)
-        * @param $refreshCache boolean If set, refreshes the diff cache
-        * @param $unhide boolean If set, allow viewing deleted revs
+        * @param IContextSource $context Context to use, anything else will be ignored.
+        * @param int $old Revision ID we want to show and diff with.
+        * @param int|string $new Either a revision ID or one of the strings 'cur', 'prev' or 'next'.
+        * @param int $rcid FIXME: Deprecated, no longer used. Defaults to 0.
+        * @param bool $refreshCache If set, refreshes the diff cache. Defaults to false.
+        * @param bool $unhide If set, allow viewing deleted revs. Defaults to false.
         *
         * @return DifferenceEngine
         */
-       public function createDifferenceEngine( IContextSource $context,
-               $old = 0, $new = 0,
-               $rcid = 0, # FIXME: use everywhere!
-               $refreshCache = false, $unhide = false
-       ) {
+       public function createDifferenceEngine( IContextSource $context, $old = 0, $new = 0,
+               $rcid = 0, //FIXME: Deprecated, no longer used
+               $refreshCache = false, $unhide = false ) {
                $diffEngineClass = $this->getDiffEngineClass();
 
                return new $diffEngineClass( $context, $old, $new, $rcid, $refreshCache, $unhide );
@@ -613,10 +616,10 @@ abstract class ContentHandler {
         *
         * @since 1.21
         *
-        * @param Title $title the page to determine the language for.
-        * @param Content|null $content the page's content, if you have it handy, to avoid reloading it.
+        * @param Title $title The page to determine the language for.
+        * @param Content $content The page's content, if you have it handy, to avoid reloading it.
         *
-        * @return Language the page's language
+        * @return Language The page's language
         */
        public function getPageLanguage( Title $title, Content $content = null ) {
                global $wgContLang, $wgLang;
@@ -648,10 +651,10 @@ abstract class ContentHandler {
         *
         * @since 1.21
         *
-        * @param Title $title the page to determine the language for.
-        * @param Content|null $content the page's content, if you have it handy, to avoid reloading it.
+        * @param Title $title The page to determine the language for.
+        * @param Content $content The page's content, if you have it handy, to avoid reloading it.
         *
-        * @return Language the page's language for viewing
+        * @return Language The page's language for viewing
         */
        public function getPageViewLanguage( Title $title, Content $content = null ) {
                $pageLang = $this->getPageLanguage( $title, $content );
@@ -680,9 +683,9 @@ abstract class ContentHandler {
         * @note: this calls the ContentHandlerCanBeUsedOn hook which may be used to override which
         * content model can be used where.
         *
-        * @param Title $title the page's title.
+        * @param Title $title The page's title.
         *
-        * @return bool true if content of this kind can be used on the given page, false otherwise.
+        * @return bool True if content of this kind can be used on the given page, false otherwise.
         */
        public function canBeUsedOn( Title $title ) {
                $ok = true;
@@ -704,19 +707,18 @@ abstract class ContentHandler {
        }
 
        /**
-        * Attempts to merge differences between three versions.
-        * Returns a new Content object for a clean merge and false for failure or
-        * a conflict.
+        * Attempts to merge differences between three versions. Returns a new
+        * Content object for a clean merge and false for failure or a conflict.
         *
         * This default implementation always returns false.
         *
         * @since 1.21
         *
-        * @param $oldContent Content|string  String
-        * @param $myContent Content|string   String
-        * @param $yourContent Content|string String
+        * @param Content|string $oldContent The page's previous content.
+        * @param Content|string $myContent One of the page's conflicting contents.
+        * @param Content|string $yourContent One of the page's conflicting contents.
         *
-        * @return Content|Bool
+        * @return Content|bool Always false.
         */
        public function merge3( Content $oldContent, Content $myContent, Content $yourContent ) {
                return false;
@@ -727,13 +729,14 @@ abstract class ContentHandler {
         *
         * @since 1.21
         *
-        * @param $oldContent Content|null: the previous text of the page.
-        * @param $newContent Content|null: The submitted text of the page.
+        * @param Content $oldContent The previous text of the page.
+        * @param Content $newContent The submitted text of the page.
         * @param int $flags Bit mask: a bit mask of flags submitted for the edit.
         *
         * @return string An appropriate auto-summary, or an empty string.
         */
-       public function getAutosummary( Content $oldContent = null, Content $newContent = null, $flags ) {
+       public function getAutosummary( Content $oldContent = null, Content $newContent = null,
+               $flags ) {
                // Decide what kind of auto-summary is needed.
 
                // Redirect auto-summaries
@@ -799,8 +802,9 @@ abstract class ContentHandler {
         *
         * @since 1.21
         *
-        * @param $title Title: the page's title
-        * @param &$hasHistory Boolean: whether the page has a history
+        * @param Title $title The page's title
+        * @param bool &$hasHistory Whether the page has a history
+        *
         * @return mixed String containing deletion reason or empty string, or
         *    boolean false if no revision occurred
         *
@@ -907,9 +911,9 @@ abstract class ContentHandler {
         *
         * @since 1.21
         *
-        * @param $current Revision The current text
-        * @param $undo Revision The revision to undo
-        * @param $undoafter Revision Must be an earlier revision than $undo
+        * @param Revision $current The current text
+        * @param Revision $undo The revision to undo
+        * @param Revision $undoafter Must be an earlier revision than $undo
         *
         * @return mixed String on success, false on failure
         */
@@ -980,7 +984,7 @@ abstract class ContentHandler {
         *
         * @since 1.21
         *
-        * @return bool
+        * @return bool Always false.
         */
        public function isParserCacheSupported() {
                return false;
@@ -993,7 +997,7 @@ abstract class ContentHandler {
         * Content models that return true here should also implement
         * Content::getSection, Content::replaceSection, etc. to handle sections..
         *
-        * @return boolean whether sections are supported.
+        * @return bool Always false.
         */
        public function supportsSections() {
                return false;
@@ -1006,7 +1010,7 @@ abstract class ContentHandler {
         * Content models that return true here should also implement
         * ContentHandler::makeRedirectContent to return a Content object.
         *
-        * @return boolean whether redirects are supported.
+        * @return bool Always false.
         */
        public function supportsRedirects() {
                return false;
@@ -1038,13 +1042,13 @@ abstract class ContentHandler {
         * hook function, a new Content object is constructed from the new
         * text.
         *
-        * @param string $event event name
-        * @param array $args parameters passed to hook functions
-        * @param bool $warn whether to log a warning.
+        * @param string $event Event name
+        * @param array $args Parameters passed to hook functions
+        * @param bool $warn Whether to log a warning.
         *                    Default to self::$enableDeprecationWarnings.
         *                    May be set to false for testing.
         *
-        * @return Boolean True if no handler aborted the hook
+        * @return bool True if no handler aborted the hook
         *
         * @see ContentHandler::$enableDeprecationWarnings
         */
index 03cc2d0..5fc2c9f 100644 (file)
  * @ingroup Content
  */
 class CssContent extends TextContent {
+
+       /**
+        * @param string $text CSS code.
+        */
        public function __construct( $text ) {
                parent::__construct( $text, CONTENT_MODEL_CSS );
        }
@@ -39,10 +43,13 @@ class CssContent extends TextContent {
         * Returns a Content object with pre-save transformations applied using
         * Parser::preSaveTransform().
         *
-        * @param $title Title
-        * @param $user User
-        * @param $popts ParserOptions
-        * @return Content
+        * @param Title $title
+        * @param User $user
+        * @param ParserOptions $popts
+        *
+        * @return CssContent
+        *
+        * @see TextContent::preSaveTransform
         */
        public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
                global $wgParser;
@@ -54,6 +61,9 @@ class CssContent extends TextContent {
                return new CssContent( $pst );
        }
 
+       /**
+        * @return string CSS wrapped in a <pre> tag.
+        */
        protected function getHtml() {
                $html = "";
                $html .= "<pre class=\"mw-code mw-css\" dir=\"ltr\">\n";
@@ -62,4 +72,5 @@ class CssContent extends TextContent {
 
                return $html;
        }
+
 }
index 7becabb..85059a8 100644 (file)
  * @ingroup Content
  */
 class CssContentHandler extends TextContentHandler {
+
+       /**
+        * @param string $modelId
+        */
        public function __construct( $modelId = CONTENT_MODEL_CSS ) {
                parent::__construct( $modelId, array( CONTENT_FORMAT_CSS ) );
        }
 
+       /**
+        * @param string $text
+        * @param string $format
+        *
+        * @return CssContent
+        *
+        * @see ContentHandler::unserializeContent()
+        */
        public function unserializeContent( $text, $format = null ) {
                $this->checkFormat( $format );
 
                return new CssContent( $text );
        }
 
+       /**
+        * @return CssContent A new CssContent object with empty text.
+        *
+        * @see ContentHandler::makeEmptyContent()
+        */
        public function makeEmptyContent() {
                return new CssContent( '' );
        }
@@ -47,6 +64,7 @@ class CssContentHandler extends TextContentHandler {
         *
         * @param Title $title
         * @param Content $content
+        *
         * @return Language wfGetLangObj( 'en' )
         *
         * @see ContentHandler::getPageLanguage()
@@ -60,6 +78,7 @@ class CssContentHandler extends TextContentHandler {
         *
         * @param Title $title
         * @param Content $content
+        *
         * @return Language wfGetLangObj( 'en' )
         *
         * @see ContentHandler::getPageViewLanguage()
@@ -67,4 +86,5 @@ class CssContentHandler extends TextContentHandler {
        public function getPageViewLanguage( Title $title, Content $content = null ) {
                return wfGetLangObj( 'en' );
        }
+
 }
index 2ae572b..11a470e 100644 (file)
  * @ingroup Content
  */
 class JavaScriptContent extends TextContent {
+
+       /**
+        * @param string $text JavaScript code.
+        */
        public function __construct( $text ) {
                parent::__construct( $text, CONTENT_MODEL_JAVASCRIPT );
        }
@@ -42,7 +46,8 @@ class JavaScriptContent extends TextContent {
         * @param Title $title
         * @param User $user
         * @param ParserOptions $popts
-        * @return Content
+        *
+        * @return JavaScriptContent
         */
        public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
                global $wgParser;
@@ -55,6 +60,9 @@ class JavaScriptContent extends TextContent {
                return new JavaScriptContent( $pst );
        }
 
+       /**
+        * @return string JavaScript wrapped in a <pre> tag.
+        */
        protected function getHtml() {
                $html = "";
                $html .= "<pre class=\"mw-code mw-js\" dir=\"ltr\">\n";
@@ -63,4 +71,5 @@ class JavaScriptContent extends TextContent {
 
                return $html;
        }
+
 }
index 064c422..2e98976 100644 (file)
  * @todo make ScriptContentHandler base class, do highlighting stuff there?
  */
 class JavaScriptContentHandler extends TextContentHandler {
+
+       /**
+        * @param string $modelId
+        */
        public function __construct( $modelId = CONTENT_MODEL_JAVASCRIPT ) {
                parent::__construct( $modelId, array( CONTENT_FORMAT_JAVASCRIPT ) );
        }
 
+       /**
+        * @param string $text
+        * @param string $format
+        *
+        * @return JavaScriptContent
+        *
+        * @see ContentHandler::unserializeContent()
+        */
        public function unserializeContent( $text, $format = null ) {
                $this->checkFormat( $format );
 
                return new JavaScriptContent( $text );
        }
 
+       /**
+        * @return JavaScriptContent A new JavaScriptContent object with empty text.
+        *
+        * @see ContentHandler::makeEmptyContent()
+        */
        public function makeEmptyContent() {
                return new JavaScriptContent( '' );
        }
@@ -47,6 +64,7 @@ class JavaScriptContentHandler extends TextContentHandler {
         *
         * @param Title $title
         * @param Content $content
+        *
         * @return Language wfGetLangObj( 'en' )
         *
         * @see ContentHandler::getPageLanguage()
@@ -60,6 +78,7 @@ class JavaScriptContentHandler extends TextContentHandler {
         *
         * @param Title $title
         * @param Content $content
+        *
         * @return Language wfGetLangObj( 'en' )
         *
         * @see ContentHandler::getPageViewLanguage()
@@ -67,4 +86,5 @@ class JavaScriptContentHandler extends TextContentHandler {
        public function getPageViewLanguage( Title $title, Content $content = null ) {
                return wfGetLangObj( 'en' );
        }
+
 }
index e780846..b601344 100644 (file)
  * @ingroup Content
  */
 class MessageContent extends AbstractContent {
+
        /**
         * @var Message
         */
        protected $mMessage;
 
        /**
-        * @param Message|String $msg A Message object, or a message key
-        * @param array|null $params An optional array of message parameters
+        * @param Message|string $msg A Message object, or a message key.
+        * @param string[] $params An optional array of message parameters.
         */
        public function __construct( $msg, $params = null ) {
                # XXX: messages may be wikitext, html or plain text! and maybe even something else entirely.
@@ -59,18 +60,18 @@ class MessageContent extends AbstractContent {
        }
 
        /**
-        * Returns the message as rendered HTML
+        * Fully parse the text from wikitext to HTML.
         *
-        * @return string The message text, parsed into html
+        * @return string Parsed HTML.
         */
        public function getHtml() {
                return $this->mMessage->parse();
        }
 
        /**
-        * Returns the message as rendered HTML
+        * Returns the message text. {{-transformation is done.
         *
-        * @return string The message text, parsed into html
+        * @return string Unescaped message text.
         */
        public function getWikitext() {
                return $this->mMessage->text();
@@ -87,6 +88,8 @@ class MessageContent extends AbstractContent {
        }
 
        /**
+        * @return string
+        *
         * @see Content::getTextForSearchIndex
         */
        public function getTextForSearchIndex() {
@@ -94,6 +97,8 @@ class MessageContent extends AbstractContent {
        }
 
        /**
+        * @return string
+        *
         * @see Content::getWikitextForTransclusion
         */
        public function getWikitextForTransclusion() {
@@ -101,6 +106,10 @@ class MessageContent extends AbstractContent {
        }
 
        /**
+        * @param int $maxLength Maximum length of the summary text, defaults to 250.
+        *
+        * @return string The summary text.
+        *
         * @see Content::getTextForSummary
         */
        public function getTextForSummary( $maxlength = 250 ) {
@@ -108,18 +117,18 @@ class MessageContent extends AbstractContent {
        }
 
        /**
-        * @see Content::getSize
-        *
         * @return int
+        *
+        * @see Content::getSize
         */
        public function getSize() {
                return strlen( $this->mMessage->plain() );
        }
 
        /**
-        * @see Content::copy
-        *
         * @return Content. A copy of this object
+        *
+        * @see Content::copy
         */
        public function copy() {
                // MessageContent is immutable (because getNativeData() returns a clone of the Message object)
@@ -127,29 +136,28 @@ class MessageContent extends AbstractContent {
        }
 
        /**
-        * @see Content::isCountable
-        *
         * @param bool $hasLinks
-        * @return bool false
+        *
+        * @return bool Always false.
+        *
+        * @see Content::isCountable
         */
        public function isCountable( $hasLinks = null ) {
                return false;
        }
 
        /**
-        * @see Content::getParserOutput
+        * @param Title $title Unused.
+        * @param int $revId Unused.
+        * @param ParserOptions $options Unused.
+        * @param bool $generateHtml Whether to generate HTML (default: true).
         *
-        * @param Title $title
-        * @param int $revId Optional revision ID
-        * @param ParserOptions $options
-        * @param bool $generateHtml Wether to generate HTML
         * @return ParserOutput
+        *
+        * @see Content::getParserOutput
         */
-       public function getParserOutput(
-               Title $title, $revId = null,
-               ParserOptions $options = null, $generateHtml = true
-       ) {
-
+       public function getParserOutput( Title $title, $revId = null,
+               ParserOptions $options = null, $generateHtml = true ) {
                if ( $generateHtml ) {
                        $html = $this->getHtml();
                } else {
@@ -160,4 +168,5 @@ class MessageContent extends AbstractContent {
 
                return $po;
        }
+
 }
index 068b150..b0da62d 100644 (file)
  * @ingroup Content
  */
 class TextContent extends AbstractContent {
+
+       /**
+        * @param string $text
+        * @param string $model_id
+        */
        public function __construct( $text, $model_id = CONTENT_MODEL_TEXT ) {
                parent::__construct( $model_id );
 
@@ -50,6 +55,11 @@ class TextContent extends AbstractContent {
                $this->mText = $text;
        }
 
+       /**
+        * @note Mutable subclasses MUST override this to return a copy!
+        *
+        * @return Content $this
+        */
        public function copy() {
                return $this; # NOTE: this is ok since TextContent are immutable.
        }
@@ -81,10 +91,10 @@ class TextContent extends AbstractContent {
         * Returns true if this content is not a redirect, and $wgArticleCountMethod
         * is "any".
         *
-        * @param bool $hasLinks if it is known whether this content contains links,
+        * @param bool $hasLinks If it is known whether this content contains links,
         * provide this information here, to avoid redundant parsing to find out.
         *
-        * @return bool True if the content is countable
+        * @return bool
         */
        public function isCountable( $hasLinks = null ) {
                global $wgArticleCountMethod;
@@ -103,7 +113,7 @@ class TextContent extends AbstractContent {
        /**
         * Returns the text represented by this Content object, as a string.
         *
-        * @return string: the raw text
+        * @return string The raw text.
         */
        public function getNativeData() {
                $text = $this->mText;
@@ -114,7 +124,7 @@ class TextContent extends AbstractContent {
        /**
         * Returns the text represented by this Content object, as a string.
         *
-        * @return string: the raw text
+        * @return string The raw text.
         */
        public function getTextForSearchIndex() {
                return $this->getNativeData();
@@ -126,7 +136,7 @@ class TextContent extends AbstractContent {
         *
         * @note: this allows any text-based content to be transcluded as if it was wikitext.
         *
-        * @return string|false: the raw text, or null if the conversion failed
+        * @return string|false The raw text, or false if the conversion failed.
         */
        public function getWikitextForTransclusion() {
                $wikitext = $this->convert( CONTENT_MODEL_WIKITEXT, 'lossy' );
@@ -142,9 +152,10 @@ class TextContent extends AbstractContent {
         * Returns a Content object with pre-save transformations applied.
         * This implementation just trims trailing whitespace.
         *
-        * @param $title Title
-        * @param $user User
-        * @param $popts ParserOptions
+        * @param Title $title
+        * @param User $user
+        * @param ParserOptions $popts
+        *
         * @return Content
         */
        public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
@@ -159,9 +170,9 @@ class TextContent extends AbstractContent {
         *
         * @since 1.21
         *
-        * @param $that Content: The other content object to compare this content
+        * @param Content $that The other content object to compare this content
         * object to.
-        * @param $lang Language: The language object to use for text segmentation.
+        * @param Language $lang The language object to use for text segmentation.
         *    If not given, $wgContentLang is used.
         *
         * @return Diff A diff representing the changes that would have to be
@@ -194,17 +205,15 @@ class TextContent extends AbstractContent {
         * Returns a generic ParserOutput object, wrapping the HTML returned by
         * getHtml().
         *
-        * @param $title Title Context title for parsing
-        * @param int|null $revId Revision ID (for {{REVISIONID}})
-        * @param $options ParserOptions|null Parser options
+        * @param Title $title Context title for parsing
+        * @param int $revId Revision ID (for {{REVISIONID}})
+        * @param ParserOptions $options Parser options
         * @param bool $generateHtml Whether or not to generate HTML
         *
-        * @return ParserOutput representing the HTML form of the text
+        * @return ParserOutput Representing the HTML form of the text.
         */
-       public function getParserOutput( Title $title,
-               $revId = null,
-               ParserOptions $options = null, $generateHtml = true
-       ) {
+       public function getParserOutput( Title $title, $revId = null,
+               ParserOptions $options = null, $generateHtml = true ) {
                global $wgParser, $wgTextModelsToParse;
 
                if ( !$options ) {
@@ -249,7 +258,7 @@ class TextContent extends AbstractContent {
         * Generates a syntax-highlighted version of the content, as HTML.
         * Used by the default implementation of getHtml().
         *
-        * @return string an HTML representation of the content's markup
+        * @return string A HTML representation of the content's markup
         */
        protected function getHighlightHtml() {
                # TODO: make Highlighter interface, use highlighter here, if available
@@ -257,17 +266,15 @@ class TextContent extends AbstractContent {
        }
 
        /**
-        * @see Content::convert()
-        *
         * This implementation provides lossless conversion between content models based
         * on TextContent.
         *
-        * @param string $toModel the desired content model, use the CONTENT_MODEL_XXX flags.
-        * @param string $lossy flag, set to "lossy" to allow lossy conversion. If lossy conversion is
-        * not allowed, full round-trip conversion is expected to work without losing information.
+        * @param string $toModel
+        * @param string $lossy
         *
-        * @return Content|bool A content object with the content model $toModel, or false if
-        * that conversion is not supported.
+        * @return Content|bool
+        *
+        * @see Content::convert()
         */
        public function convert( $toModel, $lossy = '' ) {
                $converted = parent::convert( $toModel, $lossy );
@@ -286,4 +293,5 @@ class TextContent extends AbstractContent {
 
                return $converted;
        }
+
 }
index 94b5c57..b728d31 100644 (file)
  * @ingroup Content
  */
 class TextContentHandler extends ContentHandler {
+
        // @codingStandardsIgnoreStart bug 57585
        public function __construct( $modelId = CONTENT_MODEL_TEXT,
-               $formats = array( CONTENT_FORMAT_TEXT )
-       ) {
+               $formats = array( CONTENT_FORMAT_TEXT ) ) {
                parent::__construct( $modelId, $formats );
        }
        // @codingStandardsIgnoreEnd
@@ -40,8 +40,9 @@ class TextContentHandler extends ContentHandler {
        /**
         * Returns the content's text as-is.
         *
-        * @param $content Content
-        * @param $format string|null
+        * @param Content $content
+        * @param string $format The serialization format to check
+        *
         * @return mixed
         */
        public function serializeContent( Content $content, $format = null ) {
@@ -59,11 +60,11 @@ class TextContentHandler extends ContentHandler {
         *
         * This text-based implementation uses wfMerge().
         *
-        * @param $oldContent Content|string  String
-        * @param $myContent Content|string   String
-        * @param $yourContent Content|string String
+        * @param Content|string $oldContent The page's previous content.
+        * @param Content|string $myContent One of the page's conflicting contents.
+        * @param Content|string $yourContent One of the page's conflicting contents.
         *
-        * @return Content|Bool
+        * @return Content|bool
         */
        public function merge3( Content $oldContent, Content $myContent, Content $yourContent ) {
                $this->checkModelID( $oldContent->getModel() );
@@ -96,10 +97,10 @@ class TextContentHandler extends ContentHandler {
         *
         * @since 1.21
         *
-        * @param $text   string serialized form of the content
-        * @param $format null|String the format used for serialization
+        * @param string $text Serialized form of the content
+        * @param string $format The format used for serialization
         *
-        * @return Content the TextContent object wrapping $text
+        * @return Content The TextContent object wrapping $text
         */
        public function unserializeContent( $text, $format = null ) {
                $this->checkFormat( $format );
@@ -112,9 +113,10 @@ class TextContentHandler extends ContentHandler {
         *
         * @since 1.21
         *
-        * @return Content
+        * @return Content A new TextContent object with empty text.
         */
        public function makeEmptyContent() {
                return new TextContent( '' );
        }
+
 }
index f495c56..605222e 100644 (file)
  * @ingroup Content
  */
 class WikitextContent extends TextContent {
+
        public function __construct( $text ) {
                parent::__construct( $text, CONTENT_MODEL_WIKITEXT );
        }
 
        /**
+        * @param string $section
+        *
+        * @return Content|bool|null
+        *
         * @see Content::getSection()
         */
        public function getSection( $section ) {
@@ -52,6 +57,13 @@ class WikitextContent extends TextContent {
        }
 
        /**
+        * @param string $section
+        * @param Content $with
+        * @param string $sectionTitle
+        *
+        * @throws MWException
+        * @return Content
+        *
         * @see Content::replaceSection()
         */
        public function replaceSection( $section, Content $with, $sectionTitle = '' ) {
@@ -103,7 +115,8 @@ class WikitextContent extends TextContent {
         * Returns a new WikitextContent object with the given section heading
         * prepended.
         *
-        * @param $header string
+        * @param string $header
+        *
         * @return Content
         */
        public function addSectionHeader( $header ) {
@@ -119,9 +132,10 @@ class WikitextContent extends TextContent {
         * Returns a Content object with pre-save transformations applied using
         * Parser::preSaveTransform().
         *
-        * @param $title Title
-        * @param $user User
-        * @param $popts ParserOptions
+        * @param Title $title
+        * @param User $user
+        * @param ParserOptions $popts
+        *
         * @return Content
         */
        public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
@@ -138,8 +152,9 @@ class WikitextContent extends TextContent {
         * Returns a Content object with preload transformations applied (or this
         * object if no transformations apply).
         *
-        * @param $title Title
-        * @param $popts ParserOptions
+        * @param Title $title
+        * @param ParserOptions $popts
+        *
         * @return Content
         */
        public function preloadTransform( Title $title, ParserOptions $popts ) {
@@ -157,7 +172,8 @@ class WikitextContent extends TextContent {
         * @note: migrated here from Title::newFromRedirectInternal()
         *
         * @since 1.23
-        * @return array 2 elements: Title|null and string
+        *
+        * @return array List of two elements: Title|null and string.
         */
        protected function getRedirectTargetAndText() {
                global $wgMaxRedirects;
@@ -195,10 +211,9 @@ class WikitextContent extends TextContent {
        /**
         * Implement redirect extraction for wikitext.
         *
-        * @return null|Title
+        * @return Title|null
         *
         * @see Content::getRedirectTarget
-        * @see AbstractContent::getRedirectTarget
         */
        public function getRedirectTarget() {
                list( $title, ) = $this->getRedirectTargetAndText();
@@ -207,8 +222,6 @@ class WikitextContent extends TextContent {
        }
 
        /**
-        * @see Content::updateRedirect()
-        *
         * This implementation replaces the first link on the page with the given new target
         * if this Content object is a redirect. Otherwise, this method returns $this.
         *
@@ -216,8 +229,9 @@ class WikitextContent extends TextContent {
         *
         * @param Title $target
         *
-        * @return Content a new Content object with the updated redirect (or $this
-        *   if this Content object isn't a redirect)
+        * @return Content
+        *
+        * @see Content::updateRedirect()
         */
        public function updateRedirect( Title $target ) {
                if ( !$this->isRedirect() ) {
@@ -238,14 +252,14 @@ class WikitextContent extends TextContent {
         * Returns true if this content is not a redirect, and this content's text
         * is countable according to the criteria defined by $wgArticleCountMethod.
         *
-        * @param bool $hasLinks if it is known whether this content contains
+        * @param bool $hasLinks If it is known whether this content contains
         *    links, provide this information here, to avoid redundant parsing to
         *    find out (default: null).
-        * @param $title Title: (default: null)
+        * @param Title $title Optional title, defaults to the title from the current main request.
         *
         * @internal param \IContextSource $context context for parsing if necessary
         *
-        * @return bool True if the content is countable
+        * @return bool
         */
        public function isCountable( $hasLinks = null, Title $title = null ) {
                global $wgArticleCountMethod;
@@ -279,6 +293,10 @@ class WikitextContent extends TextContent {
                return false;
        }
 
+       /**
+        * @param int $maxlength
+        * @return string
+        */
        public function getTextForSummary( $maxlength = 250 ) {
                $truncatedtext = parent::getTextForSummary( $maxlength );
 
@@ -294,20 +312,17 @@ class WikitextContent extends TextContent {
         * Returns a ParserOutput object resulting from parsing the content's text
         * using $wgParser.
         *
-        * @since    1.21
+        * @since 1.21
         *
-        * @param $title Title
-        * @param int $revId Revision to pass to the parser (default: null)
-        * @param $options ParserOptions (default: null)
+        * @param Title $title * @param int $revId Revision to pass to the parser (default: null)
+        * @param ParserOptions $options (default: null)
         * @param bool $generateHtml (default: false)
-        *
         * @internal param \IContextSource|null $context
-        * @return ParserOutput representing the HTML form of the text
+        *
+        * @return ParserOutput Representing the HTML form of the text
         */
-       public function getParserOutput( Title $title,
-               $revId = null,
-               ParserOptions $options = null, $generateHtml = true
-       ) {
+       public function getParserOutput( Title $title, $revId = null,
+               ParserOptions $options = null, $generateHtml = true ) {
                global $wgParser;
 
                if ( !$options ) {
@@ -334,6 +349,9 @@ class WikitextContent extends TextContent {
                return $po;
        }
 
+       /**
+        * @throws MWException
+        */
        protected function getHtml() {
                throw new MWException(
                        "getHtml() not implemented for wikitext. "
@@ -342,15 +360,16 @@ class WikitextContent extends TextContent {
        }
 
        /**
-        * @see  Content::matchMagicWord()
-        *
         * This implementation calls $word->match() on the this TextContent object's text.
         *
         * @param MagicWord $word
         *
-        * @return bool whether this Content object matches the given magic word.
+        * @return bool
+        *
+        * @see Content::matchMagicWord()
         */
        public function matchMagicWord( MagicWord $word ) {
                return $word->match( $this->getNativeData() );
        }
+
 }
index 1e8fd05..5ae3e25 100644 (file)
@@ -29,6 +29,7 @@
  * @ingroup Content
  */
 class WikitextContentHandler extends TextContentHandler {
+
        public function __construct( $modelId = CONTENT_MODEL_WIKITEXT ) {
                parent::__construct( $modelId, array( CONTENT_FORMAT_WIKITEXT ) );
        }
@@ -40,9 +41,9 @@ class WikitextContentHandler extends TextContentHandler {
        }
 
        /**
-        * @see ContentHandler::makeEmptyContent
+        * @return Content A new WikitextContent object with empty text.
         *
-        * @return Content
+        * @see ContentHandler::makeEmptyContent
         */
        public function makeEmptyContent() {
                return new WikitextContent( '' );
@@ -51,12 +52,12 @@ class WikitextContentHandler extends TextContentHandler {
        /**
         * Returns a WikitextContent object representing a redirect to the given destination page.
         *
-        * @see ContentHandler::makeRedirectContent
-        *
-        * @param Title $destination the page to redirect to.
-        * @param string $text text to include in the redirect, if possible.
+        * @param Title $destination The page to redirect to.
+        * @param string $text Text to include in the redirect, if possible.
         *
         * @return Content
+        *
+        * @see ContentHandler::makeRedirectContent
         */
        public function makeRedirectContent( Title $destination, $text = '' ) {
                $optionalColon = '';
@@ -84,9 +85,9 @@ class WikitextContentHandler extends TextContentHandler {
        /**
         * Returns true because wikitext supports redirects.
         *
-        * @see ContentHandler::supportsRedirects
+        * @return bool Always true.
         *
-        * @return boolean whether redirects are supported.
+        * @see ContentHandler::supportsRedirects
         */
        public function supportsRedirects() {
                return true;
@@ -95,7 +96,9 @@ class WikitextContentHandler extends TextContentHandler {
        /**
         * Returns true because wikitext supports sections.
         *
-        * @return boolean whether sections are supported.
+        * @return bool Always true.
+        *
+        * @see ContentHandler::supportsSections
         */
        public function supportsSections() {
                return true;
@@ -106,9 +109,13 @@ class WikitextContentHandler extends TextContentHandler {
         * ParserCache mechanism.
         *
         * @since 1.21
-        * @return bool
+        *
+        * @return bool Always true.
+        *
+        * @see ContentHandler::isParserCacheSupported
         */
        public function isParserCacheSupported() {
                return true;
        }
+
 }
index c5dc882..08e1885 100644 (file)
@@ -3,7 +3,7 @@
  * Helper class for making a copy of the database, mostly for unit testing.
  *
  * Copyright © 2010 Chad Horohoe <chad@anyonecanedit.org>
- * http://www.mediawiki.org/
+ * 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
index 21c868e..91ab0ca 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 /**
  * @defgroup Database Database
  *
@@ -1921,12 +1922,12 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        }
 
        /**
-        * Make UPDATE options for the DatabaseBase::update function
+        * Make UPDATE options array for DatabaseBase::makeUpdateOptions
         *
-        * @param array $options The options passed to DatabaseBase::update
-        * @return string
+        * @param array $options
+        * @return array
         */
-       protected function makeUpdateOptions( $options ) {
+       protected function makeUpdateOptionsArray( $options ) {
                if ( !is_array( $options ) ) {
                        $options = array( $options );
                }
@@ -1941,6 +1942,18 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                        $opts[] = 'IGNORE';
                }
 
+               return $opts;
+       }
+
+       /**
+        * Make UPDATE options for the DatabaseBase::update function
+        *
+        * @param array $options The options passed to DatabaseBase::update
+        * @return string
+        */
+       protected function makeUpdateOptions( $options ) {
+               $opts = $this->makeUpdateOptionsArray( $options );
+
                return implode( ' ', $opts );
        }
 
@@ -2423,11 +2436,12 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                                }
 
                                $retJOIN[] = $tableClause;
-                       // Is there an INDEX clause for this table?
                        } elseif ( isset( $use_index[$alias] ) ) {
+                               // Is there an INDEX clause for this table?
                                $tableClause = $this->tableNameWithAlias( $table, $alias );
                                $tableClause .= ' ' . $this->useIndexClause(
-                                       implode( ',', (array)$use_index[$alias] ) );
+                                       implode( ',', (array)$use_index[$alias] )
+                               );
 
                                $ret[] = $tableClause;
                        } else {
index b4c7365..377aca1 100644 (file)
@@ -38,7 +38,16 @@ class DBError extends MWException {
                $this->db = $db;
                parent::__construct( $error );
        }
+}
 
+/**
+ * Base class for the more common types of database errors. These are known to occur
+ * frequently, so we try to give friendly error messages for them.
+ *
+ * @ingroup Database
+ * @since 1.23
+ */
+class DBExpectedError extends DBError {
        /**
         * @return string
         */
@@ -80,14 +89,14 @@ class DBError extends MWException {
         * @return string
         */
        protected function getHTMLContent() {
-               return '<p>' . nl2br( htmlspecialchars( $this->getMessage() ) ) . '</p>';
+               return '<p>' . nl2br( htmlspecialchars( $this->getTextContent() ) ) . '</p>';
        }
 }
 
 /**
  * @ingroup Database
  */
-class DBConnectionError extends DBError {
+class DBConnectionError extends DBExpectedError {
        /** @var string Error text */
        public $error;
 
@@ -313,7 +322,7 @@ EOT;
 /**
  * @ingroup Database
  */
-class DBQueryError extends DBError {
+class DBQueryError extends DBExpectedError {
        public $error, $errno, $sql, $fname;
 
        /**
index 163554b..e304a34 100644 (file)
@@ -1418,7 +1418,8 @@ class MssqlBlob extends Blob {
                }
 
                $ret = '0x';
-               for ( $i = 0; $i < strlen( $this->mData ); $i++ ) {
+               $dataLength = strlen( $this->mData );
+               for ( $i = 0; $i < $dataLength; $i++ ) {
                        $ret .= bin2hex( pack( 'C', ord( $this->mData[$i] ) ) );
                }
 
index e202f8a..635909c 100644 (file)
@@ -281,4 +281,18 @@ class DatabaseMysqli extends DatabaseMysqlBase {
        protected function mysqlPing() {
                return $this->mConn->ping();
        }
+
+       /**
+        * Give an id for the connection
+        *
+        * mysql driver used resource id, but mysqli objects cannot be cast to string.
+        */
+       public function __toString() {
+               if ( $this->mConn instanceof Mysqli ) {
+                       return (string)$this->mConn->thread_id;
+               } else {
+                       // mConn might be false or something.
+                       return (string)$this->mConn;
+               }
+       }
 }
index cad7caf..998dd75 100644 (file)
@@ -794,7 +794,9 @@ class DatabaseOracle extends DatabaseBase {
                        // add sequence column to each list of columns, when not set
                        foreach ( $rows as &$row ) {
                                if ( !isset( $row[$sequenceData['column']] ) ) {
-                                       $row[$sequenceData['column']] = $this->addIdentifierQuotes('GET_SEQUENCE_VALUE(\'' . $sequenceData['sequence'] . '\')');
+                                       $row[$sequenceData['column']] =
+                                               $this->addIdentifierQuotes( 'GET_SEQUENCE_VALUE(\'' .
+                                                       $sequenceData['sequence'] . '\')' );
                                }
                        }
                }
index 0fa29a1..3313d25 100644 (file)
@@ -522,10 +522,11 @@ class DatabaseSqlite extends DatabaseBase {
         * @param array $options
         * @return string
         */
-       protected function makeUpdateOptions( $options ) {
+       protected function makeUpdateOptionsArray( $options ) {
+               $options = parent::makeUpdateOptionsArray( $options );
                $options = self::fixIgnore( $options );
 
-               return parent::makeUpdateOptions( $options );
+               return $options;
        }
 
        /**
index 331ce7d..c12b76a 100644 (file)
  * @ingroup DifferenceEngine
  */
 class ArrayDiffFormatter extends DiffFormatter {
+
        /**
-        * @param $diff
-        * @return array
+        * @param Diff $diff A Diff object.
+        *
+        * @return array[] List of associative arrays, each describing a difference.
         */
        public function format( $diff ) {
                $oldline = 1;
                $newline = 1;
                $retval = array();
-               foreach ( $diff->edits as $edit ) {
-                       switch ( $edit->type ) {
+               foreach ( $diff->getEdits() as $edit ) {
+                       switch ( $edit->getType() ) {
                                case 'add':
-                                       foreach ( $edit->closing as $l ) {
+                                       foreach ( $edit->getClosing() as $line ) {
                                                $retval[] = array(
                                                        'action' => 'add',
-                                                       'new' => $l,
+                                                       'new' => $line,
                                                        'newline' => $newline++
                                                );
                                        }
                                        break;
                                case 'delete':
-                                       foreach ( $edit->orig as $l ) {
+                                       foreach ( $edit->getOrig() as $line ) {
                                                $retval[] = array(
                                                        'action' => 'delete',
-                                                       'old' => $l,
+                                                       'old' => $line,
                                                        'oldline' => $oldline++,
                                                );
                                        }
                                        break;
                                case 'change':
-                                       foreach ( $edit->orig as $i => $l ) {
+                                       foreach ( $edit->getOrig() as $key => $line ) {
                                                $retval[] = array(
                                                        'action' => 'change',
-                                                       'old' => $l,
-                                                       'new' => isset( $edit->closing[$i] ) ? $edit->closing[$i] : null,
+                                                       'old' => $line,
+                                                       'new' => $edit->getClosing( $key ),
                                                        'oldline' => $oldline++,
                                                        'newline' => $newline++,
                                                );
                                        }
                                        break;
                                case 'copy':
-                                       $oldline += count( $edit->orig );
-                                       $newline += count( $edit->orig );
+                                       $oldline += count( $edit->getOrig() );
+                                       $newline += count( $edit->getOrig() );
                        }
                }
 
                return $retval;
        }
+
 }
index c47eced..61edc1e 100644 (file)
  * @ingroup DifferenceEngine
  */
 abstract class DiffOp {
+
+       /**
+        * @var string
+        */
        public $type;
+
+       /**
+        * @var string[]
+        */
        public $orig;
+
+       /**
+        * @var string[]
+        */
        public $closing;
 
+       /**
+        * @return string
+        */
+       public function getType() {
+               return $this->type;
+       }
+
+       /**
+        * @return string[]
+        */
+       public function getOrig() {
+               return $this->orig;
+       }
+
+       /**
+        * @param int $i
+        * @return string|null
+        */
+       public function getClosing( $i = null ) {
+               if( $i === null ) {
+                       return $this->closing;
+               }
+               if( array_key_exists( $i, $this->closing ) ) {
+                       return $this->closing[$i];
+               }
+               return null;
+       }
+
        abstract public function reverse();
 
        /**
         * @return int
         */
-       function norig() {
+       public function norig() {
                return $this->orig ? count( $this->orig ) : 0;
        }
 
        /**
         * @return int
         */
-       function nclosing() {
+       public function nclosing() {
                return $this->closing ? count( $this->closing ) : 0;
        }
 }
@@ -60,7 +100,7 @@ abstract class DiffOp {
 class DiffOpCopy extends DiffOp {
        public $type = 'copy';
 
-       function __construct( $orig, $closing = false ) {
+       public function __construct( $orig, $closing = false ) {
                if ( !is_array( $closing ) ) {
                        $closing = $orig;
                }
@@ -71,7 +111,7 @@ class DiffOpCopy extends DiffOp {
        /**
         * @return DiffOpCopy
         */
-       function reverse() {
+       public function reverse() {
                return new DiffOpCopy( $this->closing, $this->orig );
        }
 }
@@ -84,7 +124,7 @@ class DiffOpCopy extends DiffOp {
 class DiffOpDelete extends DiffOp {
        public $type = 'delete';
 
-       function __construct( $lines ) {
+       public function __construct( $lines ) {
                $this->orig = $lines;
                $this->closing = false;
        }
@@ -92,7 +132,7 @@ class DiffOpDelete extends DiffOp {
        /**
         * @return DiffOpAdd
         */
-       function reverse() {
+       public function reverse() {
                return new DiffOpAdd( $this->orig );
        }
 }
@@ -105,7 +145,7 @@ class DiffOpDelete extends DiffOp {
 class DiffOpAdd extends DiffOp {
        public $type = 'add';
 
-       function __construct( $lines ) {
+       public function __construct( $lines ) {
                $this->closing = $lines;
                $this->orig = false;
        }
@@ -113,7 +153,7 @@ class DiffOpAdd extends DiffOp {
        /**
         * @return DiffOpDelete
         */
-       function reverse() {
+       public function reverse() {
                return new DiffOpDelete( $this->closing );
        }
 }
@@ -126,7 +166,7 @@ class DiffOpAdd extends DiffOp {
 class DiffOpChange extends DiffOp {
        public $type = 'change';
 
-       function __construct( $orig, $closing ) {
+       public function __construct( $orig, $closing ) {
                $this->orig = $orig;
                $this->closing = $closing;
        }
@@ -134,7 +174,7 @@ class DiffOpChange extends DiffOp {
        /**
         * @return DiffOpChange
         */
-       function reverse() {
+       public function reverse() {
                return new DiffOpChange( $this->closing, $this->orig );
        }
 }
@@ -176,11 +216,12 @@ class DiffEngine {
        protected $lcs = 0;
 
        /**
-        * @param $from_lines
-        * @param $to_lines
-        * @return array
+        * @param string[] $from_lines
+        * @param string[] $to_lines
+        *
+        * @return DiffOp[]
         */
-       function diff( $from_lines, $to_lines ) {
+       public function diff( $from_lines, $to_lines ) {
                wfProfileIn( __METHOD__ );
 
                // Diff and store locally
@@ -237,8 +278,8 @@ class DiffEngine {
        }
 
        /**
-        * @param $from_lines
-        * @param $to_lines
+        * @param string[] $from_lines
+        * @param string[] $to_lines
         */
        private function diffLocal( $from_lines, $to_lines ) {
                global $wgExternalDiffEngine;
@@ -310,7 +351,9 @@ class DiffEngine {
 
        /**
         * Returns the whole line if it's small enough, or the MD5 hash otherwise
-        * @param $line string
+        *
+        * @param string $line
+        *
         * @return string
         */
        private function lineHash( $line ) {
@@ -337,12 +380,14 @@ class DiffEngine {
         * of the two files do not match, and likewise that the last lines do not
         * match.  The caller must trim matching lines from the beginning and end
         * of the portions it is going to specify.
-        * @param $xoff
-        * @param $xlim
-        * @param $yoff
-        * @param $ylim
-        * @param $nchunks
-        * @return array
+        *
+        * @param int $xoff
+        * @param int $xlim
+        * @param int $yoff
+        * @param int $ylim
+        * @param int $nchunks
+        *
+        * @return array List of two elements, integer and array[].
         */
        private function diag( $xoff, $xlim, $yoff, $ylim, $nchunks ) {
                $flip = false;
@@ -379,7 +424,7 @@ class DiffEngine {
                        }
 
                        $x1 = $xoff + (int)( ( $numer + ( $xlim - $xoff ) * $chunk ) / $nchunks );
-                       for ( ; $x < $x1; $x++ ) {
+                       for (; $x < $x1; $x++ ) {
                                $line = $flip ? $this->yv[$x] : $this->xv[$x];
                                if ( empty( $ymatches[$line] ) ) {
                                        continue;
@@ -427,7 +472,8 @@ class DiffEngine {
        }
 
        /**
-        * @param $ypos
+        * @param int $ypos
+        *
         * @return int
         */
        private function lcsPos( $ypos ) {
@@ -469,10 +515,11 @@ class DiffEngine {
         *
         * Note that XLIM, YLIM are exclusive bounds.
         * All line numbers are origin-0 and discarded lines are not counted.
-        * @param $xoff
-        * @param $xlim
-        * @param $yoff
-        * @param $ylim
+        *
+        * @param int $xoff
+        * @param int $xlim
+        * @param int $yoff
+        * @param int $ylim
         */
        private function compareSeq( $xoff, $xlim, $yoff, $ylim ) {
                // Slide down the bottom initial diagonal.
@@ -659,21 +706,32 @@ class DiffEngine {
  * @ingroup DifferenceEngine
  */
 class Diff {
+
+       /**
+        * @var DiffOp[]
+        */
        public $edits;
 
        /**
         * Constructor.
         * Computes diff between sequences of strings.
         *
-        * @param $from_lines array An array of strings.
+        * @param string[] $from_lines An array of strings.
         *   Typically these are lines from a file.
-        * @param $to_lines array An array of strings.
+        * @param string[] $to_lines An array of strings.
         */
-       function __construct( $from_lines, $to_lines ) {
+       public function __construct( $from_lines, $to_lines ) {
                $eng = new DiffEngine;
                $this->edits = $eng->diff( $from_lines, $to_lines );
        }
 
+       /**
+        * @return DiffOp[]
+        */
+       public function getEdits() {
+               return $this->edits;
+       }
+
        /**
         * Compute reversed Diff.
         *
@@ -681,10 +739,11 @@ class Diff {
         *
         *    $diff = new Diff($lines1, $lines2);
         *    $rev = $diff->reverse();
+        *
         * @return Object A Diff object representing the inverse of the
         *   original diff.
         */
-       function reverse() {
+       public function reverse() {
                $rev = $this;
                $rev->edits = array();
                /** @var DiffOp $edit */
@@ -700,7 +759,7 @@ class Diff {
         *
         * @return bool True if two sequences were identical.
         */
-       function isEmpty() {
+       public function isEmpty() {
                foreach ( $this->edits as $edit ) {
                        if ( $edit->type != 'copy' ) {
                                return false;
@@ -717,7 +776,7 @@ class Diff {
         *
         * @return int The length of the LCS.
         */
-       function lcs() {
+       public function lcs() {
                $lcs = 0;
                foreach ( $this->edits as $edit ) {
                        if ( $edit->type == 'copy' ) {
@@ -734,9 +793,9 @@ class Diff {
         * This reconstructs the $from_lines parameter passed to the
         * constructor.
         *
-        * @return array The original sequence of strings.
+        * @return string[] The original sequence of strings.
         */
-       function orig() {
+       public function orig() {
                $lines = array();
 
                foreach ( $this->edits as $edit ) {
@@ -754,9 +813,9 @@ class Diff {
         * This reconstructs the $to_lines parameter passed to the
         * constructor.
         *
-        * @return array The sequence of strings.
+        * @return string[] The sequence of strings.
         */
-       function closing() {
+       public function closing() {
                $lines = array();
 
                foreach ( $this->edits as $edit ) {
@@ -784,21 +843,18 @@ class MappedDiff extends Diff {
         * case-insensitve diffs, or diffs which ignore
         * changes in white-space.
         *
-        * @param $from_lines array An array of strings.
+        * @param string[] $from_lines An array of strings.
         *   Typically these are lines from a file.
-        *
-        * @param $to_lines array An array of strings.
-        *
-        * @param $mapped_from_lines array This array should
+        * @param string[] $to_lines An array of strings.
+        * @param string[] $mapped_from_lines This array should
         *   have the same size number of elements as $from_lines.
         *   The elements in $mapped_from_lines and
         *   $mapped_to_lines are what is actually compared
         *   when computing the diff.
-        *
-        * @param $mapped_to_lines array This array should
+        * @param string[] $mapped_to_lines This array should
         *   have the same number of elements as $to_lines.
         */
-       function __construct( $from_lines, $to_lines,
+       public function __construct( $from_lines, $to_lines,
                $mapped_from_lines, $mapped_to_lines ) {
                wfProfileIn( __METHOD__ );
 
@@ -845,7 +901,7 @@ class HWLDFWordAccumulator {
        private $tag = '';
 
        /**
-        * @param $new_tag
+        * @param string $new_tag
         */
        private function flushGroup( $new_tag ) {
                if ( $this->group !== '' ) {
@@ -864,7 +920,7 @@ class HWLDFWordAccumulator {
        }
 
        /**
-        * @param $new_tag
+        * @param string $new_tag
         */
        private function flushLine( $new_tag ) {
                $this->flushGroup( $new_tag );
@@ -878,8 +934,8 @@ class HWLDFWordAccumulator {
        }
 
        /**
-        * @param $words
-        * @param $tag string
+        * @param string[] $words
+        * @param string $tag
         */
        public function addWords( $words, $tag = '' ) {
                if ( $tag != $this->tag ) {
@@ -901,7 +957,7 @@ class HWLDFWordAccumulator {
        }
 
        /**
-        * @return array
+        * @return string[]
         */
        public function getLines() {
                $this->flushLine( '~done' );
@@ -919,10 +975,10 @@ class WordLevelDiff extends MappedDiff {
        const MAX_LINE_LENGTH = 10000;
 
        /**
-        * @param $orig_lines
-        * @param $closing_lines
+        * @param string[] $orig_lines
+        * @param string[] $closing_lines
         */
-       function __construct( $orig_lines, $closing_lines ) {
+       public function __construct( $orig_lines, $closing_lines ) {
                wfProfileIn( __METHOD__ );
 
                list( $orig_words, $orig_stripped ) = $this->split( $orig_lines );
@@ -934,8 +990,9 @@ class WordLevelDiff extends MappedDiff {
        }
 
        /**
-        * @param $lines
-        * @return array
+        * @param string[] $lines
+        *
+        * @return array[]
         */
        private function split( $lines ) {
                wfProfileIn( __METHOD__ );
@@ -975,7 +1032,7 @@ class WordLevelDiff extends MappedDiff {
        }
 
        /**
-        * @return array
+        * @return string[]
         */
        public function orig() {
                wfProfileIn( __METHOD__ );
@@ -995,7 +1052,7 @@ class WordLevelDiff extends MappedDiff {
        }
 
        /**
-        * @return array
+        * @return string[]
         */
        public function closing() {
                wfProfileIn( __METHOD__ );
@@ -1013,4 +1070,5 @@ class WordLevelDiff extends MappedDiff {
 
                return $lines;
        }
+
 }
index d9e1c95..d8a9ba3 100644 (file)
@@ -34,6 +34,7 @@
  * @ingroup DifferenceEngine
  */
 abstract class DiffFormatter {
+
        /** @var int Number of leading context "lines" to preserve.
         *
         * This should be left at zero for this class, but subclasses
@@ -51,7 +52,8 @@ abstract class DiffFormatter {
        /**
         * Format a diff.
         *
-        * @param $diff Diff A Diff object.
+        * @param Diff $diff A Diff object.
+        *
         * @return string The formatted output.
         */
        public function format( $diff ) {
@@ -124,7 +126,8 @@ abstract class DiffFormatter {
         * @param int $ybeg
         * @param int $ylen
         * @param $edits
-        * @throws MWException
+        *
+        * @throws MWException If the edit type is not known.
         */
        protected function block( $xbeg, $xlen, $ybeg, $ylen, &$edits ) {
                wfProfileIn( __METHOD__ );
@@ -161,10 +164,11 @@ abstract class DiffFormatter {
        }
 
        /**
-        * @param $xbeg
-        * @param $xlen
-        * @param $ybeg
-        * @param $ylen
+        * @param int $xbeg
+        * @param int $xlen
+        * @param int $ybeg
+        * @param int $ylen
+        *
         * @return string
         */
        protected function blockHeader( $xbeg, $xlen, $ybeg, $ylen ) {
@@ -178,16 +182,28 @@ abstract class DiffFormatter {
                return $xbeg . ( $xlen ? ( $ylen ? 'c' : 'd' ) : 'a' ) . $ybeg;
        }
 
+       /**
+        * Called at the start of a block of connected edits.
+        * This default implementation writes the header and a newline to the output buffer.
+        *
+        * @param string $header
+        */
        protected function startBlock( $header ) {
                echo $header . "\n";
        }
 
+       /**
+        * Called at the end of a block of connected edits.
+        * This default implementation does nothing.
+        */
        protected function endBlock() {
        }
 
        /**
-        * @param $lines
-        * @param $prefix string
+        * Writes all (optionally prefixed) lines to the output buffer, separated by newlines.
+        *
+        * @param string[] $lines
+        * @param string $prefix
         */
        protected function lines( $lines, $prefix = ' ' ) {
                foreach ( $lines as $line ) {
@@ -196,33 +212,36 @@ abstract class DiffFormatter {
        }
 
        /**
-        * @param $lines
+        * @param string[] $lines
         */
        protected function context( $lines ) {
                $this->lines( $lines );
        }
 
        /**
-        * @param $lines
+        * @param string[] $lines
         */
        protected function added( $lines ) {
                $this->lines( $lines, '>' );
        }
 
        /**
-        * @param $lines
+        * @param string[] $lines
         */
        protected function deleted( $lines ) {
                $this->lines( $lines, '<' );
        }
 
        /**
-        * @param $orig
-        * @param $closing
+        * Writes the two sets of lines to the output buffer, separated by "---" and a newline.
+        *
+        * @param string[] $orig
+        * @param string[] $closing
         */
        protected function changed( $orig, $closing ) {
                $this->deleted( $orig );
                echo "---\n";
                $this->added( $closing );
        }
+
 }
index d6cf694..414b9f8 100644 (file)
@@ -34,6 +34,7 @@ define( 'MW_DIFF_VERSION', '1.11a' );
  * @ingroup DifferenceEngine
  */
 class DifferenceEngine extends ContextSource {
+
        /** @var int */
        public $mOldid;
 
@@ -97,14 +98,14 @@ class DifferenceEngine extends ContextSource {
 
        /**
         * Constructor
-        * @param $context IContextSource context to use, anything else will be ignored
-        * @param $old Integer old ID we want to show and diff with.
-        * @param $new String|int either revision ID or 'prev' or 'next'. Default: 0.
-        * @param $rcid Integer Deprecated, no longer used!
-        * @param $refreshCache boolean If set, refreshes the diff cache
-        * @param $unhide boolean If set, allow viewing deleted revs
+        * @param IContextSource $context context to use, anything else will be ignored
+        * @param int $old old ID we want to show and diff with.
+        * @param string|int $new either revision ID or 'prev' or 'next'. Default: 0.
+        * @param int $rcid Deprecated, no longer used!
+        * @param bool $refreshCache If set, refreshes the diff cache
+        * @param bool $unhide If set, allow viewing deleted revs
         */
-       function __construct( $context = null, $old = 0, $new = 0, $rcid = 0,
+       public function __construct( $context = null, $old = 0, $new = 0, $rcid = 0,
                $refreshCache = false, $unhide = false
        ) {
                if ( $context instanceof IContextSource ) {
@@ -120,16 +121,16 @@ class DifferenceEngine extends ContextSource {
        }
 
        /**
-        * @param $value bool
+        * @param bool $value
         */
-       function setReducedLineNumbers( $value = true ) {
+       public function setReducedLineNumbers( $value = true ) {
                $this->mReducedLineNumbers = $value;
        }
 
        /**
         * @return Language
         */
-       function getDiffLang() {
+       public function getDiffLang() {
                if ( $this->mDiffLang === null ) {
                        # Default language in which the diff text is written.
                        $this->mDiffLang = $this->getTitle()->getPageLanguage();
@@ -141,23 +142,23 @@ class DifferenceEngine extends ContextSource {
        /**
         * @return bool
         */
-       function wasCacheHit() {
+       public function wasCacheHit() {
                return $this->mCacheHit;
        }
 
        /**
         * @return int
         */
-       function getOldid() {
+       public function getOldid() {
                $this->loadRevisionIds();
 
                return $this->mOldid;
        }
 
        /**
-        * @return Bool|int
+        * @return bool|int
         */
-       function getNewid() {
+       public function getNewid() {
                $this->loadRevisionIds();
 
                return $this->mNewid;
@@ -167,10 +168,11 @@ class DifferenceEngine extends ContextSource {
         * Look up a special:Undelete link to the given deleted revision id,
         * as a workaround for being unable to load deleted diffs in currently.
         *
-        * @param int $id revision ID
+        * @param int $id Revision ID
+        *
         * @return mixed URL or false
         */
-       function deletedLink( $id ) {
+       public function deletedLink( $id ) {
                if ( $this->getUser()->isAllowed( 'deletedhistory' ) ) {
                        $dbr = wfGetDB( DB_SLAVE );
                        $row = $dbr->selectRow( 'archive', '*',
@@ -193,10 +195,11 @@ class DifferenceEngine extends ContextSource {
        /**
         * Build a wikitext link toward a deleted revision, if viewable.
         *
-        * @param int $id revision ID
-        * @return string wikitext fragment
+        * @param int $id Revision ID
+        *
+        * @return string Wikitext fragment
         */
-       function deletedIdMarker( $id ) {
+       public function deletedIdMarker( $id ) {
                $link = $this->deletedLink( $id );
                if ( $link ) {
                        return "[$link $id]";
@@ -225,7 +228,7 @@ class DifferenceEngine extends ContextSource {
                        $this->getLanguage()->listToText( $missing ), count( $missing ) );
        }
 
-       function showDiffPage( $diffOnly = false ) {
+       public function showDiffPage( $diffOnly = false ) {
                wfProfileIn( __METHOD__ );
 
                # Allow frames except in certain special cases
@@ -451,7 +454,7 @@ class DifferenceEngine extends ContextSource {
         * Side effect: When the patrol link is build, this method will call
         * OutputPage::preventClickjacking() and load mediawiki.page.patrol.ajax.
         *
-        * @return String
+        * @return string
         */
        protected function markPatrolledLink() {
                global $wgUseRCPatrol, $wgEnableAPI, $wgEnableWriteAPI;
@@ -518,8 +521,9 @@ class DifferenceEngine extends ContextSource {
        }
 
        /**
-        * @param $rev Revision
-        * @return String
+        * @param Revision $rev
+        *
+        * @return string
         */
        protected function revisionDeleteLink( $rev ) {
                $link = Linker::getRevDeleteLink( $this->getUser(), $rev, $rev->getTitle() );
@@ -533,7 +537,7 @@ class DifferenceEngine extends ContextSource {
        /**
         * Show the new revision of the page.
         */
-       function renderNewRevision() {
+       public function renderNewRevision() {
                wfProfileIn( __METHOD__ );
                $out = $this->getOutput();
                $revHeader = $this->getRevisionHeader( $this->mNewRev );
@@ -616,7 +620,7 @@ class DifferenceEngine extends ContextSource {
         *
         * @return bool
         */
-       function showDiff( $otitle, $ntitle, $notice = '' ) {
+       public function showDiff( $otitle, $ntitle, $notice = '' ) {
                $diff = $this->getDiff( $otitle, $ntitle, $notice );
                if ( $diff === false ) {
                        $this->showMissingRevision();
@@ -633,7 +637,7 @@ class DifferenceEngine extends ContextSource {
        /**
         * Add style sheets and supporting JS for diff display.
         */
-       function showDiffStyle() {
+       public function showDiffStyle() {
                $this->getOutput()->addModuleStyles( 'mediawiki.action.history.diff' );
        }
 
@@ -643,9 +647,10 @@ class DifferenceEngine extends ContextSource {
         * @param string|bool $otitle Header for old text or false
         * @param string|bool $ntitle Header for new text or false
         * @param string $notice HTML between diff header and body
+        *
         * @return mixed
         */
-       function getDiff( $otitle, $ntitle, $notice = '' ) {
+       public function getDiff( $otitle, $ntitle, $notice = '' ) {
                $body = $this->getDiffBody();
                if ( $body === false ) {
                        return false;
@@ -747,9 +752,10 @@ class DifferenceEngine extends ContextSource {
        /**
         * Returns the cache key for diff body text or content.
         *
-        * @return string
         * @since 1.23
+        *
         * @throws MWException
+        * @return string
         */
        protected function getDiffBodyCacheKey() {
                if ( !$this->mOldid || !$this->mNewid ) {
@@ -771,14 +777,15 @@ class DifferenceEngine extends ContextSource {
         * perhaps taking advantage of the content's native form. This is required for all content
         * models that are not text based.
         *
-        * @param $old Content: old content
-        * @param $new Content: new content
+        * @since 1.21
+        *
+        * @param Content $old Old content
+        * @param Content $new New content
         *
+        * @throws MWException If old or new content is not an instance of TextContent.
         * @return bool|string
-        * @since 1.21
-        * @throws MWException if $old or $new are not instances of TextContent.
         */
-       function generateContentDiffBody( Content $old, Content $new ) {
+       public function generateContentDiffBody( Content $old, Content $new ) {
                if ( !( $old instanceof TextContent ) ) {
                        throw new MWException( "Diff not implemented for " . get_class( $old ) . "; " .
                                "override generateContentDiffBody to fix this." );
@@ -798,12 +805,13 @@ class DifferenceEngine extends ContextSource {
        /**
         * Generate a diff, no caching
         *
-        * @param string $otext old text, must be already segmented
-        * @param string $ntext new text, must be already segmented
+        * @param string $otext Old text, must be already segmented
+        * @param string $ntext New text, must be already segmented
+        *
         * @return bool|string
         * @deprecated since 1.21, use generateContentDiffBody() instead!
         */
-       function generateDiffBody( $otext, $ntext ) {
+       public function generateDiffBody( $otext, $ntext ) {
                ContentHandler::deprecated( __METHOD__, "1.21" );
 
                return $this->generateTextDiffBody( $otext, $ntext );
@@ -816,9 +824,10 @@ class DifferenceEngine extends ContextSource {
         *
         * @param string $otext old text, must be already segmented
         * @param string $ntext new text, must be already segmented
+        *
         * @return bool|string
         */
-       function generateTextDiffBody( $otext, $ntext ) {
+       public function generateTextDiffBody( $otext, $ntext ) {
                global $wgExternalDiffEngine, $wgContLang;
 
                wfProfileIn( __METHOD__ );
@@ -897,7 +906,7 @@ class DifferenceEngine extends ContextSource {
         * Generate a debug comment indicating diff generating time,
         * server node, and generator backend.
         *
-        * @param String $generator : What diff engine was used
+        * @param string $generator : What diff engine was used
         *
         * @return string
         */
@@ -920,11 +929,11 @@ class DifferenceEngine extends ContextSource {
        /**
         * Replace line numbers with the text in the user's language
         *
-        * @param String $text
+        * @param string $text
         *
         * @return mixed
         */
-       function localiseLineNumbers( $text ) {
+       public function localiseLineNumbers( $text ) {
                return preg_replace_callback(
                        '/<!--LINE (\d+)-->/',
                        array( &$this, 'localiseLineNumbersCb' ),
@@ -932,7 +941,7 @@ class DifferenceEngine extends ContextSource {
                );
        }
 
-       function localiseLineNumbersCb( $matches ) {
+       public function localiseLineNumbersCb( $matches ) {
                if ( $matches[1] === '1' && $this->mReducedLineNumbers ) {
                        return '';
                }
@@ -942,9 +951,10 @@ class DifferenceEngine extends ContextSource {
 
        /**
         * If there are revisions between the ones being compared, return a note saying so.
+        *
         * @return string
         */
-       function getMultiNotice() {
+       public function getMultiNotice() {
                if ( !is_object( $this->mOldRev ) || !is_object( $this->mNewRev ) ) {
                        return '';
                } elseif ( !$this->mOldPage->equals( $this->mNewPage ) ) {
@@ -978,9 +988,11 @@ class DifferenceEngine extends ContextSource {
 
        /**
         * Get a notice about how many intermediate edits and users there are
-        * @param $numEdits int
-        * @param $numUsers int
-        * @param $limit int
+        *
+        * @param int $numEdits
+        * @param int $numUsers
+        * @param int $limit
+        *
         * @return string
         */
        public static function intermediateEditsMsg( $numEdits, $numUsers, $limit ) {
@@ -999,10 +1011,11 @@ class DifferenceEngine extends ContextSource {
        /**
         * Get a header for a specified revision.
         *
-        * @param $rev Revision
+        * @param Revision $rev
         * @param string $complete 'complete' to get the header wrapped depending
         *        the visibility of the revision and a link to edit the page.
-        * @return String HTML fragment
+        *
+        * @return string HTML fragment
         */
        protected function getRevisionHeader( Revision $rev, $complete = '' ) {
                $lang = $this->getLanguage();
@@ -1064,7 +1077,7 @@ class DifferenceEngine extends ContextSource {
         *
         * @return string
         */
-       function addHeader( $diff, $otitle, $ntitle, $multi = '', $notice = '' ) {
+       public function addHeader( $diff, $otitle, $ntitle, $multi = '', $notice = '' ) {
                // shared.css sets diff in interface language/dir, but the actual content
                // is often in a different language, mostly the page content language/dir
                $tableClass = 'diff diff-contentalign-' . htmlspecialchars( $this->getDiffLang()->alignStart() );
@@ -1113,7 +1126,7 @@ class DifferenceEngine extends ContextSource {
         * Use specified text instead of loading from the database
         * @deprecated since 1.21, use setContent() instead.
         */
-       function setText( $oldText, $newText ) {
+       public function setText( $oldText, $newText ) {
                ContentHandler::deprecated( __METHOD__, "1.21" );
 
                $oldContent = ContentHandler::makeContent( $oldText, $this->getTitle() );
@@ -1126,7 +1139,7 @@ class DifferenceEngine extends ContextSource {
         * Use specified text instead of loading from the database
         * @since 1.21
         */
-       function setContent( Content $oldContent, Content $newContent ) {
+       public function setContent( Content $oldContent, Content $newContent ) {
                $this->mOldContent = $oldContent;
                $this->mNewContent = $newContent;
 
@@ -1139,7 +1152,7 @@ class DifferenceEngine extends ContextSource {
         * (Defaults to page content language).
         * @since 1.19
         */
-       function setTextLanguage( $lang ) {
+       public function setTextLanguage( $lang ) {
                $this->mDiffLang = wfGetLangObj( $lang );
        }
 
@@ -1149,7 +1162,8 @@ class DifferenceEngine extends ContextSource {
         *
         * @param int $old Revision id, e.g. from URL parameter 'oldid'
         * @param int|string $new Revision id or strings 'next' or 'prev', e.g. from URL parameter 'diff'
-        * @return array Array of two revision ids, older first, later second.
+        *
+        * @return int[] List of two revision ids, older first, later second.
         *     Zero signifies invalid argument passed.
         *     false signifies that there is no previous/next revision ($old is the oldest/newest one).
         */
@@ -1208,7 +1222,7 @@ class DifferenceEngine extends ContextSource {
         *
         * @return bool
         */
-       function loadRevisionData() {
+       public function loadRevisionData() {
                if ( $this->mRevisionsLoaded ) {
                        return true;
                }
@@ -1288,7 +1302,7 @@ class DifferenceEngine extends ContextSource {
         *
         * @return bool
         */
-       function loadText() {
+       public function loadText() {
                if ( $this->mTextLoaded == 2 ) {
                        return true;
                }
@@ -1322,7 +1336,7 @@ class DifferenceEngine extends ContextSource {
         *
         * @return bool
         */
-       function loadNewText() {
+       public function loadNewText() {
                if ( $this->mTextLoaded >= 1 ) {
                        return true;
                }
@@ -1337,4 +1351,5 @@ class DifferenceEngine extends ContextSource {
 
                return true;
        }
+
 }
index 5f28627..ac8f758 100644 (file)
@@ -31,6 +31,7 @@
  * @ingroup DifferenceEngine
  */
 class TableDiffFormatter extends DiffFormatter {
+
        function __construct() {
                $this->leadingContextLines = 2;
                $this->trailingContextLines = 2;
@@ -38,7 +39,8 @@ class TableDiffFormatter extends DiffFormatter {
 
        /**
         * @static
-        * @param $msg
+        * @param string $msg
+        *
         * @return mixed
         */
        public static function escapeWhiteSpace( $msg ) {
@@ -50,10 +52,11 @@ class TableDiffFormatter extends DiffFormatter {
        }
 
        /**
-        * @param $xbeg
-        * @param $xlen
-        * @param $ybeg
-        * @param $ylen
+        * @param int $xbeg
+        * @param int $xlen
+        * @param int $ybeg
+        * @param int $ylen
+        *
         * @return string
         */
        protected function blockHeader( $xbeg, $xlen, $ybeg, $ylen ) {
@@ -64,7 +67,9 @@ class TableDiffFormatter extends DiffFormatter {
        }
 
        /**
-        * @param $header
+        * Writes the header to the output buffer.
+        *
+        * @param string $header
         */
        protected function startBlock( $header ) {
                echo $header;
@@ -73,12 +78,19 @@ class TableDiffFormatter extends DiffFormatter {
        protected function endBlock() {
        }
 
+       /**
+        * @param string[] $lines
+        * @param string $prefix
+        * @param string $color
+        */
        protected function lines( $lines, $prefix = ' ', $color = 'white' ) {
        }
 
        /**
         * HTML-escape parameter before calling this
-        * @param $line
+        *
+        * @param string $line
+        *
         * @return string
         */
        protected function addedLine( $line ) {
@@ -87,7 +99,9 @@ class TableDiffFormatter extends DiffFormatter {
 
        /**
         * HTML-escape parameter before calling this
-        * @param $line
+        *
+        * @param string $line
+        *
         * @return string
         */
        protected function deletedLine( $line ) {
@@ -96,7 +110,9 @@ class TableDiffFormatter extends DiffFormatter {
 
        /**
         * HTML-escape parameter before calling this
-        * @param $line
+        *
+        * @param string $line
+        *
         * @return string
         */
        protected function contextLine( $line ) {
@@ -104,9 +120,10 @@ class TableDiffFormatter extends DiffFormatter {
        }
 
        /**
-        * @param $marker
-        * @param $class
-        * @param $line
+        * @param string $marker
+        * @param string $class Unused
+        * @param string $line
+        *
         * @return string
         */
        protected function wrapLine( $marker, $class, $line ) {
@@ -126,7 +143,9 @@ class TableDiffFormatter extends DiffFormatter {
        }
 
        /**
-        * @param $lines array
+        * Writes all lines to the output buffer, each enclosed in <tr>.
+        *
+        * @param string[] $lines
         */
        protected function added( $lines ) {
                foreach ( $lines as $line ) {
@@ -137,7 +156,9 @@ class TableDiffFormatter extends DiffFormatter {
        }
 
        /**
-        * @param $lines
+        * Writes all lines to the output buffer, each enclosed in <tr>.
+        *
+        * @param string[] $lines
         */
        protected function deleted( $lines ) {
                foreach ( $lines as $line ) {
@@ -148,7 +169,9 @@ class TableDiffFormatter extends DiffFormatter {
        }
 
        /**
-        * @param $lines
+        * Writes all lines to the output buffer, each enclosed in <tr>.
+        *
+        * @param string[] $lines
         */
        protected function context( $lines ) {
                foreach ( $lines as $line ) {
@@ -159,8 +182,10 @@ class TableDiffFormatter extends DiffFormatter {
        }
 
        /**
-        * @param $orig
-        * @param $closing
+        * Writes the two sets of lines to the output buffer, each enclosed in <tr>.
+        *
+        * @param string[] $orig
+        * @param string[] $closing
         */
        protected function changed( $orig, $closing ) {
                wfProfileIn( __METHOD__ );
@@ -183,4 +208,5 @@ class TableDiffFormatter extends DiffFormatter {
                }
                wfProfileOut( __METHOD__ );
        }
+
 }
index 0a86ccc..32a7605 100644 (file)
@@ -29,6 +29,7 @@
  * @ingroup DifferenceEngine
  */
 class UnifiedDiffFormatter extends DiffFormatter {
+
        /** @var int */
        protected $leadingContextLines = 2;
 
@@ -36,22 +37,22 @@ class UnifiedDiffFormatter extends DiffFormatter {
        protected $trailingContextLines = 2;
 
        /**
-        * @param $lines
+        * @param string[] $lines
         */
        protected function added( $lines ) {
                $this->lines( $lines, '+' );
        }
 
        /**
-        * @param $lines
+        * @param string[] $lines
         */
        protected function deleted( $lines ) {
                $this->lines( $lines, '-' );
        }
 
        /**
-        * @param $orig
-        * @param $closing
+        * @param string[] $orig
+        * @param string[] $closing
         */
        protected function changed( $orig, $closing ) {
                $this->deleted( $orig );
@@ -59,13 +60,15 @@ class UnifiedDiffFormatter extends DiffFormatter {
        }
 
        /**
-        * @param $xbeg
-        * @param $xlen
-        * @param $ybeg
-        * @param $ylen
+        * @param int $xbeg
+        * @param int $xlen
+        * @param int $ybeg
+        * @param int $ylen
+        *
         * @return string
         */
        protected function blockHeader( $xbeg, $xlen, $ybeg, $ylen ) {
                return "@@ -$xbeg,$xlen +$ybeg,$ylen @@";
        }
+
 }
index 7c019b0..7a0f740 100644 (file)
@@ -580,6 +580,7 @@ class WikiDiff3 {
 
                return $this->length;
        }
+
 }
 
 /**
@@ -589,6 +590,7 @@ class WikiDiff3 {
  * @ingroup DifferenceEngine
  */
 class RangeDifference {
+
        /** @var int */
        public $leftstart;
 
@@ -615,4 +617,5 @@ class RangeDifference {
                $this->rightend = $rightend;
                $this->rightlength = $rightend - $rightstart;
        }
+
 }
index a5c835e..706da96 100644 (file)
@@ -617,8 +617,9 @@ class SwiftFileBackend extends FileBackendStore {
        }
 
        protected function doGetFileStat( array $params ) {
-               $params['concurrency'] = 1;
-               $stats = $this->doGetFileStatMulti( array( 'srcs' => array( $params['src'] ) ) + $params );
+               $params = array( 'srcs' => array( $params['src'] ), 'concurrency' => 1 ) + $params;
+               unset( $params['src'] );
+               $stats = $this->doGetFileStatMulti( $params );
 
                return reset( $stats );
        }
index 3e2a09e..21505a8 100644 (file)
@@ -36,8 +36,8 @@
  * the HTML for the input field to be placed in the table.
  *
  * You can find extensive documentation on the www.mediawiki.org wiki:
- *  - http://www.mediawiki.org/wiki/HTMLForm
- *  - http://www.mediawiki.org/wiki/HTMLForm/tutorial
+ *  - https://www.mediawiki.org/wiki/HTMLForm
+ *  - https://www.mediawiki.org/wiki/HTMLForm/tutorial
  *
  * The constructor input is an associative array of $fieldname => $info,
  * where $info is an Associative Array with any of the following:
@@ -118,10 +118,11 @@ class HTMLForm extends ContextSource {
                'edittools' => 'HTMLEditTools',
                'checkmatrix' => 'HTMLCheckMatrix',
                // HTMLTextField will output the correct type="" attribute automagically.
-               // There are about four zillion other HTML5 input types, like url, but
+               // There are about four zillion other HTML5 input types, like range, but
                // we don't use those at the moment, so no point in adding all of them.
                'email' => 'HTMLTextField',
                'password' => 'HTMLTextField',
+               'url' => 'HTMLTextField',
        );
 
        public $mFieldData;
index 27d9594..e6d316c 100644 (file)
@@ -522,7 +522,7 @@ abstract class HTMLFormField {
                foreach ( $options as $key => $value ) {
                        $key = $this->msg( $key )->plain();
                        $ret[$key] = is_array( $value )
-                               ? $this->lookupOptionsKeys($field, $value)
+                               ? $this->lookupOptionsKeys( $value )
                                : strval( $value );
                }
                return $ret;
@@ -558,7 +558,7 @@ abstract class HTMLFormField {
                                $this->mOptions = self::forceToStringRecursive( $this->mParams['options'] );
                        } elseif ( array_key_exists( 'options-message', $this->mParams ) ) {
                                /** @todo This is copied from Xml::listDropDown(), deprecate/avoid duplication? */
-                               $message = $this->msg( $this->mParams['options-message'] )->plain();
+                               $message = $this->msg( $this->mParams['options-message'] )->inContentLanguage()->plain();
 
                                $optgroup = false;
                                $this->mOptions = array();
index 2944c24..3cf3188 100644 (file)
@@ -28,6 +28,7 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
        }
 
        function getInputHTML( $value ) {
+               $value = HTMLFormField::forceToStringRecursive( $value );
                $html = $this->formatOptions( $this->getOptions(), $value );
 
                return $html;
@@ -103,11 +104,12 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
        }
 
        function filterDataForSubmit( $data ) {
+               $data = HTMLFormField::forceToStringRecursive( $data );
                $options = HTMLFormField::flattenOptions( $this->getOptions() );
 
                $res = array();
                foreach ( $options as $opt ) {
-                       $res["$opt"] = in_array( $opt, $data );
+                       $res["$opt"] = in_array( $opt, $data, true );
                }
 
                return $res;
index aa0ea5d..c52f0a8 100644 (file)
@@ -17,7 +17,7 @@ class HTMLRadioField extends HTMLFormField {
 
                $validOptions = HTMLFormField::flattenOptions( $this->getOptions() );
 
-               if ( in_array( $value, $validOptions ) ) {
+               if ( in_array( strval( $value ), $validOptions, true ) ) {
                        return true;
                } else {
                        return $this->msg( 'htmlform-select-badoption' )->parse();
@@ -33,7 +33,7 @@ class HTMLRadioField extends HTMLFormField {
         * @return String
         */
        function getInputHTML( $value ) {
-               $html = $this->formatOptions( $this->getOptions(), $value );
+               $html = $this->formatOptions( $this->getOptions(), strval( $value ) );
 
                return $html;
        }
@@ -51,7 +51,7 @@ class HTMLRadioField extends HTMLFormField {
                                $html .= $this->formatOptions( $info, $value );
                        } else {
                                $id = Sanitizer::escapeId( $this->mID . "-$info" );
-                               $radio = Xml::radio( $this->mName, $info, $info == $value, $attribs + array( 'id' => $id ) );
+                               $radio = Xml::radio( $this->mName, $info, $info === $value, $attribs + array( 'id' => $id ) );
                                $radio .= '&#160;' . call_user_func( $elementFunc, 'label', array( 'for' => $id ), $label );
 
                                $html .= ' ' . Html::rawElement(
index 2e91a23..564927f 100644 (file)
@@ -72,7 +72,7 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
 
                        if ( $list == 'other' ) {
                                $final = $text;
-                       } elseif ( !in_array( $list, $this->mFlatOptions ) ) {
+                       } elseif ( !in_array( $list, $this->mFlatOptions, true ) ) {
                                # User has spoofed the select form to give an option which wasn't
                                # in the original offer.  Sulk...
                                $final = $text;
index 0437480..c32b445 100644 (file)
@@ -13,7 +13,7 @@ class HTMLSelectField extends HTMLFormField {
 
                $validOptions = HTMLFormField::flattenOptions( $this->getOptions() );
 
-               if ( in_array( $value, $validOptions ) ) {
+               if ( in_array( strval( $value ), $validOptions, true ) ) {
                        return true;
                } else {
                        return $this->msg( 'htmlform-select-badoption' )->parse();
index 045b8df..e8bcb5b 100644 (file)
@@ -21,7 +21,10 @@ class HTMLSelectOrOtherField extends HTMLTextField {
                $valInSelect = false;
 
                if ( $value !== false ) {
-                       $valInSelect = in_array( $value, HTMLFormField::flattenOptions( $this->getOptions() ) );
+                       $value = strval( $value );
+                       $valInSelect = in_array(
+                               $value, HTMLFormField::flattenOptions( $this->getOptions() ), true
+                       );
                }
 
                $selected = $valInSelect ? $value : 'other';
@@ -67,7 +70,7 @@ class HTMLSelectOrOtherField extends HTMLTextField {
                if ( $request->getCheck( $this->mName ) ) {
                        $val = $request->getText( $this->mName );
 
-                       if ( $val == 'other' ) {
+                       if ( $val === 'other' ) {
                                $val = $request->getText( $this->mName . '-other' );
                        }
 
index 57f0a72..e584d88 100644 (file)
@@ -43,9 +43,6 @@ class HTMLTextField extends HTMLFormField {
                # is essentially just a clone of this one.
                if ( isset( $this->mParams['type'] ) ) {
                        switch ( $this->mParams['type'] ) {
-                               case 'email':
-                                       $attribs['type'] = 'email';
-                                       break;
                                case 'int':
                                        $attribs['type'] = 'number';
                                        break;
@@ -54,8 +51,10 @@ class HTMLTextField extends HTMLFormField {
                                        $attribs['step'] = 'any';
                                        break;
                                # Pass through
+                               case 'email':
                                case 'password':
                                case 'file':
+                               case 'url':
                                        $attribs['type'] = $this->mParams['type'];
                                        break;
                        }
index 6d3819c..3250ff8 100644 (file)
@@ -62,7 +62,7 @@ class InstallDocFormatter {
        }
 
        protected function replaceConfigLinks( $matches ) {
-               return '<span class="config-plainlink">[http://www.mediawiki.org/wiki/Manual:' .
+               return '<span class="config-plainlink">[https://www.mediawiki.org/wiki/Manual:' .
                        $matches[1] . ' ' . $matches[1] . ']</span>';
        }
 }
index 9f39a87..592a1ca 100644 (file)
@@ -29,7 +29,7 @@ $1',
        'config-localsettings-incomplete' => 'The existing <code>LocalSettings.php</code> appears to be incomplete.
 The $1 variable is not set.
 Please change <code>LocalSettings.php</code> so that this variable is set, and click "{{int:Config-continue}}".',
-       'config-localsettings-connection-error' => 'An error was encountered when connecting to the database using the settings specified in <code>LocalSettings.php</code> or <code>AdminSettings.php</code>. Please fix these settings and try again.
+       'config-localsettings-connection-error' => 'An error was encountered when connecting to the database using the settings specified in <code>LocalSettings.php</code>. Please fix these settings and try again.
 
 $1',
        'config-session-error'            => 'Error starting session: $1',
@@ -358,9 +358,9 @@ In <strong>UTF-8 mode</strong>, MySQL will know what character set your data is
 
        'config-mssql-auth'               => 'Authentication type:',
        'config-mssql-install-auth'       => 'Select the authentication type that will be used to connect to the database during the installation process.
-If you select "Windows Authentication", the credentials of whatever user the webserver is running as will be used.',
+If you select "{{int:config-mssql-windowsauth}}", the credentials of whatever user the webserver is running as will be used.',
        'config-mssql-web-auth'           => 'Select the authentication type that the web server will use to connect to the database server, during ordinary operation of the wiki.
-If you select "Windows Authentication", the credentials of whatever user the webserver is running as will be used.',
+If you select "{{int:config-mssql-windowsauth}}", the credentials of whatever user the webserver is running as will be used.',
        'config-mssql-sqlauth'            => 'SQL Server Authentication',
        'config-mssql-windowsauth'        => 'Windows Authentication',
        'config-site-name'                => 'Name of wiki:',
@@ -609,7 +609,7 @@ $messages['qqq'] = array(
        'config-localsettings-incomplete' => '{{doc-important|Do not translate <code>LocalSettings.php</code> and <code><nowiki>{{int:Config-continue}}</nowiki><code>.}}
 Parameters:
 * $1 - name of variable (any one of required variables or installer-specific global variables)',
-       'config-localsettings-connection-error' => '{{doc-important|Do not translate <code>LocalSettings.php</code> and <code>AdminSettings.php</code>.}}
+       'config-localsettings-connection-error' => '{{doc-important|Do not translate <code>LocalSettings.php</code>.}}
 Used as error message. Parameters:
 * $1 - (probably empty string)',
        'config-session-error' => 'Parameters:
index 77c35b8..fe036ad 100644 (file)
@@ -264,7 +264,7 @@ class LocalSettingsGenerator {
 # file, not there.
 #
 # Further documentation for configuration settings may be found at:
-# http://www.mediawiki.org/wiki/Manual:Configuration_settings
+# https://www.mediawiki.org/wiki/Manual:Configuration_settings
 
 # Protect against web entry
 if ( !defined( 'MEDIAWIKI' ) ) {
@@ -280,7 +280,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 ## defaults for all runtime URL paths are based off of this.
 ## For more information on customizing the URLs
 ## (like /w/index.php/Page_title to /wiki/Page_title) please see:
-## http://www.mediawiki.org/wiki/Manual:Short_URL
+## https://www.mediawiki.org/wiki/Manual:Short_URL
 \$wgScriptPath = \"{$this->values['wgScriptPath']}\";
 \$wgScriptExtension = \"{$this->values['wgScriptExtension']}\";
 ${serverSetting}
index 6c56b3a..02116ea 100644 (file)
@@ -96,6 +96,7 @@ class OracleUpdater extends DatabaseUpdater {
                        //1.23
                        array( 'addIndex', 'logging', 'i06', 'patch-logging_user_text_type_time_index.sql' ),
                        array( 'addIndex', 'logging', 'i07', 'patch-logging_user_text_time_index.sql' ),
+                       array( 'addField', 'user', 'user_password_expires', 'patch-user_password_expire.sql' ),
 
                        // KEEP THIS AT THE BOTTOM!!
                        array( 'doRebuildDuplicateFunction' ),
index 25634ba..e05a3d4 100644 (file)
@@ -306,7 +306,7 @@ class WebInstallerOutput {
 <div id="mw-panel">
        <div class="portal" id="p-logo">
          <a style="background-image: url(../skins/common/images/mediawiki.png);"
-               href="http://www.mediawiki.org/"
+               href="https://www.mediawiki.org/"
                title="Main Page"></a>
        </div>
        <div class="portal"><div class="body">
index f83db54..4bc6cad 100644 (file)
@@ -482,7 +482,7 @@ class WebInstaller_DBConnect extends WebInstallerPage {
                $defaultType = $this->getVar( 'wgDBtype' );
 
                // Messages: config-dbsupport-mysql, config-dbsupport-postgres, config-dbsupport-oracle,
-               // config-dbsupport-sqlite
+               // config-dbsupport-sqlite, config-dbsupport-mssql
                $dbSupport = '';
                foreach ( Installer::getDBTypes() as $type ) {
                        $dbSupport .= wfMessage( "config-dbsupport-$type" )->plain() . "\n";
index 52978b8..a537861 100644 (file)
@@ -434,10 +434,10 @@ abstract class JobQueue {
         * that are actually inserted into the queue. For example, "refreshLinks" jobs are
         * spawned when a template is edited. One can think of the task as "update links
         * of pages that use template X" and an instance of that task as a "root job".
-        * However, what actually goes into the queue are potentially many refreshLinks2 jobs.
-        * Since these jobs include things like page ID ranges and DB master positions, and morph
-        * into smaller refreshLinks2 jobs recursively, simple duplicate detection (like job_sha1)
-        * for individual jobs being identical is not useful.
+        * However, what actually goes into the queue are range and leaf job subtypes.
+        * Since these jobs include things like page ID ranges and DB master positions,
+        * and can morph into smaller jobs recursively, simple duplicate detection
+        * for individual jobs being identical (like that of job_sha1) is not useful.
         *
         * In the case of "refreshLinks", if these jobs are still in the queue when the template
         * is edited again, we want all of these old refreshLinks jobs for that template to become
index 3422664..c785cb2 100644 (file)
@@ -71,6 +71,12 @@ class JobQueueRedis extends JobQueue {
        /** @var string Key to prefix the queue keys with (used for testing) */
        protected $key;
 
+       /**
+        * @var null|int maximum seconds between execution of periodic tasks.  Used to speed up
+        * testing but should otherwise be left unset.
+        */
+       protected $maximumPeriodicTaskSeconds;
+
        /**
         * @params include:
         *   - redisConfig : An array of parameters to RedisConnectionPool::__construct().
@@ -79,6 +85,10 @@ class JobQueueRedis extends JobQueue {
         *                   If a hostname is specified but no port, the standard port number
         *                   6379 will be used. Required.
         *   - compression : The type of compression to use; one of (none,gzip).
+        *   - maximumPeriodicTaskSeconds : Maximum seconds between check periodic tasks.  Set to
+        *                   force faster execution of periodic tasks for inegration tests that
+        *                   rely on checkDelay.  Without this the integration tests are very very
+        *                   slow.  This really shouldn't be set in production.
         * @param array $params
         */
        public function __construct( array $params ) {
@@ -87,6 +97,8 @@ class JobQueueRedis extends JobQueue {
                $this->server = $params['redisServer'];
                $this->compression = isset( $params['compression'] ) ? $params['compression'] : 'none';
                $this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] );
+               $this->maximumPeriodicTaskSeconds = isset( $params['maximumPeriodicTaskSeconds'] ) ?
+                       $params['maximumPeriodicTaskSeconds'] : null;
        }
 
        protected function supportedOrders() {
@@ -724,10 +736,16 @@ LUA;
                if ( $this->checkDelay ) {
                        $periods[] = 300; // 5 minutes
                }
+               $period = min( $periods );
+               $period = max( $period, 30 ); // sanity
+               // Support override for faster testing
+               if ( $this->maximumPeriodicTaskSeconds !== null ) {
+                       $period = min( $period, $this->maximumPeriodicTaskSeconds );
+               }
                return array(
                        'recyclePruneAndUndelayJobs' => array(
                                'callback' => array( $this, 'recyclePruneAndUndelayJobs' ),
-                               'period'   => max( min( $periods ), 30 ) // sanity
+                               'period'   => $period,
                        )
                );
        }
index 3b79684..e3a3e2c 100644 (file)
@@ -61,23 +61,38 @@ class CSSMin {
        /**
         * Gets a list of local file paths which are referenced in a CSS style sheet
         *
+        * This function will always return an empty array if the second parameter is not given or null
+        * for backwards-compatibility.
+        *
         * @param string $source CSS data to remap
         * @param string $path File path where the source was read from (optional)
         * @return array List of local file references
         */
        public static function getLocalFileReferences( $source, $path = null ) {
+               if ( $path === null ) {
+                       return array();
+               }
+
+               $path = rtrim( $path, '/' ) . '/';
                $files = array();
+
                $rFlags = PREG_OFFSET_CAPTURE | PREG_SET_ORDER;
                if ( preg_match_all( '/' . self::URL_REGEX . '/', $source, $matches, $rFlags ) ) {
                        foreach ( $matches as $match ) {
-                               $file = ( isset( $path )
-                                       ? rtrim( $path, '/' ) . '/'
-                                       : '' ) . "{$match['file'][0]}";
+                               $url = $match['file'][0];
 
-                               // Only proceed if we can access the file
-                               if ( !is_null( $path ) && file_exists( $file ) ) {
-                                       $files[] = $file;
+                               // Skip fully-qualified and protocol-relative URLs and data URIs
+                               if ( substr( $url, 0, 2 ) === '//' || parse_url( $url, PHP_URL_SCHEME ) ) {
+                                       break;
                                }
+
+                               $file = $path . $url;
+                               // Skip non-existent files
+                               if ( file_exists( $file ) ) {
+                                       break;
+                               }
+
+                               $files[] = $file;
                        }
                }
                return $files;
@@ -240,8 +255,7 @@ class CSSMin {
                $url = $file . $query;
 
                // Skip fully-qualified and protocol-relative URLs and data URIs
-               $urlScheme = substr( $url, 0, 2 ) === '//' || parse_url( $url, PHP_URL_SCHEME );
-               if ( $urlScheme ) {
+               if ( substr( $url, 0, 2 ) === '//' || parse_url( $url, PHP_URL_SCHEME ) ) {
                        return $url;
                }
 
index 3dce961..57d45ed 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * lessphp v0.4.0@261f1bd28f
+ * lessphp v0.4.0@b7cd5c79e8
  * http://leafo.net/lessphp
  *
  * LESS CSS compiler, adapted from http://lesscss.org
@@ -1011,6 +1011,39 @@ class lessc {
                return $this->lib_rgbahex($color);
        }
 
+       /**
+        * Given an url, decide whether to output a regular link or the base64-encoded contents of the file
+        *
+        * @param  array  $value either an argument list (two strings) or a single string
+        * @return string        formatted url(), either as a link or base64-encoded
+        */
+       protected function lib_data_uri($value) {
+               $mime = ($value[0] === 'list') ? $value[2][0][2] : null;
+               $url = ($value[0] === 'list') ? $value[2][1][2][0] : $value[2][0];
+
+               $fullpath = $this->findImport($url);
+
+               if($fullpath && ($fsize = filesize($fullpath)) !== false) {
+                       // IE8 can't handle data uris larger than 32KB
+                       if($fsize/1024 < 32) {
+                               if(is_null($mime)) {
+                                       if(class_exists('finfo')) { // php 5.3+
+                                               $finfo = new finfo(FILEINFO_MIME);
+                                               $mime = explode('; ', $finfo->file($fullpath));
+                                               $mime = $mime[0];
+                                       } elseif(function_exists('mime_content_type')) { // PHP 5.2
+                                               $mime = mime_content_type($fullpath);
+                                       }
+                               }
+
+                               if(!is_null($mime)) // fallback if the mime type is still unknown
+                                       $url = sprintf('data:%s;base64,%s', $mime, base64_encode(file_get_contents($fullpath)));
+                       }
+               }
+
+               return 'url("'.$url.'")';
+       }
+
        // utility func to unquote a string
        protected function lib_e($arg) {
                switch ($arg[0]) {
@@ -1234,24 +1267,44 @@ class lessc {
        }
 
        protected function lib_contrast($args) {
-               if ($args[0] != 'list' || count($args[2]) < 3) {
-                       return array(array('color', 0, 0, 0), 0);
-               }
+           $darkColor  = array('color', 0, 0, 0);
+           $lightColor = array('color', 255, 255, 255);
+           $threshold  = 0.43;
 
-               list($inputColor, $darkColor, $lightColor) = $args[2];
+           if ( $args[0] == 'list' ) {
+               $inputColor = ( isset($args[2][0]) ) ? $this->assertColor($args[2][0])  : $lightColor;
+               $darkColor  = ( isset($args[2][1]) ) ? $this->assertColor($args[2][1])  : $darkColor;
+               $lightColor = ( isset($args[2][2]) ) ? $this->assertColor($args[2][2])  : $lightColor;
+               $threshold  = ( isset($args[2][3]) ) ? $this->assertNumber($args[2][3]) : $threshold;
+           }
+           else {
+               $inputColor  = $this->assertColor($args);
+           }
 
-               $inputColor = $this->assertColor($inputColor);
-               $darkColor = $this->assertColor($darkColor);
-               $lightColor = $this->assertColor($lightColor);
-               $hsl = $this->toHSL($inputColor);
+           $inputColor = $this->coerceColor($inputColor);
+           $darkColor  = $this->coerceColor($darkColor);
+           $lightColor = $this->coerceColor($lightColor);
 
-               if ($hsl[3] > 50) {
-                       return $darkColor;
-               }
+           //Figure out which is actually light and dark!
+           if ( $this->lib_luma($darkColor) > $this->lib_luma($lightColor) ) {
+               $t  = $lightColor;
+               $lightColor = $darkColor;
+               $darkColor  = $t;
+           }
 
-               return $lightColor;
+           $inputColor_alpha = $this->lib_alpha($inputColor);
+           if ( ( $this->lib_luma($inputColor) * $inputColor_alpha) < $threshold) {
+               return $lightColor;
+           }
+           return $darkColor;
        }
 
+       protected function lib_luma($color) {
+           $color = $this->coerceColor($color);
+           return (0.2126 * $color[0] / 255) + (0.7152 * $color[1] / 255) + (0.0722 * $color[2] / 255);
+       }
+
+
        public function assertColor($value, $error = "expected color value") {
                $color = $this->coerceColor($value);
                if (is_null($color)) $this->throwError($error);
@@ -1475,8 +1528,9 @@ class lessc {
 
                        list(, $name, $args) = $value;
                        if ($name == "%") $name = "_sprintf";
+
                        $f = isset($this->libFunctions[$name]) ?
-                               $this->libFunctions[$name] : array($this, 'lib_'.$name);
+                               $this->libFunctions[$name] : array($this, 'lib_'.str_replace('-', '_', $name));
 
                        if (is_callable($f)) {
                                if ($args[0] == 'list')
@@ -2338,7 +2392,7 @@ class lessc_parser {
                        $this->throwError();
 
                // TODO report where the block was opened
-               if (!is_null($this->env->parent))
+               if ( !property_exists($this->env, 'parent') || !is_null($this->env->parent) )
                        throw new exception('parse error: unclosed block');
 
                return $this->env;
index f0f297f..ad8710c 100644 (file)
@@ -3,7 +3,7 @@
  * Contain classes to list log entries
  *
  * Copyright © 2004 Brion Vibber <brion@pobox.com>, 2008 Aaron Schulz
- * http://www.mediawiki.org/
+ * 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
index f5798e2..0e8d1de 100644 (file)
@@ -3,7 +3,7 @@
  * Contain log classes
  *
  * Copyright © 2002, 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * 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
index 900ece9..e27e28a 100644 (file)
@@ -3,7 +3,7 @@
  * Contain classes to list log entries
  *
  * Copyright © 2004 Brion Vibber <brion@pobox.com>, 2008 Aaron Schulz
- * http://www.mediawiki.org/
+ * 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
index 1197552..e1e7992 100644 (file)
@@ -3,7 +3,7 @@
  * DjVu image handler.
  *
  * Copyright © 2006 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * 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
index ee7eff8..9ed626f 100644 (file)
@@ -80,8 +80,7 @@ class JpegHandler extends ExifBitmapHandler {
                        wfDebug( __METHOD__ . ": running jpgtran: $cmd\n" );
                        wfProfileIn( 'jpegtran' );
                        $retval = 0;
-                       // @todo FIXME Undefined variable $env
-                       $err = wfShellExecWithStderr( $cmd, $retval, $env );
+                       $err = wfShellExecWithStderr( $cmd, $retval );
                        wfProfileOut( 'jpegtran' );
                        if ( $retval !== 0 ) {
                                $this->logErrorForExternalProcess( $retval, $err, $cmd );
index 0602986..5dc9590 100644 (file)
@@ -5,7 +5,7 @@
  * difference. Will run forever until it finds one or you kill it.
  *
  * Copyright (C) 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * 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
index c5c1be5..61c315f 100644 (file)
@@ -4,7 +4,7 @@
  * http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
  *
  * Copyright © 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * 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
index 5a091af..f6f7dbb 100644 (file)
@@ -3,7 +3,7 @@
  * Unicode normalization routines
  *
  * Copyright © 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * 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
index 89de929..59a64a3 100644 (file)
@@ -3,7 +3,7 @@
  * Approximate benchmark for some basic operations.
  *
  * Copyright © 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * 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
index f392df5..676f8f7 100644 (file)
@@ -4,7 +4,7 @@
  * and supplementary files.
  *
  * Copyright (C) 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * 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
index 9732d76..9ae6f23 100644 (file)
@@ -5,7 +5,7 @@
  * to test regression on mem usage (bug 28146)
  *
  * Copyright © 2004-2011 Brion Vibber <brion@wikimedia.org>
- * http://www.mediawiki.org/
+ * 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
index ad913b1..7be5251 100644 (file)
@@ -4,7 +4,7 @@
  * http://www.unicode.org/Public/UNIDATA/NormalizationTest.txt
  *
  * Copyright © 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * 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
index e8fec93..443516b 100644 (file)
@@ -4,7 +4,7 @@
  * Should probably merge them for consistency.
  *
  * Copyright © 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * 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
index 857943e..4a27692 100644 (file)
@@ -3,7 +3,7 @@
  * Classes to cache objects in PHP accelerators, SQL database or DBA files
  *
  * Copyright © 2003-2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * 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
@@ -250,8 +250,10 @@ abstract class BagOStuff {
         * @param $value mixed
         * @param $exptime int
         * @return bool success
+        * @deprecated 1.23
         */
        public function replace( $key, $value, $exptime = 0 ) {
+               wfDeprecated( __METHOD__, '1.23' );
                if ( $this->get( $key ) !== false ) {
                        return $this->set( $key, $value, $exptime );
                }
index f1644ed..87acb53 100644 (file)
@@ -107,17 +107,6 @@ class MemcachedBagOStuff extends BagOStuff {
                        $this->fixExpiry( $exptime ) );
        }
 
-       /**
-        * @param $key string
-        * @param $value int
-        * @param $exptime
-        * @return Mixed
-        */
-       public function replace( $key, $value, $exptime = 0 ) {
-               return $this->client->replace( $this->encodeKey( $key ), $value,
-                       $this->fixExpiry( $exptime ) );
-       }
-
        /**
         * Get the underlying client object. This is provided for debugging
         * purposes.
index 0c3b228..18546d4 100644 (file)
@@ -176,17 +176,6 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
                return $this->checkResult( $key, parent::add( $key, $value, $exptime ) );
        }
 
-       /**
-        * @param $key string
-        * @param $value int
-        * @param $exptime
-        * @return Mixed
-        */
-       public function replace( $key, $value, $exptime = 0 ) {
-               $this->debugLog( "replace($key)" );
-               return $this->checkResult( $key, parent::replace( $key, $value, $exptime ) );
-       }
-
        /**
         * @param $key string
         * @param $value int
index 427143c..f54726f 100644 (file)
@@ -236,37 +236,6 @@ class RedisBagOStuff extends BagOStuff {
                return $result;
        }
 
-       /**
-        * Non-atomic implementation of replace(). Could perhaps be done atomically
-        * with WATCH or scripting, but this function is rarely used.
-        */
-       public function replace( $key, $value, $expiry = 0 ) {
-               $section = new ProfileSection( __METHOD__ );
-
-               list( $server, $conn ) = $this->getConnection( $key );
-               if ( !$conn ) {
-                       return false;
-               }
-               if ( !$conn->exists( $key ) ) {
-                       return false;
-               }
-
-               $expiry = $this->convertToRelative( $expiry );
-               try {
-                       if ( !$expiry ) {
-                               $result = $conn->set( $key, $this->serialize( $value ) );
-                       } else {
-                               $result = $conn->setex( $key, $expiry, $this->serialize( $value ) );
-                       }
-               } catch ( RedisException $e ) {
-                       $result = false;
-                       $this->handleException( $conn, $e );
-               }
-
-               $this->logRequest( 'replace', $key, $server, $result );
-               return $result;
-       }
-
        /**
         * Non-atomic implementation of incr().
         *
index a2eb698..cbc060a 100644 (file)
@@ -107,7 +107,7 @@ class CoreTagHooks {
         * Renders a thumbnail list of the given images, with optional captions.
         * Full syntax documented on the wiki:
         *
-        *   http://www.mediawiki.org/wiki/Help:Images#Gallery_syntax
+        *   https://www.mediawiki.org/wiki/Help:Images#Gallery_syntax
         *
         * @todo break Parser::renderImageGallery out here too.
         *
index 340f462..e3d7fdf 100644 (file)
@@ -5922,7 +5922,7 @@ class Parser {
 
                # Strip external link markup
                # @todo FIXME: Not tolerant to blank link text
-               # I.E. [http://www.mediawiki.org] will render as [1] or something depending
+               # I.E. [https://www.mediawiki.org] will render as [1] or something depending
                # on how many empty links there are on the page - need to figure that out.
                $text = preg_replace( '/\[(?i:' . $this->mUrlProtocols . ')([^ ]+?) ([^[]+)\]/', '$2', $text );
 
index ddbb548..22ddfb8 100644 (file)
@@ -30,7 +30,7 @@ class IRCColourfulRCFeedFormatter implements RCFeedFormatter {
         * @see RCFeedFormatter::getLine
         */
        public function getLine( array $feed, RecentChange $rc, $actionComment ) {
-               global $wgUseRCPatrol, $wgUseNPPatrol, $wgLocalInterwiki,
+               global $wgUseRCPatrol, $wgUseNPPatrol, $wgLocalInterwikis,
                        $wgCanonicalServer, $wgScript;
                $attribs = $rc->getAttributes();
                if ( $attribs['rc_type'] == RC_LOG ) {
@@ -88,8 +88,9 @@ class IRCColourfulRCFeedFormatter implements RCFeedFormatter {
                        $flag .= ( $attribs['rc_type'] == RC_NEW ? "N" : "" ) . ( $attribs['rc_minor'] ? "M" : "" ) . ( $attribs['rc_bot'] ? "B" : "" );
                }
 
-               if ( $feed['add_interwiki_prefix'] === true && $wgLocalInterwiki !== false ) {
-                       $prefix = $wgLocalInterwiki;
+               if ( $feed['add_interwiki_prefix'] === true && $wgLocalInterwikis ) {
+                       // we use the first entry in $wgLocalInterwikis in recent changes feeds
+                       $prefix = $wgLocalInterwikis[0];
                } elseif ( $feed['add_interwiki_prefix'] ) {
                        $prefix = $feed['add_interwiki_prefix'];
                } else {
index 557c1f6..12c452a 100644 (file)
 /**
  * Dynamic JavaScript and CSS resource loading system.
  *
- * Most of the documention is on the MediaWiki documentation wiki starting at:
- *    http://www.mediawiki.org/wiki/ResourceLoader
+ * Most of the documentation is on the MediaWiki documentation wiki starting at:
+ *    https://www.mediawiki.org/wiki/ResourceLoader
  */
 class ResourceLoader {
 
-       /* Protected Static Members */
+       /**
+        * @var int
+        */
        protected static $filterCacheVersion = 7;
+       /**
+        * @var array
+        */
        protected static $requiredSourceProperties = array( 'loadScript' );
 
-       /** Array: List of module name/ResourceLoaderModule object pairs */
+       /**
+        * @var array Module name/ResourceLoaderModule object pairs
+        */
        protected $modules = array();
 
-       /** Associative array mapping module name to info associative array */
+       /**
+        * @var array Associative array mapping module name to info associative array
+        */
        protected $moduleInfos = array();
 
-       /** Associative array mapping framework ids to a list of names of test suite modules */
-       /** like array( 'qunit' => array( 'mediawiki.tests.qunit.suites', 'ext.foo.tests', .. ), .. ) */
+       /**
+        * @var array Associative array mapping framework ids to a list of names of test suite modules
+        *      like array( 'qunit' => array( 'mediawiki.tests.qunit.suites', 'ext.foo.tests', .. ), .. )
+        */
        protected $testModuleNames = array();
 
-       /** array( 'source-id' => array( 'loadScript' => 'http://.../load.php' ) ) **/
+       /**
+        * @var array e.g. array( 'source-id' => array( 'loadScript' => 'http://.../load.php' ) )
+        */
        protected $sources = array();
 
-       /** @var bool */
+       /**
+        * @var bool
+        */
        protected $hasErrors = false;
 
-       /* Protected Methods */
-
        /**
-        * Loads information stored in the database about modules.
+        * Load information stored in the database about modules.
         *
         * This method grabs modules dependencies from the database and updates modules
         * objects.
@@ -64,7 +77,7 @@ class ResourceLoader {
         * performance improvement.
         *
         * @param array $modules List of module names to preload information for
-        * @param $context ResourceLoaderContext: Context to load the information within
+        * @param ResourceLoaderContext $context Context to load the information within
         */
        public function preloadModuleInfo( array $modules, ResourceLoaderContext $context ) {
                if ( !count( $modules ) ) {
@@ -122,18 +135,19 @@ class ResourceLoader {
        }
 
        /**
-        * Runs JavaScript or CSS data through a filter, caching the filtered result for future calls.
+        * Run JavaScript or CSS data through a filter, caching the filtered result for future calls.
         *
         * Available filters are:
-        *  - minify-js \see JavaScriptMinifier::minify
-        *  - minify-css \see CSSMin::minify
+        *
+        *    - minify-js \see JavaScriptMinifier::minify
+        *    - minify-css \see CSSMin::minify
         *
         * If $data is empty, only contains whitespace or the filter was unknown,
         * $data is returned unmodified.
         *
         * @param string $filter Name of filter to run
         * @param string $data Text to filter, such as JavaScript or CSS text
-        * @return String: Filtered data, or a comment containing an error message
+        * @return string Filtered data, or a comment containing an error message
         */
        protected function filter( $filter, $data ) {
                global $wgResourceLoaderMinifierStatementsOnOwnLine, $wgResourceLoaderMinifierMaxLineLength;
@@ -193,7 +207,7 @@ class ResourceLoader {
        /* Methods */
 
        /**
-        * Registers core modules and runs registration hooks.
+        * Register core modules and runs registration hooks.
         */
        public function __construct() {
                global $IP, $wgResourceModules, $wgResourceLoaderSources, $wgLoadScript, $wgEnableJavaScriptTest;
@@ -220,17 +234,17 @@ class ResourceLoader {
        }
 
        /**
-        * Registers a module with the ResourceLoader system.
+        * Register a module with the ResourceLoader system.
         *
-        * @param $name Mixed: Name of module as a string or List of name/object pairs as an array
+        * @param mixed $name Name of module as a string or List of name/object pairs as an array
         * @param array $info Module info array. For backwards compatibility with 1.17alpha,
         *   this may also be a ResourceLoaderModule object. Optional when using
         *   multiple-registration calling style.
         * @throws MWException: If a duplicate module registration is attempted
         * @throws MWException: If a module name contains illegal characters (pipes or commas)
         * @throws MWException: If something other than a ResourceLoaderModule is being registered
-        * @return Boolean: False if there were any errors, in which case one or more modules were not
-        *     registered
+        * @return boolean False if there were any errors, in which case one or more modules were
+        *   not registered
         */
        public function register( $name, $info = null ) {
                wfProfileIn( __METHOD__ );
@@ -322,8 +336,8 @@ class ResourceLoader {
         * Source properties:
         * 'loadScript': URL (either fully-qualified or protocol-relative) of load.php for this source
         *
-        * @param $id Mixed: source ID (string), or array( id1 => props1, id2 => props2, ... )
-        * @param array $properties source properties
+        * @param mixed $id Source ID (string), or array( id1 => props1, id2 => props2, ... )
+        * @param array $properties Source properties
         * @throws MWException
         */
        public function addSource( $id, $properties = null ) {
@@ -354,9 +368,9 @@ class ResourceLoader {
        }
 
        /**
-        * Get a list of module names
+        * Get a list of module names.
         *
-        * @return Array: List of module names
+        * @return array List of module names
         */
        public function getModuleNames() {
                return array_keys( $this->moduleInfos );
@@ -364,11 +378,12 @@ class ResourceLoader {
 
        /**
         * Get a list of test module names for one (or all) frameworks.
+        *
         * If the given framework id is unknkown, or if the in-object variable is not an array,
         * then it will return an empty array.
         *
-        * @param string $framework Optional. Get only the test module names for one
-        * particular framework.
+        * @param string $framework Get only the test module names for one
+        *   particular framework (optional)
         * @return Array
         */
        public function getTestModuleNames( $framework = 'all' ) {
@@ -416,18 +431,18 @@ class ResourceLoader {
        }
 
        /**
-        * Get the list of sources
+        * Get the list of sources.
         *
-        * @return Array: array( id => array of properties, .. )
+        * @return array Like array( id => array of properties, .. )
         */
        public function getSources() {
                return $this->sources;
        }
 
        /**
-        * Outputs a response to a resource load-request, including a content-type header.
+        * Output a response to a load request, including the content-type header.
         *
-        * @param $context ResourceLoaderContext: Context in which a response should be formed
+        * @param ResourceLoaderContext $context Context in which a response should be formed
         */
        public function respond( ResourceLoaderContext $context ) {
                global $wgCacheEpoch, $wgUseFileCache;
@@ -551,7 +566,7 @@ class ResourceLoader {
 
        /**
         * Send content type and last modified headers to the client.
-        * @param $context ResourceLoaderContext
+        * @param ResourceLoaderContext $context
         * @param string $mtime TS_MW timestamp to use for last-modified
         * @param bool $errors Whether there are commented-out errors in the response
         * @return void
@@ -589,8 +604,11 @@ class ResourceLoader {
        }
 
        /**
+        * Respond with 304 Last Modified if appropiate.
+        *
         * If there's an If-Modified-Since header, respond with a 304 appropriately
         * and clear out the output buffer. If the client cache is too old then do nothing.
+        *
         * @param $context ResourceLoaderContext
         * @param string $mtime The TS_MW timestamp to check the header against
         * @return bool True if 304 header sent and output handled
@@ -624,10 +642,10 @@ class ResourceLoader {
        }
 
        /**
-        * Send out code for a response from file cache if possible
+        * Send out code for a response from file cache if possible.
         *
-        * @param $fileCache ResourceFileCache: Cache object for this request URL
-        * @param $context ResourceLoaderContext: Context in which to generate a response
+        * @param ResourceFileCache $fileCache Cache object for this request URL
+        * @param ResourceLoaderContext $context Context in which to generate a response
         * @return bool If this found a cache file and handled the response
         */
        protected function tryRespondFromFileCache(
@@ -675,10 +693,11 @@ class ResourceLoader {
        }
 
        /**
-        * Generate a CSS or JS comment block. Only use this for public data,
-        * not error message details.
+        * Generate a CSS or JS comment block.
+        *
+        * Only use this for public data, not error message details.
         *
-        * @param $text string
+        * @param string $text
         * @return string
         */
        public static function makeComment( $text ) {
@@ -687,7 +706,7 @@ class ResourceLoader {
        }
 
        /**
-        * Handle exception display
+        * Handle exception display.
         *
         * @param Exception $e to be shown to the user
         * @return string sanitized text that can be returned to the user
@@ -703,7 +722,7 @@ class ResourceLoader {
        }
 
        /**
-        * Generates code for a response
+        * Generate code for a response.
         *
         * @param $context ResourceLoaderContext Context in which to generate a response
         * @param array $modules List of module objects keyed by module name
@@ -887,17 +906,15 @@ class ResourceLoader {
        /* Static Methods */
 
        /**
-        * Returns JS code to call to mw.loader.implement for a module with
-        * given properties.
+        * Return JS code that calls mw.loader.implement with given module properties.
         *
         * @param string $name Module name
-        * @param $scripts Mixed: List of URLs to JavaScript files or String of JavaScript code
-        * @param $styles Mixed: Array of CSS strings keyed by media type, or an array of lists of URLs to
-        * CSS files keyed by media type
-        * @param $messages Mixed: List of messages associated with this module. May either be an
-        *     associative array mapping message key to value, or a JSON-encoded message blob containing
-        *     the same data, wrapped in an XmlJsCode object.
-        *
+        * @param mixed $scripts List of URLs to JavaScript files or String of JavaScript code
+        * @param mixed $styles Array of CSS strings keyed by media type, or an array of lists of URLs
+        *   to CSS files keyed by media type
+        * @param mixed $messages List of messages associated with this module. May either be an
+        *   associative array mapping message key to value, or a JSON-encoded message blob containing
+        *   the same data, wrapped in an XmlJsCode object.
         * @throws MWException
         * @return string
         */
@@ -927,22 +944,24 @@ class ResourceLoader {
        /**
         * Returns JS code which, when called, will register a given list of messages.
         *
-        * @param $messages Mixed: Either an associative array mapping message key to value, or a
-        *     JSON-encoded message blob containing the same data, wrapped in an XmlJsCode object.
-        *
+        * @param mixed $messages Either an associative array mapping message key to value, or a
+        *   JSON-encoded message blob containing the same data, wrapped in an XmlJsCode object.
         * @return string
         */
        public static function makeMessageSetScript( $messages ) {
-               return Xml::encodeJsCall( 'mw.messages.set', array( (object)$messages ) );
+               return Xml::encodeJsCall(
+                       'mw.messages.set',
+                       array( (object)$messages ),
+                       ResourceLoader::inDebugMode()
+               );
        }
 
        /**
         * Combines an associative array mapping media type to CSS into a
         * single stylesheet with "@media" blocks.
         *
-        * @param array $stylePairs Array keyed by media type containing (arrays of) CSS strings.
-        *
-        * @return Array
+        * @param array $stylePairs Array keyed by media type containing (arrays of) CSS strings
+        * @return array
         */
        private static function makeCombinedStyles( array $stylePairs ) {
                $out = array();
@@ -981,16 +1000,23 @@ class ResourceLoader {
         *    - ResourceLoader::makeLoaderStateScript( array( $name => $state, ... ) ):
         *         Set the state of modules with the given names to the given states
         *
-        * @param $name string
+        * @param string $name
         * @param $state
-        *
         * @return string
         */
        public static function makeLoaderStateScript( $name, $state = null ) {
                if ( is_array( $name ) ) {
-                       return Xml::encodeJsCall( 'mw.loader.state', array( $name ) );
+                       return Xml::encodeJsCall(
+                               'mw.loader.state',
+                               array( $name ),
+                               ResourceLoader::inDebugMode()
+                       );
                } else {
-                       return Xml::encodeJsCall( 'mw.loader.state', array( $name, $state ) );
+                       return Xml::encodeJsCall(
+                               'mw.loader.state',
+                               array( $name, $state ),
+                               ResourceLoader::inDebugMode()
+                       );
                }
        }
 
@@ -1001,19 +1027,20 @@ class ResourceLoader {
         * and $group as supplied.
         *
         * @param string $name Module name
-        * @param $version Integer: Module version number as a timestamp
+        * @param int $version Module version number as a timestamp
         * @param array $dependencies List of module names on which this module depends
         * @param string $group Group which the module is in.
         * @param string $source Source of the module, or 'local' if not foreign.
         * @param string $script JavaScript code
-        *
         * @return string
         */
        public static function makeCustomLoaderScript( $name, $version, $dependencies, $group, $source, $script ) {
                $script = str_replace( "\n", "\n\t", trim( $script ) );
                return Xml::encodeJsCall(
                        "( function ( name, version, dependencies, group, source ) {\n\t$script\n} )",
-                       array( $name, $version, $dependencies, $group, $source ) );
+                       array( $name, $version, $dependencies, $group, $source ),
+                       ResourceLoader::inDebugMode()
+               );
        }
 
        /**
@@ -1034,22 +1061,28 @@ class ResourceLoader {
         *        Registers modules with the given names and parameters.
         *
         * @param string $name Module name
-        * @param $version Integer: Module version number as a timestamp
+        * @param int $version Module version number as a timestamp
         * @param array $dependencies List of module names on which this module depends
-        * @param string $group group which the module is in.
-        * @param string $source source of the module, or 'local' if not foreign
-        *
+        * @param string $group Group which the module is in
+        * @param string $source Source of the module, or 'local' if not foreign
         * @return string
         */
        public static function makeLoaderRegisterScript( $name, $version = null,
                $dependencies = null, $group = null, $source = null
        ) {
                if ( is_array( $name ) ) {
-                       return Xml::encodeJsCall( 'mw.loader.register', array( $name ) );
+                       return Xml::encodeJsCall(
+                               'mw.loader.register',
+                               array( $name ),
+                               ResourceLoader::inDebugMode()
+                       );
                } else {
                        $version = (int)$version > 1 ? (int)$version : 1;
-                       return Xml::encodeJsCall( 'mw.loader.register',
-                               array( $name, $version, $dependencies, $group, $source ) );
+                       return Xml::encodeJsCall(
+                               'mw.loader.register',
+                               array( $name, $version, $dependencies, $group, $source ),
+                               ResourceLoader::inDebugMode()
+                       );
                }
        }
 
@@ -1065,14 +1098,21 @@ class ResourceLoader {
         *
         * @param string $id source ID
         * @param array $properties source properties (see addSource())
-        *
         * @return string
         */
        public static function makeLoaderSourcesScript( $id, $properties = null ) {
                if ( is_array( $id ) ) {
-                       return Xml::encodeJsCall( 'mw.loader.addSource', array( $id ) );
+                       return Xml::encodeJsCall(
+                               'mw.loader.addSource',
+                               array( $id ),
+                               ResourceLoader::inDebugMode()
+                       );
                } else {
-                       return Xml::encodeJsCall( 'mw.loader.addSource', array( $id, $properties ) );
+                       return Xml::encodeJsCall(
+                               'mw.loader.addSource',
+                               array( $id, $properties ),
+                               ResourceLoader::inDebugMode()
+                       );
                }
        }
 
@@ -1081,7 +1121,6 @@ class ResourceLoader {
         * present.
         *
         * @param string $script JavaScript code
-        *
         * @return string
         */
        public static function makeLoaderConditionalScript( $script ) {
@@ -1093,11 +1132,14 @@ class ResourceLoader {
         * the given value.
         *
         * @param array $configuration List of configuration values keyed by variable name
-        *
         * @return string
         */
        public static function makeConfigSetScript( array $configuration ) {
-               return Xml::encodeJsCall( 'mw.config.set', array( $configuration ), ResourceLoader::inDebugMode() );
+               return Xml::encodeJsCall(
+                       'mw.config.set',
+                       array( $configuration ),
+                       ResourceLoader::inDebugMode()
+               );
        }
 
        /**
@@ -1105,7 +1147,7 @@ class ResourceLoader {
         *
         * For example, array( 'foo.bar', 'foo.baz', 'bar.baz', 'bar.quux' )
         * becomes 'foo.bar,baz|bar.baz,quux'
-        * @param array $modules of module names (strings)
+        * @param array $modules List of module names (strings)
         * @return string Packed query string
         */
        public static function makePackedModulesString( $modules ) {
index 23d5825..68bfe59 100644 (file)
@@ -429,10 +429,11 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                foreach ( $styles as $styleFiles ) {
                        $files = array_merge( $files, $styleFiles );
                }
-               $skinFiles = self::tryForKey(
-                       self::collateFilePathListByOption( $this->skinStyles, 'media', 'all' ),
-                       $context->getSkin(),
-                       'default'
+
+               $skinFiles = self::collateFilePathListByOption(
+                       self::tryForKey( $this->skinStyles, $context->getSkin(), 'default' ),
+                       'media',
+                       'all'
                );
                foreach ( $skinFiles as $styleFiles ) {
                        $files = array_merge( $files, $styleFiles );
@@ -614,7 +615,9 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                return array_merge_recursive(
                        self::collateFilePathListByOption( $this->styles, 'media', 'all' ),
                        self::collateFilePathListByOption(
-                               self::tryForKey( $this->skinStyles, $context->getSkin(), 'default' ), 'media', 'all'
+                               self::tryForKey( $this->skinStyles, $context->getSkin(), 'default' ),
+                               'media',
+                               'all'
                        )
                );
        }
index d0c3068..d34fb5c 100644 (file)
@@ -42,7 +42,8 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        $wgEnableAPI, $wgEnableWriteAPI, $wgDBname,
                        $wgSitename, $wgFileExtensions, $wgExtensionAssetsPath,
                        $wgCookiePrefix, $wgResourceLoaderMaxQueryLength,
-                       $wgResourceLoaderStorageEnabled, $wgResourceLoaderStorageVersion;
+                       $wgResourceLoaderStorageEnabled, $wgResourceLoaderStorageVersion,
+                       $wgSearchType;
 
                $mainPage = Title::newMainPage();
 
@@ -71,6 +72,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        'wgScriptPath' => $wgScriptPath,
                        'wgScriptExtension' => $wgScriptExtension,
                        'wgScript' => $wgScript,
+                       'wgSearchType' => $wgSearchType,
                        'wgVariantArticlePath' => $wgVariantArticlePath,
                        // Force object to avoid "empty" associative array from
                        // becoming [] instead of {} in JS (bug 34604)
@@ -185,6 +187,43 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                return true;
        }
 
+       /**
+        * Get the load URL of the startup modules.
+        *
+        * This is a helper for getScript(), but can also be called standalone, such
+        * as when generating an AppCache manifest.
+        *
+        * @param $context ResourceLoaderContext
+        * @return string
+        */
+       public static function getStartupModulesUrl( ResourceLoaderContext $context ) {
+               // The core modules:
+               $moduleNames = array( 'jquery', 'mediawiki' );
+               wfRunHooks( 'ResourceLoaderGetStartupModules', array( &$moduleNames ) );
+
+               // Get the latest version
+               $loader = $context->getResourceLoader();
+               $version = 0;
+               foreach ( $moduleNames as $moduleName ) {
+                       $version = max( $version,
+                               $loader->getModule( $moduleName )->getModifiedTime( $context )
+                       );
+               }
+
+               $query = array(
+                       'modules' => ResourceLoader::makePackedModulesString( $moduleNames ),
+                       'only' => 'scripts',
+                       'lang' => $context->getLanguage(),
+                       'skin' => $context->getSkin(),
+                       'debug' => $context->getDebug() ? 'true' : 'false',
+                       'version' => wfTimestamp( TS_ISO_8601_BASIC, $version )
+               );
+               // Ensure uniform query order
+               ksort( $query );
+               return  wfAppendQuery( wfScript( 'load' ), $query );
+       }
+
+
        /**
         * @param $context ResourceLoaderContext
         * @return string
@@ -195,30 +234,6 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                $out = file_get_contents( "$IP/resources/startup.js" );
                if ( $context->getOnly() === 'scripts' ) {
 
-                       // The core modules:
-                       $moduleNames = array( 'jquery', 'mediawiki' );
-                       wfRunHooks( 'ResourceLoaderGetStartupModules', array( &$moduleNames ) );
-
-                       // Get the latest version
-                       $loader = $context->getResourceLoader();
-                       $version = 0;
-                       foreach ( $moduleNames as $moduleName ) {
-                               $version = max( $version,
-                                       $loader->getModule( $moduleName )->getModifiedTime( $context )
-                               );
-                       }
-                       // Build load query for StartupModules
-                       $query = array(
-                               'modules' => ResourceLoader::makePackedModulesString( $moduleNames ),
-                               'only' => 'scripts',
-                               'lang' => $context->getLanguage(),
-                               'skin' => $context->getSkin(),
-                               'debug' => $context->getDebug() ? 'true' : 'false',
-                               'version' => wfTimestamp( TS_ISO_8601_BASIC, $version )
-                       );
-                       // Ensure uniform query order
-                       ksort( $query );
-
                        // Startup function
                        $configuration = $this->getConfig( $context );
                        $registrations = self::getModuleRegistrations( $context );
@@ -230,7 +245,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                                "};\n";
 
                        // Conditional script injection
-                       $scriptTag = Html::linkedScript( wfAppendQuery( wfScript( 'load' ), $query ) );
+                       $scriptTag = Html::linkedScript( self::getStartupModulesUrl( $context ) );
                        $out .= "if ( isCompatible() ) {\n" .
                                "\t" . Xml::encodeJsCall( 'document.write', array( $scriptTag ) ) .
                                "}\n" .
index debf01b..eea723b 100644 (file)
@@ -896,18 +896,16 @@ class SearchResult {
        }
 
        /**
-        * @param array $terms terms to highlight
         * @return String: highlighted title, '' if not supported
         */
-       function getTitleSnippet( $terms ) {
+       function getTitleSnippet() {
                return '';
        }
 
        /**
-        * @param array $terms terms to highlight
         * @return String: highlighted redirect name (redirect to this page), '' if none or not supported
         */
-       function getRedirectSnippet( $terms ) {
+       function getRedirectSnippet() {
                return '';
        }
 
index aec6a01..c3edf51 100644 (file)
@@ -3,7 +3,7 @@
  * MySQL search engine
  *
  * Copyright (C) 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * 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
index cea17d2..4532178 100644 (file)
@@ -3,7 +3,7 @@
  * Oracle search engine
  *
  * Copyright © 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * 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
index c9f5466..9dc1e77 100644 (file)
@@ -3,7 +3,7 @@
  * PostgreSQL search engine
  *
  * Copyright © 2006-2007 Greg Sabino Mullane <greg@turnstep.com>
- * http://www.mediawiki.org/
+ * 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
index b0d1f95..1dd6b16 100644 (file)
@@ -46,6 +46,16 @@ class SiteList extends GenericArrayObject {
         */
        protected $byGlobalId = array();
 
+       /**
+        * Navigational site identifiers alias inter-language prefixes
+        * pointing to their sites offset value.
+        *
+        * @since 1.23
+        *
+        * @var array of string
+        */
+       protected $byNavigationId = array();
+
        /**
         * @see GenericArrayObject::getObjectType
         *
@@ -75,6 +85,11 @@ class SiteList extends GenericArrayObject {
                $this->byGlobalId[$site->getGlobalId()] = $index;
                $this->byInternalId[$site->getInternalId()] = $index;
 
+               $ids = $site->getNavigationIds();
+               foreach ( $ids as $navId ) {
+                       $this->byNavigationId[$navId] = $index;
+               }
+
                return true;
        }
 
@@ -94,6 +109,11 @@ class SiteList extends GenericArrayObject {
 
                        unset( $this->byGlobalId[$site->getGlobalId()] );
                        unset( $this->byInternalId[$site->getInternalId()] );
+
+                       $ids = $site->getNavigationIds();
+                       foreach ( $ids as $navId ) {
+                               unset( $this->byNavigationId[$navId] );
+                       }
                }
 
                parent::offsetUnset( $index );
@@ -196,6 +216,43 @@ class SiteList extends GenericArrayObject {
                $this->offsetUnset( $this->byInternalId[$id] );
        }
 
+       /**
+        * Returns if the list contains the site with the provided navigational site id.
+        *
+        * @param string $id
+        *
+        * @return boolean
+        */
+       public function hasNavigationId( $id ) {
+               return array_key_exists( $id, $this->byNavigationId );
+       }
+
+       /**
+        * Returns the Site with the provided navigational site id.
+        * The site needs to exist, so if not sure, call has first.
+        *
+        * @since 1.23
+        *
+        * @param string $id
+        *
+        * @return Site
+        */
+       public function getSiteByNavigationId( $id ) {
+               return $this->offsetGet( $this->byNavigationId[$id] );
+       }
+
+       /**
+        * Removes the site with the specified navigational site id.
+        * The site needs to exist, so if not sure, call has first.
+        *
+        * @since 1.23
+        *
+        * @param string $id
+        */
+       public function removeSiteByNavigationId( $id ) {
+               $this->offsetUnset( $this->byNavigationId[$id] );
+       }
+
        /**
         * Sets a site in the list. If the site was not there,
         * it will be added. If it was, it will be updated.
index 4e2556c..888829a 100644 (file)
  * @ingroup SpecialPage
  */
 abstract class ChangesListSpecialPage extends SpecialPage {
-       var $rcSubpage, $rcOptions; // @todo Rename these, make protected
-       protected $customFilters;
+       /** @var string */
+       protected $rcSubpage;
 
-       /**
-        * The feed format to output as (either 'rss' or 'atom'), or null if no
-        * feed output was requested
-        *
-        * @var string $feedFormat
-        */
-       protected $feedFormat;
+       /** @var FormOptions */
+       protected $rcOptions;
+
+       /** @var array */
+       protected $customFilters;
 
        /**
         * Main execution point
@@ -46,19 +44,13 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         */
        public function execute( $subpage ) {
                $this->rcSubpage = $subpage;
-               $this->feedFormat = $this->including() ? null : $this->getRequest()->getVal( 'feed' );
-               if ( $this->feedFormat !== 'atom' && $this->feedFormat !== 'rss' ) {
-                       $this->feedFormat = null;
-               }
 
                $this->setHeaders();
                $this->outputHeader();
                $this->addModules();
 
+               $rows = $this->getRows();
                $opts = $this->getOptions();
-               // Fetch results, prepare a batch link existence check query
-               $conds = $this->buildMainQueryConds( $opts );
-               $rows = $this->doMainQuery( $conds, $opts );
                if ( $rows === false ) {
                        if ( !$this->including() ) {
                                $this->doHeader( $opts );
@@ -67,26 +59,30 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                        return;
                }
 
-               if ( !$this->feedFormat ) {
-                       $batch = new LinkBatch;
-                       foreach ( $rows as $row ) {
-                               $batch->add( NS_USER, $row->rc_user_text );
-                               $batch->add( NS_USER_TALK, $row->rc_user_text );
-                               $batch->add( $row->rc_namespace, $row->rc_title );
-                       }
-                       $batch->execute();
-               }
-               if ( $this->feedFormat ) {
-                       list( $changesFeed, $formatter ) = $this->getFeedObject( $this->feedFormat );
-                       /** @var ChangesFeed $changesFeed */
-                       $changesFeed->execute( $formatter, $rows, $this->checkLastModified( $this->feedFormat ), $opts );
-               } else {
-                       $this->webOutput( $rows, $opts );
+               $batch = new LinkBatch;
+               foreach ( $rows as $row ) {
+                       $batch->add( NS_USER, $row->rc_user_text );
+                       $batch->add( NS_USER_TALK, $row->rc_user_text );
+                       $batch->add( $row->rc_namespace, $row->rc_title );
                }
+               $batch->execute();
+
+               $this->webOutput( $rows, $opts );
 
                $rows->free();
        }
 
+       /**
+        * Get the database result for this special page instance. Used by ApiFeedRecentChanges.
+        *
+        * @return bool|ResultWrapper Result or false
+        */
+       public function getRows() {
+               $opts = $this->getOptions();
+               $conds = $this->buildMainQueryConds( $opts );
+               return $this->doMainQuery( $conds, $opts );
+       }
+
        /**
         * Get the current FormOptions for this request
         *
@@ -461,30 +457,6 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                $out->addModules( 'mediawiki.special.changeslist.legend.js' );
        }
 
-       /**
-        * Return an array with a ChangesFeed object and ChannelFeed object.
-        *
-        * This is intentionally not abstract not to require subclasses which don't
-        * use feeds functionality to implement it.
-        *
-        * @param string $feedFormat Feed's format (either 'rss' or 'atom')
-        * @return array
-        */
-       public function getFeedObject( $feedFormat ) {
-               throw new MWException( "Not implemented" );
-       }
-
-       /**
-        * Get last-modified date, for client caching. Not implemented by default
-        * (returns current time).
-        *
-        * @param string $feedFormat
-        * @return string|bool
-        */
-       public function checkLastModified( $feedFormat ) {
-               return wfTimestampNow();
-       }
-
        protected function getGroupName() {
                return 'changes';
        }
index c594807..3642750 100644 (file)
@@ -74,6 +74,7 @@ class SpecialContributions extends IncludableSpecialPage {
                $this->opts['limit'] = $request->getInt( 'limit', $user->getOption( 'rclimit' ) );
                $this->opts['target'] = $target;
                $this->opts['topOnly'] = $request->getBool( 'topOnly' );
+               $this->opts['newOnly'] = $request->getBool( 'newOnly' );
 
                $nt = Title::makeTitleSafe( NS_USER, $target );
                if ( !$nt ) {
@@ -140,6 +141,9 @@ class SpecialContributions extends IncludableSpecialPage {
                if ( $this->opts['topOnly'] ) {
                        $feedParams['toponly'] = true;
                }
+               if ( $this->opts['newOnly'] ) {
+                       $feedParams['newonly'] = true;
+               }
                if ( $this->opts['deletedOnly'] ) {
                        $feedParams['deletedonly'] = true;
                }
@@ -185,6 +189,7 @@ class SpecialContributions extends IncludableSpecialPage {
                                'month' => $this->opts['month'],
                                'deletedOnly' => $this->opts['deletedOnly'],
                                'topOnly' => $this->opts['topOnly'],
+                               'newOnly' => $this->opts['newOnly'],
                                'nsInvert' => $this->opts['nsInvert'],
                                'associated' => $this->opts['associated'],
                        ) );
@@ -318,6 +323,16 @@ class SpecialContributions extends IncludableSpecialPage {
                                array(),
                                array( 'page' => $userpage->getPrefixedText() )
                        );
+
+                       # Suppression log link (bug 59120)
+                       if ( $this->getUser()->isAllowed( 'suppressionlog' ) ) {
+                               $tools[] = Linker::linkKnown(
+                                       SpecialPage::getTitleFor( 'Log', 'suppress' ),
+                                       $this->msg( 'sp-contributions-suppresslog' )->escaped(),
+                                       array(),
+                                       array( 'offender' => $username )
+                               );
+                       }
                }
                # Uploads
                $tools[] = Linker::linkKnown(
@@ -404,6 +419,10 @@ class SpecialContributions extends IncludableSpecialPage {
                        $this->opts['topOnly'] = false;
                }
 
+               if ( !isset( $this->opts['newOnly'] ) ) {
+                       $this->opts['newOnly'] = false;
+               }
+
                $form = Html::openElement(
                        'form',
                        array(
@@ -423,6 +442,7 @@ class SpecialContributions extends IncludableSpecialPage {
                        'year',
                        'month',
                        'topOnly',
+                       'newOnly',
                        'associated'
                );
 
@@ -555,10 +575,21 @@ class SpecialContributions extends IncludableSpecialPage {
                                array( 'class' => 'mw-input' )
                        )
                );
+               $checkLabelNewOnly = Html::rawElement(
+                       'span',
+                       array( 'style' => 'white-space: nowrap' ),
+                       Xml::checkLabel(
+                               $this->msg( 'sp-contributions-newonly' )->text(),
+                               'newOnly',
+                               'mw-show-new-only',
+                               $this->opts['newOnly'],
+                               array( 'class' => 'mw-input' )
+                       )
+               );
                $extraOptions = Html::rawElement(
                        'td',
                        array( 'colspan' => 2 ),
-                       $deletedOnlyCheck . $checkLabelTopOnly
+                       $deletedOnlyCheck . $checkLabelTopOnly . $checkLabelNewOnly
                );
 
                $dateSelectionAndSubmit = Xml::tags( 'td', array( 'colspan' => 2 ),
@@ -642,6 +673,7 @@ class ContribsPager extends ReverseChronologicalPager {
 
                $this->deletedOnly = !empty( $options['deletedOnly'] );
                $this->topOnly = !empty( $options['topOnly'] );
+               $this->newOnly = !empty( $options['newOnly'] );
 
                $year = isset( $options['year'] ) ? $options['year'] : false;
                $month = isset( $options['month'] ) ? $options['month'] : false;
@@ -821,6 +853,10 @@ class ContribsPager extends ReverseChronologicalPager {
                        $condition[] = 'rev_id = page_latest';
                }
 
+               if ( $this->newOnly ) {
+                       $condition[] = 'rev_parent_id = 0';
+               }
+
                return array( $tables, $index, $condition, $join_conds );
        }
 
index d148a50..6c3cb95 100644 (file)
@@ -427,6 +427,15 @@ class DeletedContributionsPage extends SpecialPage {
                                                'page' => $nt->getPrefixedText()
                                        )
                                );
+                               # Suppression log link (bug 59120)
+                               if ( $this->getUser()->isAllowed( 'suppressionlog' ) ) {
+                                       $tools[] = Linker::linkKnown(
+                                               SpecialPage::getTitleFor( 'Log', 'suppress' ),
+                                               $this->msg( 'sp-contributions-suppresslog' )->escaped(),
+                                               array(),
+                                               array( 'offender' => $userObj->getName() )
+                                       );
+                               }
                        }
 
                        # Uploads
index 6695c82..c867f06 100644 (file)
@@ -143,7 +143,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                        }
                        $out->addHTML( $this->userForm( $this->mTarget ) );
 
-                       return false;
+                       return;
                }
 
                $this->mTargetObj = $ret;
@@ -159,7 +159,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                $form->loadData();
 
                if ( !wfRunHooks( 'EmailUserForm', array( &$form ) ) ) {
-                       return false;
+                       return;
                }
 
                $result = $form->show();
index 2ac34eb..29722c8 100644 (file)
@@ -3,7 +3,7 @@
  * Implements Special:Import
  *
  * Copyright © 2003,2005 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * 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
index 4548b63..8137651 100644 (file)
@@ -203,7 +203,7 @@ class SpecialPrefixindex extends SpecialAllpages {
 
                        $n = 0;
                        if ( $res->numRows() > 0 ) {
-                               $out = Xml::openElement( 'table', array( 'id' => 'mw-prefixindex-list-table' ) );
+                               $out = Xml::openElement( 'table', array( 'class' => 'mw-prefixindex-list-table' ) );
 
                                $prefixLength = strlen( $prefix );
                                while ( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
index d266e3f..720d0a8 100644 (file)
  * @ingroup SpecialPage
  */
 class SpecialRecentChanges extends ChangesListSpecialPage {
-
+       // @codingStandardsIgnoreStart Needed "useless" override to change parameters.
        public function __construct( $name = 'Recentchanges', $restriction = '' ) {
                parent::__construct( $name, $restriction );
        }
+       // @codingStandardsIgnoreEnd
 
        /**
         * Main execution point
@@ -38,10 +39,19 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
         * @param string $subpage
         */
        public function execute( $subpage ) {
+               // Backwards-compatibility: redirect to new feed URLs
+               $feedFormat = $this->getRequest()->getVal( 'feed' );
+               if ( !$this->including() && $feedFormat ) {
+                       $query = $this->getFeedQuery();
+                       $query['feedformat'] = $feedFormat === 'atom' ? 'atom' : 'rss';
+                       $this->getOutput()->redirect( wfAppendQuery( wfScript( 'api' ), $query ) );
+                       return;
+               }
+
                // 10 seconds server-side caching max
                $this->getOutput()->setSquidMaxage( 10 );
                // Check if the client has a cached version
-               $lastmod = $this->checkLastModified( $this->feedFormat );
+               $lastmod = $this->checkLastModified();
                if ( $lastmod === false ) {
                        return;
                }
@@ -142,8 +152,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
        }
 
        public function validateOptions( FormOptions $opts ) {
-               global $wgFeedLimit;
-               $opts->validateIntBounds( 'limit', 0, $this->feedFormat ? $wgFeedLimit : 5000 );
+               $opts->validateIntBounds( 'limit', 0, 5000 );
                parent::validateOptions( $opts );
        }
 
@@ -244,16 +253,26 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                return $rows;
        }
 
+       public function outputFeedLinks() {
+               $this->addFeedLinks( $this->getFeedQuery() );
+       }
+
        /**
-        * Output feed links.
+        * Get URL query parameters for action=feedrecentchanges API feed of current recent changes view.
+        *
+        * @return array
         */
-       public function outputFeedLinks() {
-               $feedQuery = $this->getFeedQuery();
-               if ( $feedQuery !== '' ) {
-                       $this->getOutput()->setFeedAppendQuery( $feedQuery );
-               } else {
-                       $this->getOutput()->setFeedAppendQuery( false );
-               }
+       private function getFeedQuery() {
+               global $wgFeedLimit;
+               $query = array_filter( $this->getOptions()->getAllValues(), function ( $value ) {
+                       // API handles empty parameters in a different way
+                       return $value !== '';
+               } );
+               $query['action'] = 'feedrecentchanges';
+               if ( $query['limit'] > $wgFeedLimit ) {
+                       $query['limit'] = $wgFeedLimit;
+               }
+               return $query;
        }
 
        /**
@@ -267,7 +286,8 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
 
                $limit = $opts['limit'];
 
-               $showWatcherCount = $wgRCShowWatchingUsers && $this->getUser()->getOption( 'shownumberswatching' );
+               $showWatcherCount = $wgRCShowWatchingUsers
+                       && $this->getUser()->getOption( 'shownumberswatching' );
                $watcherCache = array();
 
                $dbr = $this->getDB();
@@ -316,7 +336,9 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
 
                if ( $rows->numRows() === 0 ) {
                        $this->getOutput()->addHtml(
-                               '<div class="mw-changeslist-empty">' . $this->msg( 'recentchanges-noresult' )->parse() . '</div>'
+                               '<div class="mw-changeslist-empty">' .
+                               $this->msg( 'recentchanges-noresult' )->parse() .
+                               '</div>'
                        );
                } else {
                        $this->getOutput()->addHTML( $rclistOutput );
@@ -465,64 +487,14 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
         * Don't use this if we are using the patrol feature, patrol changes don't
         * update the timestamp
         *
-        * @param string $feedFormat
         * @return string|bool
         */
-       public function checkLastModified( $feedFormat ) {
+       public function checkLastModified() {
                $dbr = $this->getDB();
                $lastmod = $dbr->selectField( 'recentchanges', 'MAX(rc_timestamp)', false, __METHOD__ );
-               if ( $feedFormat || !$this->getUser()->useRCPatrol() ) {
-                       if ( $lastmod && $this->getOutput()->checkLastModified( $lastmod ) ) {
-                               # Client cache fresh and headers sent, nothing more to do.
-                               return false;
-                       }
-               }
-
                return $lastmod;
        }
 
-       /**
-        * Return an array with a ChangesFeed object and ChannelFeed object.
-        *
-        * @param string $feedFormat Feed's format (either 'rss' or 'atom')
-        * @return array
-        */
-       public function getFeedObject( $feedFormat ) {
-               $changesFeed = new ChangesFeed( $feedFormat, 'rcfeed' );
-               $formatter = $changesFeed->getFeedObject(
-                       $this->msg( 'recentchanges' )->inContentLanguage()->text(),
-                       $this->msg( 'recentchanges-feed-description' )->inContentLanguage()->text(),
-                       $this->getPageTitle()->getFullURL()
-               );
-
-               return array( $changesFeed, $formatter );
-       }
-
-       /**
-        * Get the query string to append to feed link URLs.
-        *
-        * @return string
-        */
-       public function getFeedQuery() {
-               global $wgFeedLimit;
-
-               $options = $this->getOptions()->getChangedValues();
-
-               // wfArrayToCgi() omits options set to null or false
-               foreach ( $options as &$value ) {
-                       if ( $value === false ) {
-                               $value = '0';
-                       }
-               }
-               unset( $value );
-
-               if ( isset( $options['limit'] ) && $options['limit'] > $wgFeedLimit ) {
-                       $options['limit'] = $wgFeedLimit;
-               }
-
-               return wfArrayToCgi( $options );
-       }
-
        /**
         * Creates the choose namespace selection
         *
@@ -713,7 +685,6 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                $dl = $lang->pipeList( $dl );
 
                // show/hide links
-               $showhide = array( $this->msg( 'show' )->text(), $this->msg( 'hide' )->text() );
                $filters = array(
                        'hideminor' => 'rcshowhideminor',
                        'hidebots' => 'rcshowhidebots',
@@ -722,6 +693,9 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        'hidepatrolled' => 'rcshowhidepatr',
                        'hidemyself' => 'rcshowhidemine'
                );
+
+               $showhide = array( 'show', 'hide' );
+
                foreach ( $this->getCustomFilters() as $key => $params ) {
                        $filters[$key] = $params['msg'];
                }
@@ -732,7 +706,18 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
 
                $links = array();
                foreach ( $filters as $key => $msg ) {
-                       $link = $this->makeOptionsLink( $showhide[1 - $options[$key]],
+                       // The following messages are used here:
+                       // rcshowhideminor-show, rcshowhideminor-hide, rcshowhidebots-show, rcshowhidebots-hide,
+                       // rcshowhideanons-show, rcshowhideanons-hide, rcshowhideliu-show, rcshowhideliu-hide,
+                       // rcshowhidepatr-show, rcshowhidepatr-hide, rcshowhidemine-show, rcshowhidemine-hide.
+                       $linkMessage = $this->msg( $msg . '-' . $showhide[1 - $options[$key]] );
+                       // Extensions can define additional filters, but don't need to define the corresponding
+                       // messages. If they don't exist, just fall back to 'show' and 'hide'.
+                       if ( !$linkMessage->exists() ) {
+                               $linkMessage = $this->msg( $showhide[1 - $options[$key]] );
+                       }
+
+                       $link = $this->makeOptionsLink( $linkMessage->text(),
                                array( $key => 1 - $options[$key] ), $nondefaults );
                        $links[] = $this->msg( $msg )->rawParams( $link )->escaped();
                }
@@ -740,13 +725,15 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                // show from this onward link
                $timestamp = wfTimestampNow();
                $now = $lang->userTimeAndDate( $timestamp, $user );
-               $tl = $this->makeOptionsLink(
-                       $now, array( 'from' => $timestamp ), $nondefaults
-               );
-
+               $timenow = $lang->userTime( $timestamp, $user );
+               $datenow = $lang->userDate( $timestamp, $user );
                $rclinks = $this->msg( 'rclinks' )->rawParams( $cl, $dl, $lang->pipeList( $links ) )
                        ->parse();
-               $rclistfrom = $this->msg( 'rclistfrom' )->rawParams( $tl )->parse();
+               $rclistfrom = $this->makeOptionsLink(
+                       $this->msg( 'rclistfrom' )->rawParams( $now, $timenow, $datenow )->parse(),
+                       array( 'from' => $timestamp ),
+                       $nondefaults
+               );
 
                return "{$note}$rclinks<br />$rclistfrom";
        }
index 7cc8d30..c4f40be 100644 (file)
@@ -27,7 +27,8 @@
  * @ingroup SpecialPage
  */
 class SpecialRecentChangesLinked extends SpecialRecentChanges {
-       var $rclTargetTitle;
+       /** @var bool|Title */
+       protected $rclTargetTitle;
 
        function __construct() {
                parent::__construct( 'Recentchangeslinked' );
@@ -55,7 +56,8 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges {
                $outputPage = $this->getOutput();
                $title = Title::newFromURL( $target );
                if ( !$title || $title->isExternal() ) {
-                       $outputPage->addHtml( '<div class="errorbox">' . $this->msg( 'allpagesbadtitle' )->parse() . '</div>' );
+                       $outputPage->addHtml( '<div class="errorbox">' . $this->msg( 'allpagesbadtitle' )
+                                       ->parse() . '</div>' );
                        return false;
                }
 
@@ -105,7 +107,9 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges {
                        $opts['tagfilter']
                );
 
-               if ( !wfRunHooks( 'SpecialRecentChangesQuery', array( &$conds, &$tables, &$join_conds, $opts, &$query_options, &$select ) ) ) {
+               if ( !wfRunHooks( 'SpecialRecentChangesQuery',
+                       array( &$conds, &$tables, &$join_conds, $opts, &$query_options, &$select ) )
+               ) {
                        return false;
                }
 
@@ -128,14 +132,20 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges {
                }
 
                // field name prefixes for all the various tables we might want to join with
-               $prefix = array( 'pagelinks' => 'pl', 'templatelinks' => 'tl', 'categorylinks' => 'cl', 'imagelinks' => 'il' );
+               $prefix = array(
+                       'pagelinks' => 'pl',
+                       'templatelinks' => 'tl',
+                       'categorylinks' => 'cl',
+                       'imagelinks' => 'il'
+               );
 
                $subsql = array(); // SELECT statements to combine with UNION
 
                foreach ( $link_tables as $link_table ) {
                        $pfx = $prefix[$link_table];
 
-                       // imagelinks and categorylinks tables have no xx_namespace field, and have xx_to instead of xx_title
+                       // imagelinks and categorylinks tables have no xx_namespace field,
+                       // and have xx_to instead of xx_title
                        if ( $link_table == 'imagelinks' ) {
                                $link_ns = NS_FILE;
                        } elseif ( $link_table == 'categorylinks' ) {
@@ -234,17 +244,6 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges {
                return $extraOpts;
        }
 
-       public function getFeedObject( $feedFormat ) {
-               $feed = new ChangesFeed( $feedFormat, false );
-               $feedObj = $feed->getFeedObject(
-                       $this->msg( 'recentchangeslinked-title', $this->getTargetTitle()->getPrefixedText() )
-                               ->inContentLanguage()->text(),
-                       $this->msg( 'recentchangeslinked-feed' )->inContentLanguage()->text(),
-                       $this->getPageTitle()->getFullURL()
-               );
-               return array( $feed, $feedObj );
-       }
-
        /**
         * @return Title
         */
index 3599dc6..1d0a302 100644 (file)
@@ -63,29 +63,29 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
         */
        static $UILabels = array(
                'revision' => array(
-                       'check-label'   => 'revdelete-hide-text',
-                       'success'               => 'revdelete-success',
-                       'failure'               => 'revdelete-failure',
+                       'check-label' => 'revdelete-hide-text',
+                       'success' => 'revdelete-success',
+                       'failure' => 'revdelete-failure',
                ),
                'archive' => array(
-                       'check-label'   => 'revdelete-hide-text',
-                       'success'               => 'revdelete-success',
-                       'failure'               => 'revdelete-failure',
+                       'check-label' => 'revdelete-hide-text',
+                       'success' => 'revdelete-success',
+                       'failure' => 'revdelete-failure',
                ),
                'oldimage' => array(
-                       'check-label'   => 'revdelete-hide-image',
-                       'success'               => 'revdelete-success',
-                       'failure'               => 'revdelete-failure',
+                       'check-label' => 'revdelete-hide-image',
+                       'success' => 'revdelete-success',
+                       'failure' => 'revdelete-failure',
                ),
                'filearchive' => array(
-                       'check-label'   => 'revdelete-hide-image',
-                       'success'               => 'revdelete-success',
-                       'failure'               => 'revdelete-failure',
+                       'check-label' => 'revdelete-hide-image',
+                       'success' => 'revdelete-success',
+                       'failure' => 'revdelete-failure',
                ),
                'logging' => array(
-                       'check-label'   => 'revdelete-hide-name',
-                       'success'               => 'logdelete-success',
-                       'failure'               => 'logdelete-failure',
+                       'check-label' => 'revdelete-hide-name',
+                       'success' => 'logdelete-success',
+                       'failure' => 'logdelete-failure',
                ),
        );
 
index b89522d..81077a9 100644 (file)
@@ -806,7 +806,7 @@ class SpecialSearch extends SpecialPage {
 
                $t = $result->getTitle();
 
-               $titleSnippet = $result->getTitleSnippet( $terms );
+               $titleSnippet = $result->getTitleSnippet();
 
                if ( $titleSnippet == '' ) {
                        $titleSnippet = null;
@@ -819,7 +819,7 @@ class SpecialSearch extends SpecialPage {
 
                // format redirect if any
                $redirectTitle = $result->getRedirectTitle();
-               $redirectText = $result->getRedirectSnippet( $terms );
+               $redirectText = $result->getRedirectSnippet();
                $redirect = '';
                if ( !is_null( $redirectTitle ) ) {
                        if ( $redirectText == '' ) {
index 537709b..bbe56ec 100644 (file)
@@ -401,9 +401,15 @@ class LoginForm extends SpecialPage {
                        return Status::newFatal( 'sorbs_create_account_reason' );
                }
 
+               // Normalize the name so that silly things don't cause "invalid username" errors.
+               // User::newFromName does some rather strict checking, rejecting e.g. leading/trailing/multiple spaces.
+               $title = Title::makeTitleSafe( NS_USER, $this->mUsername );
+               if ( !is_object( $title ) ) {
+                       return Status::newFatal( 'noname' );
+               }
+
                # Now create a dummy user ($u) and check if it is valid
-               $name = trim( $this->mUsername );
-               $u = User::newFromName( $name, 'creatable' );
+               $u = User::newFromName( $title->getText(), 'creatable' );
                if ( !is_object( $u ) ) {
                        return Status::newFatal( 'noname' );
                } elseif ( 0 != $u->idForName() ) {
index c38b009..870fa11 100644 (file)
@@ -86,6 +86,9 @@ class SpecialVersion extends SpecialPage {
                                        $file = $this->getExtAuthorsFileName( dirname( $extNode['path'] ) );
                                        if ( $file ) {
                                                $wikiText = file_get_contents( $file );
+                                               if ( substr( $file, -4 ) === '.txt' ) {
+                                                       $wikiText = Html::element( 'pre', array(), $wikiText );
+                                               }
                                        }
                                }
 
index 3f49ed3..d5b8d8b 100644 (file)
@@ -75,16 +75,21 @@ if ( !function_exists( 'session_name' ) ) {
 
                <h1>MediaWiki <?php echo htmlspecialchars( $wgVersion ) ?></h1>
                <div class='error'>
-               <p>LocalSettings.php not found.</p>
-               <p>
-               <?php
-               if ( $installerStarted ) {
-                       echo "Please <a href=\"" . htmlspecialchars( $path ) . "mw-config/index." . htmlspecialchars( $ext ) . "\"> complete the installation</a> and download LocalSettings.php.";
-               } else {
-                       echo "Please <a href=\"" . htmlspecialchars( $path ) . "mw-config/index." . htmlspecialchars( $ext ) . "\"> set up the wiki</a> first.";
-               }
-               ?>
-               </p>
+               <?php if ( !file_exists( MW_CONFIG_FILE ) ) { ?>
+                       <p>LocalSettings.php not found.</p>
+                       <p>
+                       <?php
+                       if ( $installerStarted ) {
+                               echo "Please <a href=\"" . htmlspecialchars( $path ) . "mw-config/index." . htmlspecialchars( $ext ) . "\"> complete the installation</a> and download LocalSettings.php.";
+                       } else {
+                               echo "Please <a href=\"" . htmlspecialchars( $path ) . "mw-config/index." . htmlspecialchars( $ext ) . "\"> set up the wiki</a> first.";
+                       }
+                       ?>
+                       </p>
+               <?php } else { ?>
+                       <p>LocalSettings.php not readable.</p>
+                       <p>Please correct file permissions and try again.</p>
+               <?php } ?>
 
                </div>
        </body>
index 0cb83d5..aba0d27 100644 (file)
@@ -58,15 +58,23 @@ class UsercreateTemplate extends BaseTemplate {
                        <section class="mw-form-header">
                                <?php $this->html( 'header' ); /* extensions such as ConfirmEdit add form HTML here */ ?>
                        </section>
+                       <!-- This element is used by the mediawiki.special.userlogin.signup.js module. -->
+                       <div
+                               id="mw-createacct-status-area"
+                               <?php if ( $this->data['message'] ) { ?>
+                                       class="<?php echo $this->data['messagetype']; ?>box"
+                               <?php } else { ?>
+                                       style="display: none;"
+                               <?php } ?>
+                       >
                        <?php if ( $this->data['message'] ) { ?>
-                               <div class="<?php $this->text( 'messagetype' ); ?>box">
                                        <?php if ( $this->data['messagetype'] == 'error' ) { ?>
                                                <strong><?php $this->msg( 'createacct-error' ); ?></strong>
                                                <br />
                                        <?php } ?>
                                        <?php $this->html( 'message' ); ?>
-                               </div>
                        <?php } ?>
+                       </div>
 
                        <div>
                                <label for='wpName2'>
index 68097e3..c416d11 100644 (file)
@@ -146,7 +146,7 @@ class UserloginTemplate extends BaseTemplate {
 
                        <div>
                                <?php
-                               echo Html::input( 'wpLoginAttempt', $this->getMsg( 'pt-login' )->text(), 'submit', array(
+                               echo Html::input( 'wpLoginAttempt', $this->getMsg( 'pt-login-button' )->text(), 'submit', array(
                                        'id' => 'wpLoginAttempt',
                                        'tabindex' => '6',
                                        'class' => 'mw-ui-button mw-ui-big mw-ui-block mw-ui-constructive'
index 67bffc3..6cce4ac 100644 (file)
@@ -42,7 +42,7 @@ abstract class UploadBase {
        protected $mFilteredName, $mFinalExtension;
        protected $mLocalFile, $mFileSize, $mFileProps;
        protected $mBlackListedExtensions;
-       protected $mJavaDetected;
+       protected $mJavaDetected, $mSVGNSError;
 
        protected static $safeXmlEncodings = array( 'UTF-8', 'ISO-8859-1', 'ISO-8859-2', 'UTF-16', 'UTF-32' );
 
@@ -786,7 +786,7 @@ abstract class UploadBase {
                        return $this->mTitle;
                } elseif ( $blackListedExtensions ||
                                ( $wgCheckFileExtensions && $wgStrictFileExtensions &&
-                                       !$this->checkFileExtensionList( $ext, $wgFileExtensions ) ) ) {
+                                       !$this->checkFileExtension( $this->mFinalExtension, $wgFileExtensions ) ) ) {
                        $this->mBlackListedExtensions = $blackListedExtensions;
                        $this->mTitleError = self::FILETYPE_BADTYPE;
                        $this->mTitle = null;
@@ -1168,6 +1168,7 @@ abstract class UploadBase {
         * @return mixed false of the file is verified (does not contain scripts), array otherwise.
         */
        protected function detectScriptInSvg( $filename ) {
+               $this->mSVGNSError = false;
                $check = new XmlTypeCheck(
                        $filename,
                        array( $this, 'checkSvgScriptCallback' ),
@@ -1178,6 +1179,9 @@ abstract class UploadBase {
                        // Invalid xml (bug 58553)
                        return array( 'uploadinvalidxml' );
                } elseif ( $check->filterMatch ) {
+                       if ( $this->mSVGNSError ) {
+                               return array( 'uploadscriptednamespace', $this->mSVGNSError );
+                       }
                        return array( 'uploadscripted' );
                }
                return false;
@@ -1204,7 +1208,51 @@ abstract class UploadBase {
         * @return bool
         */
        public function checkSvgScriptCallback( $element, $attribs ) {
-               $strippedElement = $this->stripXmlNamespace( $element );
+               list( $namespace, $strippedElement ) = $this->splitXmlNamespace( $element );
+
+               static $validNamespaces = array(
+                       '',
+                       'adobe:ns:meta/',
+                       'http://creativecommons.org/ns#',
+                       'http://inkscape.sourceforge.net/dtd/sodipodi-0.dtd',
+                       'http://ns.adobe.com/adobeillustrator/10.0/',
+                       'http://ns.adobe.com/adobesvgviewerextensions/3.0/',
+                       'http://ns.adobe.com/extensibility/1.0/',
+                       'http://ns.adobe.com/flows/1.0/',
+                       'http://ns.adobe.com/illustrator/1.0/',
+                       'http://ns.adobe.com/imagereplacement/1.0/',
+                       'http://ns.adobe.com/pdf/1.3/',
+                       'http://ns.adobe.com/photoshop/1.0/',
+                       'http://ns.adobe.com/saveforweb/1.0/',
+                       'http://ns.adobe.com/variables/1.0/',
+                       'http://ns.adobe.com/xap/1.0/',
+                       'http://ns.adobe.com/xap/1.0/g/',
+                       'http://ns.adobe.com/xap/1.0/g/img/',
+                       'http://ns.adobe.com/xap/1.0/mm/',
+                       'http://ns.adobe.com/xap/1.0/rights/',
+                       'http://ns.adobe.com/xap/1.0/stype/dimensions#',
+                       'http://ns.adobe.com/xap/1.0/stype/font#',
+                       'http://ns.adobe.com/xap/1.0/stype/manifestitem#',
+                       'http://ns.adobe.com/xap/1.0/stype/resourceevent#',
+                       'http://ns.adobe.com/xap/1.0/stype/resourceref#',
+                       'http://ns.adobe.com/xap/1.0/t/pg/',
+                       'http://purl.org/dc/elements/1.1/',
+                       'http://purl.org/dc/elements/1.1',
+                       'http://schemas.microsoft.com/visio/2003/svgextensions/',
+                       'http://sodipodi.sourceforge.net/dtd/sodipodi-0.dtd',
+                       'http://web.resource.org/cc/',
+                       'http://www.freesoftware.fsf.org/bkchem/cdml',
+                       'http://www.inkscape.org/namespaces/inkscape',
+                       'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
+                       'http://www.w3.org/2000/svg',
+               );
+
+               if ( !in_array( $namespace, $validNamespaces ) ) {
+                       wfDebug( __METHOD__ . ": Non-svg namespace '$namespace' in uploaded file.\n" );
+                       // @TODO return a status object to a closure in XmlTypeCheck, for MW1.21+
+                       $this->mSVGNSError = $namespace;
+                       return true;
+               }
 
                /*
                 * check for elements that can contain javascript
@@ -1226,6 +1274,13 @@ abstract class UploadBase {
                        return true;
                }
 
+               # Block iframes, in case they pass the namespace check
+               if ( $strippedElement == 'iframe' ) {
+                       wfDebug( __METHOD__ . ": iframe in uploaded file.\n" );
+                       return true;
+               }
+
+
                foreach ( $attribs as $attrib => $value ) {
                        $stripped = $this->stripXmlNamespace( $attrib );
                        $value = strtolower( $value );
@@ -1299,6 +1354,19 @@ abstract class UploadBase {
                return false; //No scripts detected
        }
 
+       /**
+        * Divide the element name passed by the xml parser to the callback into URI and prifix.
+        * @param $name string
+        * @return array containing the namespace URI and prefix
+        */
+       private static function splitXmlNamespace( $element ) {
+               // 'http://www.w3.org/2000/svg:script' -> array( 'http://www.w3.org/2000/svg', 'script' )
+               $parts = explode( ':', strtolower( $element ) );
+               $name = array_pop( $parts );
+               $ns = implode( ':', $parts );
+               return array( $ns, $name );
+       }
+
        /**
         * @param $name string
         * @return string
index bb5b49f..57e73da 100644 (file)
@@ -752,8 +752,7 @@ class LanguageConverter {
                        return;
                }
 
-               global $wgDisableLangConversion, $wgDisableTitleConversion, $wgRequest,
-                       $wgUser;
+               global $wgDisableLangConversion, $wgDisableTitleConversion, $wgRequest;
                $isredir = $wgRequest->getText( 'redirect', 'yes' );
                $action = $wgRequest->getText( 'action' );
                $linkconvert = $wgRequest->getText( 'linkconvert', 'yes' );
@@ -768,8 +767,7 @@ class LanguageConverter {
                                ( $isredir == 'no'
                                        || $action == 'edit'
                                        || $action == 'submit'
-                                       || $linkconvert == 'no'
-                                       || $wgUser->getOption( 'noconvertlink' ) == 1 ) ) ) {
+                                       || $linkconvert == 'no' ) ) ) {
                        return;
                }
 
index aa3e4f2..88d57de 100644 (file)
@@ -54,7 +54,8 @@ class UzConverter extends LanguageConverter {
                'ф' => 'f', 'Ф' => 'F',
                'ц' => 'c', 'Ц' => 'C',
                'ў' => 'oʻ', 'Ў' => 'Oʻ',
-               'ц' => 'ts', 'Ц' => 'Ts', // note: at the beginning of a word and right after a consonant, only "s" is used
+               // note: at the beginning of a word and right after a consonant, only "s" is used
+               'ц' => 'ts', 'Ц' => 'Ts',
                'қ' => 'q', 'Қ' => 'Q',
                'ё' => 'yo', 'Ё' => 'Yo',
                'ю' => 'yu', 'Ю' => 'Yu',
@@ -69,9 +70,9 @@ class UzConverter extends LanguageConverter {
                'a' => 'а', 'A' => 'А',
                'b' => 'б', 'B' => 'Б',
                'd' => 'д', 'D' => 'Д',
-               'e' => 'е', 'E' => 'Е',
-               ' e' => ' э', ' E' => ' Э', // "э" is used at the beginning of a word instead of "e"
-               'ye' => 'е', 'Ye' => 'Е',
+               // at the beginning of a word and after a vowel, "э" is used instead of "e"
+               // (see regex below)
+               'e' => 'э', 'E' => 'Э',
                'f' => 'ф', 'F' => 'Ф',
                'g' => 'г', 'G' => 'Г',
                'g‘' => 'ғ', 'G‘' => 'Ғ', 'gʻ' => 'ғ', 'Gʻ' => 'Ғ',
@@ -112,6 +113,18 @@ class UzConverter extends LanguageConverter {
                );
        }
 
+       function translate( $text, $toVariant ) {
+               if( $toVariant == 'uz-cyrl' ) {
+                       $text = str_replace( 'ye', 'е', $text );
+                       $text = str_replace( 'Ye', 'Е', $text );
+                       $text = str_replace( 'YE', 'Е', $text );
+                       // "е" after consonants, otherwise "э" (see above)
+                       $text = preg_replace( '/([BVGDJZYKLMNPRSTFXCWQʻ‘H])E/u', '$1Е', $text );
+                       $text = preg_replace( '/([bvgdjzyklmnprstfxcwqʻ‘h])e/ui', '$1е', $text );
+               }
+               return parent::translate( $text, $toVariant );
+       }
+
 }
 
 /**
index a74b167..d4726be 100644 (file)
@@ -166,7 +166,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Recibir copias de os correus que ninvío ta atros usuarios',
 'tog-diffonly' => "No amostrar o conteniu d'a pachina debaixo d'as esferencias",
 'tog-showhiddencats' => 'Amostrar categorías amagatas',
-'tog-noconvertlink' => 'Desactivar a conversión de titol de vinclo',
 'tog-norollbackdiff' => 'No amostrar as diferencias dimpués de revertir',
 'tog-useeditwarning' => "Alvertir-me quan salga d'una pachina d'edición sin alzar os cambios",
 
index 6ba9cc1..b6e6ba6 100644 (file)
@@ -80,7 +80,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Sendan mē gelīcnessa þāra spearcǣrenda þe ic ōðrum brūcendum sende',
 'tog-diffonly' => 'Nā īwan trametes innunge under scādungum',
 'tog-showhiddencats' => 'Īwan gehȳdede floccas',
-'tog-noconvertlink' => 'Ne lǣt hlencena titula āwendunge',
 'tog-norollbackdiff' => 'Forlǣtan scādunge siþþan edweorc sīe gedōn',
 'tog-useeditwarning' => 'Cȳðan mē þǣr ic afare fram adihtunge tramete þe gīet hæbbe unhordoda andwendunga.',
 'tog-prefershttps' => 'Brūc ā sicore þēodednesse þā þū sī inmeldod',
index 71e8d90..689f479 100644 (file)
@@ -524,7 +524,6 @@ $messages = array(
 'tog-ccmeonemails' => 'أرسل إلي نسخا من الرسائل الإلكترونية التي أرسلها إلى المستخدمين الآخرين',
 'tog-diffonly' => 'لا تعرض محتوى الصفحة أسفل الفرق',
 'tog-showhiddencats' => 'أظهر التصنيفات المخفية',
-'tog-noconvertlink' => 'عطل تحويل عناوين الروابط',
 'tog-norollbackdiff' => 'أزل الفرق بعد إحداث استرجاع',
 'tog-useeditwarning' => 'حذّرني عندما أغادر تحرير صفحة فيها تغييرات لم أحفظها',
 'tog-prefershttps' => 'دائما استخدم اتصالا آمنا بعد الدخول',
@@ -699,7 +698,7 @@ $messages = array(
 'articlepage' => 'اعرض صفحة المحتوى',
 'talk' => 'نقاش',
 'views' => 'معاينة',
-'toolbox' => 'اÙ\84أدÙ\88ات',
+'toolbox' => 'أدوات',
 'userpage' => 'طالع صفحة المستخدم',
 'projectpage' => 'طالع صفحة المشروع',
 'imagepage' => 'طالع صفحة الملف',
@@ -1037,9 +1036,9 @@ $2',
 'suspicious-userlogout' => 'رفض طلب خروجك لأنه يبدو كأنه أرسل عن طريق متصفح معطوب أو وسيط تخزين.',
 'createacct-another-realname-tip' => 'الاسم الحقيقي اختياري.
 إذا اخترت توفيره فسيستخدم لنسبة عمل المستخدم إليه.',
-'pt-login' => 'تسجÙ\8aÙ\84 Ø§Ù\84دخÙ\88Ù\84',
-'pt-createaccount' => 'Ø£Ù\86شئ Ø­Ø³Ø§Ø¨Ø§Ù\8b',
-'pt-userlogout' => 'تسجÙ\8aÙ\84 Ø§Ù\84خرÙ\88ج',
+'pt-login' => 'دخول',
+'pt-createaccount' => 'Ø¥Ù\86شاء Ø­Ø³Ø§Ø¨',
+'pt-userlogout' => 'خروج',
 
 # Email sending
 'php-mail-error-unknown' => "خطأ غير معروف في وظيفة البريد PHP's mail()",
@@ -1266,10 +1265,10 @@ $2
 في نص التعديل. تم رفض التعديل لمنع فساد نص المقالة.
 هذا يحدث أحيانا عندما تستخدم خدمة بروكسي مجهول معيبة مبنية على الوب.'''",
 'edit_form_incomplete' => "'''بعض أجزاء من نموذج التعديل لم تصل إلى الخادم؛ تأكد من أن تعديلاتك لم تمس وحاول مجددا.'''",
-'editing' => 'تعديل «$1»',
+'editing' => 'تعديل $1',
 'creating' => 'إنشاء «$1»',
-'editingsection' => 'تحرÙ\8aر $1 (قسم)',
-'editingcomment' => 'تعدÙ\8aÙ\84 $1 (Ù\82سÙ\85 Ø¬Ø¯Ù\8aد)',
+'editingsection' => 'تعدÙ\8aÙ\84 $1 (قسم)',
+'editingcomment' => 'Ø¥Ù\86شاء Ù\82سÙ\85 Ù\85Ù\86 Â«$1»',
 'editconflict' => 'تضارب في التحرير: $1',
 'explainconflict' => "لقد عدل شخص آخر هذه الصفحة بعد أن بدأت أنت بتحريرها.
 صندوق النصوص العلوي يحتوي على النص الموجود حاليا في الصفحة.
@@ -1551,7 +1550,7 @@ $1",
 'mergelogpagetext' => 'بالأسفل قائمة بأحدث عمليات الدمج لتاريخ صفحة ما إلى أخرى.',
 
 # Diffs
-'history-title' => 'تاريخ «$1»',
+'history-title' => 'تاريخ "$1"',
 'difference-title' => '«$1»: الفرق بين المراجعتين',
 'difference-title-multipage' => '«$1» و«$2»: الفرق بين الصفحتين',
 'difference-multipage' => '(الفرق بين الصفحتين)',
@@ -1930,11 +1929,23 @@ $1",
 'rcnotefrom' => "بالأسفل التغييرات منذ '''$2''' (إلى '''$1''' معروضة).",
 'rclistfrom' => 'أظهر التغييرات بدء من $1',
 'rcshowhideminor' => '$1 التعديلات الطفيفة',
+'rcshowhideminor-show' => 'أظهر',
+'rcshowhideminor-hide' => 'أخف',
 'rcshowhidebots' => '$1 البوتات',
+'rcshowhidebots-show' => 'أظهر',
+'rcshowhidebots-hide' => 'أخف',
 'rcshowhideliu' => '$1 {{GENDER:$1|مستخدمين مسجلين|مستخدمات مسجلات|مستخدمون مسجلون}}',
+'rcshowhideliu-show' => 'أظهر',
+'rcshowhideliu-hide' => 'أخف',
 'rcshowhideanons' => '$1 المستخدمين المجهولين',
+'rcshowhideanons-show' => 'أظهر',
+'rcshowhideanons-hide' => 'أخف',
 'rcshowhidepatr' => '$1 التعديلات المراجعة',
+'rcshowhidepatr-show' => 'أظهر',
+'rcshowhidepatr-hide' => 'أخف',
 'rcshowhidemine' => '$1 تعديلاتي',
+'rcshowhidemine-show' => 'أظهر',
+'rcshowhidemine-hide' => 'أخف',
 'rclinks' => 'أظهر آخر $1 تعديل في آخر $2 يوم<br />$3',
 'diff' => 'فرق',
 'hist' => 'تاريخ',
@@ -1956,7 +1967,7 @@ $1",
 'recentchangeslinked' => 'تغييرات ذات علاقة',
 'recentchangeslinked-feed' => 'تغييرات ذات علاقة',
 'recentchangeslinked-toolbox' => 'تغييرات ذات علاقة',
-'recentchangeslinked-title' => 'التغييرات المرتبطة ب "$1"',
+'recentchangeslinked-title' => 'التغييرات المرتبطة بصفحة «$1»',
 'recentchangeslinked-summary' => "هذه قائمة بالتغييرات التي تمت حديثا للصفحات الموصولة من صفحة معينة (أو إلى الأعضاء ضمن تصنيف معين).
 الصفحات في [[Special:Watchlist|قائمة مراقبتك]] '''مغلظة'''",
 'recentchangeslinked-page' => 'اسم الصفحة:',
@@ -2064,6 +2075,7 @@ $1",
 'uploaddisabledtext' => 'رفع الملفات معطل.',
 'php-uploaddisabledtext' => 'رفع ملفات PHP معطل. من فضلك تحقق من إعدادات رفع الملفات.',
 'uploadscripted' => 'هذا الملف يضم كود HTML أو كود آخر يمكن أن يفسره متصفح الوب بطريقة خاطئة.',
+'uploadinvalidxml' => 'تعذر تحليل XML في الملف المرفوع.',
 'uploadvirus' => 'الملف يحتوي على فيروس! التفاصيل: $1',
 'uploadjava' => 'يحتوي ملف ZIP هذا على ملفات جافا .class.
 لا يسمح برفع ملفات جافا لأنها تتيح تخطي القيود الأمنية.',
@@ -2702,7 +2714,7 @@ $UNWATCHURL
 'excontentauthor' => "المحتوى كان: '$1' (والمساهم الوحيد كان '[[Special:Contributions/$2|$2]]')",
 'exbeforeblank' => "المحتوى قبل الإفراغ كان: '$1'",
 'exblank' => 'الصفحة كانت فارغة',
-'delete-confirm' => 'حذف «$1»',
+'delete-confirm' => 'حذف "$1"',
 'delete-legend' => 'حذف',
 'historywarning' => "'''تحذير:''' الصفحة التي توشك على حذفها لها تاريخ فيه {{PLURAL:$1||مراجعة واحدة|مراجعتان|$1 مراجعات|$1 مراجعة}} تقريبا:",
 'confirmdeletetext' => 'أنت على وشك أن تقوم بحذف صفحة بالإضافة إلى كل تاريخها.
@@ -2765,7 +2777,7 @@ $UNWATCHURL
 'modifiedarticleprotection' => 'غير مستوى حماية "[[$1]]"',
 'unprotectedarticle' => 'أزال الحماية من "[[$1]]"',
 'movedarticleprotection' => 'نقل إعدادات الحماية من "[[$2]]" إلى "[[$1]]"',
-'protect-title' => 'ضبط حماية «$1»',
+'protect-title' => 'ضبط حماية "$1"',
 'protect-title-notallowed' => 'عرض مستوى حماية "$1"',
 'prot_1movedto2' => 'نُقلت [[$1]] إلى [[$2]]',
 'protect-badnamespace-title' => 'نطاق لا يحمى',
@@ -2914,6 +2926,7 @@ $1',
 'sp-contributions-search' => 'بحث عن مساهمات',
 'sp-contributions-username' => 'عنوان أيبي أو اسم مستخدم:',
 'sp-contributions-toponly' => 'أظهر أعلى المراجعات فقط',
+'sp-contributions-newonly' => 'أظهر إنشاء الصفحات فقط',
 'sp-contributions-submit' => 'بحث',
 
 # What links here
@@ -3082,7 +3095,7 @@ $1',
 'lockedbyandtime' => '(من $1 على $2 في $3 )',
 
 # Move page
-'move-page' => 'نقل «$1»',
+'move-page' => 'نقل $1',
 'move-page-legend' => 'نقل صفحة',
 'movepagetext' => "باستخدام  الاستمارة بالأسفل بإمكانك أن تغير اسم الصفحة، وأن تنقل تاريخها إلى الاسم الجديد.
 العنوان القديم سيصبح تحويلة للعنوان الجديد.
@@ -4585,6 +4598,4 @@ $5
 'expand_templates_generate_rawhtml' => 'أظهر خام HTML',
 'expand_templates_preview' => 'عرض مسبق',
 
-# Unknown messages
-'uploadinvalidxml' => 'تعذر تحليل XML في الملف المرفوع.',
 );
index e7b6138..65b3eaf 100644 (file)
@@ -53,7 +53,6 @@ $messages = array(
 'tog-ccmeonemails' => 'sift liya noskha mn rasaail lbarid lelectroni likansiftha lmostkhdimin lkhrin',
 'tog-diffonly' => 'matbiynch mohtawa sfha tht lforoqat',
 'tog-showhiddencats' => 'biyn tsnifat lmkhfiya',
-'tog-noconvertlink' => 'aattl thwil anwan lwslat',
 'tog-norollbackdiff' => 'hiyd lfrq ila drt istirjaa',
 
 'underline-always' => 'Dima',
index 30c128e..623ba8c 100644 (file)
@@ -339,7 +339,6 @@ $messages = array(
 'tog-ccmeonemails' => 'ابعتلى  نسخ من رسايل الايميل اللى بابعتها لليوزرز التانيين',
 'tog-diffonly' => 'ما تبين ش محتوى الصفحة تحت الفروقات',
 'tog-showhiddencats' => 'بين التّصنيفات المستخبية',
-'tog-noconvertlink' => 'عطل تحويل عناوين الوصلات',
 'tog-norollbackdiff' => 'الغى الاختلافات بعد ما تعمل الرول باك',
 'tog-useeditwarning' => 'حذّرنى لما اسيب صفحة تعديل فيها تغييرات مش متسييڤه',
 'tog-prefershttps' => 'إستخدم  وصله متأمنه بعد الدخول',
index fd3fff6..63a73ff 100644 (file)
@@ -100,7 +100,6 @@ $messages = array(
 'tog-ccmeonemails' => "Mandame copies de los correos qu'unvio a otros usuarios",
 'tog-diffonly' => 'Nun amosar el conteníu de la páxina embaxo de les diferencies',
 'tog-showhiddencats' => 'Amosar categoríes anubríes',
-'tog-noconvertlink' => 'Desactivar la conversión del títulu del enllaz',
 'tog-norollbackdiff' => 'Desaniciar les diferencies depués de facer una restauración',
 'tog-useeditwarning' => "Avisame cuando salga d'una páxina d'edición con cambios ensin guardar",
 'tog-prefershttps' => 'Usar siempre una conexón segura en aniciando sesión',
@@ -616,6 +615,9 @@ Por favor espera $1 enantes d'intentalo otra vuelta.",
 'suspicious-userlogout' => "La to solicitú de zarrar sesión refugose porque paez qu'unvióla un restolador frañíu o un proxy de caché.",
 'createacct-another-realname-tip' => "El nome real ye opcional.
 Si decide conseñalu, va usase p'atribuir el trabayu al usuariu.",
+'pt-login' => 'Entrar',
+'pt-createaccount' => 'Crear una cuenta',
+'pt-userlogout' => 'Salir',
 
 # Email sending
 'php-mail-error-unknown' => 'Fallu desconocíu na función mail() de PHP.',
@@ -624,8 +626,7 @@ Si decide conseñalu, va usase p'atribuir el trabayu al usuariu.",
 
 # Change password dialog
 'changepassword' => 'Camudar la clave',
-'resetpass_announce' => "Aniciasti sesión con un códigu provisional unviáu per corréu electrónicu.
-P'acabar d'aniciar sesión, tienes de configurar equí una contraseña nueva:",
+'resetpass_announce' => "P'acabar d'aniciar sesión, tien de definir equí una contraseña nueva.",
 'resetpass_text' => '<!-- Amestar testu equí -->',
 'resetpass_header' => 'Camudar la contraseña de la cuenta',
 'oldpassword' => 'Contraseña antigua:',
@@ -641,8 +642,13 @@ Por favor espera $1 enantes d'intentalo otra vuelta.",
 'resetpass-submit-cancel' => 'Encaboxar',
 'resetpass-wrong-oldpass' => 'Contraseña temporal o actual inválida.
 Seique yá camudaras correutamente la contraseña o que pidieras una nueva contraseña temporal.',
+'resetpass-recycled' => 'Por favor, cambie la so contraseña por otra distinta de la actual.',
+'resetpass-temp-emailed' => "Anició sesión con un códigu temporal unviáu per corréu electrónicu.
+Pa completar l'aniciu de sesión, tien de definir una nueva contraseña equí:",
 'resetpass-temp-password' => 'Contraseña temporal:',
 'resetpass-abort-generic' => "Una estensión encaboxó'l cambiu de la contraseña.",
+'resetpass-expired' => "La so contraseña caducó. Defina una nueva contraseña p'aniciar sesión.",
+'resetpass-expired-soft' => 'La so contraseña caducó y tien de reaniciala. Escueya una contraseña nueva, o calque «{{int:resetpass-submit-cancel}}» pa reaniciala más sero.',
 
 # Special:PasswordReset
 'passwordreset' => 'Reaniciar contraseña',
@@ -1499,14 +1505,26 @@ Esta información sedrá pública.',
 'recentchanges-legend-heading' => "'''Lleenda:'''",
 'recentchanges-legend-newpage' => '(ver tamién la  [[Special:NewPages|llista de páxines nueves]])',
 'recentchanges-legend-plusminus' => "(''±123'')",
-'rcnotefrom' => "Abaxo tan los cambeos dende '''$2''' (s'amuesen fasta '''$1''').",
+'rcnotefrom' => "Abaxo tan los cambeos dende <strong>$2</strong> (s'amuesen fasta <strong>$1</strong>).",
 'rclistfrom' => 'Amosar los nuevos cambios dende $1',
 'rcshowhideminor' => '$1 ediciones menores',
+'rcshowhideminor-show' => 'Amosar',
+'rcshowhideminor-hide' => 'Anubrir',
 'rcshowhidebots' => '$1 bots',
+'rcshowhidebots-show' => 'Amosar',
+'rcshowhidebots-hide' => 'Anubrir',
 'rcshowhideliu' => '$1 los usuarios rexistraos',
+'rcshowhideliu-show' => 'Amosar',
+'rcshowhideliu-hide' => 'Anubrir',
 'rcshowhideanons' => '$1 usuarios anónimos',
+'rcshowhideanons-show' => 'Amosar',
+'rcshowhideanons-hide' => 'Anubrir',
 'rcshowhidepatr' => '$1 ediciones supervisaes',
+'rcshowhidepatr-show' => 'Amosar',
+'rcshowhidepatr-hide' => 'Anubrir',
 'rcshowhidemine' => '$1 les mios ediciones',
+'rcshowhidemine-show' => 'Amosar',
+'rcshowhidemine-hide' => 'Anubrir',
 'rclinks' => 'Amosar los caberos $1 cambeos de los caberos $2 díes <br />$3',
 'diff' => 'dif',
 'hist' => 'hist',
@@ -1638,6 +1656,8 @@ Deberíes revisar el historial de desaniciu del ficheru enantes de xubilu otra v
 'php-uploaddisabledtext' => 'Les xubíes de ficheros tan desactivaes en PHP.
 Por favor, comprueba la configuración de file_uploads.',
 'uploadscripted' => 'Esti ficheru contién códigu HTML o scripts que se puen interpretar equivocadamente por un navegador.',
+'uploadscriptednamespace' => "Esti ficheru SVG contién l'espaciu de nomes illegal «$1»",
+'uploadinvalidxml' => "Nun pudo interpretase'l XML del ficheru cargáu.",
 'uploadvirus' => '¡El ficheru tien un virus!
 Detalles: $1',
 'uploadjava' => 'El ficheru ye un archivu ZIP que contién un ficheru .class de Java.
@@ -2009,6 +2029,7 @@ Les entraes <del>tachaes</del> tan resueltes.',
 'deadendpagestext' => 'Les páxines siguientes nun enllacien a páxina dala de {{SITENAME}}.',
 'protectedpages' => 'Páxines protexíes',
 'protectedpages-indef' => 'Namái les proteiciones permanentes',
+'protectedpages-summary' => 'Esta páxina llista les páxines esistentes que tan protexíes actualmente. Pa ver la llista de títulos que tienen torgada la creación, vea [[{{#special:ProtectedTitles}}]].',
 'protectedpages-cascade' => 'Namái proteiciones en cascada',
 'protectedpages-noredirect' => 'Anubrir redireiciones',
 'protectedpagesempty' => 'Nun hai páxines protexíes anguaño con estos parámetros.',
@@ -2021,6 +2042,7 @@ Les entraes <del>tachaes</del> tan resueltes.',
 'protectedpages-unknown-timestamp' => 'Desconocida',
 'protectedpages-unknown-performer' => 'Usuariu desconocíu',
 'protectedtitles' => 'Títulos protexíos',
+'protectedtitles-summary' => 'Esta páxina llista los títulos que tienen torgada la creación. Pa ver una llista de les páxines esistentes protexíes, vea [[{{#special:ProtectedPages}}]].',
 'protectedtitlesempty' => 'Nun hai títulos protexíos anguaño con estos parámetros.',
 'listusers' => "Llista d'usuarios",
 'listusers-editsonly' => 'Amosar namái usuarios con ediciones',
@@ -2474,6 +2496,7 @@ La cabera entrada del rexistru de bloqueos s'ufre darréu pa referencia:",
 'sp-contributions-search' => 'Buscar contribuciones',
 'sp-contributions-username' => "Direición IP o nome d'usuariu:",
 'sp-contributions-toponly' => 'Amosar namái les ediciones que son les caberes revisiones',
+'sp-contributions-newonly' => 'Amosar namái les ediciones que son creaciones de páxines',
 'sp-contributions-submit' => 'Buscar',
 
 # What links here
@@ -4016,6 +4039,4 @@ En realidá cuasi tolo qu'apaeza ente llaves dobles.",
 'expand_templates_generate_rawhtml' => 'Ver el HTML en bruto',
 'expand_templates_preview' => 'Vista previa',
 
-# Unknown messages
-'uploadinvalidxml' => "Nun pudo interpretase'l XML del ficheru cargáu.",
 );
index de6c063..fd5b391 100644 (file)
@@ -640,6 +640,9 @@ Pakilaog sana tabi nin sarong tugmadong koreo o pabayae na mayong laman an surat
 'suspicious-userlogout' => 'An hinahagad mong magluwas pinagpundo nin huli ta ini gayod pinagpadara sa paagi nin sarong pasang kilyaw o proksing hilom.',
 'createacct-another-realname-tip' => 'An totoong pangaran opsyonal.
 Kun gustuhon mong itao ini, ini paggagamiton sa pagtatao nin pagkakabistohan kan paragamit para sa saindang mga kaggibohan.',
+'pt-login' => 'Maglaog',
+'pt-createaccount' => 'Magmukna nin panindog',
+'pt-userlogout' => 'Magluwas',
 
 # Email sending
 'php-mail-error-unknown' => 'Bakong bantog na kasalaan sa PHP mail() function.',
@@ -648,8 +651,7 @@ Kun gustuhon mong itao ini, ini paggagamiton sa pagtatao nin pagkakabistohan kan
 
 # Change password dialog
 'changepassword' => 'Ribayan an sekretong panlaog',
-'resetpass_announce' => 'Ika nakalaog na na igwang sarong temporaryong koda sa e-koreo.
-Tanganing tapuson an paglalaog, ika kaipong magkaag nin sarong baguhon na sekretong panlaog digdi:',
+'resetpass_announce' => 'Sa pagtapos kan paglalaog mo, ika kaipuhanan na magkaag nin sarong baguhong pasa-taramon.',
 'resetpass_text' => '<!-- Magdagdag nin teksto digdi -->',
 'resetpass_header' => 'Ribayan an panindog na sekretong panlaog',
 'oldpassword' => 'Dating sekretong panlaog:',
@@ -663,8 +665,12 @@ Tanganing tapuson an paglalaog, ika kaipong magkaag nin sarong baguhon na sekret
 'resetpass-submit-cancel' => 'I-kansela',
 'resetpass-wrong-oldpass' => 'Saláng temporaryo o presenteng sekretong panlaog.
 Matriumpo mo nang nailaog an sekretong panlaog o nakua an bàgong temporaryong sekretong panlaog.',
+'resetpass-recycled' => 'Tabi man pakibaguha an saimong pasa-taramon na magin sarong bagay na ibahon kesa sa ngunyan mong pasa-taramon.',
+'resetpass-temp-emailed' => 'Ika nakapaglaog na igwa nin sarong temporaryong koda na pinag-esurat saimo. Sa pagtapos kan paglalaog mo, ika kaipuhan na magkaag nin sarong baguhong pasa-taramon digde:',
 'resetpass-temp-password' => 'Temporaryong sekretong panlaog:',
 'resetpass-abort-generic' => 'Pagliwat kan sikretong panlaog ipinagpauntok kan sarong ekstensyon.',
+'resetpass-expired' => 'An saimong pasa-taramon nagpalso na. Tabi man pakikaag nin sarong baguhong pasa-taramon tanganing makalaog ka.',
+'resetpass-expired-soft' => 'An saimong pasa-taramon nagpalso na, asin kinakaipuhan na baguhan. Tabi man pakipili nin sarong baguhong pasa-taramon ngunyan, o i-klik an kanselaron sa pagbago kaini aro-atyan.',
 
 # Special:PasswordReset
 'passwordreset' => 'Pakibago kan sekretong panlaog',
index d9a3276..04af676 100644 (file)
@@ -97,7 +97,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Без паказу ўхваленых правак у нядаўніх змяненнях',
 'tog-newpageshidepatrolled' => 'Без паказу ўхваленых правак у пераліку новых старонак',
 'tog-extendwatchlist' => 'Паказваць усе змяненні, а не толькі апошнія',
-'tog-usenewrc' => 'Групаваць змены старонкі ў спісах апошніх зменаў і назіранняў (патрабуе JavaScript)',
+'tog-usenewrc' => 'Групаваць змены па старонках у апошніх зменах і спісе назірання',
 'tog-numberheadings' => 'Аўта-нумараваць падзагалоўкі',
 'tog-showtoolbar' => 'Паказваць рэдактарскую стужку (Яваскрыпт)',
 'tog-editondblclick' => 'Праўка старонак па падвойным пстрыку (Яваскрыпт)',
@@ -231,7 +231,7 @@ $messages = array(
 'cancel' => 'Нічога',
 'moredotdotdot' => 'Яшчэ...',
 'morenotlisted' => 'Больш нічога няма...',
-'mypage' => 'УлаÑ\81наÑ\8f Ñ\81таронка',
+'mypage' => 'Старонка',
 'mytalk' => 'Размовы',
 'anontalk' => 'Размова для гэтага IP',
 'navigation' => 'Навігацыя',
@@ -331,7 +331,7 @@ $1',
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Пра {{GRAMMAR:вінавальны|{{SITENAME}}}}',
 'aboutpage' => 'Project:Пра {{GRAMMAR:вінавальны|{{SITENAME}}}}',
-'copyright' => 'Матэрыял даступны на ўмовах $1.',
+'copyright' => 'Матэрыял даступны на ўмовах $1 (калі не пазначана іншае).',
 'copyrightpage' => '{{ns:project}}:Аўтарскія правы',
 'currentevents' => 'Актуальныя падзеі',
 'currentevents-url' => 'Project:Актуальныя падзеі',
@@ -464,6 +464,7 @@ $2',
 'ns-specialprotected' => 'Не дазволена правіць старонкі ў прасторы назваў {{ns:special}}.',
 'titleprotected' => "Назва засцерагаецца ад стварэння; ахова пастаўлена ўдзельнікам: [[User:$1|$1]].
 Тлумачэнне пастаноўкі пад ахову: ''$2''.",
+'exception-nologin' => 'Вы не ўвайшлі ў сістэму',
 
 # Virus scanner
 'virus-badscanner' => "Некарэктная канфігурацыя: невядомы антывірусны сканер: ''$1''",
@@ -480,6 +481,7 @@ $2',
 'yourname' => 'Імя ўдзельніка',
 'userlogin-yourname' => 'Імя ўліковага запісу',
 'userlogin-yourname-ph' => 'Увядзіце імя вашага ўліковага запісу',
+'createacct-another-username-ph' => 'Увядзіце імя карыстальніка',
 'yourpassword' => 'Пароль',
 'userlogin-yourpassword' => 'Пароль',
 'userlogin-yourpassword-ph' => 'Увядзіце ваш пароль',
@@ -500,18 +502,28 @@ $2',
 'logout' => 'Выйсці з сістэмы',
 'userlogout' => 'Выйсці з сістэмы',
 'notloggedin' => 'Не ўвайшоў',
+'userlogin-noaccount' => 'Не маеце ўліковага запісу?',
 'nologin' => 'Не маеце рахунку? $1.',
 'nologinlink' => 'Завесці рахунак',
 'createaccount' => 'Стварыць рахунак',
 'gotaccount' => "Ужо маеце рахунак? '''$1'''.",
 'gotaccountlink' => 'Увайсці ў сістэму',
 'userlogin-resetlink' => 'Забыліся даныя для ўваходу?',
+'userlogin-resetpassword-link' => 'Забылі пароль?',
+'createacct-emailrequired' => 'Адрас электроннай пошты',
+'createacct-emailoptional' => 'Адрас электроннай пошты (неабавязкова)',
+'createacct-email-ph' => 'Увядзіце ваш адрас электроннай пошты',
+'createacct-another-email-ph' => 'Увядзіце адрас электроннай пошты',
 'createaccountmail' => 'праз эл.пошту',
 'createaccountreason' => 'Прычына:',
+'createacct-reason' => 'Прычына',
+'createacct-imgcaptcha-ph' => 'Увядзіце тэкст, які вы бачыце вышэй',
+'createacct-submit' => 'Стварыць уліковы запіс',
 'badretype' => 'Уведзеныя паролі не аднолькавыя.',
 'userexists' => 'Такое імя ўдзельніка ўжо занятае.
 Калі ласка, выбярыце іншае імя.',
 'loginerror' => 'Памылка ўваходу',
+'createacct-error' => 'Памылка стварэння ўліковага запісу',
 'createaccounterror' => 'Не ўдалося стварыць рахунак: $1',
 'nocookiesnew' => 'Рахунак быў створаны, але ў сістэму вы не ўвайшлі. {{SITENAME}} карыстаецца квіткамі (кукі), каб апрацоўваць уваходы ўдзельнікаў, а гэтая функцыянальнасць адключана ў вашым браўзеры. Уключыце квіткі ў браўзеры, тады ўваходзьце са сваімі новымі імем удзельніка і паролем.',
 'nocookieslogin' => '{{SITENAME}} карыстаецца квіткамі (кукі), каб пазнаваць удзельнікаў. У вашым браўзеры квіткі не дазволены. Дазвольце іх працу і паспрабуйце ізноў.',
@@ -529,7 +541,7 @@ $2',
 'passwordtooshort' => 'Трэба, каб у паролі было найменей {{PLURAL:$1|1 знак|$1 знакаў}}.',
 'password-name-match' => 'Ваш пароль павінен адрознівацца ад імя карыстальніка.',
 'password-login-forbidden' => 'Выкарыстанне гэтага імя карыстальніка і пароля было забаронена.',
-'mailmypassword' => 'Ð\90даÑ\81лаÑ\86Ñ\8c Ð½Ð¾Ð²Ñ\8b Ð¿Ð°Ñ\80олÑ\8c Ñ\8dл.поÑ\88Ñ\82ай',
+'mailmypassword' => 'СкÑ\96нÑ\83Ñ\86Ñ\8c Ð¿Ð°Ñ\80олÑ\8c',
 'passwordremindertitle' => 'Нагаданне пра пароль ад {{SITENAME}}',
 'passwordremindertext' => 'Нехта (магчыма, што вы, з адрасу IP $1) папрасіў выслаць новы пароль для пляцоўкі {{SITENAME}} ($4). Для ўдзельніка "$2" быў створаны тымчасовы пароль: "$3".
 Калі вы хацелі менавіта гэтага, то ўвайдзіце ў сістэму і выберыце сабе новы пароль. Тымчасовы пароль будзе дзейным на працягу {{PLURAL:$5|аднаго дня|$5 дзён}}.
@@ -563,6 +575,9 @@ $2',
 'login-abort-generic' => 'Няўдалая спроба ўвайсці ў сістэму',
 'loginlanguagelabel' => 'Мова: $1',
 'suspicious-userlogout' => 'Ваш запыт на выхад быў адмоўлены, паколькі ён выглядае як накіраваны са зламанага браўзера або кэшаванне проксі-сервераў.',
+'pt-login' => 'Увайсці',
+'pt-createaccount' => 'Стварыць уліковы запіс',
+'pt-userlogout' => 'Выйсці',
 
 # Email sending
 'php-mail-error-unknown' => 'Невядомая памылка ў функцыі PHP-пошты',
@@ -570,13 +585,13 @@ $2',
 
 # Change password dialog
 'changepassword' => 'Пароль',
-'resetpass_announce' => 'Ð\92Ñ\8b Ñ\9eвайÑ\88лÑ\96 Ñ\9e Ñ\81Ñ\96Ñ\81Ñ\82Ñ\8dмÑ\83 Ð¿Ð°Ð´ Ñ\82Ñ\8bмÑ\87аÑ\81овÑ\8bм Ð¿Ð°Ñ\80олем, Ð¿Ñ\80Ñ\8bÑ\81ланÑ\8bм Ñ\8dл.поÑ\88Ñ\82ай. Ð\9aаб Ð¿Ñ\80авÑ\96лÑ\8cна Ð°Ñ\84оÑ\80мÑ\96Ñ\86Ñ\8c Ñ\83ваÑ\85од, Ð½Ð°Ð»ÐµÐ¶Ñ\8bÑ\86Ñ\8c Ð²Ñ\8bзнаÑ\87Ñ\8bÑ\86Ñ\8c Ð½Ð¾Ð²Ñ\8b Ð¿Ð°Ñ\80олÑ\8c Ð²Ð¾Ñ\81Ñ\8c Ñ\82Ñ\83Ñ\82:',
+'resetpass_announce' => 'Ð\9aаб Ð·Ð°Ð²Ñ\8fÑ\80Ñ\88Ñ\8bÑ\86Ñ\8c Ñ\83ваÑ\85од Ñ\83 Ñ\81Ñ\96Ñ\81Ñ\82Ñ\8dмÑ\83, Ð\92Ñ\8b Ð¿Ð°Ð²Ñ\96ннÑ\8b Ñ\9eÑ\81Ñ\82анавÑ\96Ñ\86Ñ\8c Ð½Ð¾Ð²Ñ\8b Ð¿Ð°Ñ\80олÑ\8c.',
 'resetpass_header' => 'Змяніць пароль рахунку',
 'oldpassword' => 'Стары пароль:',
 'newpassword' => 'Новы пароль:',
 'retypenew' => 'Новы пароль паўторна:',
 'resetpass_submit' => 'Наставіць пароль і ўвайсці',
-'changepassword-success' => 'Ваш пароль паспяхова зменены! Цяпер уваходзім...',
+'changepassword-success' => 'Ваш пароль паспяхова зменены!',
 'resetpass_forbidden' => 'Не дазволена мяняць паролі',
 'resetpass-no-info' => 'Трэба ўвайсці ў сістэму, каб звяртацца да гэтай старонкі наўпрост.',
 'resetpass-submit-loggedin' => 'Змяніць пароль',
@@ -1929,12 +1944,12 @@ $1',
 'watchlistanontext' => 'Каб паглядзець ці змяніць спіс назірання, трэба $1.',
 'watchnologin' => 'Без прадстаўлення',
 'watchnologintext' => 'Каб правіць свой спіс назірання, трэба [[Special:UserLogin|ўвайсці ў сістэму]].',
-'addwatch' => 'Дадаць у назіранае',
+'addwatch' => 'Дадаць у спіс назірання',
 'addedwatchtext' => "Старонка \"[[:\$1]]\" была дададзена да [[Special:Watchlist|назіраных]] вамі.
 Змяненні, якія адбудуцца з гэтай старонкай і з Размовай пра яе, будуць паказвацца там, і старонка будзе '''вылучацца шрыфтам''' у [[Special:RecentChanges|спісе нядаўніх змяненняў]], каб лягчэй пазнаваць яе.
 
 Калі вы не пажадаеце больш назіраць за гэтай старонкай, націсніце \"Не назіраць\" у бакоўцы.",
-'removewatch' => 'Выдаліць са спісу назірання',
+'removewatch' => 'Выдаліць са спіса назірання',
 'removedwatchtext' => 'Старонка "[[:$1]]" была вынята з вашага [[Special:Watchlist|спіса назірання]].',
 'watch' => 'Назіраць',
 'watchthispage' => 'Назіраць за гэтай старонкай',
@@ -2009,8 +2024,8 @@ $UNWATCHURL
 Пацвердзіце свой намер зрабіць гэта, сваё разуменне наступстваў, і што вы робіце гэта ў адпаведнасці з [[{{MediaWiki:Policy-url}}|палітыкай (асноўнымі правіламі)]].',
 'actioncomplete' => 'Завершана аперацыя',
 'actionfailed' => 'Памылка дзеяння',
-'deletedtext' => '"$1" было выдалена.
\91аÑ\87 $2 Ð¿Ð° Ð¶Ñ\83Ñ\80нал Ð½Ñ\8fдаÑ\9eнÑ\96Ñ\85 Ð²Ñ\8bдаленнÑ\8fÑ\9e.',
+'deletedtext' => 'Старонка "$1" была выдалена.
\97апÑ\96Ñ\81Ñ\8b Ð°Ð± Ð½Ñ\8fдаÑ\9eнÑ\96Ñ\85 Ð²Ñ\8bдаленнÑ\8fÑ\85 Ð³Ð». Ñ\9e $2.',
 'dellogpage' => 'Журнал сціранняў',
 'dellogpagetext' => 'Ніжэй паказаны спіс самых нядаўніх сціранняў.',
 'deletionlog' => 'журнал сціранняў',
@@ -2139,7 +2154,7 @@ $UNWATCHURL
 'undeletedpage' => "'''$1 была адноўлена'''
 
 Праверце пералік нядаўніх сціранняў і аднаўленняў у [[Special:Log/delete|журнале сціранняў]].",
-'undelete-header' => 'Ð\91аÑ\87 Ð½Ñ\8fдаÑ\9eна Ñ\81Ñ\86Ñ\91Ñ\80Ñ\82Ñ\8bÑ\8f Ñ\81Ñ\82аÑ\80онкÑ\96 Ñ\9e [[Special:Log/delete|журнале сціранняў]].',
+'undelete-header' => 'Ð\9dÑ\8fдаÑ\9eна Ñ\81Ñ\86Ñ\91Ñ\80Ñ\82Ñ\8bÑ\8f Ñ\81Ñ\82аÑ\80онкÑ\96 Ð¼Ð¾Ð¶Ð½Ð° Ð¿Ð°Ð³Ð»Ñ\8fдзеÑ\86Ñ\8c Ñ\83 [[Special:Log/delete|журнале сціранняў]].',
 'undelete-search-title' => 'Пошук выдаленых старонак',
 'undelete-search-box' => 'Знайсці ў сцёртых старонках',
 'undelete-search-prefix' => 'Паказаць старонкі, пачынаючы з:',
@@ -2295,7 +2310,7 @@ $1',
 'blocklog-showlog' => '{{GENDER:$1|Гэты ўдзельнік ужо блакіраваўся|Гэта ўдзельніца ўжо блакіравалася}} раней.
 Ніжэй прыведзены журнал блакіровак:',
 'blocklog-showsuppresslog' => 'Гэты ўдзельнік ужо заблакаваны і скрыты. Журнал утойвання прыведзены ніжэй:',
-'blocklogentry' => 'пастаўлены блок на "[[$1]]", з часам трывання $2 $3',
+'blocklogentry' => 'паставіў блок на "[[$1]]", з часам трывання $2 $3',
 'reblock-logentry' => 'змененыя настройкі блока для [[$1]] з часам згасання $2 $3',
 'blocklogtext' => 'Журнал пастаноўкі і здымання блокаў. Аўтаматычна блакаваныя адрасы IP тут не паказваюцца. Спіс актуальных забарон і блокаў бач у [[Special:BlockList|спісе блокаў IP]].',
 'unblocklogentry' => 'зняты блок з $1',
@@ -3286,15 +3301,15 @@ $5
 'watchlistedit-raw-legend' => 'Правіць нефарматаваны спіс назірання',
 'watchlistedit-raw-explain' => 'Назвы старонак з ліку назіраных паказаныя ніжэй, без афармлення, адна назва на адзін радок; такім чынам, спіс можна правіць як звычайны тэкст. Па сканчэнні націсніце "{{int:Watchlistedit-raw-submit}}". Таксама гэта можна зрабіць праз [[Special:EditWatchlist|стандартны інтэрфейс]].',
 'watchlistedit-raw-titles' => 'Назвы:',
-'watchlistedit-raw-submit' => 'Абнавіць Назіранае',
+'watchlistedit-raw-submit' => 'Абнавіць спіс назірання',
 'watchlistedit-raw-done' => 'Спіс назірання абноўлены.',
 'watchlistedit-raw-added' => 'Дапісаны{{PLURAL:$1| 1 складнік|я $1 складнікаў}}:',
 'watchlistedit-raw-removed' => 'Выняты{{PLURAL:$1| 1 складнік|я $1 складнікаў}}:',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'Паказаць змяненні',
-'watchlisttools-edit' => 'Паказаць назіранае',
-'watchlisttools-raw' => 'Паказаць нефарматаванае назіранае',
+'watchlisttools-edit' => 'Паказаць спіс назірання',
+'watchlisttools-raw' => 'Паказаць нефарматаваны спіс назірання',
 
 # Signatures
 'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|размовы]])',
index 928d7c2..0ae4846 100644 (file)
@@ -298,7 +298,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Адпраўляць мне копіі лістоў, якія я дасылаю іншым удзельнікам',
 'tog-diffonly' => 'Не паказваць зьмест старонкі пад параўнаньнем зьменаў',
 'tog-showhiddencats' => 'Паказваць схаваныя катэгорыі',
-'tog-noconvertlink' => 'Забараніць канвэртацыю назваў спасылак',
 'tog-norollbackdiff' => 'Не паказваць зьмены пасьля выкарыстаньня функцыі адкату',
 'tog-useeditwarning' => 'Папярэджваць мяне, калі я буду пакідаць старонку рэдагаваньня зь незахаванымі зьменамі',
 'tog-prefershttps' => 'Заўсёды карыстацца бясьпечным злучэньнем па ўваходзе ў сыстэму',
@@ -386,7 +385,7 @@ $messages = array(
 'category-empty' => "''Гэтая катэгорыя ня ўтрымлівае ні старонак, ні файлаў.''",
 'hidden-categories' => '{{PLURAL:$1|1=Схаваная катэгорыя|Схаваныя катэгорыі}}',
 'hidden-category-category' => 'Схаваныя катэгорыі',
-'category-subcat-count' => '{{PLURAL:$2|Гэтая катэгорыя зьмяшчае наступную падкатэгорыю.|Гэтая катэгорыя зьмяшчае {{PLURAL:$1|наступную $1 падкатэгорыю|наступныя $1 падкатэгорыі|наступныя $1 падкатэгорыяў}} з $2 агулам.}}',
+'category-subcat-count' => '{{PLURAL:$2|1=Гэтая катэгорыя зьмяшчае наступную падкатэгорыю.|Гэтая катэгорыя зьмяшчае {{PLURAL:$1|наступную $1 падкатэгорыю|наступныя $1 падкатэгорыі|наступныя $1 падкатэгорыяў}} з $2 агулам.}}',
 'category-subcat-count-limited' => 'У гэтай катэгорыі $1 {{PLURAL:$1|падкатэгорыя|падкатэгорыі|падкатэгорыяў}}.',
 'category-article-count' => '{{PLURAL:$2|1=Гэтая катэгорыя ўтрымлівае толькі адну старонку.|{{PLURAL:$1|Паказаная $1 старонка|Паказаныя $1 старонкі|Паказаныя $1 старонак}} гэтай катэгорыі з $2.}}',
 'category-article-count-limited' => 'У гэтай катэгорыі $1 {{PLURAL:$1|старонка|старонкі|старонак}}.',
@@ -803,6 +802,7 @@ $2',
 Калі Вы яго пазначыце, яно будзе выкарыстоўвацца для пазначэньня Вашай працы.',
 'pt-login' => 'Увайсьці',
 'pt-createaccount' => 'Стварыць рахунак',
+'pt-userlogout' => 'Выйсьці',
 
 # Email sending
 'php-mail-error-unknown' => 'Узьнікла невядомая памылка ў функцыі PHP mail()',
@@ -827,8 +827,12 @@ $2',
 'resetpass-wrong-oldpass' => 'Няслушны часовы альбо цяперашні пароль.
 Магчыма Вы ўжо пасьпяхова зьмянілі Ваш пароль альбо запыталі новы часовы пароль.',
 'resetpass-recycled' => 'Калі ласка, зьмяніце ваш пароль на нешта адрознае ад вашага цяперашняга паролю.',
+'resetpass-temp-emailed' => 'Вы ўвашлі з дапамогай часовага коду, які быў дасланы праз электронную пошту.
+Каб завершыць уваход, вы мусіце ўвесьці новы пароль:',
 'resetpass-temp-password' => 'Часовы пароль:',
 'resetpass-abort-generic' => 'Зьмяненьне паролю было скасаванае пашырэньнем.',
+'resetpass-expired' => 'Тэрмін дзеяньня вашага паролю скончыўся. Калі ласка, пазначце новы пароль для ўваходу ў сыстэму.',
+'resetpass-expired-soft' => 'Тэрмін дзеяньня вашага паролю скончыўся і ён патрабуе замены. Калі ласка, абярыце новы пароль цяпер або націсьніце «{{int:resetpass-submit-cancel}}», каб зьмяніць яго пазьней.',
 
 # Special:PasswordReset
 'passwordreset' => 'Ачыстка паролю',
@@ -1673,14 +1677,26 @@ $1",
 'recentchanges-label-plusminus' => 'Памер старонкі зьмяніўся на такую колькасьць байтаў',
 'recentchanges-legend-heading' => "'''Легенда:'''",
 'recentchanges-legend-newpage' => '(глядзіце таксама [[Special:NewPages|сьпіс новых старонак]])',
-'rcnotefrom' => "Ніжэй знаходзяцца зьмены з '''$2''' (да '''$1''' на старонку).",
+'rcnotefrom' => 'Ніжэй знаходзяцца зьмены з <strong>$2</strong> (да <strong>$1</strong> на старонку).',
 'rclistfrom' => 'Паказаць зьмены з $1',
 'rcshowhideminor' => '$1 дробныя праўкі',
+'rcshowhideminor-show' => 'Паказаць',
+'rcshowhideminor-hide' => 'Схаваць',
 'rcshowhidebots' => '$1 робатаў',
+'rcshowhidebots-show' => 'Паказаць',
+'rcshowhidebots-hide' => 'Схаваць',
 'rcshowhideliu' => '$1 зарэгістраваных карыстальнікаў',
+'rcshowhideliu-show' => 'Паказаць',
+'rcshowhideliu-hide' => 'Схаваць',
 'rcshowhideanons' => '$1 ананімаў',
+'rcshowhideanons-show' => 'Паказаць',
+'rcshowhideanons-hide' => 'Схаваць',
 'rcshowhidepatr' => '$1 патруляваныя праўкі',
+'rcshowhidepatr-show' => 'Паказаць',
+'rcshowhidepatr-hide' => 'Схаваць',
 'rcshowhidemine' => '$1 мае праўкі',
+'rcshowhidemine-show' => 'Паказаць',
+'rcshowhidemine-hide' => 'Схаваць',
 'rclinks' => 'Паказаць апошнія $1 зьменаў за мінулыя $2 дзён<br />$3',
 'diff' => 'розьн',
 'hist' => 'гіст',
@@ -1806,6 +1822,8 @@ $1",
 'uploaddisabledtext' => 'Загрузка файлаў забароненая.',
 'php-uploaddisabledtext' => 'Загрузка файлаў была адключаная ў парамэтрах канфігурацыі PHP. Калі ласка, праверце значэньне парамэтра «file_uploads».',
 'uploadscripted' => 'Гэты файл утрымлівае HTML-код альбо скрыпт, які можа памылкова апрацоўвацца браўзэрам.',
+'uploadscriptednamespace' => 'Гэты SVG-файл утрымлівае няслушную прастору назваў «$1»',
+'uploadinvalidxml' => 'Не атрымалася прааналізаваць XML у загружаным файле.',
 'uploadvirus' => 'Файл утрымлівае вірус! Падрабязнасьці: $1',
 'uploadjava' => 'Файл зьяўляецца ZIP-архівам, які зьмяшчае .class-файл Java.
 Загрузка Java-файлаў забароненая ў мэтах бясьпекі.',
@@ -2450,7 +2468,7 @@ $UNWATCHURL
 Выдаленьне такіх старонак было забароненае, каб пазьбегнуць праблемаў у працы {{GRAMMAR:родны|{{SITENAME}}}}.',
 'delete-warning-toobig' => 'Гэтая старонка мае доўгую гісторыю рэдагаваньняў, больш за $1 {{PLURAL:$1|вэрсію|вэрсіі|вэрсіяў}}.
 Яе выдаленьне можа выклікаць праблемы ў працы базы зьвестак {{GRAMMAR:родны|{{SITENAME}}}}; будзьце асьцярожны.',
-'deleting-backlinks-warning' => "'''Увага:''' іншыя старонкі ўключаюць або спасылаюцца на старонку, якую вы зьбіраецеся выдаліць.",
+'deleting-backlinks-warning' => "'''Увага:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|іншыя старонкі]] ўключаюць або спасылаюцца на старонку, якую вы зьбіраецеся выдаліць.",
 
 # Rollback
 'rollback' => 'Адкаціць рэдагаваньні',
@@ -2629,8 +2647,10 @@ $1',
 'sp-contributions-blocked-notice-anon' => 'Гэты IP-адрас у дадзены момант заблякаваны.
 Апошні запіс з журнала блякаваньняў пададзены ніжэй для даведкі:',
 'sp-contributions-search' => 'Пошук унёску',
+'sp-contributions-suppresslog' => 'выдалены ўнёсак удзельніка',
 'sp-contributions-username' => 'IP-адрас альбо імя ўдзельніка/ўдзельніцы:',
 'sp-contributions-toponly' => 'Паказваць толькі зьмены, якія зьяўляюцца апошнімі вэрсіямі',
+'sp-contributions-newonly' => 'Паказваць толькі праўкі, якімі былі створаныя старонкі',
 'sp-contributions-submit' => 'Шукаць',
 
 # What links here
@@ -2939,6 +2959,7 @@ $2',
 'thumbnail_image-type' => 'Тып выявы не падтрымліваецца',
 'thumbnail_gd-library' => 'Няпоўная канфігурацыя бібліятэкі GD: няма функцыі $1',
 'thumbnail_image-missing' => 'Верагодна няма файла $1',
+'thumbnail_image-failure-limit' => 'Было зроблена зашмат няўдалых спробаў ($1 ці болей) сфармаваць гэтую мініятуру. Калі ласка, паспрабуйце пазьней.',
 
 # Special:Import
 'import' => 'Імпартаваць старонкі',
@@ -2988,6 +3009,7 @@ $2',
 'import-error-special' => 'Старонка «$1» не была імпартаваная, таму што яна належыць да спэцыяльнай прасторы назваў, старонкі ў якой не дазволеныя.',
 'import-error-invalid' => 'Старонка «$1» не была імпартаваная з-за няслушнасьці назвы.',
 'import-error-unserialize' => 'Не атрымалася дэсэрыялізаваць вэрсію $2 старонкі «$1». Меркавалася, што вэрсія выкарыстоўвала мадэль зьвестак $3 і была сэрыялізавана ў фармаце $4.',
+'import-error-bad-location' => 'Праўка $2, якая выкарыстоўвае мадэль зьместу $3, ня можа быць захаваная ў «$1» гэтай вікі, таму што такая мадэль не падтрымліваецца на гэтай старонцы.',
 'import-options-wrong' => '{{PLURAL:$2|1=Няслушная налада|Няслушныя налады}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'Пазначаная назва карнявой старонкі няслушная.',
 'import-rootpage-nosubpage' => 'Падстаронкі ў прасторы назваў «$1» карнявой старонкі не дазволеныя.',
@@ -4003,12 +4025,12 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 'logentry-delete-delete' => '$1 {{GENDER:$2|выдаліў|выдаліла}} старонку $3',
 'logentry-delete-restore' => '$1 {{GENDER:$2|аднавіў|аднавіла}} старонку $3',
 'logentry-delete-event' => '$1 {{GENDER:$2|зьмяніў|зьмяніла}} бачнасьць $5 {{PLURAL:$5|1=падзеі ў журнале|падзеяў у журнале}} на $3: $4',
-'logentry-delete-revision' => '$1 {{GENDER:$2|зьмяніў|зьмяніла}} бачнасьць $5 {{PLURAL:$5|1=вэрсіі|вэрсіяў}} старонкі $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|зьмяніў|зьмяніла}} бачнасьць $5 {{PLURAL:$5|вэрсіі|вэрсіяў}} старонкі $3: $4',
 'logentry-delete-event-legacy' => '$1 {{GENDER:$2|зьмяніў|зьмяніла}} бачнасьць падзеяў у журнале на $3',
 'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|зьмяніў|зьмяніла}} бачнасьць вэрсіяў старонкі $3',
 'logentry-suppress-delete' => '$1 {{GENDER:$2|схаваў|схавала}} старонку $3',
-'logentry-suppress-event' => '$1 прыхавана {{GENDER:$2|зьмяніў|зьмяніла}} бачнасьць $5 {{PLURAL:$5|1=падзеі ў журнале|падзеяў у журнале}} на $3: $4',
-'logentry-suppress-revision' => '$1 прыхавана {{GENDER:$2|зьмяніў|зьмяніла}} бачнасьць $5 {{PLURAL:$5|1=вэрсіі|вэрсіяў}} старонкі $3: $4',
+'logentry-suppress-event' => '$1 прыхавана {{GENDER:$2|зьмяніў|зьмяніла}} бачнасьць $5 {{PLURAL:$5|падзеі ў журнале|падзеяў у журнале}} на $3: $4',
+'logentry-suppress-revision' => '$1 прыхавана {{GENDER:$2|зьмяніў|зьмяніла}} бачнасьць $5 {{PLURAL:$5|вэрсіі|вэрсіяў}} старонкі $3: $4',
 'logentry-suppress-event-legacy' => '$1 прыхавана {{GENDER:$2|зьмяніў|зьмяніла}} бачнасьць падзеяў у журнале на $3',
 'logentry-suppress-revision-legacy' => '$1 прыхавана {{GENDER:$2|зьмяніў|зьмяніоа}} бачнасьць вэрсіяў старонкі $3',
 'revdelete-content-hid' => 'зьмест схаваны',
@@ -4060,7 +4082,7 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 'api-error-badtoken' => 'Унутраная памылка: няслушны ключ.',
 'api-error-copyuploaddisabled' => 'Загрузка з URL-адрасу забароненая на гэтым сэрвэры.',
 'api-error-duplicate' => 'Ужо {{PLURAL:$1|1=існуе [$2 іншы файл]|існуюць [$2 іншыя файлы]}} з такім жа зьместам.',
-'api-error-duplicate-archive' => 'Раней на сайце {{PLURAL:$1|1=ўжо быў [$2 файл]|былі [$2 файлы]}} з дакладна такім жа зьместам, але {{PLURAL:$1|1=ён быў выдалены|яны былі выдаленыя}}.',
+'api-error-duplicate-archive' => 'Раней на сайце {{PLURAL:$1|1=быў [$2 файл]|былі [$2 файлы]}} з дакладна такім жа зьместам, але {{PLURAL:$1|1=ён быў выдалены|яны былі выдаленыя}}.',
 'api-error-duplicate-archive-popup-title' => 'Дублікаты {{PLURAL:$1|1=файла, які ўжо быў выдалены|файлаў, якія ўжо былі выдаленыя}}',
 'api-error-duplicate-popup-title' => '{{PLURAL:$1|1=Ідэнтычны файл|Ідэнтычныя файлы}}',
 'api-error-empty-file' => 'Дасланы Вамі файл быў пусты.',
@@ -4143,6 +4165,4 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 'expand_templates_generate_xml' => 'Паказаць дрэва аналізу XML',
 'expand_templates_preview' => 'Папярэдні прагляд',
 
-# Unknown messages
-'uploadinvalidxml' => 'Не атрымалася прааналізаваць XML у загружаным файле.',
 );
index e1057e9..051831d 100644 (file)
@@ -16,6 +16,7 @@
  * @author Kaganer
  * @author MegaAlex
  * @author Milicevic01
+ * @author Mitzev
  * @author Simona
  * @author Spiritia
  * @author Stanqo
@@ -633,6 +634,7 @@ $2',
 
 Администраторът, който го е заключил, е посочил следната причина: „$3“.',
 'exception-nologin-text' => 'За досъп до желаната страница или действие уикито изисква [[Special:Userlogin|влизане в системата]].',
+'exception-nologin-text-manual' => 'За достъп до избраното действие или страница е необходимо $1 в системата.',
 
 # Virus scanner
 'virus-badscanner' => "Лоша конфигурация: непознат скенер за вируси: ''$1''",
@@ -642,8 +644,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Излязохте от системата.'''
 
-Можете да продължите да използвате {{SITENAME}} анонимно или да <span class='plainlinks'>[$1 влезете отново]</span> като друг потребител.
-Обърнете внимание, че някои страници все още ще се показват така, сякаш сте влезли, докато не изтриете кеш-паметта на браузъра.",
+Обърнете внимание, че някои страници все още ще се показват така, сякаш сте влезли, докато не изтриете кеша на браузъра.",
 'welcomeuser' => 'Здравейте, $1!',
 'welcomecreation-msg' => 'Вашата сметка беше създадена.
 Можете да промените [[Special:Preferences|настройките на {{SITENAME}}]] според предпочитанията си.',
@@ -659,6 +660,7 @@ $2',
 'createacct-yourpasswordagain' => 'Потвърждаване на паролата',
 'createacct-yourpasswordagain-ph' => 'Въвежда се паролата (повторно)',
 'remembermypassword' => 'Запомняне на паролата на този компютър (най-много за $1 {{PLURAL:$1|ден|дни}})',
+'userlogin-remembermypassword' => 'Запомняне',
 'userlogin-signwithsecure' => 'Използване на защитена връзка',
 'yourdomainname' => 'Домейн:',
 'password-change-forbidden' => 'Не можете да променяте пароли в това уики.',
@@ -691,6 +693,7 @@ $2',
 'createacct-another-join' => 'Попълване на информацията за новата сметка',
 'createacct-emailrequired' => 'Адрес за електронна поща',
 'createacct-emailoptional' => 'Адрес за електронна поща (незадължително)',
+'createacct-email-ph' => 'Въведете Вашия адрес за електронна поща',
 'createacct-another-email-ph' => 'Въвежда се електронна поща',
 'createaccountmail' => 'Използване на случайна временна парола, която се изпраща на електронната поща, посочена по-долу',
 'createacct-realname' => 'Истинско име (незадължително)',
@@ -767,6 +770,11 @@ $2',
 'login-abort-generic' => 'Влизането беше неуспешно - Прекратено',
 'loginlanguagelabel' => 'Език: $1',
 'suspicious-userlogout' => 'Заявката ви за излизане от системата беше отхвърлена, тъй като изглежда е била изпратена погрешка от браузъра или кеширащото прокси.',
+'createacct-another-realname-tip' => 'Истинското име е незадължително.
+В случай, че бъде избрабо да се попълни, ще бъде използвано за да му се приписват приносите в уикито.',
+'pt-login' => 'Влизане',
+'pt-createaccount' => 'Създаване на сметка',
+'pt-userlogout' => 'Излизане',
 
 # Email sending
 'php-mail-error-unknown' => 'Неизвестна грешка в mail() функцията на PHP',
@@ -774,7 +782,7 @@ $2',
 
 # Change password dialog
 'changepassword' => 'Смяна на парола',
-'resetpass_announce' => 'Ð\92лÑ\8fзоÑ\85Ñ\82е Ñ\81 Ð²Ñ\80еменен ÐºÐ¾Ð´, Ð¿Ð¾Ð»Ñ\83Ñ\87ен Ð¿Ð¾ ÐµÐ»ÐµÐºÑ\82Ñ\80оннаÑ\82а Ð¿Ð¾Ñ\89а. Ð¡ÐµÐ³Ð° Ðµ Ð½Ñ\83жно Ð´Ð° Ñ\81и Ð¸Ð·Ð±ÐµÑ\80еÑ\82е Ð½Ð¾Ð²Ð° Ð¿Ð°Ñ\80ола:',
+'resetpass_announce' => 'Ð\97а Ð´Ð° Ñ\81е Ð·Ð°Ð²Ñ\8aÑ\80Ñ\88и Ð¿Ñ\80оÑ\86еÑ\81а Ð½Ð° Ð²Ð»Ð¸Ð·Ð°Ð½Ðµ, Ð½ÐµÐ¾Ð±Ñ\85одимо Ðµ Ð´Ð° Ñ\81е Ð¸Ð·Ð±ÐµÑ\80е Ð½Ð¾Ð²Ð° Ð¿Ð°Ñ\80ола.',
 'resetpass_text' => '<!-- Тук добавете текст -->',
 'resetpass_header' => 'Промяна на парола',
 'oldpassword' => 'Стара парола:',
@@ -1581,11 +1589,23 @@ $1",
 'rcnotefrom' => 'Дадени са промените от <strong>$2</strong> (до <strong>$1</strong> показани).',
 'rclistfrom' => 'Показване на промени, като се започва от $1.',
 'rcshowhideminor' => '$1 на малки промени',
+'rcshowhideminor-show' => 'Показване',
+'rcshowhideminor-hide' => 'Скриване',
 'rcshowhidebots' => '$1 на ботове',
+'rcshowhidebots-show' => 'Показване',
+'rcshowhidebots-hide' => 'Скриване',
 'rcshowhideliu' => '$1 на регистрирани потребители',
+'rcshowhideliu-show' => 'Показване',
+'rcshowhideliu-hide' => 'Скриване',
 'rcshowhideanons' => '$1 на анонимни потребители',
+'rcshowhideanons-show' => 'Показване',
+'rcshowhideanons-hide' => 'Скриване',
 'rcshowhidepatr' => '$1 на проверени редакции',
+'rcshowhidepatr-show' => 'Показване',
+'rcshowhidepatr-hide' => 'Скриване',
 'rcshowhidemine' => '$1 на моите приноси',
+'rcshowhidemine-show' => 'Показване',
+'rcshowhidemine-hide' => 'Скриване',
 'rclinks' => 'Показване на последните $1 промени за последните $2 дни<br />$3',
 'diff' => 'разл',
 'hist' => 'ист',
@@ -1706,6 +1726,7 @@ $1",
 'uploaddisabledtext' => 'Качването на файлове е забранено.',
 'php-uploaddisabledtext' => 'Качванията на файлове са спрени през PHP. Проверете настройката file_uploads.',
 'uploadscripted' => 'Файлът съдържа HTML или скриптов код, който може да бъде погрешно  интерпретиран от браузъра.',
+'uploadscriptednamespace' => 'Този SVG файл съдържа неправилно пространство на имената " $1 "',
 'uploadvirus' => 'Файлът съдържа вирус! Подробности: $1',
 'uploadjava' => 'Файлът е ZIP файл, който съдържа Java .class файл.
 Качването на Java файлове не е позволено, тъй като могат да причинят заобикаляне на ограниченията за сигурност.',
@@ -2006,6 +2027,7 @@ $1',
 'protectedpages-indef' => 'Само безсрочни защити',
 'protectedpages-cascade' => 'Само каскадни защити',
 'protectedpagesempty' => 'В момента няма защитени страници с тези параметри.',
+'protectedpages-reason' => 'Причина',
 'protectedtitles' => 'Защитени заглавия',
 'protectedtitlesempty' => 'В момента няма заглавия, защитени с тези параметри.',
 'listusers' => 'Списък на потребителите',
@@ -2432,6 +2454,7 @@ $1',
 'sp-contributions-search' => 'Търсене на приноси',
 'sp-contributions-username' => 'IP-адрес или потребителско име:',
 'sp-contributions-toponly' => 'Показване само на последните редакции',
+'sp-contributions-newonly' => 'Показване само на редакции свързани с началното създаване на страницата.',
 'sp-contributions-submit' => 'Търсене',
 
 # What links here
@@ -2714,6 +2737,7 @@ $1',
 'allmessages-prefix' => 'Филтриране по представка:',
 'allmessages-language' => 'Език:',
 'allmessages-filter-submit' => 'Отваряне',
+'allmessages-filter-translate' => 'Превеждане',
 
 # Thumbnails
 'thumbnail-more' => 'Увеличаване',
@@ -3572,7 +3596,13 @@ $5
 'version-hook-name' => 'Име на куката',
 'version-hook-subscribedby' => 'Ползвана от',
 'version-version' => '(Версия $1)',
-'version-license' => 'Лиценз',
+'version-license' => 'Лиценз на МедияУики',
+'version-ext-license' => 'Лиценз',
+'version-ext-colheader-version' => 'Версия',
+'version-ext-colheader-license' => 'Лиценз',
+'version-ext-colheader-description' => 'Описание',
+'version-ext-colheader-credits' => 'Автори',
+'version-license-title' => 'Лиценз за $1',
 'version-poweredby-credits' => "Това уики се задвиждва от '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'други',
 'version-poweredby-translators' => 'преводачи в translatewiki.net',
index ac198f4..4c6801b 100644 (file)
@@ -605,6 +605,9 @@ $2',
 'suspicious-userlogout' => 'আপনার প্রস্থানের অনুরোধ বাতিল হয়েছে কারণ অনুমিত যে আপনার ব্রাউজার অসম্পূর্ণ অথবা পূবর্বতী তথ্য প্রেরণ করেছে।',
 'createacct-another-realname-tip' => 'আসল নাম ঐচ্ছিক।
 আপনি যদি তা দিতে চান, তাহলে তা ব্যবহারকারীকে তাদের কাজের জন্য স্বীকৃতিদানে ব্যবহার করা হবে।',
+'pt-login' => 'প্রবেশ',
+'pt-createaccount' => 'অ্যাকাউন্ট তৈরি করুন',
+'pt-userlogout' => 'প্রস্থান',
 
 # Email sending
 'php-mail-error-unknown' => 'পিএইচপি এর মেইল () কার্যে অজ্ঞাত ভুল',
@@ -634,7 +637,7 @@ $2',
 'resetpass-temp-password' => 'অস্থায়ী শব্দচাবি:',
 'resetpass-abort-generic' => 'শব্দচাবি পরিবর্তন একটি এক্সটেনশনের কারণে স্থগিত করা হয়েছে।',
 'resetpass-expired' => 'আপনার পাসওয়ার্ডের মেয়াদ উত্তীর্ণ হয়েছে। অনুগ্রহ করে নতুন পাসওয়ার্ড নির্ধারণ করুন।',
-'resetpass-expired-soft' => 'আপনার পাসওয়ার্ড মেয়াদ উত্তীর্ণ হয়েছে, এবং আপনাকে একটি নতুন পাসওয়ার্ড নির্ধারণ করতে হবে। অনুগ্রহ করে এখনই একটি নতুন পাসওয়ার্ড নির্ধারণ করুন অথবা পরে পরিবর্তন করতে চাইলে বাতিল বাটনে ক্লিক করুন।',
+'resetpass-expired-soft' => 'আপনার পাসওয়ার্ডের মেয়াদ উত্তীর্ণ হয়েছে এবং আপনাকে একটি নতুন পাসওয়ার্ড নির্ধারণ করতে হবে। অনুগ্রহ করে এখনই একটি নতুন পাসওয়ার্ড নির্ধারণ করুন অথবা পরে পরিবর্তন করতে চাইলে "{{int:resetpass-submit-cancel}}" বাটনে ক্লিক করুন।',
 
 # Special:PasswordReset
 'passwordreset' => 'শব্দচাবি রিসেট',
@@ -1157,6 +1160,7 @@ $1",
 'searchrelated' => 'সম্পর্কিত',
 'searchall' => 'সমস্ত',
 'showingresults' => "নিচে '''$2''' নং থেকে শুরু করে {{PLURAL:$1|'''1''' ফলাফল|'''$1''' ফলাফলসমূহ}} দেখানো হল।",
+'showingresultsinrange' => '#<strong>$2</strong> থেকে #<strong>$3</strong> পরিসীমার মধ্যে {{PLURAL:$1|<strong>১টি</strong> ফলাফল|<strong>$1টি</strong> ফলাফল}} নিচে দেখানো হচ্ছে।',
 'showingresultsnum' => "নিম্নে {{PLURAL:$3|'''1''' ফলাফল|'''$3''' ফলাফলসমূহ}} দেখানো হয়েছে যা শুরু হয়েছে #'''$2''' দিয়ে।",
 'showingresultsheader' => "'''$4''' এর জন্য {{PLURAL:$5|ফলাফল '''$3''' এর '''$1'''|ফলাফলসমূহ '''$3''' এর মধ্যে '''$1 - $2'''}}",
 'search-nonefound' => 'খোঁজকৃত পাতার সাথে মিলে যায় এমন কোনো ফলাফল নেই।',
@@ -1472,14 +1476,26 @@ $1",
 'recentchanges-legend-heading' => "'''ব্যাখ্যামূলক বর্ণনা:'''",
 'recentchanges-legend-newpage' => '(আরও দেখুন [[Special:NewPages|নতুন পাতার তালিকা]])',
 'recentchanges-legend-plusminus' => "(''±১২৩'')",
-'rcnotefrom' => "'''$2'''-এর পরে সংঘটিত পরিবর্তনগুলো নিচে দেখানো হল ('''$1'''টি)।",
-'rclistfrom' => '$1-এর পর সংঘটিত নতুন পরিবর্তনগুলো দেখাও।',
+'rcnotefrom' => '<strong>$2</strong>টা থেকে সংঘটিত পরিবর্তনগুলি (সর্বোচ্চ <strong>$1টি</strong> দেখানো হয়েছে)',
+'rclistfrom' => '$2, $3 তারিখের পর সংঘটিত নতুন পরিবর্তনগুলো দেখাও',
 'rcshowhideminor' => 'অনুল্লেখ্য পরিবর্তনগুলো $1',
+'rcshowhideminor-show' => 'দেখাও',
+'rcshowhideminor-hide' => 'আড়াল করো',
 'rcshowhidebots' => 'বটগুলো $1',
+'rcshowhidebots-show' => 'দেখাও',
+'rcshowhidebots-hide' => 'আড়াল করো',
 'rcshowhideliu' => 'নিবন্ধিত ব্যবহারকারীদের $1',
+'rcshowhideliu-show' => 'দেখাও',
+'rcshowhideliu-hide' => 'আড়াল করো',
 'rcshowhideanons' => 'বেনামী ব্যবহারকারীদের $1',
+'rcshowhideanons-show' => 'দেখাও',
+'rcshowhideanons-hide' => 'আড়াল করো',
 'rcshowhidepatr' => 'পরীক্ষিত সম্পাদনা $1',
+'rcshowhidepatr-show' => 'দেখাও',
+'rcshowhidepatr-hide' => 'আড়াল করো',
 'rcshowhidemine' => 'আমার সম্পাদনাগুলো $1',
+'rcshowhidemine-show' => 'দেখাও',
+'rcshowhidemine-hide' => 'আড়াল করো',
 'rclinks' => "'''প্রদর্শনের ধরন'''<br />
 * বিগত ($2) দিনের শেষ ($1)টি পরিবর্তন দেখাও
 * $3",
@@ -1605,6 +1621,7 @@ $1",
 'php-uploaddisabledtext' => 'পিএইপি -এ ফাইল আপলোড নিস্ক্রিয় রয়েছে।
 অনুগ্রহ করে file_uploads সেটিং পরীক্ষা করুন।',
 'uploadscripted' => 'এই ফাইলে এমন HTML বা স্ক্রিপ্ট কোড আছে যা একটি ওয়েব ব্রাউজার ভুল বুঝতে পারে।',
+'uploadscriptednamespace' => 'এই SVG ফাইলে অবৈধ নামস্থান "$1" রয়েছে',
 'uploadvirus' => 'এই ফাইলটিতে ভাইরাস আছে! ব্যাখ্যা: $1',
 'uploadjava' => 'এটি একটি ZIP ফরম্যাটের ফাইল, যেখানে একটি জাভা .class ফরম্যাটের ফাইল রয়েছে।
 জাভা ফাইল আপলোডের কোনো অনুমতি নেই, কারণ এই ধরনের ফাইল সিস্টেমে নিরাপত্তা ত্রুটি তৈরী করতে পারে।',
@@ -2154,6 +2171,7 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 'watchmethod-list' => 'নজরে রাখা পাতাগুলিতে সাম্প্রতিক পরিবর্তন পরীক্ষা করা হচ্ছে',
 'watchlistcontains' => 'আপনার নজরতালিকায় $1 টি {{PLURAL:$1|পাতা|পাতা}} রয়েছে।',
 'iteminvalidname' => "'$1'নং আইটেমে সমস্যা, অবৈধ নাম...",
+'wlnote2' => '$3, $2 অনুসারে, সর্বশেষ {{PLURAL:$1|ঘণ্টার|<strong>$1</strong> ঘণ্টার}} পরিবর্তন নিচে দেয়া হয়েছে।',
 'wlshowlast' => 'দেখাও সর্বশেষ  $1 ঘন্টা $2 দিন $3',
 'watchlist-options' => 'নজর তালিকা পছন্দসমূহ',
 
@@ -2241,7 +2259,7 @@ $UNWATCHURL
 'delete-warning-toobig' => 'এই পাতাটির একটি বৃহৎ সম্পাদনা ইতিহাস রয়েছে, যা $1 {{PLURAL:$1|সংস্করণেরও|সংস্করণেরও}} বেশি।
 এই পাতাটি মুছে ফেললে তা {{SITENAME}} সাইটের ডেটাবেজ সমস্যার কারণ হতে পারে;
 সাবধানতার সাথে এগিয়ে যান।',
-'deleting-backlinks-warning' => "'''সতর্কীকরণ:''' আপনি যেটি মুছে ফেলতে যাচ্ছেন তা অন্যান্য পাতাসমূহের সাথে সংযুক্ত অথবা অন্তর্ভুক্ত করা আছে।",
+'deleting-backlinks-warning' => "'''সতর্কীকরণ:''' আপনি যেটি মুছে ফেলতে যাচ্ছেন তা [[Special:WhatLinksHere/{{FULLPAGENAME}}|অন্যান্য পাতাসমূহে]] সংযুক্ত অথবা অন্তর্ভুক্ত রয়েছে।",
 
 # Rollback
 'rollback' => 'সম্পাদনা ফিরিয়ে নিন',
@@ -2414,6 +2432,7 @@ $1',
 'sp-contributions-blocked-notice-anon' => 'এই আইপি ঠিকানাটি বর্তমানে বাধাদানকৃত অবস্থায় রয়েছে।
 তথ্যসূত্র হিসেবে সাম্প্রতিক বাধাদান লগের ভুক্তিটি নিচে দেওয়া হলো:',
 'sp-contributions-search' => 'অবদানসমূহের জন্য অনুসন্ধান',
+'sp-contributions-suppresslog' => 'মুছে ফেলা ব্যবহারকারী অবদান',
 'sp-contributions-username' => 'আইপি (IP) ঠিকানা অথবা ব্যবহারকারীর নাম:',
 'sp-contributions-toponly' => 'শুধুমাত্র সেই সম্পাদনাগুলি দেখাও যেগুলো সাম্প্রতিক সংস্করণের অন্তর্ভুক্ত।',
 'sp-contributions-submit' => 'অনুসন্ধান',
@@ -2516,7 +2535,7 @@ $1',
 'change-blocklink' => 'ব্লক অবস্থার পরিবর্তন করুন',
 'contribslink' => 'অবদান',
 'emaillink' => 'ই-মেইল পাঠাও',
-'autoblocker' => 'আপনাকে স্বয়ংক্রিয়ভাবে বাধা দেওয়া হয়েছে, কারণ আপনার আইপি ঠিকানাটি সম্প্রতি "[[User:$1|$1]]" ব্যবহার করেছেন।   $1-কে বাধাদানের কারণ: "$2"',
+'autoblocker' => 'আপনাকে স্বয়ংক্রিয়ভাবে বাধা দেওয়া হয়েছে, কারণ আপনার আইপি ঠিকানাটি সম্প্রতি "[[User:$1|$1]]" ব্যবহার করেছেন। $1-কে বাধাদানের কারণ "$2"',
 'blocklogpage' => 'বাধা দানের লগ',
 'blocklog-showlog' => 'এই ব্যবহারকারীকে পূর্বেও বাধা প্রদান করা হয়েছিলো।
 তথ্যসূত্র হিসেবে তাই পূর্বের বাধাদানের লগটি নিচে প্রদর্শন করা হচ্ছে:',
index 155e30a..37183a6 100644 (file)
@@ -29,40 +29,46 @@ $digitTransformTable = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'འོà½\82à¼\8bà½\90ིà½\82à¼\8bའà½\90ེà½\93à¼\8bà½\94།',
-'tog-hideminor' => 'རྩོà½\98à¼\8bསà¾\92ྲིà½\82à¼\8bà½\86ུà½\84à¼\8bà½\9aà½\82སà¼\8bསྦསà¼\8bà½\96།',
-'tog-hidepatrolled' => 'ལà¾\9fà¼\8bà½\9eིà½\96à¼\8bà½\96ྱསà¼\8bà½\94འིà¼\8bརྩོà½\98à¼\8bསà¾\92ྲིà½\82à¼\8bསྦསà¼\8bà½\96།',
-'tog-newpageshidepatrolled' => 'ཤོà½\82à¼\8bà½\84ོསà¼\8bà½\82སརà¼\8bà½\96རà¼\8bལà¾\9fà¼\8bà½\9eིà½\96à¼\8bà½\96ྱསà¼\8bà½\94འིà¼\8bརྩོà½\98à¼\8bསà¾\92ྲིà½\82à¼\8bསྦསà¼\8bà½\96།',
-'tog-extendwatchlist' => 'à½\98à½\89à½\98à¼\8bའà½\87ོà½\82à¼\8bà½\90ོà¼\8bà½\96à½\80ྲà½\98ས་ཏེ་ཉེ་ལམ་ཙམ་མིན་པར་བཟོ་བཅོས་ཡོངས་རྫོགས་སྟོན་ཅིག',
-'tog-usenewrc' => 'ཡརà¼\8bརà¾\92ྱསà¼\8bà½\85à½\93à¼\8bà½\82ྱིà¼\8bà½\89ེà¼\8bà½\96འིà¼\8bà½\96à½\9fོà¼\8bà½\96à½\85ོསà¼\8bà½\96ེà½\91à¼\8bསྤྱོà½\91à¼\8bà½\94à¼\8d(Java à½¡à½²à¼\8bà½\96རྡà¼\8bà½\86à½\91à¼\8bà½\91à½\82ོས)',
+'tog-underline' => 'འོà½\82à¼\8bà½\90ིà½\82à¼\8bà½\85à½\93à¼\8bལà¼\8bསྦྲེལà¼\8bà½\98à½\90ུà½\91།',
+'tog-hideminor' => 'à½\89ེà¼\8bà½\91ུསà¼\8bà½\80ྱིà¼\8bརྩོà½\98à¼\8bསà¾\92ྲིà½\82à¼\8bà½\82ལà¼\8bà½\86ུà½\84à¼\8bà½\82ྱིà¼\8bའà½\82ྱུརà¼\8bལྡོà½\82à¼\8bརྣà½\98སà¼\8bསྦས།',
+'tog-hidepatrolled' => 'à½\89ེà¼\8bà½\91ུསà¼\8bà½\80ྱིà¼\8bལà¾\9fà¼\8bà½\9eིà½\96à¼\8bà½\96ྱསà¼\8bà½\94འིà¼\8bརྩོà½\98à¼\8bསà¾\92ྲིà½\82à¼\8bརྣà½\98སà¼\8bསྦས།',
+'tog-newpageshidepatrolled' => 'ཤོà½\82à¼\8bà½\84ོསà¼\8bà½\82སརà¼\8bà½\96རà¼\8bལà¾\9fà¼\8bà½\9eིà½\96à¼\8bà½\96ྱསà¼\8bà½\94འིà¼\8bརྩོà½\98à¼\8bསà¾\92ྲིà½\82à¼\8bà½\80ྱིà¼\8bཤོà½\82à¼\8bà½\84ོསà¼\8bསྦས།',
+'tog-extendwatchlist' => 'ལà¾\9fà¼\8bà½\9eིà½\96à¼\8bà½\90ོà¼\8bརà¾\92ྱà¼\8bསà¾\90ྱེà½\91་ཏེ་ཉེ་ལམ་ཙམ་མིན་པར་བཟོ་བཅོས་ཡོངས་རྫོགས་སྟོན་ཅིག',
+'tog-usenewrc' => 'à½\89ེà¼\8bà½\96འིà¼\8bà½\96à½\9fོà¼\8bà½\96à½\85ོསà¼\8bà½\91à½\84à¼\8bà½\91à½\82སà¼\8bའà½\91ེà½\98སà¼\8bཤོà½\82à¼\8bà½\84ོསà¼\8bà½\80ྱིà¼\8bà½\96à½\85ོསà¼\8bའà½\82ྱུརà¼\8bརà¾\90ྱེà½\93à¼\8bà½\94སà¼\8bསྡེà¼\8bà½\9aà½\93à¼\8bà½\96à½\85ོསà¼\8bའà½\82ྱུརà¼\8bà½\95ྱིà½\93à¼\8bའà½\91ུà½\82à¼\8d',
 'tog-numberheadings' => 'རང་སྒྲིག་ཨང་རྟགས་འགོ་བརྗོད།',
-'tog-showtoolbar' => 'རྩོམ་སྒྲིག་ལག་ཆ་སྟོན།(JavaScript ཡི་བརྡ་ཆད་དགོས།)',
-'tog-editondblclick' => 'ཤོག་ངོས་རྩོམ་སྒྲིག་བྱེད་པར་ལན་གཉིས་རྡེབ།(JavaScript ཡི་བརྡ་ཆད་དགོས།)',
-'tog-rememberpassword' => 'ངའི་ནང་འཛུལ་བཤར་ལྟ་ཆས་འདི་རུ་མང་མཐའ་ཉིན $1 {{PLURAL:$1}} དྲན་པར་མཛོད།',
-'tog-watchcreations' => 'ངའི་ལྟ་ཐོའི་གྲས་སུ་གསར་བཟོ་བྱས་པ་ལ་ཤོག་ངོས་ཁ་སྣོན།',
-'tog-watchdefault' => 'ངའི་ལྟ་ཐོའི་གྲས་སུ་རྩོམ་སྒྲིག་བྱས་པ་ལ་ཤོག་ངོས་ཁ་སྣོན།',
-'tog-watchmoves' => 'ངའི་ལྟ་ཐོའི་གྲས་སུ་སྤོར་བ་ལ་ཤོག་ངོས་ཁ་སྣོན།',
-'tog-watchdeletion' => 'ངའི་ལྟ་ཐོའི་གྲས་སུ་དོར་བ་ལ་ཤོག་ངོས་ཁ་སྣོན།',
-'tog-previewontop' => 'རྩོམ་སྒྲིག་སྒྲོམ་གྱི་སྔོན་དུ་དཔེ་གཟུགས་སྟོན་པ།',
-'tog-previewonfirst' => 'ཐོག་མའི་རྩོམ་སྒྲིག་སྟེང་དུ་དཔེ་གཟུགས་སྟོན་པ།',
-'tog-enotifwatchlistpages' => 'ངའི་ལྟ་ཐོའི་ཤོག་ངོས་ལ་བཟོ་བཅོས་བྱུང་ཚེ་གློག་འཕྲིན་གཏང་རོགས།',
+'tog-showtoolbar' => 'རྩོམ་སྒྲིག་ལག་ཆ་སྟོན། (JavaScript ཡི་བརྡ་ཆད་དགོས།)',
+'tog-editondblclick' => 'ཤོག་ངོས་རྩོམ་སྒྲིག་བྱེད་པར་ལན་གཉིས་རྡེབ།',
+'tog-editsectiononrightclick' => 'དུམ་འཚམས་ཀྱི་འགོ་འརྗོད་ལ་འཐེབ་གཞོང་གཡས་པ་གནོན་ཏེ་དུམ་འཚམས་བཟོ་འཅོས་བྱེད་རོགས།',
+'tog-rememberpassword' => 'ངའི་ནང་འཛུལ་བཤར་ཆས་འདི་སྟེང་(མང་མཐར་ཉིན $1 དྲན་པར་མཛོད། )',
+'tog-watchcreations' => 'ངས་གསར་བཟོ་བྱས་པའི་ཤོག་ངོས་དང་ཡིག་ཆ་ཡར་འཇུག་བྱས་པ་རྣམས་ངའི་དགའ་འདེམས་ཐོ་ལ་སྣོན་རོགས།',
+'tog-watchdefault' => 'ངས་ཁ་སྣོན་བྱས་པའི་ཤོག་ངོས་དང་ཡིག་ཆ་རྣམས་ངའི་ལྟ་ཞིབ་ཐོ་ནང་སྣོན་རོགས།',
+'tog-watchmoves' => 'ངས་ཤོག་ངོས་དང་ཡིག་ཆ་ཕན་ཚུན་སྤོར་བ་རྣམས་ངའི་ལྟ་ཞིབ་ཐོའི་ནང་སྣོན་རོགས།',
+'tog-watchdeletion' => 'ངས་ཤོག་ངོས་དང་ཡིག་ཆ་སུབ་འདོར་བྱས་པ་རྣམས་ངའི་ལྟ་ཞིབ་ཐོའི་ནང་སྣོན་རོགས།',
+'tog-minordefault' => 'ཁ་སྣོན་རྩོམ་སྒྲིག་རྣམས་རང་འགུལ་གྱིས་རྩོམ་སྒྲིག་ཕལ་པར་རྟགས་རྒྱོབ་རོགས།',
+'tog-previewontop' => 'རྩོམ་སྒྲིག་སྒྲོམ་གྱི་སྟེང་སྔོན་ལྟའི་དཔེ་གཟུགས་སྟོན།',
+'tog-previewonfirst' => 'ཐེངས་དང་པོའི་རྩོམ་སྒྲིག་སྟེང་དུ་སྔོན་ལྟའི་དཔེ་གཟུགས་སྟོན།',
+'tog-enotifwatchlistpages' => 'ངའི་ལྟ་ཞིབ་ཐོ་ནང་གི་ཤོག་ངོས་དང་ཡིག་ཆ་རྣམས་ལ་འགྱུར་ལྡོག་བྱུང་ཚེ་ང་ལ་གློག་འཕྲིན་གཏོང་རོགས།',
 'tog-enotifusertalkpages' => 'ངའི་སྤྱོད་མིའི་གླེང་མོལ་ལ་བཟོ་བཅོས་བྱུང་ཚེ་གློག་འཕྲིན་གཏང་རོགས།',
-'tog-enotifminoredits' => 'རྩོམ་སྒྲིག་ཆུང་ཚགས་རིགས་ལའང་གློག་འཕྲིན་གཏོང་རོགས།',
+'tog-enotifminoredits' => 'རྩོམ་སྒྲིག་དང་ཡིག་ཆར་བཟོ་བཅོས་ཆུང་ཚགས་རིགས་བྱུང་ན་ཡང་གློག་འཕྲིན་གཏོང་རོགས།',
+'tog-enotifrevealaddr' => 'ངའི་གློག་འཕྲིན་ཁ་བྱང་འདི་བརྡ་ཐོའི་ཁ་བྱང་ནང་གསལ་སྟོན་བྱེད་རོགས།',
 'tog-shownumberswatching' => 'ཤོག་ངོས་ལ་ལྟ་བཞིན་པའི་སྤྱོད་མིའི་ཁ་གྲངས་སྟོན།',
 'tog-oldsig' => 'ད་ཡོད་མིང་རྟགས།',
-'tog-watchlisthideown' => 'ངའི་རྩོམ་སྒྲིག་རྣམས་ལྟ་ཐོ་ལས་སྦས་རོགས།',
-'tog-watchlisthideminor' => 'རྩོམ་སྒྲིག་ཕལ་བ་རྣམས་ལྟ་ཐོ་ལས་སྦས་རོགས།',
+'tog-watchlisthideown' => 'ངའི་རྩོམ་སྒྲིག་རྣམས་ལྟ་ཞིབ་ཐོ་ལས་སྦས་རོགས།',
+'tog-watchlisthidebots' => 'རང་འགུལ་འཕྱུལ་ཆས་ཀྱི་བཟོ་འཅོས་བྱས་པ་རྣམས་ངའི་ལྟ་ཞིབ་ཐོ་ལས་སྦས་རོགས།',
+'tog-watchlisthideminor' => 'རྩོམ་སྒྲིག་ཕལ་བ་རྣམས་ལྟ་ཞིབ་ཐོ་ལས་སྦས་རོགས།',
 'tog-watchlisthideliu' => 'ཐོ་འཛུལ་སྤྱོད་མིའི་རྩོམ་སྒྲིག་རྣམས་ལྟ་ཐོ་ལས་སྦས་རོགས།',
 'tog-ccmeonemails' => 'ངས་གཞན་ལ་བཏང་བའི་གློག་འཕྲིན་གྱི་འདྲ་བཤུས་སྐུར་རོགས།',
 'tog-showhiddencats' => 'སྦས་བའི་དཀར་ཆག་སྟོན་རོགས།',
+'tog-useeditwarning' => 'ངས་རྩོམ་སྒྲིག་ཤོག་ངོས་གང་རུང་ཐོག་བཟོ་འཅོས་རྣམས་ཉར་གཆོག་མ་བྱས་པར་འདོར་ན་ཉེན་བརྡ་གཏོང་རོགས།',
+'tog-prefershttps' => 'རྒྱན་དུ་ནང་འཛུལ་བྱས་བའི་སྐབས་བདེ་འཇགས་འབྲེལ་ལམ་བརྒྱུད་རོགས།',
 
-'underline-always' => 'à½\93à½\98à¼\8bཡà½\84à¼\8bà¼\8d',
-'underline-never' => 'à½\93à½\98à¼\8bཡà½\84à¼\8bà½\98ིà½\93།',
-'underline-default' => 'རà¾\92ྱསà¼\8bà½\96à¼\8bའà½\91ྲེà½\93à¼\8bà½\94།',
+'underline-always' => 'à½\91ུསà¼\8bརà¾\92ྱུà½\93à¼\8bà½\91ུà¼\8b',
+'underline-never' => 'à½\82à½\8fà½\93à¼\8bà½\93སà¼\8bà½\98à¼\8bà½\96ྱེà½\91།',
+'underline-default' => 'འཤརà¼\8bà½\86སà¼\8bà½\91à½\84à¼\8bརà¾\92ྱà½\96à¼\8bལà¾\97ོà½\84སà¼\8bརྣà½\98སà¼\8bརà½\84à¼\8bསོརà¼\8bà½\96à½\9eà½\82à¼\8bརོà½\82ས།',
 
 # Font style option in Special:Preferences
-'editfont-style' => 'རྩོམ་སྒྲིག་ཡིག་གཟུགས།',
-'editfont-default' => 'རà¾\92ྱསà¼\8bà½\94à¼\8bའà½\91ྲེà½\93à¼\8bà½\94།',
+'editfont-style' => 'རྩོà½\98à¼\8bསà¾\92ྲིà½\82à¼\8bà½\96à½\9fོà¼\8bའà½\85ོསà¼\8bà½\81ུལà¼\8bà½\82ྱིà¼\8bཡིà½\82à¼\8bà½\82à½\9fུà½\82སà¼\8d',
+'editfont-default' => 'འཤརà¼\8bà½\86སà¼\8bརà½\84à¼\8bསོརà¼\8bà½\96à½\9eà½\82།',
 'editfont-monospace' => 'བར་ཚད་མཉམ་པའི་ཡིག་གཟུགས།',
 'editfont-sansserif' => 'ཡིག་གཟུགས་རྭ་མེད།',
 'editfont-serif' => 'ཡིག་གཟུགས་རྭ་ཅན།',
@@ -82,18 +88,18 @@ $messages = array(
 'thu' => 'གཟའ་ཕུར་བུ།',
 'fri' => 'གཟའ་པ་སངས།',
 'sat' => 'གཟའ་སྤེན་པ།',
-'january' => 'ཟླ་དང་པོ།',
-'february' => 'ཟླ་གཉིས་པ།',
-'march' => 'ཟླ་གསུམ་པ།',
-'april' => 'ཟླ་བཞི་བ།',
-'may_long' => 'ཟྮ་ལྔ་བ།',
-'june' => 'ཟླ་དྲུག་པ།',
-'july' => 'ཟླ་བདུན་པ།',
-'august' => 'ཟླ་བརྒྱད་པ།',
-'september' => 'ཟླ་དགུ་བ།',
-'october' => 'ཟླ་བཅུ་བ།',
-'november' => 'ཟླ་བཅུ་གཅིག་པ།',
-'december' => 'ཟླ་བཅུ་གཉིས་པ།',
+'january' => 'à½\9fླà¼\8bà½\96à¼\8bà½\91à½\84à¼\8bà½\94ོà¼\8d',
+'february' => 'à½\9fླà¼\8bà½\96à¼\8bà½\82à½\89ིསà¼\8bà½\94à¼\8d',
+'march' => 'à½\9fླà¼\8bà½\96à¼\8bà½\82སུà½\98à¼\8bà½\94à¼\8d',
+'april' => 'à½\9fླà¼\8bà½\96à¼\8bà½\96à½\9eིà¼\8bà½\96à¼\8d',
+'may_long' => 'à½\9fྮà¼\8bà½\96à¼\8bལà¾\94à¼\8bà½\96à¼\8d',
+'june' => 'à½\9fླà¼\8bà½\96à¼\8bà½\91ྲུà½\82à¼\8bà½\94à¼\8d',
+'july' => 'à½\9fླà¼\8bà½\96à¼\8bà½\96à½\91ུà½\93à¼\8bà½\94à¼\8d',
+'august' => 'à½\9fླà¼\8bà½\96à¼\8bà½\96རà¾\92ྱà½\91à¼\8bà½\94à¼\8d',
+'september' => 'à½\9fླà¼\8bà½\96à¼\8bà½\91à½\82ུà¼\8bà½\96à¼\8d',
+'october' => 'à½\9fླà¼\8bà½\96à¼\8bà½\96à½\85ུà¼\8bà½\96à¼\8d',
+'november' => 'à½\9fླà¼\8bà½\96à¼\8bà½\96à½\85ུà¼\8bà½\82à½\85ིà½\82à¼\8bà½\94à¼\8d',
+'december' => 'à½\9fླà¼\8bà½\96à¼\8bà½\96à½\85ུà¼\8bà½\82à½\89ིསà¼\8bà½\94à¼\8d',
 'january-gen' => 'ཟླ་དང་པོ།',
 'february-gen' => 'ཟླ་གཉིས་པ།',
 'march-gen' => 'ཟླ་གསུམ་པ།',
@@ -106,9 +112,9 @@ $messages = array(
 'october-gen' => 'ཟླ་བཅུ་བ།',
 'november-gen' => 'ཟླ་བཅུ་གཅིག་པ།',
 'december-gen' => 'ཟླ་བཅུ་གཉིས་པ།',
-'jan' => 'ཟླ་དང་པོ།',
-'feb' => 'ཟླ་གཉིས་པ།',
-'mar' => 'ཟླ་གསུམ་པ།',
+'jan' => 'à½\9fླà¼\8bà½\96à¼\8bà½\91à½\84à¼\8bà½\94ོà¼\8d',
+'feb' => 'à½\9fླà¼\8bà½\96à¼\8bà½\82à½\89ིསà¼\8bà½\94à¼\8d',
+'mar' => 'à½\9fླà¼\8bà½\96à¼\8bà½\82སུà½\98à¼\8bà½\94à¼\8d',
 'apr' => 'ཟླ་བཞི་བ།',
 'may' => 'ཟླ་ལྔ་བ།',
 'jun' => 'ཟླ་དྲུག་པ།',
@@ -118,24 +124,45 @@ $messages = array(
 'oct' => 'ཟླ་བཅུ་བ།',
 'nov' => 'ཟླ་བཅུ་གཅིག་པ།',
 'dec' => 'ཟླ་བཅུ་གཉིས་པ།',
+'january-date' => 'ཟླ་བ་དང་པོ། $1',
+'february-date' => 'ཟླ་བ་གཉིས་པ། $1',
+'march-date' => 'ཟླ་བ་གསུམ་པ། $1',
+'april-date' => 'ཟླ་བ་བཞི་པ། $1',
+'may-date' => 'ཟླ་བ་ལྔ་པ། $1',
+'june-date' => 'ཟླ་བ་དྲུག་པ། $1',
+'july-date' => 'ཟླ་བ་བདུན་པ། $1',
+'august-date' => 'ཟླ་བ་བརྒྱད་པ། $1',
+'september-date' => 'ཟླ་བ་དགུ་པ། $1',
+'october-date' => 'ཟླ་བ་བཅུ་པ། $1',
+'november-date' => 'ཟླ་བ་བཅུ་གཅིག་པ། $1',
+'december-date' => 'ཟླ་བ་བཅུ་གཉིས་པ། $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:|སྡེ་ཚན་|སྡེ་ཚན་ $1}}',
 'category_header' => '"$1"ནང་་གི་ཤོག་ངོས།',
 'subcategories' => 'རིགས་གཏོགས།',
 'category-media-header' => '"$1"ནང་་གི་ཆ་འཕྲིན།',
-'category-empty' => "''སྡེ་ཚན་འདིའི་ནང་དུ་བར་སྐབས་སུ་ཤོག་ངོས་སམ་ཆ་འཕྲིན་མི་འདུག ''",
+'category-empty' => '<em> སྡེ་ཚན་འདིའི་ནང་དུ་བར་སྐབས་སུ་ཤོག་ངོས་སམ་བརྙན་རིས་མི་འདུག། </em>',
 'hidden-categories' => '|སྦས་བའི་སྡེ་ཚན།|སྦས་བའི་སྡེ་ཚན།}}{{PLURAL:$1',
 'hidden-category-category' => 'སྦས་བའི་སྡེ་ཚན།',
+'category-subcat-count' => '{{PLURAL:$2|སྡེ་ཙན་འདི་ནང་ཁྱོན་སྡོམས་པས་ $2 ནས་ གཤམ་གྱི་བྱེ་བྲག་སྡེ་ཚན།{{PLURAL:$1|subcategory|$1 subcategories}}ཙམ་འདུག།}}',
 'category-subcat-count-limited' => 'སྡེ་ཚན་འདིར་གཤམ་གྱི་བྱེ་བྲག་སྡེ་ཚན་{{PLURAL:$1|subcategory|$1 subcategories}}ཡོད།',
 'category-article-count' => '{{PLURAL:$2|སྡེ་ཚན་འདིར་གཤམ་གྱི་ཤོག་ངོས་ཁོ་ན་བསྡུས་ཡོད། |The following {{PLURAL:$1|page is|$1 pages are}} in this category, out of $2 total.}}',
+'category-article-count-limited' => 'གཤམ་གྱི་{{PLURAL:$1|ཤོག་ངོས་འདི་|$1 ཤོག་ངོས་རྣམས་}}ད་གནས་སྡེ་ཚན་འདི་ནང་ཡོད།',
+'category-file-count' => '{{PLURAL:$2|སྡེ་ཚན་འདི་ནང་གཤམ་གྱི་ཡིག་ཆ་ཁོ་ན་ཡོད།|གཤམ་གྱི་ {{PLURAL:$1|ཡིག་ཆ་འདི་|$1 ཡིག་ཆ་རྣམས་}} སྡེ་ཚན་འདི་ནང་གི་,ཁྱོན་བསྡོམས་གྱི་ $2 ནས་ཡིན།}}',
+'category-file-count-limited' => 'གཤམ་གྱི་{{PLURAL:$1|ཡིག་ཆ་འདི་|$1ཡིག་ཆ་རྣམས་}}ད་གནས་སྡེ་ཚན་འདི་ནང་ཡོད།',
+'listingcontinuesabbrev' => 'མུ་འཐུད།',
+'index-category' => 'དཀར་ཆག་ཅན་གྱི་ཤོག་ངོས།',
+'noindex-category' => 'དཀར་ཆག་མེད་པའི་ཤོག་ངོས།',
+'broken-file-category' => 'ཡིག་ཆའི་སྦྲེལ་མཐུད་འབོར་བརླག་སོང་བའི་ཤོག་ངོས།',
 
 'about' => 'སྐོར།',
 'article' => 'ནང་དོན་ཤོག་ངོས།',
 'newwindow' => '(སྒེའུ་ཁུང་གསར་བར་ཕྱེ་བ།)',
 'cancel' => 'རྩིས་མེད།',
 'moredotdotdot' => 'དེ་ལས་མང་བ་་་',
-'mypage' => 'ངའི་ཤོག་ངོས།',
+'morenotlisted' => 'ཐོ་གཞུང་འདི་ཆ་ཚང་མེད།',
+'mypage' => 'ཤོག་ངོས།',
 'mytalk' => 'གཏམ་གླེང།',
 'anontalk' => 'IP གནས་ཡུལ་འདི་ལ་གླེང་མོལ།',
 'navigation' => 'ཕྱོགས་ཁྲིད།',
@@ -143,7 +170,8 @@ $messages = array(
 
 # Cologne Blue skin
 'qbfind' => 'འཚོལ་བ།',
-'qbedit' => 'རྩོམ་སྒྲིག',
+'qbbrowse' => 'བཤེར་འཚོལ།',
+'qbedit' => 'བཟོ་འཅོས།',
 'qbpageoptions' => 'ཤོག་ངོས་འདི།',
 'qbmyoptions' => 'ངའི་ཤོག་ངོས།',
 'faq' => 'རྒྱུན་ལྡན་དྲི་བ།',
@@ -153,30 +181,32 @@ $messages = array(
 'vector-action-addsection' => 'བརྗོད་གཞི་ཁ་སྣོན།',
 'vector-action-delete' => 'སུབས།',
 'vector-action-move' => 'སྤོར་བ།',
-'vector-action-protect' => 'སྲུà½\84à¼\8bསà¾\90ྱོà½\96།',
-'vector-action-undelete' => 'à½\96སུà½\96སà¼\8bà½\94à¼\8bà½\82སོà¼\8bà½\96à¼\8d',
+'vector-action-protect' => 'འà½\82ོà½\82à¼\8bསྲུà½\84།',
+'vector-action-undelete' => 'à½\98ིà¼\8bà½\96སུà½\96སà¼\8b',
 'vector-action-unprotect' => 'སྲུང་སྐྱོབ་གློད་པ།',
 'vector-view-create' => 'གསར་བཟོ།',
 'vector-view-edit' => 'རྩོམ་སྒྲིག',
 'vector-view-history' => 'ལོ་རྒྱུས་ལ་ལྟ་བ།',
 'vector-view-view' => 'ཀློག་པ།',
 'vector-view-viewsource' => 'ཁུངས་ལ་ལྟ་བ།',
-'actions' => 'བྱ་འགུལ།',
-'namespaces' => 'མིང་འགོད་ས།',
+'actions' => 'བྱ་སྤྱོད།',
+'namespaces' => 'མིང་གནས།',
+'variants' => 'འགྱུར་ཚད།',
 
+'navigation-heading' => 'ཕྱོགས་ཁྲིད་འདེམས་བྱང།',
 'errorpagetitle' => 'ནོར་འཁྲུལ།',
 'returnto' => '$1 ལ་བསྐྱར་ལོག་བྱེད་པ།',
 'tagline' => 'ཡོང་ཁུངས་{{SITENAME}}',
-'help' => 'རོà½\82སà¼\8bརà½\98།',
+'help' => 'à½\95à½\93à¼\8bà½\82ྲོà½\82ས།',
 'search' => 'འཚོལ་བ།',
-'searchbutton' => 'འà½\9aོལà¼\8bà½\96à¼\8d',
+'searchbutton' => 'འཚོལ།',
 'go' => 'སོང་།',
 'searcharticle' => 'འཚོལ།',
 'history' => 'ཤོག་ངོས་ལོ་རྒྱུས།',
 'history_short' => 'ལོ་རྒྱུས།',
 'updatedmarker' => 'ཐེངས་སྔོན་མའི་ལྟ་ཀློག་རྗེས་ཀྱི་བཟོ་བཅོས།',
-'printableversion' => 'à½\91à½\94རà¼\8bà½\90ུà½\96à¼\8bà½\94།',
-'permalink' => 'རà¾\9fà½\82à¼\8bà½\96རà¾\9fà½\93à¼\8bà½\82ྱིà¼\8bà½\91ྲà¼\8bའà½\96ྲེལ།',
+'printableversion' => 'à½\94རà¼\8bའà½\91ེà½\96སà¼\8bརུà½\84à¼\8bà½\96འིà¼\8bའà½\82ྱུར།',
+'permalink' => 'à½\96རà¾\9fà½\93à¼\8bའà½\87à½\82སà¼\8bà½\80ྱིà¼\8bསྦྲེལà¼\8bà½\98à½\90ུà½\91།',
 'print' => 'དཔར་བ།',
 'view' => 'ལྟ་བ།',
 'edit' => 'རྩོམ་སྒྲིག',
@@ -185,22 +215,23 @@ $messages = array(
 'create-this-page' => 'ཤོག་ངོས་འདི་སྐྲུན་པ།',
 'delete' => 'སུབས།',
 'deletethispage' => 'ཤོག་ངོས་འདི་འདོར་བ།',
-'undelete_short' => '{{PLURAL:$1|one edit|$1edits}} མ་འདོར་ཞིག',
+'undeletethispage' => 'ཤོག་ངོས་འདི་མི་སུབ་རོགས།',
+'undelete_short' => '{{PLURAL:$1|བཟོ་འཅོས་གཅིག་|བཟོ་འཅོས་ $1}}མ་བསུབ་རོགས།',
 'viewdeleted_short' => '{{བསུབས་པའི་རྩོམ་སྒྲིག PLURAL:$1|བསུབས་པའི་རྩོམ་སྒྲིག $1}}ལ་ལྟ་བ།',
-'protect' => 'སྲུà½\84à¼\8bà½\96།',
+'protect' => 'འà½\82ོà½\82à¼\8bསྲུà½\84།',
 'protect_change' => 'སྒྱུར་བཅོས།',
 'protectthispage' => 'ཤོག་ངོས་འདི་སྲུང་བ།',
 'unprotect' => 'སྲུང་སྐྱོབ་བཅོས་བསྒྱུར།',
 'unprotectthispage' => 'ངོ་ཤོག་འདིའི་སྲུང་སྐྱོབ་བཅོས་བསྒྱུར།',
 'newpage' => 'ཤོག་ངོས་གསར་བ།',
 'talkpage' => 'ཤོག་ངོས་འདིར་གྲོས་སྡུར།',
-'talkpagelinktext' => 'à½\82ླེà½\84à¼\8bà½\98ོལ།',
+'talkpagelinktext' => 'à½\82à½\8fà½\98à¼\8bà½\82ླེà½\84།',
 'specialpage' => 'དམིགས་གསལ་ཤོག་ངོས།',
 'personaltools' => 'སྒེར་ཀྱི་ལག་ཆ།',
 'postcomment' => 'སྡེ་ཚན་གསར་བ།',
 'articlepage' => 'ནང་དོན་ཤོག་ངོས་ལ་ལྟ་བ།',
 'talk' => 'གྲོས་བསྡུར།',
-'views' => 'à½\98à½\90ོà½\84à¼\8bརིས།',
+'views' => 'ལà¾\9fà¼\8bà½\9eིà½\96།',
 'toolbox' => 'ལག་ཆའི་སྒམ།',
 'userpage' => 'སྤྱོད་མིའི་ཤོག་ངོས་ལ་ལྟ་བ།',
 'projectpage' => 'ལས་འཆར་ཤོག་ངོས་ལ་ལྟ་བ།',
@@ -210,61 +241,76 @@ $messages = array(
 'viewhelppage' => 'རོགས་རམ་ཤོག་ངོས་ལ་ལྟ་བ།',
 'categorypage' => 'སྡེ་ཚན་ཤོག་ངོས་སྟོན་ཅིག',
 'viewtalkpage' => 'གྲོས་མོལ་ལ་ལྟ་བ།',
-'otherlanguages' => 'སྐད་རིགས་གཞན།',
+'otherlanguages' => 'སà¾\90à½\91à¼\8bརིà½\82སà¼\8bà½\82à½\9eà½\93à¼\8bà½\90ོà½\82à¼\8d',
 'redirectedfrom' => '$1 ནས་ཁ་ཕྱོགས་བསྐྱར་དུ་བཟོས་པ།',
 'redirectpagesub' => 'རིམ་འགྲེམ་ཤོག་ངོས།',
-'lastmodifiedat' => 'དྲ་ངོས་འདི་ཡི་བཟོ་བཅོས་མཐའ་མ་$1 $2 ལ་རེད།',
+'lastmodifiedat' => 'ཤོག་ངོས་འདི་ཡི་བཟོ་བཅོས་མཐའ་མ་$1 ཀྱི་ $2 ལ་རེད།',
+'viewcount' => 'ཤོགངོས་འདི་{{PLURAL:$1|ཐེངས་གཅིག་|ཐེངས་ $1}}བལྟས་འདུག།',
 'protectedpage' => 'སྲུང་སྐྱོབ་བྱས་པའི་ཤོག་ངོས།',
 'jumpto' => 'གནས་སྤོ།',
 'jumptonavigation' => 'ཕྱོགས་ཁྲིད།',
 'jumptosearch' => 'འཚོལ།',
+'view-pool-error' => 'དགོངས་པ་མ་ཚོམས་རོགས། སྤྱོད་མི་མང་དག་ཞིག་གི་ཤོག་ངོས་འདིར་གཟིགས་ཞིང་འདུག་པས། གནས་སྐབས་རིང་ཞབས་ཞུ་འཕྲུལ་ཆས་ཐེག་བརྒལ་བྱས་འདུག། 
+ཤོག་ངོས་འདིར་བསྐྱར་དུ་མ་གཟིགས་གོང་ཡུད་ཙམ་རིང་སྒུག་རོགས་གནང། $1',
+'pool-timeout' => 'ཟྭ་རྒྱག་སྒུག་ཡུན་གྱི་དུས་ཚོད་རྫོགས་སོང།',
+'pool-queuefull' => 'སྤྱི་པའི་ཐེབས་རྩའི་བསྟར་པ་ཁེངས་འདུག།',
 'pool-errorunknown' => 'ངོས་མ་ཟིན་པའི་ནོར་འཁྲུལ།',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
-'aboutsite' => '{{SITENAME}}à½\84ེà½\91à¼\8bà½\80ྱི་སྐོར།',
-'aboutpage' => 'Project: ཡི་སྐོར།',
-'copyright' => 'à½\91ྲà¼\8bà½\96འིà¼\8bà½\93à½\84à¼\8bà½\91ོà½\93à¼\8b$1སྟེང་དུ་ཡོད།',
+'aboutsite' => '{{SITENAME}}ཡི་སྐོར།',
+'aboutpage' => 'Project:སྐོར།',
+'copyright' => 'à½\91ེà¼\8bà½\98ིà½\93à¼\8bà½\82ྱིà¼\8bà½\98à½\86à½\93à¼\8bའà½\82ྲེལà¼\8bཡོà½\91à¼\8bà½\93à¼\8bà½\98à¼\8bà½\82à½\8fོà½\82སà¼\8d à½\91ྲà¼\8bà½\96འིà¼\8bà½\93à½\84à¼\8bà½\91ོà½\93à¼\8b $1 སྟེང་དུ་ཡོད།',
 'copyrightpage' => '{{ns:project}}:པར་དབང་།',
-'currentevents' => 'à½\91à¼\8bལà¾\9fའིà¼\8bà½\96ྱà¼\8bà½\96།',
-'currentevents-url' => 'Project:à½\91à¼\8bལà¾\9fའིà¼\8bà½\96ྱà¼\8bà½\96།',
-'disclaimers' => 'à½\91à½\82à½\82à¼\8bà½\96ྱ།',
-'disclaimerpage' => 'Project:སྤྱིའིà¼\8bà½\91à½\82à½\82à¼\8bà½\96ྱ།',
+'currentevents' => 'à½\91à¼\8bལà¾\9fའིà¼\8bà½\91ོà½\93à¼\8bà½\82à½\93à½\91།',
+'currentevents-url' => 'Project:à½\91à¼\8bལà¾\9fའིà¼\8bà½\91ོà½\93à¼\8bà½\82à½\93à½\91།',
+'disclaimers' => 'à½\96à½\91à½\82à¼\8bསྤྲོà½\91à¼\8bའà½\91ོརà¼\8bà½\98à½\81à½\93།',
+'disclaimerpage' => 'Project:ཡོà½\84སà¼\8bà½\81ྱà½\96à¼\8bà½\80ྱིà¼\8bà½\96à½\91à½\82à¼\8bསྤྲོà½\91à¼\8bà½\81ེà¼\8bà½\91à½\96à½\84à¼\8bརྩོà½\91à¼\8bལེà½\93།',
 'edithelp' => 'རྩོམ་སྒྲིག་རོགས་རམ།',
-'helppage' => 'Help:à½\93à½\84à¼\8bà½\91ོà½\93à¼\8b',
-'mainpage' => 'གཙོ་ངོས།',
-'mainpage-description' => 'གཙོ་ངོས།',
+'helppage' => 'Help:à½\93à½\84à¼\8bà½\91ོà½\93à¼\8d',
+'mainpage' => 'à½\82à½\99ོà¼\8bà½\82à½\93à½\91à¼\8bཤོà½\82à¼\8bà½\84ོསà¼\8d',
+'mainpage-description' => 'à½\82à½\99ོà¼\8bà½\82à½\93à½\91à¼\8bཤོà½\82à¼\8bà½\84ོསà¼\8d',
 'policy-url' => 'Project: སྒྲིག་གཞི།',
-'portal' => 'ཁོངས་མི་འདུ་ར།',
-'privacy' => 'སྒེར་ཁྲིམས།',
-'privacypage' => 'Project: སྒེར་ཁྲིམས།',
+'portal' => 'ཁོངས་མི་གཞུང་སྒོ།',
+'portal-url' => 'Project:ཁོངས་མི་འདུ་རའི་གཞུང་སྒོ་',
+'privacy' => 'གསང་དོན་གན་རྒྱ།',
+'privacypage' => 'Project: གསང་དོན་གན་རྒྱ།',
 
 'badaccess' => 'ཆོག་ཆན་ལ་ནོར་འཁྲུལ།',
 
+'versionrequired' => 'ཝེ་ཁེ་བརྒྱུད་ལམ་གྱི་འགྱུར།  MediaWiki Version $1 དེ་དགོས་འདུག།',
+'versionrequiredtext' => 'ཤོག་ངོས་འདི་བེད་སྤྱོད་པར་ཝེ་ཁེ་བརྒྱུད་ལམ་གྱི་འགྱུར་ $1 འདི་དགོས། [[Special:Version|version page]] འདིར་གཟིགས་རོགས།',
+
 'ok' => 'འགྲིག',
-'retrievedfrom' => '"$1"ལསà¼\8bརà¾\99ེà½\91à¼\8bà½\94།',
+'retrievedfrom' => '"$1"ལསà¼\8bསླརà¼\8bརà¾\99ེà½\91à¼\8bསོà½\84།',
 'youhavenewmessages' => 'ཁྱེད་ལ་འཕྲིན་གསར་$1($2)ཡོད།',
 'youhavenewmessagesmulti' => 'ཁྱེད་ལ་ $1 སྟེང་དུ་འཕྲིན་ཡིག་འདུག',
-'editsection' => 'རྩོམ་སྒྲིག',
+'editsection' => 'རྩོམ་སྒྲིག',
 'editold' => 'རྩོམ་སྒྲིག',
 'viewsourceold' => 'ཁོངས་ལ་ལྟ་བ།',
 'editlink' => 'བཟོ་བཅོས།',
 'viewsourcelink' => 'ཁོངས་ལ་ལྟ་བ།',
-'editsectionhint' => 'རྩོམ་སྒྲིག་སྡེ་ཚན།$1',
-'toc' => 'à½\9fུརà¼\8bà½\98à½\86ན།',
+'editsectionhint' => 'རྩོམ་སྒྲིག་སྡེ་ཚན།$1',
+'toc' => 'à½\93à½\84à¼\8bà½\91ོན།',
 'showtoc' => 'སྟོན།',
 'hidetoc' => 'སྦས།',
 'collapsible-collapse' => 'རྡིབ་སྐྱོན།',
-'viewdeleted' => ' $1 ལ་ལྟའམ།',
+'collapsible-expand' => 'རྒྱ་སྐྱེད།',
+'thisisdeleted' => '$1 ལ་ལྟ་བའམ་རང་ལོགས་བྱེད་རོགས།',
+'viewdeleted' => ' $1 ལ་ལྟ་དགོས་སམ།',
+'feedlinks' => 'འདྲན་ཆས། :',
 'site-rss-feed' => '$1 ཡི་RSS འབྱུང་ཁུངས།',
-'site-atom-feed' => '$1 ཡི་Atom འབྱུང་ཁུངས།',
+'site-atom-feed' => '$1 ཡི་ཆ་ཤས་ཡ་ལན།',
 'page-rss-feed' => '$1 ཡི་RSS འབྱུང་ཁུངས།',
 'page-atom-feed' => '$1 ཡི་Atom འབྱུང་ཁུངས།',
-'red-link-title' => '$1 ( ཤོག་ངོས་མེད་པ།)',
+'red-link-title' => '$1 (ཤོག་ངོས་མེད་པ།)',
+'sort-descending' => 'མར་རིམ་སྒྲིགས་',
+'sort-ascending' => 'ཡར་རིམ་སྒྲིགས།',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'རྩོà½\98à¼\8bཡིà½\82',
+'nstab-main' => 'ཤོà½\82à¼\8bà½\84ོསà¼\8d',
 'nstab-user' => 'སྤྱོད་མིའི་ཤོག་ངོས།',
-'nstab-special' => 'དམིཊ་གསལ་ཤོག་ངོས།',
+'nstab-media' => 'འཕྲིན་ལམ་ཤོག་ངོས།',
+'nstab-special' => 'ཆེད་ལས་ཤོག་ངོས།',
 'nstab-project' => 'ལས་འཆར་ཤོག་ངོས།',
 'nstab-image' => 'ཡིག་ཆ།',
 'nstab-mediawiki' => 'སྐད་ཆ།',
@@ -279,11 +325,23 @@ $messages = array(
 # General errors
 'error' => 'ནོར་འཁྲུལ།',
 'readonly' => 'གཞི་གྲངས་མཛོད་ཟྭ་བརྒྱབ་པ།',
+'missing-article' => 'གཞི་གྲངས་མཛོད་ནང་ཤོག་ངོས་ཀྱི་ཡི་གེ་བཙལ་ཐུབ་ཀྱི་མི་འདུག་པས། "$1" $2 
+ཕལ་ཆེར་འདི་གཤམ་ཀྱི་འགོག་རྐྱེན་ལོ་རྒྱུས་སུབ་པ་འམ་དུས་ཡོལ་ཀྱི་ཁྱད་པར་སོགས་ཀྱི་རྒྱུ་རྐྱེན་ཡིན།
+གལ་སྲིད་དེ་ལྟར་མིན་ཚེ། ཕལ་ཆེར་ཁྱེད་ཀྱི་ནོར་སྐྱོན་འཙལ་རྙེད་བྱང་བས།  [[Special:ListUsers/sysop|administrator]], དྲ་རྒྱའི་ས་ཚིགས་འདི་ཐོག་ཞུ་ཡིག་འབུལ་གནང་ཡོང་བ་མཁྱེན།',
 'internalerror' => 'ནང་ལོག་ནོར་སྐྱོན།',
 'internalerror_info' => 'ནང་ལོགས་ནོར་སྐྱོན། $1',
 'filecopyerror' => '"$1" "$2"ལ་འདྲ་བཤུ་བྱེད་མ་ཐུབ།',
+'filerenameerror' => '"$1" ནས་ "$2" བར་མིང་བརྗེ་སྒྱུར་ཐུབ་མ་སོང།',
 'filedeleteerror' => '"$1"ཟེར་བ་སུབ་མ་ཐུབ།',
-'filenotfound' => '"$1"ཟེར་བའི་ཡིག་ཆ་མ་རྙེད་པ།',
+'directorycreateerror' => 'དཀར་ཆག་ "$1" འདི་བཟོ་ཐུབ་མ་སོང།',
+'filenotfound' => '"$1" ཟེར་བའི་ཡིག་ཆ་རྙེད་ཀྱི་མིན་འདུག།',
+'fileexistserror' => 'ཡིག་ཆ་ "$1" འདི་འབྲི་ཐུབ་ཀྱིན་མི་འདུག། ཡིག་ཆ་འདི་བཞིན་འདི་སྔ་ནས་འདུག།',
+'unexpected' => 'ཡོང་མི་སྲིད་པའི་ཁྱད་ཆོས། : "$1"="$2"',
+'formerror' => 'ནོར་འཁྲུལ།:འགེངས་ཤོག་འབུལ་ཐུབ་མ་སོང།',
+'badarticleerror' => 'ཤོག་ངོས་འདི་ཐོག་ལག་བསྟར་བྱེད་ཐུབ་ཀྱི་མ་རེད།',
+'cannotdelete' => 'ཤོག་ངོས་འམ་ཡིག་ཆ་ "$1" འདི་སུབས་ཐུབ་མ་ཀྱི་མིན་འདུག། ཕལ་ཆེར་གཞན་ཞིག་གི་སུབས་ཚར་འདུག།',
+'cannotdelete-title' => 'ཤོག་ངོས་ "$1" འདི་སུབས་ཐུབ་མ་སོང།',
+'delete-hook-aborted' => 'འབྲི་སུབས་འདི་བཀག་འགོག་བྱས་སོང། རྒྱུ་རྐྱེན་བྲིས་མིན་འདུག།',
 'badtitle' => 'ཁ་བྱང་སྐྱོན་ཅན།',
 'viewsource' => 'ཁོངས་ལ་ལྟ་བ།',
 'actionthrottled' => 'བྱ་འགུལ་ཁེགས་སོང་།',
@@ -296,7 +354,7 @@ $messages = array(
 # Login and logout pages
 'yourname' => 'སྤྱོད་མིང་།',
 'yourpassword' => 'ལམ་ཡིག',
-'yourpasswordagain' => 'ལà½\98à¼\8bཡིà½\82à¼\8bསà¾\90ྱརà¼\8bà½\82à½\8fà½\82སà¼\8bà½\96ྱོས།',
+'yourpasswordagain' => 'à½\82སà½\84à¼\8bà½\96འིà¼\8bཨà½\84à¼\8bà½\84ོསà¼\8bའà½\9bིà½\93à¼\8bà½\82à½\93à½\84à¼\8bརོà½\82ས།',
 'remembermypassword' => 'ངའི་ལམ་ཡིག་འདིར་(མང་མཐའ་ཉིན $1 {{PLURAL:$1}}) དྲན་པར་བྱས།',
 'login' => 'ནང་འཛུལ།',
 'nav-login-createaccount' => 'ནང་འཛུལ། / ཐོ་འགོད།',
@@ -307,11 +365,13 @@ $messages = array(
 'notloggedin' => 'ནང་འཛུལ་བྱས་མེད།',
 'nologinlink' => 'ཐོ་ཞིག་འགོད་པ།',
 'createaccount' => 'ཐོ་འགོད།',
+'gotaccount' => '$1 སྔོན་ཚུད་ནས་རྩིས་ཁྲ་ཡོད་དམ།',
 'gotaccountlink' => 'ནང་འཛུལ།',
-'createaccountmail' => 'གློག་འཕྲིན་སྤྱད་དེ།',
+'userlogin-resetlink' => 'ཁྱེད་ཀྱི་ནང་འཛུལ་ཀྱི་ཞིབ་ཕྲའི་གནད་དོན་བརྗེད་འདུག་གམ།',
+'createaccountmail' => 'སྐབས་འཕྲལ་རང་མོས་གྱི་གསང་བའི་ཨང་གྲངས་བེད་སྤྱད་པ་དང། ལྷན་དུ་གློག་འཕྲིན་ཁ་བྱང་ངེས་གཏན་ཞིག་ལ་བསྐུར་རོགས།',
 'createaccountreason' => 'རྒྱུ་མཚན།',
 'badretype' => 'ལམ་ཡིག་གང་བཅུག་པ་ཐོ་ཐུག་མ་བྱུང་།',
-'userexists' => 'à½\98ིà½\84à¼\8bའà½\91ིà¼\8bà½\96ེà½\91à¼\8bསྤྱོà½\91à¼\8bà½\96ྱསà¼\8bà½\9fིà½\93à¼\8bà½\94སà¼\8bà½\98ིà½\84à¼\8bà½\82à½\9eà½\93à¼\8bà½\9eིà½\82à¼\8bà½\82à½\91à½\98་རོགས།',
+'userexists' => 'སྤྱོà½\91à¼\8bà½\98ིà½\84à¼\8bའà½\91ིà¼\8bསà¾\94ོà½\93à¼\8bà½\9aུà½\91à¼\8bà½\93སà¼\8bà½\96ེà½\91à¼\8bསྤྱོà½\91à¼\8bà½\96ྱསà¼\8bà½\9fིà½\93à¼\8bའà½\91ུà½\82à¼\8bà½\94སà¼\8d à½\98ིà½\84à¼\8bà½\82à½\9eà½\93à¼\8bà½\9eིà½\82à¼\8bà½\82à½\91à½\98à¼\8bà½\82à½\93à½\84་རོགས།',
 'loginerror' => 'ནང་འཛུལ་ནོར་སྐྱོན།',
 'loginsuccesstitle' => 'ནང་འཛུལ་བདེ་བར་གྲུབ།',
 'nosuchusershort' => 'སྤྱོད་མི་"$1"ཟེར་བ་མི་འདུག དག་ཆར་བསྐྱར་ཞིབ་བྱོས།',
@@ -319,12 +379,12 @@ $messages = array(
 'login-userblocked' => 'སྤྱོད་མི་འདི་བཀག་འགོག་བྱས་པས་ནང་འཛུལ་གྱི་ཆོག་མཆན་མེད།',
 'wrongpassword' => 'ལམ་ཡིག་ནོར་འདུག བསྐྱར་དུ་ཚོད་ལྟ་བྱོས།',
 'wrongpasswordempty' => 'ལམ་ཡིག་སྟོང་པ་རེད། བསྐྱར་དུ་ཚོད་ལྟ་བྱོས།',
-'mailmypassword' => 'à½\82ློà½\82à¼\8bའà½\95ྲིà½\93à¼\8bལà½\98à¼\8bཡིà½\82à¼\8bà½\82སརà¼\8bà½\96།',
+'mailmypassword' => 'à½\82སà½\84à¼\8bà½\96འིà¼\8bཨà½\84à¼\8bà½\82ྲà½\84སà¼\8bà½\96སà¾\90ྱརà¼\8bà½\96à½\9fོà¼\8bà½\82à½\93à½\84à¼\8bརོà½\82ས།',
 'loginlanguagelabel' => 'སྐད་རིགས། $1',
 
 # Change password dialog
 'changepassword' => 'ལམ་ཡིག་བརྗེ་བ།',
-'resetpass_announce' => 'à½\81ྱེà½\91à¼\8bà½\80ྱིསà¼\8bà½\84à¼\8bà½\9aོསà¼\8bà½\96à½\8fà½\84à¼\8bà½\96འིà¼\8bà½\82à½\93སà¼\8bསà¾\90à½\96སà¼\8bལà½\98à¼\8bཡིà½\82à¼\8bལà¼\8bà½\96རà¾\9fེà½\93à¼\8bà½\93སà¼\8bà½\93à½\84à¼\8bའà½\9bུལà¼\8bà½\96ྱསà¼\8bའà½\91ུà½\82 à½\93à½\84à¼\8bའà½\9bུལà¼\8bà½\86à¼\8bà½\9aà½\84à¼\8bà½\96à¼\8bà½\96ྱེà½\91à¼\8bà½\94རà¼\8bའà½\91ིརà¼\8bà½\84ེསà¼\8bà½\94རà¼\8bà½\91ུà¼\8bལà½\98à¼\8bཡིà½\82à¼\8bà½\82སརà¼\8bà½\96à¼\8bའà½\87ུà½\82à¼\8bà½\91à½\82ོས།',
+'resetpass_announce' => 'à½\93à½\84à¼\8bའà½\9bུལà¼\8bà½\96ྱེà½\91à¼\8bà½\94རà¼\8d à½\81ྱེà½\91à¼\8bà½\80ྱིསà¼\8bà½\82སà½\84à¼\8bà½\96འིà¼\8bཨà½\84à¼\8bà½\82སརà¼\8bà½\94à¼\8bà½\9eིà½\82à¼\8bའà½\87ུà½\82à¼\8bརོà½\82ས།',
 'oldpassword' => 'ལམ་ཡིག་རྙིང་བ།',
 'newpassword' => 'ལམ་ཡིག་གསར་བ།',
 'retypenew' => 'ལམ་ཡིག་གསར་བ་བསྐྱར་འཇུག་བྱོས།',
@@ -360,6 +420,7 @@ $messages = array(
 'headline_tip' => 'རིམ་པ། ༢ འགོ་ཕྲེང་།',
 'nowiki_sample' => 'རྣམ་བཞག་མེད་པའི་ཡི་གེ་འདྲེན་པ།',
 'nowiki_tip' => 'ཝེ་ཁེའི་རྣམ་གཞག་དོར་བ།',
+'image_tip' => 'བཙུད་འཇུག་ཡིག་ཆ།',
 'media_tip' => 'ཡིག་ཆ་སྦྲེལ་མཐུད།',
 'sig_tip' => 'མིང་རྟགས་མཉམ་དུ་ཟླ་ཚེས་ཐེལ་ཙེ།',
 'hr_tip' => 'ཐད་ཐིག ༼ཆུད་ཟོས་མེད་པར།༽',
@@ -386,6 +447,10 @@ $messages = array(
 'loginreqpagetext' => 'ཤོག་ངོས་གཞན་རྣམས་ལྟ་བར་ངེས་པར་དུ་$1བྱ་དགོས།',
 'accmailtitle' => 'ལམ་ཡིག་བཏང་ཟིན།',
 'newarticle' => '(གསར་བ)',
+'noarticletext' => 'ཤོག་ངོས་འདི་ནང་ད་གནས་ཡིག་གེ་མིན་འདུག།
+ཁྱེད་ཀྱིས་ཤོགངོས་གཞན་ཁག་ནང་ [[Special:Search/{{PAGENAME}}|ཤོག་ངོས་འདིའི་འགོ་བརྗོད་འཚོལ་རོགས།]] <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} དེ་དང་འབྲེལ་བའི་དོ་ཟླའི་ཐོར་འཚོལ་རོགས།],',
+'noarticletext-nopermission' => 'ཤོག་ངོས་འདི་ནང་ད་གནས་ཡི་གེ་མིན་འདུག།
+ཁྱེད་ཀྱིས་ཤོགངོས་གཞན་ཁག་ནང་ [[Special:Search/{{PAGENAME}}|ཤོག་ངོས་འདིའི་འགོ་བརྗོད་འཚོལ་རོགས།]] དེ་མིན་ <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} དེ་དང་འབྲེལ་བའི་དོ་ཟླའི་ཐོར་འཚོལ་རོགས།]</span> ཡིན་ནའང་ཁྱེད་ལ་ཤོག་ངོས་འདི་གསར་སྐྲུན་བྱེད་པའི་ཆོག་མཆན་མིན་འདུག།',
 'previewnote' => '"འདི་ནི་སྔོན་ལྟ་ཙམ་ཡིན་པ་ཡིད་ལ་འཇགས་རོགས། "ཁྱེད་ཀྱི་བཟོ་བཅོས་ད་དུང་ཉར་ཚགས་བྱས་མི་འདུག',
 'editing' => '$1རྩོམ་སྒྲིག་བྱེད་བཞིན་པ།',
 'editingsection' => ' $1 (སྡེ་ཚན) ལ་རྩོམ་སྒྲིག་བྱེད་བཞིན་པ།',
@@ -394,13 +459,21 @@ $messages = array(
 'templatesused' => 'ཤོག་ངོས་འདིར་སྤྱད་པའི་ {{PLURAL:$1|དཔེ་པང་།}}',
 'template-protected' => 'སྲུང་སྐྱོབ་འོག་ཡོད་པ།',
 'nocreate-loggedin' => 'ཤོག་ངོས་གསར་བཟོའི་ཆོག་མཆན་མི་འདུག',
+'permissionserrorstext-withaction' => 'གཤམ་ཀྱི་ {{PLURAL:$1|རྒྱུ་རྐྱེན་}}འོག་ཁྱེད་ལ་ $2 ཆོག་མཆན་མིན་འདུག་པས།',
 'recreate-moveddeleted-warn' => "'''ཉེན་བརྡ་:རང་གིས་སུབ་ཚར་བའི་ཤོག་ལེ་ཞིག་བསྐྱར་བཟོ་བྱེད་ཀྱི་འདུག་ '''
 ཁྱེད་རང་གལ་སྲིད་མུ་མཐུད་ཤོག་ལེ་འདི་བཟོ་ཅོས་བྱེད་འདོད་ན་སྟབས་བདེ་ཞིག་ལ་ང་ཚོས་སུབ་བཟིན་པའི་ཤོག་ལེ་འདིར་ཉར་ཡོད།",
 
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => '<strong> ཉེན་བརྡ།</strong> དཔེ་དཔང་གི་ཚད་གཞི་ཧ་ཅང་ཆེན་པོ་འདུག། དཔེ་དཔང་ཁ་ཅིག་ཚུད་ཐུབ་ཀྱི་མ་རེད།',
+'post-expand-template-inclusion-category' => 'དཔེ་དཔང་གི་ཚད་གཞི་བརྒལ་བའི་ཤོག་ངོས།',
+
 # History pages
 'viewpagelogs' => 'ཤོག་ངོས་འདིའི་ཉིན་ཐོ་ལ་ལྟ་བ།',
+'currentrev-asof' => 'མཐའ་འཇུག་ཀྱི་ཞིབ་བཤེར། $1',
 'revisionasof' => '$1 ལ་བཅོས་པ།',
 'previousrevision' => ' ← བཟོ་བཅོས་སྔ་མ།',
+'nextrevision' => 'ཞིབ་བཤེར་གསར་བ་ཁག།',
+'currentrevisionlink' => 'ཉེ་བའི་ཆར་གྱི་ཞིབ་བཤེར།',
 'cur' => 'ད་ལྟ།',
 'next' => 'རྗེས་མ།',
 'last' => 'མཐའ་མ།',
@@ -418,7 +491,7 @@ $messages = array(
 'rev-showdeleted' => 'སྟོན།',
 'revdelete-show-file-submit' => 'ཡིན།',
 'revdelete-radio-same' => 'བཟོ་བཅོས་མ་བྱེད།',
-'revdelete-radio-set' => 'ཡིà½\93།',
+'revdelete-radio-set' => 'à½\98à½\84ོà½\93à¼\8bà½\98ེà½\91à¼\8bà½\80ྱི།',
 'revdel-restore' => 'བཅོས་སུ་རུང་བ།',
 'pagehist' => 'ཤོག་ངོས་ལོ་རྒྱུས།',
 'revdelete-reasonotherlist' => 'རྒྱུ་མཚན་གཞན་པ།',
@@ -432,6 +505,7 @@ $messages = array(
 
 # Diffs
 'lineno' => 'ཐིག་ཕྲེང་$1:',
+'compareselectedversions' => 'འདེམས་བཞིན་པའི་བཟོ་འཅོས་དཔར་གཞིའི་ཁྱད་པར་སྟོན།',
 'editundo' => 'ཕྱིར་འཐེན།',
 
 # Search results
@@ -440,17 +514,22 @@ $messages = array(
 'notextmatches' => 'ཤོག་ངོས་ཡིག་འབྲུ་མཚུངས་པ་མི་འདུག',
 'prevn' => 'སྔོན་མ་{{PLURAL:$1|$1}}',
 'nextn' => 'རྗེས་མ་{{PLURAL:$1|$1}}',
+'prevn-title' => 'དེ་སྔོན་ $1{{PLURAL:$1|གྲུབ་འབྲས།}}',
+'nextn-title' => 'དེ་རྗེས་ཀྱི་ $1{{PLURAL:$1|གྲུབ་འབྲས།}}',
 'shown-title' => 'མིག་སྔར་སྟོན་པ། $1{{PLURAL:$1|གྲུབ་འབྲས།}}ཤོག་ངོས་ལྟར།',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3)ལ་ལྟ་བ།',
-'searchmenu-new' => 'ལྦེ་ཁེ་སྟེང་ལ་ཤོག་ལེ་ [[:$1]]བཟོས།',
+'searchmenu-new' => 'ཝེ་ཁི་སྟེང་ལ་ <strong>ཤོག་ངོས་གསར་པ་</strong> "[[:$1]]" བཟོས། {{PLURAL:$2|0=|ཁྱེད་ཀྱི་འཚོལ་ཞིབ་བྱས་པའི་ཤོག་ངོས་རྣམས་ལ་ཡང་གཟིགས་རོགས།.|མ་ཟད་འཚོལ་ཞིབ་བྱས་པའི་གྲུབ་འབྲས་གཞན་རྣམས་ལ་ཡང་གཟིགས་རོགས།}}',
+'searchprofile-articles' => 'ནང་དོན་ཤོག་ངོས།',
 'searchprofile-project' => 'རོགས་རམ་དང་འཆར་གཞིའི་ཤོག་ངོས་',
+'searchprofile-images' => 'སྨྱན་མང་བརྒྱུད་ལམ།',
 'searchprofile-everything' => 'ཚང་མ་',
 'searchprofile-advanced' => 'མཐོ་རིམ་',
 'searchprofile-articles-tooltip' => '$1ནང་དུ་འཚོལ་བ།',
 'searchprofile-project-tooltip' => '$1ནང་དུ་འཚོལ་བ།',
 'searchprofile-images-tooltip' => 'ཡིག་ཆ་འཚོལ་བ།',
 'searchprofile-everything-tooltip' => 'བརྗོད་དོན་ཚང་མ་འཚོལ་གཞིབ་བྱེད་(གྲོས་མེས་ཤོག་ངོས་ཡང་འཚུད་པ་)',
-'search-result-size' => '$1({{PLURAL:$2|1 word|$2 words}})',
+'searchprofile-advanced-tooltip' => 'རང་སྒྲུབ་མིང་བར་ནང་འཚོལ་རོགས།',
+'search-result-size' => '$1({{PLURAL:$2|1 ཚིག། |$2 ཚིག།}})',
 'search-redirect' => '($1རིམ་འགྲེམ།)',
 'search-section' => '(ཚན་པ $1)',
 'search-suggest' => '$1 ལ་ཟེར་བ་ཡིན་ནམ།',
@@ -458,7 +537,9 @@ $messages = array(
 'search-interwiki-default' => '$1ལས་རྙེད་པ།',
 'search-interwiki-more' => '(དེ་ལས་མང་བ།)',
 'search-relatedarticle' => 'འབྲེལ་ཡོད།',
+'searchrelated' => 'འབྲེལ་ཡོད།',
 'searchall' => 'ཚང་མ།',
+'showingresultsheader' => '{{PLURAL:$5|གྲུབ་འབྲས་ <strong>$1</strong> ཡི་<strong>$3</strong>གྲབ་འབྲས། <strong>$1 - $2</strong> ཡི་ <strong>$3</strong>}} ཆེད་དུ་ <strong>$4</strong>',
 'search-nonefound' => 'ཁྱེད་ཀྱི་འདྲི་ཞིབ་དང་མཐུན་པའི་ལན་མི་འདུག་',
 'powersearch-legend' => 'ཞིབ་ཏུ་འཚོལ་བ།',
 'powersearch-ns' => 'མིང་གནས་ནང་འཚོལ་བ།',
@@ -473,7 +554,7 @@ $messages = array(
 'prefs-personal' => 'སྤྱོད་མིའི་སྤྱི་ཁོག',
 'prefs-rc' => 'ཉེ་བའི་བཟོ་བཅོས།',
 'prefs-watchlist' => 'མཉམ་འཇོག་ཐོ།',
-'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
+'prefs-watchlist-days-max' => 'མང་མཐར་ཡང་ $1 {{PLURAL:$1|ཉིན།|ཉིན།}}',
 'prefs-watchlist-edits-max' => 'མང་ཚད་ཨང་གྲངས། ༡༠༠༠',
 'prefs-resetpass' => 'ལམ་ཡིག་བརྗེ་བ།',
 'prefs-changeemail' => 'དྲ་འཕྲིན་བརྗེ་བ།',
@@ -483,16 +564,18 @@ $messages = array(
 'searchresultshead' => 'འཚོལ།',
 'stub-threshold-disabled' => 'ནུས་མེད་དུ་བཟོས་ཟིན།',
 'timezoneregion-africa' => 'ཨ་ཧྥི་རི་ཀ',
-'youremail' => 'à½\91ྲà¼\8bའà½\95ྲིà½\93à¼\8d *:',
-'username' => 'དྲ་མིང་།:',
-'uid' => 'ནང་འཛུལ་ཐོ་མིང་།',
+'youremail' => 'à½\82ློà½\82à¼\8bའà½\95ྲིà½\93à¼\8d:',
+'username' => '{{GENDER:$1|དྲ་མིང་།}}:',
+'uid' => '{{GENDER:$1|སྤྱོད་མིའི་}}ནང་འཛུལ་ཐོ་མིང་།:',
 'yourrealname' => 'དངོས་མིང་།',
 'yourlanguage' => 'སྐད་རིགས།',
 'yournick' => 'མིང་རྟགས་སོ་མ།',
-'yourgender' => 'à½\95ོà¼\8bà½\98ོ།',
-'gender-male' => 'à½\95ོ།',
-'gender-female' => 'མོ།',
+'yourgender' => 'à½\81ྱེà½\91à¼\8bལà¼\8bà½\82à½\84à¼\8bའà½\91ྲà¼\8bà½\96ྱསà¼\8bà½\93སà¼\8bའà½\96ོà½\91à¼\8bà½\91à½\82ོསà¼\8bསà½\98།',
+'gender-male' => 'à½\81ོà¼\8bརà½\84à¼\8bà½\82ིསà¼\8bà½\9dེà¼\8bà½\81ེà¼\8bརྩོà½\98à¼\8bསà¾\92ྲིà½\82à¼\8bà½\96ྱསà¼\8bསོà½\84།',
+'gender-female' => 'à½\98ོà¼\8bརà½\84à¼\8bà½\82ིསà¼\8bà½\9dེà¼\8bà½\81ེà¼\8bཤོà½\82à¼\8bà½\84ོསà¼\8bà½\90ོà½\82à¼\8bརྩོà½\98à¼\8bསà¾\92ྲིà½\82à¼\8bà½\96ྱསà¼\8bསོà½\84à¼\8d',
 'email' => 'དྲ་འཕྲིན།',
+'prefs-help-email' => 'གློག་འཕྲིན་ཁ་བྱང་ནི་རང་མོས་ཡིན། ཡིན་ན་འང་གལ་སྲིད་ཁྱེད་ཀྱི་གསང་བའི་ཨང་གྲངས་འརྗེད་པ་སོགས་བྱུང་ཚེ། གསང་བའི་ཨང་བསྐྱར་སྒྲིག་སྐབས་ངེས་པར་དུ་དགོས།',
+'prefs-help-email-others' => 'ཁྱེད་ཀྱི་ཐད་ཀར་གློག་འཕྲིན་འམ་ཡང་ན་འགྲོ་གླེང་ཤོག་ངོས་བརྒྱུད་སྤྱོད་མི་གཞན་རྣམས་ཀྱི་ཁྱེད་ལ་འབྲེལ་བ་བྱེད་ཐུབ། ཁྱེད་རང་གི་གློག་འཕྲིན་ཁ་བྱང་སྤྱོད་མི་གཞན་གྱི་འབྲེལ་བ་བྱེད་སྐབས་གསང་གཏོལ་བྱེད་མི་སྲིད།',
 'prefs-info' => 'རྨང་གཞིའི་གནས་ཚུལ།',
 'prefs-signature' => 'མིང་རྟགས།',
 
@@ -523,7 +606,7 @@ $messages = array(
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'ཤོག་ངོས་འདི་ཀློག་པ།',
-'action-edit' => 'ཤོà½\82à¼\8bà½\84ོསà¼\8bའà½\91ིà¼\8bརྩོà½\98à¼\8bསà¾\92ྲིà½\82à¼\8bà½\96ྱེà½\91à¼\8bà½\94།',
+'action-edit' => 'ཤོà½\82à¼\8bà½\84ོསà¼\8bའà½\91ིà¼\8bརྩོà½\98à¼\8bསà¾\92ྲིà½\82à¼\8bà½\96ྱེà½\91à¼\8bà½\91à½\84།',
 'action-createpage' => 'ཤོག་ངོས་གསར་བཟོ།',
 'action-move' => 'ཤོག་ངོས་འདི་སྤོར་ཅིག',
 'action-movefile' => 'ཡིག་ཆ་འདི་སྤོར་ཅིག',
@@ -532,20 +615,24 @@ $messages = array(
 'action-undelete' => 'ཤོག་ངོས་འདི་བསུབས་ཟིན་གསོ་བ།',
 'action-block' => 'སྤྱོད་མི་འདི་རྩོམ་སྒྲིག་ལ་ཁོག་ཅིག',
 'action-protect' => 'ཤོག་ངོས་འདིའི་སྲུང་སྐྱོབ་རིམ་པ་བསྒྱུར་བཅོས་གཏོང་བ།',
-'action-import' => 'ཤོà½\82à¼\8bà½\84ོསà¼\8bའà½\91ིà¼\8bà½\9dེà¼\8bà½\81ེà¼\8bà½\82à½\9eà½\93à¼\8bà½\93སà¼\8bà½\93à½\84à¼\8bའà½\91ྲེà½\93à¼\8bà½\96ྱེà½\91à¼\8bà½\94།',
-'action-importupload' => 'ཤོà½\82à¼\8bà½\84ོསà¼\8bའà½\91ིà¼\8bཡིà½\82à¼\8bà½\86à¼\8bཡརà¼\8bའà½\87ུà½\82à¼\8bལསà¼\8bà½\93à½\84à¼\8bའà½\91ྲེà½\93à¼\8bà½\96ྱེà½\91à¼\8bà½\94།',
+'action-import' => 'à½\9dེà¼\8bà½\81ེà¼\8bà½\82à½\9eà½\93à¼\8bà½\93སà¼\8bà½\93à½\84à¼\8bའà½\91ྲེà½\93à¼\8bà½\96ྱེà½\91à¼\8bà½\94འིà¼\8bཤོà½\82à¼\8bà½\84ོས།',
+'action-importupload' => 'ཡིà½\82à¼\8bà½\86à¼\8bཡརà¼\8bའà½\87ུà½\82à¼\8bལསà¼\8bà½\93à½\84à¼\8bའà½\91ྲེà½\93à¼\8bà½\96ྱེà½\91à¼\8bà½\94འིà¼\8bཤོà½\82à¼\8bà½\84ོས།',
 'action-unwatchedpages' => 'མ་བལྟས་ཤོག་ངོས་ཀྱི་ཐོ་ལ་ལྟ་བ།',
 'action-userrights' => 'སྤྱོད་མིའི་ཐོབ་ཐང་ཡོངས་ལ་རྩོམ་སྒྲིག་བྱེད་པ།',
 'action-userrights-interwiki' => 'ཝེ་ཁེ་གཞན་གྱི་སྤྱོད་མི་ཚོའི་སྤྱོད་མིའི་ཐོབ་ཐང་རྩོམ་སྒྲིག་བྱེད་པ།',
 
 # Recent changes
+'nchanges' => '$1 {{PLURAL:$1|འགྱུར་བཅོས།|འགྱུར་བཅོས།}}',
 'recentchanges' => 'ཉེ་བའི་བཟོ་བཅོས།',
 'recentchanges-legend' => 'ཉེ་བའི་བཟོ་བཅོས་འདེམས་ཚན།',
 'recentchanges-label-newpage' => 'རྩོམ་སྒྲིག་འདིས་ཤོག་ངོས་གསར་བ་ཞིག་བཟོས་འདུག',
 'recentchanges-label-minor' => 'འདི་ནི་རྩོམ་སྒྲིག་ཕལ་བ་ཞིག་ཡིན།',
+'recentchanges-label-bot' => 'བཟོ་འཅོས་འདི་རང་འགུལ་འཕྲུལ་ཆས་ཀྱིས་བྱས་སོང།',
+'recentchanges-label-unpatrolled' => 'རྩོམ་སྒྲིག་འདི་སྐོར་ཞིབ་བྱེད་རྒྱུ་རེད་འདུག།',
 'rclistfrom' => '$1 ལས་འགོ་བཙུགས་ཏེ་འགྱུར་བཅོས་གསར་བ་སྟོན་ཅིག',
 'rcshowhideminor' => '$1 རྩོམ་སྒྲིག་ཕལ་བ།',
-'rcshowhideliu' => 'ཐོ་འཛུལ་བྱས་པའི་སྤྱོད་མི་ $1',
+'rcshowhidebots' => '$1 རང་འགུལ་འཕྲུལ་ཆས།',
+'rcshowhideliu' => '$1 ཐོ་འགོད་སྤྱོད་མི།',
 'rcshowhideanons' => 'མིང་མེད་སྤྱོད་མི $1',
 'rcshowhidemine' => '$1ངའི་རྩོམ་སྒྲིག',
 'rclinks' => 'འདས་བའི་ཉིན་ $2 <br />$3 ནང་ཚུན་གྱི་བཟོ་བཅོས་གཞུག་མ་ $1 སྟོན་ཅིག',
@@ -555,6 +642,7 @@ $messages = array(
 'show' => 'སྟོན།',
 'minoreditletter' => 'སྒྲིག་ཆུང་།',
 'newpageletter' => 'ཤོག་གསར།',
+'boteditletter' => 'རང་འགུལ་འཕྲུལ་ཆས།',
 'rc_categories_any' => 'གང་རུང་།',
 'rc-enhanced-expand' => 'ཞིབ་ཕྲར་སྟོན།',
 'rc-enhanced-hide' => 'ཞིབ་ཕྲ་སྦས་བ།',
@@ -566,13 +654,14 @@ $messages = array(
 'recentchangeslinked-title' => '"$1" དང་འབྲེལ་བའི་འགྱུར་བཅོས།',
 'recentchangeslinked-summary' => "འདི་ནི་དམིགས་གསལ་ཤོག་ངོས་༼ཡང་ན་དམིགས་གསལ་རྣམ་གྲངས་ཀྱི་ཁོངས་མི་༽དང་འབྲེལ་བའི་ཉེ་བའི་བཟོ་བཅོས་རེད།[[Special:Watchlist|yourwatchlist]] ནང་གི་ཤོག་ངོས་རྣམས་'''ཡིག་གཟུགས་སྦོམ་པོ་'''ཡིན།",
 'recentchangeslinked-page' => 'ཤོག་ངོས་མིང་།',
+'recentchangeslinked-to' => 'ཤོག་ངོས་འདི་ཐོག་གི་བཟོ་འཅོས་རྣམས་ཤོག་ངོས་དེ་དང་འབྲེལ་བའི་འགྱུར་བ་སྟོན་རོགས།',
 
 # Upload
 'upload' => 'ཡིག་ཆ་ཡར་འཇུག',
 'uploadbtn' => 'ཡར་འཇོག',
 'reuploaddesc' => 'ཡར་འཇུག་དོར་ནས་ཡར་འཇུག་རེའུ་མིག་ཏུ་ཕྱིར་ལོག་པ།',
 'uploadnologin' => 'ནང་འཛུལ་བྱས་མེད།',
-'uploadlogpage' => 'རྩོà½\98à¼\8bཡིà½\82་ཡར་འཇུག',
+'uploadlogpage' => 'à½\89ིà½\93à¼\8bà½\90ོ་ཡར་འཇུག',
 'filename' => 'ཡིག་ཆའི་མིང་།',
 'filedesc' => 'བསྡུས་དོན།',
 'fileuploadsummary' => 'བསྡུས་དོན།:',
@@ -590,6 +679,9 @@ $messages = array(
 'uploaddisabled' => 'ཡར་འཇུག་ནུས་མེད་བཟོས་འདུག',
 'watchthisupload' => 'ཡིག་ཆ་འདི་ལ་གཟིགས།',
 
+'license' => 'གན་རྒྱ་ནང་ཞུགས་པ།',
+'license-header' => 'གན་རྒྱ་ནང་ཞུགས་པ།',
+
 # Special:ListFiles
 'imgfile' => 'བརྙན་རིས།',
 'listfiles' => 'ཡིག་ཆའི་ཐོ་གཞུང་།',
@@ -605,6 +697,7 @@ $messages = array(
 'filehist-help' => 'ཟླ་ཚེས་/དུས་ཚོད་གནུན་ཏེ་རྩོམ་ཡིག་ལ་ལྟ་བ།',
 'filehist-deleteall' => 'ཚང་མ་སུབས།',
 'filehist-deleteone' => 'གསུབས།',
+'filehist-revert' => 'ཕྱིར་ལྡོག།',
 'filehist-current' => 'ད་ལྟ།',
 'filehist-datetime' => 'ཚེས་གྲངས། / དུས་ཚོད།',
 'filehist-thumb' => 'བསྡུས་དོན།',
@@ -616,6 +709,8 @@ $messages = array(
 'filehist-missing' => 'ཡིག་ཆ་ཆད་པ།',
 'imagelinks' => 'ཡིག་ཆ་བེད་སྤྱོད་ཁུལ།',
 'linkstoimage' => '{{PLURAL:$1|pagelinks|$1pagelink}} འདི་ལ་སྦྲེལ་ཡོད།',
+'sharedupload-desc-here' => 'ཡིག་ཆ་འདི་ནས་$1 རེད་འདུག། ལས་འཆར་གཞན་ཁག་ནང་བེད་སྤྱོད་ཡོད་ངེས།
+[$2 འགྲེལ་བརྗོད་ཤོག་ངོས་]འདིའི་འགྲེལ་བརྗོད་གཤམ་དུ་འཁོད་ཡོད།',
 'shared-repo-from' => '$1 ནས།',
 
 # File deletion
@@ -633,13 +728,18 @@ $messages = array(
 'unusedtemplateswlh' => 'སྦྲེལ་མཐུད་གཞན་དག',
 
 # Random page
-'randompage' => 'རང་མོས་ཤོག་ངོས།',
+'randompage' => 'སྐམས་དོན་ཤོག་ངོས།',
+
+# Statistics
+'statistics' => 'བསྡོམས་རྩིས།',
 
 'brokenredirects-edit' => 'རྩོམ་སྒྲིག',
 'brokenredirects-delete' => 'གསུབ་པ།',
 
 # Miscellaneous special pages
-'nbytes' => '{{PLURAL:$1|ཡིག་ཚགས།}} $1',
+'nbytes' => '{{PLURAL:$1|ཡིག་ཚིགས།}} $1',
+'nmembers' => '$1 {{PLURAL:$1|ཚོགས་མི།|ཚོགས་མི།}}',
+'prefixindex' => 'སྔཽན་སྦྱོར་དང་ལྷན་དུ་ཤོག་ངོས་ཧྲིལ་པོ།',
 'shortpages' => 'ཤོག་ངོས་ཐུང་ངུ་།',
 'newpages' => 'ཤོག་ངོས་གསར་བ།',
 'newpages-username' => 'དྲ་མིང་།:',
@@ -663,15 +763,18 @@ $messages = array(
 'allarticles' => 'ཤོག་ངོས་ཆ་ཚང་།',
 'allpagessubmit' => 'སོང་།',
 
+# Special:Categories
+'categories' => 'སྡེ་ཚན།',
+
 # Special:LinkSearch
-'linksearch' => 'ཕྱི་རོལ་སྦྲེལ་མཐུད།',
+'linksearch' => 'à½\95ྱིà¼\8bརོལà¼\8bསྦྲེལà¼\8bà½\98à½\90ུà½\91à¼\8bའà½\9aོལà¼\8bà½\9eིà½\96à¼\8d',
 
 # Special:ListGroupRights
 'listgrouprights-members' => 'ཁོངས་མིའི་ཐོ་ཡིག',
 
 # Email user
 'emailuser' => 'སྤྱོད་མི་འདིར་གློག་འཕྲིན་སྐུར་བ།',
-'emailmessage' => 'སà¾\90à½\91à¼\8bà½\86།',
+'emailmessage' => 'à½\96རྡà¼\8bའà½\95ྲིà½\93།',
 
 # Watchlist
 'watchlist' => 'ལྟ་ཞིབ་ཐོ།',
@@ -709,15 +812,15 @@ $messages = array(
 'rollbacklink' => 'རྒྱབ་འགྲིལ་གཏོང་བ།',
 
 # Protect
-'protectedarticle' => 'སྲུà½\84à¼\8bསà¾\90ྱོà½\96་བྱས་ཟིན།"[[$1]]"',
+'protectedarticle' => 'འà½\82ོà½\82à¼\8bསྲུà½\84་བྱས་ཟིན།"[[$1]]"',
 'modifiedarticleprotection' => '"[[$1]]" ལ་སྲུང་སྐྱོབ་རིམ་པ་བཟོ་བཅོས་བྱས་བ།',
 'protectcomment' => 'རྒྱུ་མཚན།',
 'protectexpiry' => 'དུས་ཡུན་རྫོགས་ཚད།',
 'protect_expiry_invalid' => 'དུས་ཡུན་རྫོགས་ཚད་ནོར་བ།',
 'protect-default' => 'སྤྱོད་མི་ཡོངས་ལ་ཕྱེ་བ།',
-'protect-fallback' => '"$1" ཆོག་མཆན་དགོས།',
-'protect-level-autoconfirmed' => 'སྤྱོà½\91à¼\8bà½\98ིà¼\8bà½\82སརà¼\8bà½\96à¼\8bà½\91à½\84à¼\8bà½\90ོà¼\8bà½\98ེà½\91à¼\8bརྣà½\98སà¼\8bà½\96à½\80à½\82à¼\8bའà½\82ོà½\82',
-'protect-level-sysop' => 'དོ་དམ་པ་ཁོ་ནར།',
+'protect-fallback' => 'སྤྱོད་མི་ "$1" གྱི་ཆོག་མཆན་ཡོད་པ་ཁོ་ནར་བྱེད་དབང་ཡོད།',
+'protect-level-autoconfirmed' => 'རà½\84à¼\8bའà½\82ུལà¼\8bà½\84ོསà¼\8bའà½\9bིà½\93à¼\8bà½\96ྱསà¼\8bà½\94འིà¼\8bསྤྱོà½\91à¼\8bà½\98ིà¼\8bà½\81ོà¼\8bà½\93རà¼\8bà½\96ྱེà½\91à¼\8bà½\91à½\96à½\84à¼\8bཡོà½\91à¼\8d',
+'protect-level-sysop' => 'à½\91ོà¼\8bà½\91à½\98à¼\8bà½\94à¼\8bà½\81ོà¼\8bà½\93རà¼\8bà½\96ྱེà½\91à¼\8bà½\91à½\96à½\84à¼\8bཡོà½\91à¼\8d',
 'protect-cantedit' => 'ཁྱོད་ལ་ཤོག་ངོས་འདི་རྩོམ་སྒྲིག་གི་ཆོག་མཆན་མེད་པས་ངོས་འདི་ཡི་སྲུང་སྐྱོབ་རིམ་པ་ལ་བཟོ་བཅོས་བྱེད་མི་ཆོག',
 'restriction-type' => 'ཆོག་མཆན།',
 'restriction-level' => 'དམ་བསྒྲགས་ཚད་རིམ།',
@@ -734,10 +837,10 @@ $messages = array(
 # Namespace form on various pages
 'namespace' => 'མིང་གནས།',
 'invert' => 'གདམ་པའི་ལྡོག་ཕྱོགས།',
-'blanknamespace' => '༼གཙོ་ངོས།༽',
+'blanknamespace' => '(གཙོ་གནད།)',
 
 # Contributions
-'contributions' => 'མཐུན་འགྱུར།',
+'contributions' => '{{GENDER:$1|སྤྱོད་མི།}} མཐུན་འགྱུར།',
 'mycontris' => 'མཐུན་འགྱུར།',
 'month' => 'ཟླ་བ་འདི་ནས།',
 'year' => 'ལོ་འདི་ནས།',
@@ -750,20 +853,25 @@ $messages = array(
 'whatlinkshere-title' => '"$1" ལ སྦྲེལ་ཡོད་པའི་ཤོག་ངོས།',
 'whatlinkshere-page' => 'ཤོག་ངོས།',
 'linkshere' => "གཤམ་གྱི་ཤོག་ངོས་རྣམས་ '''[[:$1]]''': ལ་སྦྲེལ་ཡོད།",
+'nolinkshere' => '<strong>[[:$1]]</strong> ཤོག་ངོས་གཅིག་ཀྱང་སྦྲེལ་མཐུད་མི་འདུག།',
 'isimage' => 'ཡིག་རིས་སྦྲེལ་མཐུད།',
 'whatlinkshere-links' => '← སྦྲེལ་མཐུད།',
+'whatlinkshere-hideredirs' => '$1 ཁ་ཕྱོགས་བསྐྱར་སྟོན།',
 'whatlinkshere-hidelinks' => '$1 སྦྲེལ་མཐུད།',
+'whatlinkshere-hideimages' => '$1 ཡིག་ཆ་སྦྲེལ་མཐུད།',
 'whatlinkshere-filters' => 'ཡིག་ཚགས།',
 
 # Block/unblock
 'blockip' => 'སྤྱོད་མི་འགོག་སྡོམ།',
 'ipbreason' => 'རྒྱུ་མཚན།',
+'ipblocklist' => 'འགོག་སྡོམ་བྱས་པའི་སྤྱོད་མི།',
 'ipblocklist-submit' => 'འཚོལ།',
 'blocklink' => 'འགོག་པ།',
 'unblocklink' => 'བཀག་སྡོམ་གློད་པ།',
 'change-blocklink' => 'བཀག་སྡོམ་བསྒྱུར་བཅོས།',
-'contribslink' => 'à½\96ྱསà¼\8bརà¾\97ེས།',
+'contribslink' => 'à½\98à½\90ུà½\93à¼\8bའà½\82ྱུར།',
 'blocklogpage' => 'རྩོམ་ཡིག་བཀག་འགོག',
+'block-log-flags-nocreate' => 'རྩིས་ཁྲ་གསར་བཟོ་འགོག་འདུག།',
 
 # Move page
 'movearticle' => 'ཤོག་ངོས་སྤོར་བ།',
@@ -791,40 +899,40 @@ $messages = array(
 'tooltip-pt-preferences' => 'ཁྱེད་ཀྱི་ལེགས་སྒྲིག',
 'tooltip-pt-watchlist' => 'ཞུ་དག་གཏོང་བཞིན་པའི་ཤོག་ངོས།',
 'tooltip-pt-mycontris' => 'ངའི་བྱས་རྗེས་སྟོན་པ།',
-'tooltip-pt-login' => 'à½\93à½\84à¼\8bའà½\9bུལ།',
-'tooltip-pt-logout' => 'à½\95ྱིརà¼\8bའà½\96ུà½\91།',
-'tooltip-ca-talk' => 'གྲོས་མོལ།',
-'tooltip-ca-edit' => 'à½\81ྱེà½\91à¼\8bà½\80ྱིསà¼\8bà½\91ྲà¼\8bà½\84ོསà¼\8bའà½\91ིà¼\8bརྩོà½\98à¼\8bསà¾\92ྲིà½\82à¼\8bà½\96ྱེà½\91à¼\8bà½\86ོà½\82 à½\89རà¼\8bà½\9aà½\82སà¼\8bà½\96ྱེà½\91à¼\8bà½\94འིà¼\8bསà¾\94ོà½\93à¼\8bà½\91ུà¼\8bà½\98à½\90ེà½\96à¼\8bà½\82à½\85ུསà¼\8bསà¾\94ོà½\93à¼\8bà½\98à¼\8bསྤྱོà½\91་རོགས།',
+'tooltip-pt-login' => 'à½\81ྱེà½\91à¼\8bརà½\84à¼\8bà½\93à½\84à¼\8bའà½\9bུལà¼\8bà½\82à½\93à½\84à¼\8bà½\96རà¼\8bà½\91à½\82འà¼\8bà½\96སུà¼\8bà½\9eུà¼\8d à½ à½¼à½\93à¼\8bà½\80ྱà½\84à¼\8bའà½\91ིརà¼\8bའà½\82à½\93à¼\8bའà½\81ུརà¼\8bà½\96ྱེà½\91à¼\8bà½\98à½\81à½\93à¼\8bà½\98ེà½\91།',
+'tooltip-pt-logout' => 'à½\95ྱིརà¼\8bà½\91ོà½\93།',
+'tooltip-ca-talk' => 'ཤོà½\82à¼\8bà½\84ོསà¼\8bà½\80ྱིà¼\8bà½\93à½\84à¼\8bà½\91ོà½\93à¼\8bà½\82ྲོསà¼\8bà½\98ོལà¼\8d',
+'tooltip-ca-edit' => 'à½\81ྱེà½\91à¼\8bà½\80ྱིསà¼\8bཤོà½\82à¼\8bà½\84ོསà¼\8bའà½\91ིརà¼\8bརྩོà½\98à¼\8bསà¾\92ྲིà½\82à¼\8bà½\96ྱེà½\91à¼\8bà½\86ོà½\82à¼\8d à½\89རà¼\8bà½\9aà½\82སà¼\8bà½\98à¼\8bà½\96ྱེà½\91à¼\8bà½\82ོà½\84à¼\8bསà¾\94ོà½\93à¼\8bལà¾\9fའིà¼\8bà½\98à½\90ེà½\96à¼\8bà½\82à½\9eོà½\84à¼\8bà½\82à½\93ོà½\93་རོགས།',
 'tooltip-ca-addsection' => 'སྡེ་ཚན་གསར་བ་ཞིག་འགོ་འཛུགས་པ།',
-'tooltip-ca-viewsource' => 'ཤོà½\82à¼\8bà½\84ོསà¼\8bའà½\91ིà¼\8bསྲུà½\84à¼\8bསà¾\90ྱོà½\96à¼\8bའོà½\82à¼\8bཡོà½\91à¼\8d à½\81ྱེà½\91à¼\8bà½\80ྱིསà¼\8bའà½\91ིའིà¼\8bའà½\96ྱུà½\84à¼\8bà½\81ོà½\84སà¼\8bལà¾\9fà¼\8bà½\86ོà½\82',
-'tooltip-ca-history' => 'à½\96à½\9fོ་བཅོས་སྔ་མ།',
+'tooltip-ca-viewsource' => 'ཤོà½\82à¼\8bà½\84ོསà¼\8bའà½\91ིà¼\8bའà½\82ོà½\82à¼\8bསྲུà½\84à¼\8bà½\96ྱསà¼\8bཡོà½\91à¼\8d à½\81ྱེà½\91à¼\8bà½\80ྱིསà¼\8bའà½\91ིའིà¼\8bà½\81ུà½\84སà¼\8bལà¼\8bལà¾\9fà¼\8bà½\86ོà½\82à¼\8d',
+'tooltip-ca-history' => 'ཤོà½\82à¼\8bà½\84ོསà¼\8bའà½\91ིའིà¼\8bà½\96སà¾\90ྱར་བཅོས་སྔ་མ།',
 'tooltip-ca-protect' => 'ཤོག་ངོས་འདི་སྲུངས་ཤིག',
 'tooltip-ca-delete' => 'ཤོག་ངོས་འདི་དོར་ཅིག',
 'tooltip-ca-move' => 'ཤོག་ངོས་འདི་སྤོར་བ།',
 'tooltip-ca-watch' => 'ཤོག་ངོས་འདི་ཁྱོད་ཀྱི་མཉམ་འཇོག་ཐོ་རུ་འཇུག་པ།',
 'tooltip-ca-unwatch' => 'ཤོག་ངོས་འདི་མཉམ་འཇོག་ཐོ་ལས་ལེན་པ།',
-'tooltip-search' => 'ལà½\82à¼\8bà½\86à¼\8bའà½\9aོལà¼\8d',
+'tooltip-search' => 'འà½\9aོལà¼\8d {{SITENAME}}',
 'tooltip-search-go' => 'མིང་ཇི་བཞིན་པའི་ཤོག་ངོས་སྟེང་དུ་སྐྱོད་པ།',
-'tooltip-search-fulltext' => 'à½\9aིà½\82་འདི་འཚོལ།',
-'tooltip-p-logo' => 'à½\82à½\99ོà¼\8bà½\84ོས།',
-'tooltip-n-mainpage' => 'à½\82à½\99ོà¼\8bà½\84ོསà¼\8bལà¼\8bལà¾\9fà¼\8bà½\96།',
-'tooltip-n-mainpage-description' => 'à½\82à½\99ོà¼\8bà½\84ོསà¼\8bལà¼\8bལà¾\9fà¼\8bà½\96།',
-'tooltip-n-portal' => 'ལསà¼\8bའà½\86རà¼\8bསà¾\90ོརà¼\8bà½\91à½\84à¼\8bà½\81ྱེà½\91à¼\8bà½\80ྱིསà¼\8bà½\85ིà¼\8bà½\9eིà½\82à¼\8bà½\96ྱེà½\91à¼\8bà½\93ུསà¼\8bà½\94à¼\8d à½\82à½\84à¼\8bà½\91ུà¼\8bའà½\9aོལà¼\8bà½\91à½\82ོསà¼\8bà½\94།',
+'tooltip-search-fulltext' => 'ཤོà½\82à¼\8bà½\84ོསà¼\8bà½\90ོà½\82à¼\8bཡིà½\82à¼\8bརà¾\90ྱà½\84་འདི་འཚོལ།',
+'tooltip-p-logo' => 'à½\82à½\99ོà¼\8bà½\82à½\93à½\91à¼\8bཤོà½\82à¼\8bà½\84ོསà¼\8bལà¼\8bà½\82à½\9fིà½\82སà¼\8bརོà½\82ས།',
+'tooltip-n-mainpage' => 'à½\82à½\99ོà¼\8bà½\82à½\93à½\91à¼\8bཤོà½\82à¼\8bà½\84ོསà¼\8bལà¼\8bà½\82à½\9fིà½\82སà¼\8bརོà½\82ས།',
+'tooltip-n-mainpage-description' => 'à½\82à½\99ོà¼\8bà½\82à½\93à½\91à¼\8bཤོà½\82à¼\8bà½\84ོསà¼\8bལà¼\8bà½\82à½\9fིà½\82སà¼\8bརོà½\82ས།',
+'tooltip-n-portal' => 'ལསà¼\8bའà½\86རà¼\8bསà¾\90ོརà¼\8d à½\81ྱེà½\91à¼\8bà½\80ྱིསà¼\8bà½\82à½\84à¼\8bà½\96ྱེà½\91à¼\8bà½\90ུà½\96à¼\8bà½\96à½\98à¼\8d à½\82à½\84à¼\8bà½\91ུà¼\8bའà½\9aོལà¼\8bà½\91à½\82ོསà¼\8bསà½\98།',
 'tooltip-n-currentevents' => 'ཉེ་བའི་ལས་དོན་གྱི་རྒྱབ་ལྗོངས་གནས་ཚུལ་འཚོལ་བ།',
-'tooltip-n-recentchanges' => 'à½\9dེà¼\8bà½\81ེà¼\8bསà¾\9fེà½\84à¼\8bà½\82ིà¼\8bà½\89ེà¼\8bà½\96འིà¼\8bà½\96à½\9fོà¼\8bà½\96à½\85ོསà¼\8bà½\80ྱིà¼\8bà½\90ོà¼\8bà½\82à½\9eུà½\84à¼\8b།',
-'tooltip-n-randompage' => 'རà½\84à¼\8bà½\98ོསà¼\8bཤོà½\82à¼\8bà½\84ོསà¼\8bཤིà½\82à¼\8bལེà½\93à¼\8bà½\94།',
+'tooltip-n-recentchanges' => 'à½\9dེà¼\8bà½\81ེà¼\8bསà¾\9fེà½\84à¼\8bà½\82ིà¼\8bà½\89ེà¼\8bà½\86རà¼\8bà½\96à½\9fོà¼\8bà½\96à½\85ོསà¼\8bà½\80ྱིà¼\8bà½\90ོ།',
+'tooltip-n-randompage' => 'སà¾\90à½\96སà¼\8bà½\91ོà½\93à¼\8bཤོà½\82à¼\8bà½\84ོསà¼\8bཤིà½\82à¼\8bà½\95à½\96à¼\8bའà½\87ུà½\82།',
 'tooltip-n-help' => 'གང་དུ་འཚོལ་བའི་གནས།',
-'tooltip-t-whatlinkshere' => 'འà½\91ིà¼\8bལà¼\8bསྦྲེལà¼\8bà½\96འིà¼\8bà½\9dེà¼\8bà½\81ེà¼\8bཤོà½\82à¼\8bà½\84ོསà¼\8bཡོà½\84སà¼\8bརྫོà½\82ས།',
-'tooltip-t-recentchangeslinked' => 'à½\84ོསà¼\8bའà½\91ིà¼\8bà½\91à½\84à¼\8bའà½\96ྲེལà¼\8bà½\96འི་ཉེ་བའི་བཟོ་བཅོས།',
+'tooltip-t-whatlinkshere' => 'འà½\91ིརà¼\8bསྦྲེལà¼\8bཡོà½\91à¼\8bà½\94འིà¼\8bà½\9dེà¼\8bà½\81ེà¼\8bཤོà½\82à¼\8bà½\84ོསà¼\8bཧྲིལà¼\8bà½\94ོའིà¼\8bà½\90ོ།',
+'tooltip-t-recentchangeslinked' => 'ཤོà½\82à¼\8bà½\84ོསà¼\8bའà½\91ིà¼\8bà½\91à½\84à¼\8bསྤྲེལà¼\8bà½\96འིà¼\8bཤོà½\82à¼\8bà½\84ོསà¼\8bà½\82à½\9eà½\93à¼\8bà½\90ོà½\82à¼\8bà½\82ི་ཉེ་བའི་བཟོ་བཅོས།',
 'tooltip-feed-rss' => 'ཤོག་ངོས་འདིའི་RSS འབྱུང་ཁུངས།',
 'tooltip-feed-atom' => 'ཤོག་ངོས་འདིའི་Atom འབྱུང་ཁུངས།',
 'tooltip-t-contributions' => 'བཀོལ་མི་འདིའི་བྱས་རྗེས་སྟོན།',
-'tooltip-t-emailuser' => 'སྤྱོà½\91à¼\8bà½\98ིà¼\8bའà½\91ིརà¼\8bà½\91ྲà¼\8bའà½\95ྲིà½\93à¼\8bསà¾\90ུརà¼\8bà½\96།',
+'tooltip-t-emailuser' => 'སྤྱོà½\91à¼\8bà½\98ིà¼\8bའà½\91ིརà¼\8bà½\82ློà½\82à¼\8bའà½\95ྲིà½\93à¼\8bà½\96སà¾\90ུརà¼\8bརོà½\82ས།',
 'tooltip-t-upload' => 'ཡིག་ཆ་ཡར་འཇུག',
-'tooltip-t-specialpages' => 'à½\91à½\98ིà½\8aà¼\8bà½\82སལ་ཤོག་ངོས་ཀྱི་ཐོ་གཞུང་།',
-'tooltip-t-print' => 'à½\91à½\94རà¼\8bà½\90ུà½\96à¼\8bà½\94འིà¼\8bà½\98ིà¼\8bའà½\91ྲà¼\8bà½\86ོས།',
-'tooltip-t-permalink' => 'རà¾\9fà½\82à¼\8bà½\96རà¾\9fà½\93à¼\8bà½\82ྱིà¼\8bà½\91ྲà¼\8bà½\96རà¼\8bའà½\87ུà½\82à¼\8bà½\94།',
-'tooltip-ca-nstab-main' => 'à½\93à½\84à¼\8bà½\91ོà½\93à¼\8bཤོà½\82à¼\8bà½\84ོསà¼\8bལà¼\8bལà¾\9fà¼\8bà½\96།',
+'tooltip-t-specialpages' => 'à½\86ེà½\91à¼\8bལས་ཤོག་ངོས་ཀྱི་ཐོ་གཞུང་།',
+'tooltip-t-print' => 'ཤོà½\82à¼\8bà½\84ོསà¼\8bའà½\91ིའིà¼\8bà½\91à½\94རà¼\8bརུà½\84à¼\8bà½\96འིà¼\8bའà½\82ྱུར།',
+'tooltip-t-permalink' => 'à½\96à½\9fོà¼\8bའà½\85ོསà¼\8bཤོà½\82à¼\8bà½\84ོསà¼\8bའà½\91ིའིà¼\8bà½\96རà¾\9fà½\93à¼\8bའà½\87à½\82སà¼\8bà½\80ྱིà¼\8bསྦྲེལà¼\8bà½\98à½\90ུà½\91།',
+'tooltip-ca-nstab-main' => 'à½\93à½\84à¼\8bà½\91ོà½\93à¼\8bà½\80ྱིà¼\8bཤོà½\82à¼\8bà½\84ོསà¼\8bལà¼\8bà½\82à½\9fིà½\82སà¼\8bརོà½\82ས།',
 'tooltip-ca-nstab-user' => 'སྤྱོད་མིའི་ཤོག་ངོས་ལ་ལྟ་བ།',
 'tooltip-ca-nstab-special' => 'དྲ་ངོས་འདི་དམིགས་གསལ་བ་ཡིན་པས་བཟོ་བཅོས་རྒྱག་མི་ཆོག',
 'tooltip-ca-nstab-project' => 'ལས་འཆར་ཤོག་ངོས་ལ་ལྟ་བ།',
@@ -835,6 +943,9 @@ $messages = array(
 'tooltip-save' => 'བཟོ་བཅོས་ཉར་ཚགས་བྱོས།',
 'tooltip-preview' => 'ཉར་ཚགས་ཀྱི་སྔོན་དུ་བཟོ་བཅོས་ལ་བསྐྱར་ཞིབ་གནང་རོགས།',
 'tooltip-diff' => 'གང་ལ་བཟོ་བཅོས་བྱས་པའི་ཡིག་འབྲུ་སྟོན་པ།',
+'tooltip-compareselectedversions' => 'ཤོག་ངོས་འདེམས་བཞིན་བ་གཉིས་ཀྱི་བར་བཟོ་འཅོས་དཔར་གཞིའི་ཁྱད་པར་སྟོན།',
+'tooltip-rollback' => '"རྒྱབ་སྒྲིལ།" ཞེས་པ་འདིས་ཤོག་ངོས་སྟེང་གི་དེ་སྔོན་གི་རྩོམ་སྒྲིག་མཐུན་འགྱུར་རྣམས་མཐེབ་གཞོང་གནོན་ཐེངས་གཅིག་ལ་ཕྱིར་ལྡོག་བྱེད་རྒྱུ་ཡིན།',
+'tooltip-undo' => '"ཕྱིར་འཐེན།" ཞེས་པ་དེས་ཁྱེད་ཀྱི་རྩོམ་སྒྲིག་ཕྱིར་ལྡོག་པ་དང་སྔོན་འཚུད་བལྟ་ཞིབ་ཤོག་ངོས་ཁ་ཕྱེ་རྒྱུ་ཡིན། མཇུག་སྡོམ་ཀྱི་རྒྱུ་རྐྱེན་གླེང་འཇུག་རྒྱུ་ཡིན།',
 'tooltip-summary' => 'ཕྱོགས་བསྡོམས་ཐུང་ངུ་ཞིག་འབྲིས་',
 
 # Browsing diffs
@@ -842,11 +953,24 @@ $messages = array(
 'nextdiff' => 'རྩོམ་སྒྲིག་གསར་གྲས། →',
 
 # Media information
+'file-info-size' => '$1 × $2 བརྙན་རྒྱུ།, ཡིག་ཆ་ཆེ་ཆུང།: $3, རྣམ་གཞག།: $4',
 'show-big-image' => 'ཐོག་མའི་ཡིག་ཆ།',
 
 # Special:NewFiles
 'ilsubmit' => 'འཚོལ།',
 
+# Bad image list
+'bad_image_list' => 'གཤམ་གྱི་རྣམ་གཞག་ལྟར་རྗེས་སུ་འབྲང་རོགས།:
+རེའུ་མིག་ཡོད་པ་ཁོ་ན་ཆ་འཇོག་བྱེད་རྒྱ་ཡིན།',
+
+# Metadata
+'metadata' => 'རྒྱུ་གཞི་གྲངས།',
+'metadata-help' => 'ཡིག་ཆ་འདིར་ཆ་འཕྲིན་གཞན་དག་པ་ཁ་ཅིག་འདུག། ཕལ་ཆེར་གྲངས་འཛིན་དཔར་ཆས་འམ་འབེབས་ཆས་ལས་གྲངས་འཛིན་ཡོང་ཆེད་བཟོས་པ་ཡིན། 
+གལ་སྲིད་ཡིག་ཆ་འདིར་འགྱུར་བ་གཏོང་གནང་ན། དེ་སྔོན་གྱི་ལྟར་ཞིབས་ཚག་སྟོན་མི་ཐུབ།',
+'metadata-fields' => 'དཔར་རིས་ཀྱི་ནང་དོན་འདིར་ཡོད་པ་རྣམས་ནང་དོན་ཞིབ་ཕྲའི་སྐབས་སྟོན་རྒྱུ་ཡིན། དེ་མིན་རྣམས་རང་འགུལ་གྱི་འབས་ཞོགས་རྒྱུ་ཡིན།
+* བཟོ་སྐྲུན།
+* དབྱབས་གཟུགས།',
+
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'ཚང་མ།',
 'namespacesall' => 'ཡོངས་རྫོགས།',
@@ -859,11 +983,15 @@ $messages = array(
 'table_pager_limit_submit' => 'སོང་།',
 
 # Watchlist editing tools
+'watchlisttools-view' => 'འབྲེལ་ཡོད་འགྱུར་བཅོས་ལ་གཟིགས་རོགས།',
 'watchlisttools-edit' => 'མཉམ་འཇོག་ཐོར་ལྟ་བ་དང་བསྒྱུར་བཅོས་བྱེད་པ།',
 'watchlisttools-raw' => 'ལྟ་ཐོའི་གོ་རིམ་བཅོས་སྒྲིག',
 
 # Special:SpecialPages
-'specialpages' => 'དམིགས་གསལ་ཤོག་ངོས།',
+'specialpages' => 'ཆེད་ལས་ཤོག་ངོས།',
+
+# Special:Tags
+'tag-filter' => '[[Special:མཆན་བུ་|མཆན་བུ།]] འདེམས་འཚག།:',
 
 # New logging system
 'rightsnone' => '(སྟོང་པ།)',
index f8fdb42..074feb0 100644 (file)
@@ -216,7 +216,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Kas din un eilskrid eus ar posteloù a gasan da implijerien all',
 'tog-diffonly' => "Arabat diskouez danvez ar pennadoù dindan an diforc'hioù",
 'tog-showhiddencats' => 'Diskouez ar rummadoù kuzhet',
-'tog-noconvertlink' => 'Diweredekaat amdroadur an titloù',
 'tog-norollbackdiff' => 'Na ziskouez an diff goude un distaoladenn',
 'tog-useeditwarning' => 'Kas keloù din pa guitaan ur bajenn degaset kemmoù enni hep enrollañ',
 'tog-prefershttps' => "Implijout bepred ur c'hevreadur suraet pa vezit kevreet",
index 795df35..4b6ab4c 100644 (file)
@@ -318,7 +318,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Pošalji mi kopije emailova koje pošaljem drugim korisnicima',
 'tog-diffonly' => 'Ne prikazuj sadržaj stranice ispod prikaza razlika',
 'tog-showhiddencats' => 'Prikaži skrivene kategorije',
-'tog-noconvertlink' => 'Onemogući konverziju naslova linkova',
 'tog-norollbackdiff' => 'Nakon vraćanja zanemari prikaz razlika',
 'tog-useeditwarning' => 'Upozori me kada napustim stranicu za izmjene bez spašenih promjena',
 'tog-prefershttps' => 'Uvijek koristi sigurnu konekciju kada sam prijavljen.',
index db20f8f..f5237c9 100644 (file)
@@ -240,7 +240,6 @@ $messages = array(
 'tog-ccmeonemails' => "Envia'm còpia dels missatges que enviï als altres usuaris",
 'tog-diffonly' => 'Amaga el contingut de la pàgina davall de la taula de diferències',
 'tog-showhiddencats' => 'Mostra les categories ocultes',
-'tog-noconvertlink' => 'Inhabilita la conversió dels títols dels enllaços',
 'tog-norollbackdiff' => 'Omet la pàgina de diferències després de realitzar una reversió',
 'tog-useeditwarning' => "Avisa'm quan surti d'una pàgina d'edició amb canvis sense desar",
 'tog-prefershttps' => 'Utilitza sempre una connexió segura en iniciar una sessió',
@@ -617,7 +616,7 @@ No oblideu de canviar les vostres [[Special:Preferences|preferències de {{SITEN
 'yourname' => "Nom d'usuari",
 'userlogin-yourname' => 'Usuari',
 'userlogin-yourname-ph' => "Introduïu el vostre nom d'usuari",
-'createacct-another-username-ph' => "Introdueix el nom d'usuari",
+'createacct-another-username-ph' => "Introduïu el nom d'usuari",
 'yourpassword' => 'Contrasenya',
 'userlogin-yourpassword' => 'Contrasenya',
 'userlogin-yourpassword-ph' => 'Introduïu la vostra contrasenya',
@@ -654,11 +653,11 @@ No oblideu de canviar les vostres [[Special:Preferences|preferències de {{SITEN
 Feu servir el formulari de sota per iniciar la sessió com un altre usuari.',
 'userlogin-createanother' => 'Crea un altre compte',
 'createacct-join' => 'Introduïu les vostres dades.',
-'createacct-another-join' => 'Introdueix la informació del nou compte a continuació:',
+'createacct-another-join' => 'Introduïu la informació del nou compte a continuació:',
 'createacct-emailrequired' => 'Adreça de correu electrònic',
 'createacct-emailoptional' => 'Adreça de correu electrònic (opcional)',
 'createacct-email-ph' => 'Introduïu la vostra adreça de correu electrònic',
-'createacct-another-email-ph' => 'Introdueix una adreça de correu electrònic',
+'createacct-another-email-ph' => 'Introduïu una adreça de correu electrònic',
 'createaccountmail' => "Utilitza una contrasenya aleatòria temporal i envia-la a l'adreça de correu indicada",
 'createacct-realname' => 'Nom real (opcional)',
 'createaccountreason' => 'Motiu:',
@@ -737,6 +736,9 @@ Espereu $1 abans de tornar-ho a provar.",
 'suspicious-userlogout' => "S'ha denegat la vostra petició per tancar la sessió ja què sembla que va ser enviada per un navegador defectuós o un proxy cau.",
 'createacct-another-realname-tip' => "El nom real és opcional.
 Si decidiu proporcionar-lo, s'utilitzarà per a reconèixer a l'usuari el seu treball.",
+'pt-login' => 'Iniciar sessió',
+'pt-createaccount' => 'Crea un compte',
+'pt-userlogout' => 'Finalitza la sessió',
 
 # Email sending
 'php-mail-error-unknown' => 'Error desconegut en la funció mail() de PHP',
@@ -767,7 +769,7 @@ Per completar l'inici de sessió heu de definir una contrasenya nova a continuac
 'resetpass-temp-password' => 'Contrasenya temporal:',
 'resetpass-abort-generic' => 'Una extensió ha interromput el canvi de contrasenya.',
 'resetpass-expired' => 'La contrasenya ha vençut. Definiu una contrasenya nova per iniciar la sessió.',
-'resetpass-expired-soft' => 'La contrasenya ha vençut i cal restablir-la. Trieu una contrasenya nova ara, o feu clic a cancel·lat per a restablir-la més endavant.',
+'resetpass-expired-soft' => 'La contrasenya ha vençut i cal restablir-la. Trieu una contrasenya nova ara, o feu clic a «{{int:resetpass-submit-cancel}}» per a restablir-la més endavant.',
 
 # Special:PasswordReset
 'passwordreset' => 'Restablir contrasenya',
@@ -1610,14 +1612,26 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
 'recentchanges-legend-heading' => "'''Llegenda:'''",
 'recentchanges-legend-newpage' => '(vegeu també la [[Special:NewPages|llista de pàgines noves]])',
 'recentchanges-legend-plusminus' => "(''±123'')",
-'rcnotefrom' => 'A sota hi ha els canvis des de <b>$2</b> (es mostren fins <b>$1</b>).',
+'rcnotefrom' => 'A sota hi ha els canvis des de <strong>$2</strong> (es mostren fins <strong>$1</strong>).',
 'rclistfrom' => 'Mostra els canvis nous des de $1',
 'rcshowhideminor' => '$1 edicions menors',
+'rcshowhideminor-show' => 'Mostra',
+'rcshowhideminor-hide' => 'Amaga',
 'rcshowhidebots' => '$1 bots',
+'rcshowhidebots-show' => 'Mostra',
+'rcshowhidebots-hide' => 'Amaga',
 'rcshowhideliu' => '$1 usuaris registrats',
+'rcshowhideliu-show' => 'Mostra',
+'rcshowhideliu-hide' => 'Amaga',
 'rcshowhideanons' => '$1 usuaris anònims',
+'rcshowhideanons-show' => 'Mostra',
+'rcshowhideanons-hide' => 'Amaga',
 'rcshowhidepatr' => '$1 edicions supervisades',
+'rcshowhidepatr-show' => 'Mostra',
+'rcshowhidepatr-hide' => 'Amaga',
 'rcshowhidemine' => '$1 edicions pròpies',
+'rcshowhidemine-show' => 'Mostra',
+'rcshowhidemine-hide' => 'Amaga',
 'rclinks' => 'Mostra els darrers $1 canvis en els darrers $2 dies<br />$3',
 'diff' => 'dif',
 'hist' => 'hist',
@@ -1740,6 +1754,8 @@ Si us plau, si encara desitgeu carregar el vostre fitxer, torneu enrera i carreg
 'uploaddisabledtext' => "S'ha inhabilitat la càrrega de fitxers.",
 'php-uploaddisabledtext' => 'La càrrega de fitxer està desactivada al PHP. Comproveu les opcions del fitxer file_uploads.',
 'uploadscripted' => 'Aquest fitxer conté codi HTML o de seqüències que pot ser interpretat equivocadament per un navegador.',
+'uploadscriptednamespace' => 'Aquest fitxer SVG conté un espai de noms "$1" no autoritzat',
+'uploadinvalidxml' => "No s'ha pogut analitzar l'XML del fitxer carregat.",
 'uploadvirus' => 'El fitxer conté un virus! Detalls: $1',
 'uploadjava' => 'El fitxer és un arxiu ZIP que conté un fitxer .class de Java. No està permesa la càrrega de fitxers Java, perquè poden passar per alt les restriccions de seguretat.',
 'upload-source' => 'Fitxer font',
@@ -2375,7 +2391,7 @@ Vegeu $2 per a un registre dels esborrats més recents.",
 'delete-edit-reasonlist' => "Edita els motius d'eliminació",
 'delete-toobig' => "Aquesta pàgina té un historial d'edicions molt gran, amb més de $1 {{PLURAL:$1|canvi|canvis}}. L'eliminació d'aquestes pàgines està restringida per a prevenir que hi pugui haver un desajustament seriós de la base de dades de tot el projecte {{SITENAME}} per accident.",
 'delete-warning-toobig' => "Aquesta pàgina té un historial d'edicions molt gran, amb més de $1 {{PLURAL:$1|canvi|canvis}}. Eliminar-la podria suposar un seriós desajustament de la base de dades de tot el projecte {{SITENAME}}; aneu en compte abans dur a terme l'acció.",
-'deleting-backlinks-warning' => "'''Avís:''' Altres pàgines enllacen o transclouen de la pàgina que esteu a punt de suprimir.",
+'deleting-backlinks-warning' => "'''Avís:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Altres pàgines]] enllacen o transclouen de la pàgina que esteu a punt de suprimir.",
 
 # Rollback
 'rollback' => 'Reverteix edicions',
@@ -2550,8 +2566,10 @@ Per més detalls, la última entrada del registre es mostra a continuació:",
 'sp-contributions-blocked-notice-anon' => 'En aquests moments, aquesta adreça IP es troba blocada.
 Per més detalls, la última entrada del registre es mostra a continuació:',
 'sp-contributions-search' => 'Cerca les contribucions',
+'sp-contributions-suppresslog' => "contribucions suprimides de l'usuari",
 'sp-contributions-username' => "Adreça IP o nom d'usuari:",
 'sp-contributions-toponly' => 'Mostra només revisions superiors',
+'sp-contributions-newonly' => 'Mostra només modificacions que són creacions de pàgina',
 'sp-contributions-submit' => 'Cerca',
 
 # What links here
@@ -4075,6 +4093,4 @@ També expandeix les funcions sintàctiques, com ara <code><nowiki>{{</nowiki>#l
 'expand_templates_generate_rawhtml' => "Mostra l'HTML sense filtrar",
 'expand_templates_preview' => 'Previsualitza',
 
-# Unknown messages
-'uploadinvalidxml' => "No s'ha pogut analitzar l'XML del fitxer carregat.",
 );
index 7fc2dd8..37210cd 100644 (file)
@@ -327,7 +327,7 @@ $messages = array(
 'tog-usenewrc' => 'Лелабе дика могӀам керла чу хийцамашна (оьшу JavaScript)',
 'tog-numberheadings' => 'Ша шех хlитто терахь корташна',
 'tog-showtoolbar' => 'Гайта лакхара гӀирсан дакъа нисйеш аттон оц тадар чохь (JavaScript)',
-'tog-editondblclick' => 'Нисйе агӀонаш шозза тӀетаӀийча (JavaScript)',
+'tog-editondblclick' => 'Нисъе агӀонаш шозза тӀетаӀийча (JavaScript)',
 'tog-editsectiononrightclick' => 'Нисде дакъа шозза бакъехьар дахка тӀетаӀийча оцу кортан (JavaScript)',
 'tog-rememberpassword' => 'Даглаца сан дӀаяздар хӀокху браузеран тӀехь (цхьан $1 {{PLURAL:$1|дийнахь}})',
 'tog-watchcreations' => 'ТӀетоха ас кхоьллина агӀонаш тергаме могӀам чу',
@@ -355,7 +355,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Дlадахьийта суна исанна кехат, аса дохьуьйтуш долу кхечу декъашхошна.',
 'tog-diffonly' => 'Ма гайта агlон чулацам шина башхонца цхьатерра йолуш',
 'tog-showhiddencats' => 'Гайта къайлаха йолу категореш',
-'tog-noconvertlink' => 'Хааман хьажораг кхуллу гӀирс дӀабайа',
 'tog-norollbackdiff' => 'Юха яккхиначул тӀаьхьа ма гайта версешан башхо',
 'tog-useeditwarning' => 'Хаамбе бина хийцамаш дӀаязцабеш аса болх дӀатосучу хенахь',
 'tog-prefershttps' => 'Даима лела йе лардина системин чудалар',
@@ -470,7 +469,7 @@ $messages = array(
 # Cologne Blue skin
 'qbfind' => 'Лаха',
 'qbbrowse' => 'Хьажар',
-'qbedit' => 'Нисйé',
+'qbedit' => 'Нисъе',
 'qbpageoptions' => 'Агlо нисйар',
 'qbmyoptions' => 'Хьан нисдарш',
 'faq' => 'СиХХ',
@@ -484,7 +483,7 @@ $messages = array(
 'vector-action-undelete' => 'Меттахlоттадé',
 'vector-action-unprotect' => 'ГӀароллех къаста',
 'vector-view-create' => 'Кхоллар',
-'vector-view-edit' => 'Нисйé',
+'vector-view-edit' => 'Нисъе',
 'vector-view-history' => 'АгӀона хийцамаш',
 'vector-view-view' => 'Éшар',
 'vector-view-viewsource' => 'Билглонашка хьажа',
@@ -508,9 +507,9 @@ $messages = array(
 'permalink' => 'Даиман йолу хьажораг',
 'print' => 'Зорба тоха',
 'view' => 'Хьажа',
-'edit' => 'Нисйé',
+'edit' => 'Нисъе',
 'create' => 'Кхолла',
-'editthispage' => 'Нисйé хlара агlо',
+'editthispage' => 'Нисъе хӀъара агӀо',
 'create-this-page' => 'Кхолла хlара агlо',
 'delete' => 'ДӀаяккха',
 'deletethispage' => 'ДӀаяккха хӀара агӀо',
@@ -574,8 +573,8 @@ $1',
 'policy-url' => 'Project:Бакъо',
 'portal' => 'Юкъараллин ков',
 'portal-url' => 'Project:Юкъараллин ков',
-'privacy' => 'Ð\9fолиÑ\82ика ÐºÑ\8aайлаÑ\85а',
-'privacypage' => 'Project:Ð\9fолиÑ\82ика ÐºÑ\8aайлаÑ\85а',
+'privacy' => 'Ð\9aÑ\8aайлаÑ\85а Ð¿Ð¾Ð»Ð¸Ñ\82ика',
+'privacypage' => 'Project:Ð\9aÑ\8aайлаÑ\85а Ð¿Ð¾Ð»Ð¸Ñ\82ика',
 
 'badaccess' => 'ТӀекхачарехь гӀалат',
 'badaccess-group0' => 'Шуьга кхочуш далур дац дехарца деш дерг',
@@ -594,10 +593,10 @@ $1',
 'newmessageslinkplural' => '{{PLURAL:$1|керла хаам|999=керла хаамаш}}',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|тӀаьхьара бина хийцам|999=тӀаьхьара бина хийцамаш}}',
 'youhavenewmessagesmulti' => 'Хьуна кхаьчна керла хаам оцу $1',
-'editsection' => 'нисйé',
-'editold' => 'нисйé',
+'editsection' => 'нисъе',
+'editold' => 'нисъе',
 'viewsourceold' => 'хьажа йолуш йолучу коде',
-'editlink' => 'нисйé',
+'editlink' => 'нисъе',
 'viewsourcelink' => 'хьажа йолуш йолучу коде',
 'editsectionhint' => 'Нисде дакъа: $1',
 'toc' => 'Чулацам',
@@ -712,9 +711,16 @@ URL язъеш гӀалат даьлла хила мега.
 'ns-specialprotected' => 'ХӀокху «{{ns:special}}» цӀерийн меттигашан агӀонаш таян йиш яц.',
 'titleprotected' => "[[Декъашхочо:$1|$1]] дихкина ишта корта болуш агӀо кхоллар.
 Гайтина бахьна: ''$2''.",
+'filereadonlyerror' => "файл хийца цатарло «$1», «$2» Ӏалаш ечехь ешаран хьолехь хилар бахьнехь.
+
+ХӀара хьал хӀоттиначу куьйгалхочо битина хаам: «''$3''».",
+'invalidtitle-knownnamespace' => 'Магийна боцу коьртамогӀа цӀерийн меттигца «$2» йоза  «$3»',
+'invalidtitle-unknownnamespace' => 'Магийна боцу коьртамогӀа ца йовза меттигца $1 «$2» йозанца',
 'exception-nologin' => 'ХӀинца а ахьа системин чохь болх беш бац',
+'exception-nologin-text-manual' => 'АгӀо тӀекхача луш хилийта оьшу $1.',
 
 # Virus scanner
+'virus-badscanner' => "Нисяран гӀалат. Ца йовза вирусийн сканер: ''$1''",
 'virus-scanfailed' => 'сканиран гӀалат (код $1)',
 'virus-unknownscanner' => 'йозуш йоцу антивирус:',
 
@@ -736,7 +742,7 @@ URL язъеш гӀалат даьлла хила мега.
 'yourpasswordagain' => 'Юха язъе пароль:',
 'createacct-yourpasswordagain' => 'Бакъ йе пароль',
 'createacct-yourpasswordagain-ph' => 'Кхин цкъа язъе пароль',
-'remembermypassword' => 'Даглаца сан дӀаяздар хӀокху компьютеран тӀехь (цхьан $1 {{PLURAL:$1|динахь}})',
+'remembermypassword' => 'Ð\94аглаÑ\86а Ñ\81ан Ð´Ó\80аÑ\8fздаÑ\80 Ñ\85Ó\80окÑ\85Ñ\83 ÐºÐ¾Ð¼Ð¿Ñ\8cÑ\8eÑ\82еÑ\80ан Ñ\82Ó\80еÑ\85Ñ\8c (Ñ\86Ñ\85Ñ\8cан $1 {{PLURAL:$1|дийнаÑ\85Ñ\8c}})',
 'userlogin-remembermypassword' => 'Дагахь латт ве/е со',
 'userlogin-signwithsecure' => 'Ларийна цхьаьнакхетар',
 'yourdomainname' => 'Хьан машан меттиг:',
@@ -833,6 +839,7 @@ URL язъеш гӀалат даьлла хила мега.
 
 # Change password dialog
 'changepassword' => 'Хийца пароль',
+'resetpass_announce' => 'Чудахар чекх далийта хӀотта йе керла пароль.',
 'resetpass_text' => '<!-- Кхузахь язъде хьай йоза -->',
 'resetpass_header' => 'Хийца дӀаяздаран пароль',
 'oldpassword' => 'Шираелла пароль:',
@@ -844,13 +851,19 @@ URL язъеш гӀалат даьлла хила мега.
 'resetpass-no-info' => 'ХӀара агӀо лело системин чугӀо.',
 'resetpass-submit-loggedin' => 'Хийца пароль',
 'resetpass-submit-cancel' => 'Цаоьшу',
+'resetpass-recycled' => 'Дехар до, хӀинца йолччул башха пароль хӀотта йе.',
+'resetpass-temp-emailed' => 'Ахьа чугӀош язйина цкъачунна электронан почте яийтина пароль. Чудахар чекхдалийта язъян еза керла пароль.',
 'resetpass-temp-password' => 'Цхьан хана пароль:',
 'resetpass-abort-generic' => 'Пароль хийцар дӀахедар',
+'resetpass-expired' => 'Хьан паролан хан чекхелла. Дехар до керла пароль хӀоттаяр.',
+'resetpass-expired-soft' => 'Хьа паролан хан чекхелла. Дехар до, харжа керла пароль я тӀетаӀе «{{int:resetpass-submit-cancel}}», и тӀехо хица.',
 
 # Special:PasswordReset
 'passwordreset' => 'Пароль кхоссар',
 'passwordreset-text-many' => '{{PLURAL:$1|Пароль кхосса юза лахара цхьа меттиг.}}',
 'passwordreset-legend' => 'Пароль кхоссар',
+'passwordreset-disabled' => 'ХӀокху вики чохь пароль кхоссар дӀадайина ду.',
+'passwordreset-emaildisabled' => 'Электронан почтан функцеш хӀокху вики чохь дӀаяйина ю.',
 'passwordreset-username' => 'Декъашхочун цӀе:',
 'passwordreset-domain' => 'Домен:',
 'passwordreset-capture' => 'Хьажа беанчу хааме?',
@@ -1047,6 +1060,7 @@ URL язъеш гӀалат даьлла хила мега.
 'post-expand-template-argument-category' => 'Кепашан аргументаш юкъахь йитина агӀонаш',
 'parser-template-loop-warning' => 'Карийна кепаш юкъахь хилла шад: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Дозанал хьаладаьлла кӀоргенца юх юха дина кеп ($1)',
+'parser-unstrip-loop-warning' => 'ДӀачӀагӀанца pre карина',
 
 # "Undo" feature
 'undo-success' => 'Нисйинарг а тlе цалаца мега. Дехар до, хьажа цхьатерра йуй башхо, тешна хила, баккъалла иза хийцам буйте хьуна безарг, тlакха тlе таlайе «дlайазйе агlо», хийцам хlотта ба.',
@@ -1086,13 +1100,22 @@ URL язъеш гӀалат даьлла хила мега.
 'rev-deleted-comment' => '(нисдарах лаьцна хаам дӀабаьккхина)',
 'rev-deleted-user' => '(авторан цӏе дӏаяйина)',
 'rev-deleted-event' => '(дӀаяздар дӀаяьккхина)',
+'rev-deleted-user-contribs' => '[декъашхочун цӀе я IP-адрес дӀаяхина — къинхьегаман агӀонгара нисдар къайлаяьккхина]',
+'rev-deleted-text-permission' => "ХӀара агӀона верси '''дӀаяьккхина''' ю.
+Бахьна далина [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дӀаяьхнарш йолу тептар чохь].",
 'rev-deleted-text-unhide' => "ХӀара агӀона верси '''дӀаяьккхина''' ю.
 Бахьна далина [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дӀаяьхнарш йолу тептар чохь].
 Хьайна лаахь хьа йиш ю [$1 и верси хьажа].",
+'rev-suppressed-text-unhide' => "ХӀара агӀона верси '''къайлаяьккхина''' ю.
+Бахьна далина [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дӀаяьхнарш йолу тептар чохь].
+Хьайна лаахь хьа йиш ю [$1 и верси хьажа].",
 'rev-deleted-text-view' => "ХӀара агӀона верси '''дӀаяьккхина''' ю.
 Бахьна далина [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дӀаяьхнарш йолу тептар чохь].",
+'rev-suppressed-text-view' => "ХӀара агӀона верси '''къайлаяьккхина''' ю.
+Бахьна далина [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дӀаяьхнарш йолу тептар чохь].",
 'rev-deleted-no-diff' => "АгӀона цхьа верси '''дӀаяьккхина''' хилар бахьнехь, хӀуна версийн башхалла хьажа цало.
 Мадарра каро мега [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дӀаяккхаран тептар чохь].",
+'rev-suppressed-no-diff' => "Хьо хӀокху версешан башхала хьажа цало, царах цхьаъ '''дӀаяьккхина''' хилар бахьнехь.",
 'rev-delundel' => 'гайта/къайла',
 'rev-showdeleted' => 'гайта',
 'revisiondelete' => 'ДӀаяха / меттахӀотае агӀона версеш',
@@ -1102,7 +1125,7 @@ URL язъеш гӀалат даьлла хила мега.
 'revdelete-show-file-confirm' => 'Бакъалла лаьий хьуна дӀаяьккхина файлан версега хьажа «<nowiki>$1</nowiki>» $2 тӀера, $3?',
 'revdelete-show-file-submit' => 'Хlаъ',
 'revdelete-selected' => "'''АгӀона [[:$1]] {{PLURAL:$2|1=къастина верси|къастина версеш}}:'''",
-'logdelete-selected' => "'''Тептар чура {{PLURAL:$1|1=хаьржина дӀаяздар|хаьржина дӀаяздарш}}:'''",
+'logdelete-selected' => '<strong>Тептар чура {{PLURAL:$1|хаьржина дӀаяздар|хаьржина дӀаяздарш}}:</strong>',
 'revdelete-text' => "'''ДӀаяхна агӀонашан версеш а хелларш а гуш хир ду агӀона истори а тептаран а чохь, амма цара чулацам куьйгалхошна бен тӀекхочу чохь хир бац.'''
 {{SITENAME}} проектан куьйгалхойн йиш хир ю хӀокху интерфейс чухула дӀааьхинарш меттахӀотта я.",
 'revdelete-confirm' => 'Дехар до, бакъдар ахьа деш дерг [[{{MediaWiki:Policy-url}}|бакъонашца]] деш хилар.',
@@ -1180,6 +1203,7 @@ $1",
 'diff-empty' => '(башхалла яц)',
 'diff-multi-sameuser' => '(ца {{PLURAL:$1|гайтина юккъера цхьа верси|гайтина юккъера цхьа версеш}} оьцу декъашхочун)',
 'diff-multi-otherusers' => '(ца {{PLURAL:$1|гайтина юккъера верси|гайтина юккъера версеш}} {{PLURAL:$2|кхин цхьан декъашхочун|$2 декъашхойн}})',
+'diff-multi-manyusers' => '({{PLURAL:$1|гайтина яц $1 юккъера верси, йина|не показаны $1 юккъера версеш, йина}} {{PLURAL:$2|$2 декъашхочо|$2 декъашхоша}})',
 
 # Search results
 'searchresults' => 'Лахарна хилам',
@@ -1236,6 +1260,7 @@ $1",
 'preferences' => 'Гlирс нисбан',
 'mypreferences' => 'ГӀирс нисбан',
 'prefs-edits' => 'Нисдарши дукхалла:',
+'prefsnologintext2' => 'Оьшу $1, гӀирс дӀанисбан.',
 'prefs-skin' => 'Кечяран тема',
 'skin-preview' => 'Хьалха муха ю хьажа',
 'datedefault' => 'Iад йитарца',
@@ -1247,16 +1272,17 @@ $1",
 'prefs-rc' => 'Керла нисдарш',
 'prefs-watchlist' => 'Тергаме могӀам',
 'prefs-watchlist-days' => 'Денойн дукхалла:',
-'prefs-watchlist-days-max' => 'Къезиг  $1 {{PLURAL:$1|дена}}',
+'prefs-watchlist-days-max' => 'Къезиг $1 {{PLURAL:$1|дена}}',
 'prefs-watchlist-edits' => 'Тергаме могӀам чохь гойтучу нисдаршан максимальни дукхалла:',
 'prefs-watchlist-edits-max' => 'Уггар дукха: 1000',
 'prefs-watchlist-token' => 'Тергаме могӀанан токен:',
 'prefs-misc' => 'Кхин гlирсаш',
 'prefs-resetpass' => 'Хийца пароль',
 'prefs-changeemail' => 'Хийца электрони почт',
+'prefs-setemail' => 'Электронан почтан адрес дӀахӀоттор',
 'prefs-email' => 'Электронан почтан параметраш',
 'prefs-rendering' => 'Арахьара хатl',
-'saveprefs' => 'lалашдан',
+'saveprefs' => 'Ӏалашдан',
 'restoreprefs' => 'МеттахӀоттабе гӀирс Iад битарца',
 'prefs-editing' => 'Тадар',
 'rows' => 'МогӀанаш:',
@@ -1265,7 +1291,7 @@ $1",
 'stub-threshold' => 'Кеч яран доза <a href="#" class="stub">коьртамогӀамна хьажорагаш</a> (байташках):',
 'stub-threshold-disabled' => 'ДӀадайина',
 'recentchangesdays' => 'Керла нисдар гайта динахь:',
-'recentchangesdays-max' => 'Къезиг  $1 {{PLURAL:$1|дена}}',
+'recentchangesdays-max' => 'Къезиг $1 {{PLURAL:$1|дена}}',
 'recentchangescount' => 'Iад йитарца гойтуш долу нисдаршан дукхалла',
 'prefs-help-recentchangescount' => 'Гойту керла нисдарш, агӀонашан истори, тептарш.',
 'prefs-help-watchlist-token2' => 'Иза хьан тергаме могӀан къайла догӀа ду.
@@ -1297,7 +1323,7 @@ $1",
 'youremail' => 'Кехат яздо зlе цlе:',
 'username' => '{{GENDER:$1|Декъашхочун цӀе}}:',
 'uid' => 'Декъашхочун {{GENDER:$1|код}}:',
-'prefs-memberingroups' => '{{GENDER:$2|Тобана|Тобана}} {{PLURAL:$1|1=декъашхо|декъашхо}}:',
+'prefs-memberingroups' => '{{GENDER:$1|Тобана|Тобаншан}} {{PLURAL:$2|декъашхо|декъашхой}}:',
 'prefs-registration' => 'ДӀаяздар кхолийна хан:',
 'yourrealname' => 'Хьан бакъ цlе:',
 'yourlanguage' => 'Мотт:',
@@ -1315,6 +1341,7 @@ $1",
 'email' => 'Email',
 'prefs-help-email' => 'Электронан почтан адрес цахӀоттийча а хӀумма дац, амма иза оьшар ю, нагахь хьуна хьай пароль йицлахь.',
 'prefs-help-email-others' => 'Кхин дӀа цо кхечу декъашхошна йиш хуьлуьйту хьога электронан кехат даийта хьан агӀона чохь йолу хьажориган гӀоьнца.',
+'prefs-help-email-required' => 'Электронан почтан адрес яздан деза.',
 'prefs-info' => 'Коьрта хаам',
 'prefs-i18n' => 'Юкъардекъа мотт',
 'prefs-signature' => 'КуьгтаӀор',
@@ -1361,7 +1388,7 @@ $1",
 'group' => 'Тоба:',
 'group-user' => 'Декъашхой',
 'group-autoconfirmed' => 'Ша тӀелаьцболу декъашхой',
-'group-bot' => 'ШаболÑ\85Ñ\85ой',
+'group-bot' => 'Ð\91оÑ\82аÑ\88',
 'group-sysop' => 'Куьйгалхой',
 'group-bureaucrat' => 'Бюрократаш',
 'group-suppress' => 'Ревизораш',
@@ -1369,14 +1396,14 @@ $1",
 
 'group-user-member' => '{{GENDER:$1|декъашхо}}',
 'group-autoconfirmed-member' => '{{GENDER:$1|шашеха тӀелаьцна декъашхо}}',
-'group-bot-member' => 'шаболххо',
+'group-bot-member' => '{{GENDER:$1|бот}}',
 'group-sysop-member' => '{{GENDER:$1|куьйгалхо}}',
 'group-bureaucrat-member' => '{{GENDER:$1|бюрократхо}}',
 'group-suppress-member' => '{{GENDER:$1|ревизор}}',
 
 'grouppage-user' => '{{ns:project}}:Декъашхой',
 'grouppage-autoconfirmed' => '{{ns:project}}:Бакъонаш йолу декъашхой',
-'grouppage-bot' => '{{ns:project}}:ШаболÑ\85Ñ\85ой',
+'grouppage-bot' => '{{ns:project}}:Ð\91оÑ\82аÑ\88',
 'grouppage-sysop' => '{{ns:project}}:Куьйгалхой',
 'grouppage-bureaucrat' => '{{ns:project}}:Бюрократаш',
 'grouppage-suppress' => '{{ns:project}}:Ревизораш',
@@ -1472,28 +1499,41 @@ $1",
 'action-movefile' => 'хӀокху файлан цӀе хийца',
 'action-upload' => 'чуяккха хӀара файл',
 'action-reupload' => 'йолуш йолу файлан тӀехула дӀаязъяр',
+'action-upload_by_url' => 'URL адресан тӀера хӀара файл чуяккхар',
 'action-writeapi' => 'нисдеш лелойо API',
 'action-delete' => 'дӀаяккха хӀара агӀо',
 'action-deleterevision' => 'агӀона хӀара верси дӀаяккхар',
 'action-deletedhistory' => 'хӀокху агӀона дӀаяккхинцу исторега хьажар',
 'action-browsearchive' => 'ДӀаяхна агӀонаш лахар',
 'action-undelete' => 'хӀара агӀо меттахӀоттор',
+'action-suppressrevision' => 'хӀокху къайлаха йолу агӀон версеш хьажар а меттахӀоттор а',
 'action-suppressionlog' => 'хӀокху долара тептаре хьажар',
 'action-block' => 'хӀокху декъашхошка тадарш ца дайта дехкар хӀоттор',
+'action-protect' => 'хӀокху агӀона гӀоралин хьал хийцар',
+'action-rollback' => 'билгала агӀона тӀехьарчу декъашхочо дина нисдарш сиха юхадахар',
+'action-import' => 'кхечу википедешкара агӀонаш импорт ян',
+'action-importupload' => 'файлаш чуяхарца агӀонаш импорт ян',
 'action-patrol' => 'кхечера нисдарш хьаьжна сана билгалдар',
 'action-autopatrol' => 'шен нисдарш хьаьжна сана билгалдар',
+'action-unwatchedpages' => 'тергамехь йоцу агӀонийн могӀане хьажар',
+'action-mergehistory' => 'хӀокху агӀона хийцаман истори вовшахтохар',
+'action-userrights' => 'декъашхойн массо бакъонаш хийцар',
+'action-userrights-interwiki' => 'кхечу викеш чура декъашхойн бакъонаш хийцар',
 'action-siteadmin' => 'хаамийн гуламан блоктохар а блокдӀаяккхар а',
 'action-sendemail' => 'Электронан кехат дӀадахьийтар',
 'action-editmywatchlist' => 'хьан тергаме могӀам табар',
 'action-viewmywatchlist' => 'шен тергаме могӀане хьажар',
+'action-viewmyprivateinfo' => 'хьан долара хааме хьажар',
+'action-editmyprivateinfo' => 'хьан долара хаам табар',
 
 # Recent changes
-'nchanges' => '$1 {{PLURAL:$1|хийцам|хийцамаш|хийцамаш}}',
+'nchanges' => '$1 {{PLURAL:$1|хийцам|хийцамаш}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|тӀеххьара чудаларца}}',
 'enhancedrc-history' => 'истори',
 'recentchanges' => 'Керла нисдарш',
 'recentchanges-legend' => 'Гlирс нисбарна керла нисдарш',
 'recentchanges-summary' => 'Лахахь гайтина хене хьаьжна Википедин агӀонашкахь тӀаьхьара бина хийцамаш',
-'recentchanges-noresult' => 'Билгал йинчу хенахь цӀа хийцамаш бина бац.',
+'recentchanges-noresult' => 'Билгал йинчу хенахь цхьа хийцамаш бина бац.',
 'recentchanges-feed-description' => 'Тергам бе тlаьхьара вики хийцаман хlокху ларца.',
 'recentchanges-label-newpage' => 'Оцу нисдарца кхоллина керла агlо.',
 'recentchanges-label-minor' => 'Хlара нисдинарг къастийна жимо долушсан',
@@ -1501,14 +1541,26 @@ $1",
 'recentchanges-label-unpatrolled' => 'ХӀара нисдар хӀинца цхьано патрулировать дина дац',
 'recentchanges-label-plusminus' => 'байташкахь барам хийцар',
 'recentchanges-legend-newpage' => '(хьажа кхин [[Special:NewPages|керла агӀонийн могӀа]])',
-'rcnotefrom' => "Лахахь гайтина тӀера '''$2''' хийцамаш ('''$1''' къезиг).",
+'rcnotefrom' => 'Лахахь гайтина тӀера <strong>$2</strong> (хийцамаш <strong>$1</strong> кӀезиг).',
 'rclistfrom' => 'Гайта хийцам оцу $1.',
 'rcshowhideminor' => '$1 кегийра нисдарш',
-'rcshowhidebots' => '$1 шабелхалой',
+'rcshowhideminor-show' => 'Гайта',
+'rcshowhideminor-hide' => 'Къайладаха',
+'rcshowhidebots' => '$1 боташ',
+'rcshowhidebots-show' => 'Гайта',
+'rcshowhidebots-hide' => 'Къайлабаха',
 'rcshowhideliu' => '$1 шайн цӀершца болу декъашхой',
+'rcshowhideliu-show' => 'Гайта',
+'rcshowhideliu-hide' => 'Къайлабаха',
 'rcshowhideanons' => '$1 цӀе хьулйина декъашхой',
+'rcshowhideanons-show' => 'Гайта',
+'rcshowhideanons-hide' => 'Къайлабаха',
 'rcshowhidepatr' => '$1 хьажжина нисдарш',
+'rcshowhidepatr-show' => 'Гайта',
+'rcshowhidepatr-hide' => 'Къайладаха',
 'rcshowhidemine' => '$1 айхьа нисдинарш',
+'rcshowhidemine-show' => 'Гайта',
+'rcshowhidemine-hide' => 'Къайладаха',
 'rclinks' => 'Гайта тlаьхьара $1 хийцамаш оцу $2 ден<br />$3',
 'diff' => 'тейп тайпнара',
 'hist' => 'истори',
@@ -1574,6 +1626,17 @@ $1",
 'filetype-mime-mismatch' => 'Файлан шоръелла «.$1» оцунна MIME-тайпанца йогӀуш яц ($2).',
 'filetype-banned-type' => "'''«.$1»''' — {{PLURAL:$4|1=ца магийна файлан тайп|ца магийна файлийн тайпанаш}}.
 {{PLURAL:$3|1=Магийна файлан тайп ю|Магийна файлийн тайпанаш ю:}} $2.",
+'filetype-missing' => 'Файлан шоралла яц (масала, «.jpg»).',
+'empty-file' => 'Ахьа яхьийтина файл еса ю.',
+'file-too-large' => 'Ахьа яхьийтина файл тӀех йоккха ю.',
+'filename-tooshort' => 'Файлан цӀе тӀехь йоца ю.',
+'filetype-banned' => 'ХӀара файлийн тайп магийна яц.',
+'verification-error' => 'ХӀара файл хьаран чекх цаяьлла.',
+'illegal-filename' => 'Магийна йоцу файлан цӀе.',
+'overwrite' => 'йолуш йолу файл хийца магийна дац.',
+'unknown-error' => 'Ца довза гӀалат даьлла',
+'tmp-create-error' => 'Цатарло хана файл кхолла.',
+'tmp-write-error' => 'Хана файлан дӀаяздаран гӀалат',
 'emptyfile' => 'Ахьа чуйоккхуш йолу файл еса хийла там бу. Иза гӀалат хийла мега файлан цӀе нийса язйина йоцу дела. Дехар до хьажа бакъалла и юьй ахьа чуйоккхуш йолу файл.',
 'fileexists' => 'Иштта цӀе йолу файл йолуш ю. Дехар до, хьажа <strong>[[:$1]]</strong>, лаьий хьуна и хийца. 
 [[$1|thumb]]',
@@ -1600,8 +1663,14 @@ $1",
 'savefile' => 'ДӀаязе йе файл',
 'uploadedimage' => 'чуяьккхина «[[$1]]»',
 'overwroteimage' => 'Чуяьккхина файлан керла верси «[[$1]]»',
+'uploaddisabled' => 'Чуяккхар магийна дац',
+'copyuploaddisabled' => 'URL тӀера чуяккхар дӀадайина ду.',
+'uploadfromurl-queued' => 'Хьа чуяккхар рогӀехь ду.',
+'uploaddisabledtext' => 'Файлаш чуяхар дӀадайина ду.',
+'uploadscriptednamespace' => "ХӀокху SVG-файлан цӀерийн меттиг нийса яц '$1'",
 'upload-source' => 'ДIайолалун файл',
 'sourcefilename' => 'ДIайолалун файл:',
+'sourceurl' => 'Хьостан URL-адрес:',
 'destfilename' => 'Файлан керла цӀе:',
 'upload-maxfilesize' => 'Файлан: $1 максимальни барам',
 'upload-description' => 'Файлах лаьцна',
@@ -1623,7 +1692,16 @@ JD # Jenoptik
 MGP # Pentax
 PICT # тайп тайпан
  #</pre> <!-- битийша хlара могlа ша мабарра -->',
+'upload-success-subj' => 'Чуяккхар кхиамца чекхделира.',
+'upload-success-msg' => 'Хьа чуяккхар [$2] кхиамца чекхделира. Хиллачуьнга хьажа йиш ю кхузахь: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Чуяккхаран бала',
+'upload-failure-msg' => 'Хьа чуяккхаран бала карина [$2]:
 
+$1',
+'upload-warning-subj' => 'ДӀахьедар',
+'upload-warning-msg' => 'Чуйоккхуш [$2] гӀалат даьлла. И нисдан юхагӀо [[Special:Upload/stash/$1|upload form]] чу.',
+
+'upload-proto-error' => 'Нийса йоцу протокол',
 'upload-file-error' => 'Чоьхьара гӀалат',
 'upload-unknown-size' => 'Хууш доцу барам',
 'upload-http-error' => 'Даьлла гӀалат HTTP: $1',
@@ -1631,12 +1709,16 @@ PICT # тайп тайпан
 # File backend
 'backend-fail-readonly' => 'ХӀара «$1» хӀинца еша бен таро яц. Бахьна: «$2»',
 
+# Special:UploadStash
+'uploadstash' => 'Къайлаха чуяккхар',
+
 # HTTP errors
 'http-timed-out' => 'Хьежаран хан чекхели HTTP-жоп дехаран.',
 
 'license' => 'Бакъойалар:',
 'license-header' => 'Бакъойалар',
 'nolicense' => 'Яц',
+'license-nopreview' => '(Хьалха муха ю хьажа цало)',
 'upload_source_file' => ' (файл хьан компьютер чохь ю)',
 
 # Special:ListFiles
@@ -1645,6 +1727,7 @@ PICT # тайп тайпан
 'listfiles_search_for' => 'Лаха хIуман цIарца:',
 'imgfile' => 'файл',
 'listfiles' => 'Файлаш',
+'listfiles_thumb' => 'Жима',
 'listfiles_date' => 'Терахь',
 'listfiles_name' => 'Файлан цӀе',
 'listfiles_user' => 'Декъашхо',
@@ -1652,7 +1735,9 @@ PICT # тайп тайпан
 'listfiles_description' => 'Цуьнах лаьцна',
 'listfiles_count' => 'Верси',
 'listfiles-show-all' => 'Гайта суьртийн шира версеш',
+'listfiles-latestversion' => 'Карара верси',
 'listfiles-latestversion-yes' => 'ХӀаъ',
+'listfiles-latestversion-no' => 'ХӀахӀа',
 
 # File description page
 'file-anchor-link' => 'Файл',
@@ -1665,13 +1750,16 @@ PICT # тайп тайпан
 'filehist-datetime' => 'Терахь/Хан',
 'filehist-thumb' => 'Жима',
 'filehist-thumbtext' => 'Жимо башхо оцу $1',
+'filehist-nothumb' => 'Миниатюра яц',
 'filehist-user' => 'Декъашхо',
 'filehist-dimensions' => 'Файлан барам',
 'filehist-filesize' => 'Файлан барам',
 'filehist-comment' => 'Билгалдаккхар',
+'filehist-missing' => 'Файл яц',
 'imagelinks' => 'Файл лелор',
 'linkstoimage' => '{{PLURAL:$1|ТӀаьхьайогӀу $1 агӀо тӀетойжина|ТӀаьхьайогlу $1 агӀонаш тӀетойжина|ТӀаьхьайогӀу $1 агӀонаш тӀетойжина}} хӀокху файлан:',
 'nolinkstoimage' => 'АгӀонашчохь файл лелош яц.',
+'linkstoimage-redirect' => '$1 (файлан дӀасахьажораг) $2',
 'duplicatesoffile' => '{{PLURAL:$1|Лахара файл ю дубликат|Лахара $1 файлаш ю дубликаташ}} хӀокху файлан ([[Special:FileDuplicateSearch/$2|мадарра]]):',
 'sharedupload' => 'ХӀара хӀума оцун $1 чура ю иза хила мега лелош кхечу проекташкахь.',
 'sharedupload-desc-here' => 'ХӀара файл $1 чура ю и лело йиш ю массо проекташкахь.
@@ -1724,7 +1812,7 @@ PICT # тайп тайпан
 'unusedtemplates' => 'Лелош доцу кепаш',
 'unusedtemplatestext' => 'Кхузахь дагар йина «{{ns:template}}» цӀерийн меттиган агӀонаш, кхечу агӀонийн юкъа тоьхна йоцу.
 Диц ма делахь хьажа кеп агӀонашкахь лелош юй.',
-'unusedtemplateswlh' => 'кÑ\85ин Ñ\85Ñ\8cажоÑ\80агаÑ\88',
+'unusedtemplateswlh' => 'кхин хьажоргаш',
 
 # Random page
 'randompage' => 'Цахууш нисйелла агӀо',
@@ -1739,7 +1827,7 @@ PICT # тайп тайпан
 
 # Statistics
 'statistics' => 'Бухехьдерг',
-'statistics-header-pages' => 'Агlонашан жамlа',
+'statistics-header-pages' => 'АгӀонийн жамӀ',
 'statistics-header-edits' => 'Нисдаран жамӀ',
 'statistics-header-users' => 'Декъашхойн жамӀа',
 'statistics-header-hooks' => 'Кхин статистика',
@@ -1749,23 +1837,28 @@ PICT # тайп тайпан
 'statistics-files' => 'Чуйаьхна файлаш',
 'statistics-edits' => 'Нисдаран дукхалла {{grammar:genitive|{{SITENAME}}}} дlа йолайаларца',
 'statistics-edits-average' => 'Юккъера агӀонан нисдаран терахь',
+'statistics-views-total' => 'Массо хьажарш',
+'statistics-views-peredit' => 'Нисдаре хьажарш',
 'statistics-users' => '[[ВП:Дlаязвалар|Дlаязбелларш]] шаберигге декъашхой чохь болу [[Special:ListUsers|(могlам)]]',
 'statistics-users-active' => 'Жигара декъашхой',
 'statistics-users-active-desc' => 'Декъашхой, муьлха цхьа хlум дина болу, кху {{PLURAL:$1|1=тlаьххьара $1 динахь|тlаьххьара $1 дийнахь}}',
+'statistics-mostpopular' => 'Дукху хьоьжу агӀонаш',
 
 'pageswithprop' => 'АгӀонаш цхьадолу къастамашца',
 'pageswithprop-legend' => 'АгӀонаш цхьадолу къастамашца',
 'pageswithprop-text' => 'Кхузахь гойтуш ю агӀонаш цхьадолу къастамаш куьйга юху билгал даьхнарш.',
 'pageswithprop-prop' => 'Къастаман цӀе:',
+'pageswithprop-submit' => 'Лаха',
 
 'doubleredirects' => 'Шалха дIасахьажийнарш',
 'doubleredirectstext' => 'ХӀокху агӀонехь ю дӀасахьажорашан тӀе хьажийна йолу дӀасахьажораш.
 <del>ТӀехула сиз хаькхна </del>нисйина чарна.',
 'double-redirect-fixed-move' => 'АгӀон [[$1]] цӀе хийцина, хӀинца иза дӀахьажийна оцу [[$2]]',
+'double-redirect-fixer' => 'ДӀасахьажинарш нисерг',
 
 'brokenredirects' => 'ДIахаьдна долу дIасахьажораш',
 'brokenredirectstext' => 'Лахара дӀасахьажийнарш ю йоцучу агӀонийн тӀе хьажийна:',
-'brokenredirects-edit' => 'нисйé',
+'brokenredirects-edit' => 'нисъе',
 'brokenredirects-delete' => 'дӀаяккха',
 
 'withoutinterwiki' => 'Юкъарвики-хьажорагаш йоцу агӀонаш',
@@ -1776,12 +1869,15 @@ PICT # тайп тайпан
 
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|байт}}',
-'ncategories' => '$1 {{PLURAL:$1|категори|категореш|категореш}}',
-'ninterwikis' => '$1 {{PLURAL:$1|1=Ñ\8eкÑ\8aаÑ\80вики-Ñ\85Ñ\8cажоÑ\80аг|Ñ\8eкÑ\8aаÑ\80вики-Ñ\85Ñ\8cажоÑ\80агаÑ\88}}',
-'nlinks' => '$1 {{PLURAL:$1|1=Ñ\85Ñ\8cажоÑ\80аг|Ñ\85Ñ\8cажоÑ\80агаÑ\88}}',
+'ncategories' => '$1 {{PLURAL:$1|категори|категореш}}',
+'ninterwikis' => '$1 {{PLURAL:$1|1=юкъарвики-хьажораг|юкъарвики-хьажоргаш}}',
+'nlinks' => '$1 {{PLURAL:$1|1=хьажораг|хьажоргаш}}',
 'nmembers' => '$1 {{PLURAL:$1|1=хӀума|хӀумнаш}}',
-'nimagelinks' => 'Лелош ю $1 {{PLURAL:$1|агӀоначохь|агӀонашкахь|агӀонашкахь}}',
-'ntransclusions' => 'лелош ю $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' => 'Дехаро хӀумма ца елла.',
 'lonelypages' => 'Байлахь йисина агIонаш',
 'lonelypagestext' => 'Кхузахь ю {{grammar:genitive|{{SITENAME}}}} кхечу агӀонашкахь тӀе хьажийна хьажорагаш йоцу агӀонаш.',
@@ -1791,6 +1887,7 @@ PICT # тайп тайпан
 'uncategorizedtemplates' => 'Категореш йоцу кепаш',
 'unusedcategories' => 'Йаьсса категореш',
 'unusedimages' => 'Лелош доцу файлаш',
+'popularpages' => 'ГӀараяьлла агӀонаш',
 'wantedcategories' => 'Оьшуш йолу категореш',
 'wantedpages' => 'Оьшуш йолу агIонаш',
 'wantedfiles' => 'Оьшуш йолу файлаш',
@@ -1805,7 +1902,7 @@ PICT # тайп тайпан
 'mostimages' => 'Массарел дуккха лелайо файлаш',
 'mostinterwikis' => 'Дуккха юкъарвики хьажорагаш тӀе тоьхна йолу агӀонаш',
 'mostrevisions' => 'Сих сиха нисйина йолу агIонаш',
-'prefixindex' => 'Хьалха агlонашан цlераш хlотто йеза',
+'prefixindex' => 'Хьалха агӀонашан цӀераш хӀотто йеза',
 'prefixindex-namespace' => 'Хьалха агӀонашан цӀераш хӀотто еза («{{ns:$1}}»)',
 'prefixindex-strip' => 'Хиламийн могӀам чура префикс къайлаяккха',
 'shortpages' => 'Боцоа яззамаш',
@@ -1814,6 +1911,7 @@ PICT # тайп тайпан
 'protectedpages' => 'ГIаролла дина агIонаш',
 'protectedpages-indef' => 'Хан йоцуш гӀоралла динарш бен',
 'protectedpages-cascade' => 'Чахчарин гӀоралла бен',
+'protectedpages-noredirect' => 'Къайлаяха дӀасахьажийнарш',
 'protectedpages-timestamp' => 'Терахь/хан',
 'protectedpages-page' => 'АгӀо',
 'protectedpages-expiry' => 'Чекхйолу',
@@ -1827,6 +1925,7 @@ PICT # тайп тайпан
 'listusers-editsonly' => 'Цхаъ мукъане а хийцам бина декъашхой гайта',
 'listusers-creationsort' => 'Кхоьллина хене хьаьжна нисъяр',
 'listusers-desc' => 'Харжа къезиг хиларца',
+'usereditcount' => '$1 {{PLURAL:$1|нисдар|нисдарш}}',
 'usercreated' => '{{GENDER:$3|дӀавазвелла|дӀаязелла}} $1 $2',
 'newpages' => 'Керла агlонаш',
 'newpages-username' => 'Декъашхо:',
@@ -1841,6 +1940,7 @@ PICT # тайп тайпан
 'nopagetext' => 'Ишта агӀо яц.',
 'pager-newer-n' => '{{PLURAL:$1|алсамо керла 1|алсамо керланаш $1}}',
 'pager-older-n' => '{{PLURAL:$1|алсамо шира 1|алсамо ширниш $1}}',
+'suppress' => 'Хьулдар',
 
 # Book sources
 'booksources' => 'Жайнан хьосташ',
@@ -1873,12 +1973,17 @@ PICT # тайп тайпан
 'allpages-bad-ns' => '{{SITENAME}} кху чохь ана цlераш яц «$1».',
 'allpages-hide-redirects' => 'Къайлаяха дӀасахьажийнарш',
 
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'Хьажа тӀехьарчу версега.',
+
 # Special:Categories
 'categories' => 'Категореш',
 'categoriespagetext' => '{{PLURAL:$1|1=Лахара категореш чохь ю|Лахара категореш чохь ю}} агӀонаш я медиа-файлаш.
 Кхузахь гойтуш яц [[Special:UnusedCategories|лелош йоцу категореш]].
 Кхин дӀа [[Special:WantedCategories| хийла еза категореш]].',
 'categoriesfrom' => 'Гучé яха категореш, оцу:',
+'special-categories-sort-count' => 'нисъе дукхаллица',
+'special-categories-sort-abc' => 'нисъе абатца',
 
 # Special:DeletedContributions
 'deletedcontributions' => 'Декъашхочун дӀабяккхина къинхьегам',
@@ -1888,6 +1993,7 @@ PICT # тайп тайпан
 # Special:LinkSearch
 'linksearch' => 'Арахьара хьажораг',
 'linksearch-pat' => 'Лаха кеп:',
+'linksearch-ns' => 'ЦӀерийн ана:',
 'linksearch-ok' => 'Лаха',
 'linksearch-text' => 'Лело мега хӀоттош йолу символаш, масала, <code>*.wikipedia.org</code>.
 Лакхара даржан домен мукъа хила еза , масала<code>*.org</code><br />
@@ -1898,13 +2004,14 @@ PICT # тайп тайпан
 'listusersfrom' => 'Гучé баха декъашхой, болалуш болу тӀера:',
 'listusers-submit' => 'Гайта',
 'listusers-noresult' => 'Декъашхой цакарий.',
+'listusers-blocked' => '(блоктоьхна)',
 
 # Special:ActiveUsers
 'activeusers' => 'Жигар декъашхой могlам',
 'activeusers-intro' => 'Лахахь гойтуш бу  {{PLURAL:$1|1=тӀаьхьара $1 динахь|тӀаьхьара $1 деношкахь}} хийцамаш бина декъашхой.',
 'activeusers-count' => '{{PLURAL:$3|1=тӀаьхьарчу $3 динахь|тӀаьхьара $3 деношкахь}} $1 {{PLURAL:$1|1=нисдар|нисдарш}} дина',
 'activeusers-from' => 'Гучé баха декъашхой, болалуш болу тӀера:',
-'activeusers-hidebots' => 'Къайлабаха шабелхалой',
+'activeusers-hidebots' => 'Къайлабаха боташ',
 'activeusers-hidesysops' => 'Къайлабаха куьйгалхой',
 'activeusers-noresult' => 'Декъашхой цакарий.',
 
@@ -1918,13 +2025,17 @@ PICT # тайп тайпан
 'listgrouprights-rights' => 'Бакъонаш',
 'listgrouprights-helppage' => 'Help:Тобан бакъонаш',
 'listgrouprights-members' => '(тобан могlам)',
+'listgrouprights-addgroup' => '{{PLURAL:$2|тоба|тобанаш}} тӀетоха ло: $1',
+'listgrouprights-removegroup' => '{{PLURAL:$2|тобан чура дӀабаха|тобанаш чура дӀабаха}} ло: $1',
 'listgrouprights-addgroup-all' => 'массо тобанийн юкъатоха йиш ю',
+'listgrouprights-removegroup-all' => 'тобан чура дӀабаха ло',
 
 # Email user
 'mailnologintext' => 'Электронан кехаташ кхехьийта йиш хилийта [[Special:UserLogin|системин чугӀо]] кхин декъашхошка хаамаш кхехьийта хьа [[Special:Preferences|гӀирса чохь]] бакъалла долу электронан почтан адрес хила деза.',
 'emailuser' => 'Декъашхочун хааман кехат',
 'emailuser-title-target' => 'Декъашхочунга кехат яздар',
 'emailuser-title-notarget' => 'Декъашхочунга кехат яздар',
+'emailpage' => 'Декъашхочунга кехат яздар',
 'emailpagetext' => 'ХӀокху агӀона гӀоьнца йиш ю {{GENDER:$1|декъашхочун}} электронан почте хаам бахьийта.
 Хьоьга жоп лур ду ахьа [[Special:Preferences|хьайн гӀирса чу]] дӀаяздина долу адрес тӀе.',
 'defemailsubject' => 'Хаам {{grammar:genitive|{{SITENAME}}}} чура бу',
@@ -1940,10 +2051,15 @@ PICT # тайп тайпан
 'emailsenttext' => 'Хьан электроннан хаам дӏабахьийтина.',
 'emailuserfooter' => 'ХӀара хаам бахийтинера $1 {{GENDER:$1|декъащхочо}} $2 {{GENDER:$2|декъащхочунга}} «декъашхочунга хаам» олучу функцин гӀоьнца {{SITENAME}} проектан.',
 
+# User Messenger
+'usermessage-summary' => 'Битта системан хаам.',
+'usermessage-editor' => 'Системан дӀакхачор',
+
 # Watchlist
 'watchlist' => 'Тергаме могӀам',
 'mywatchlist' => 'Тергаме могӀам',
 'watchlistfor2' => 'Цунна $1 $2',
+'nowatchlist' => 'Ха тергаме могӀа баьсса бу.',
 'watchlistanontext' => 'Тергаме могӀоме хьажа я тая кхочушде $1.',
 'watchnologin' => 'Системин чугӀо',
 'addwatch' => 'Тергаме могӀам юкъа тоха',
@@ -1954,11 +2070,14 @@ PICT # тайп тайпан
 'watch' => 'Тидам бе',
 'watchthispage' => 'Тергам бé хlокху агlон',
 'unwatch' => 'Тергамах къаста',
+'unwatchthispage' => 'ДӀадаккха терго яр',
 'notanarticle' => 'Бац яззам',
+'notvisiblerev' => 'Верси дӀаяьккхина хила',
 'watchlist-details' => 'Хьан тергаме могlамца $1 {{PLURAL:$1|агlо|агlонаш|агlонаш}} ю, дийцаре агlонаша йоцуш.',
+'wlheader-enotif' => 'Электронан почте хаамаш байтар латина ду.',
 'wlheader-showupdated' => "Хийцам бина агӀонаш '''Ӏаьржа''' шрифтцан билгальяха ю.",
 'wlnote2' => 'Лахахьа гайтина {{PLURAL:$1|тӀеххьара сахьт}} чохь бина хийцамаш $2 $3.',
-'wlshowlast' => 'Гайта тlаьххьара $1 сахьташ $2 денош $3',
+'wlshowlast' => 'Гайта тӀаьххьара $1 сахьт $2 де $3',
 'watchlist-options' => 'Тергаме могlаман гlирс нисбар',
 
 # Displayed when you click the "watch" button and it is in the process of watching
@@ -1966,6 +2085,17 @@ PICT # тайп тайпан
 'unwatching' => 'Тергаме могӀанан чура дӀаяккхар…',
 
 'enotif_reset' => 'Билгал йаь ерриге агӀонаш хьаьжна санна',
+'enotif_impersonal_salutation' => 'Декъашхо {{grammar:genitive|{{SITENAME}}}}',
+'enotif_subject_deleted' => 'Проектан «{{SITENAME}}» агӀо «$1» {{gender:$2|декъашхочо}} $2 дӀаяьккхина',
+'enotif_subject_created' => 'Проектан «{{SITENAME}}» агӀо «$1» {{gender:$2|декъашхочо}} $2 кхоьллина',
+'enotif_subject_moved' => 'Проектан «{{SITENAME}}» агӀо «$1» {{gender:$2|декъашхочо}} $2 цӀе хийцина',
+'enotif_subject_restored' => 'Проектан «{{SITENAME}}» агӀо «$1» {{gender:$2|декъашхочо}} $2 меттахӀоьттина',
+'enotif_subject_changed' => 'Проектан «{{SITENAME}}» агӀо «$1» {{gender:$2|декъашхочо}} $2 хийцам бина',
+'enotif_body_intro_deleted' => 'Проектан «{{SITENAME}}» агӀо «$1» {{gender:$2|декъашхочо}} $2 дӀаяьккхина, хьажа $3',
+'enotif_body_intro_created' => 'Проектан «{{SITENAME}}» агӀо «$1» $PAGEEDITDATE {{gender:$2|декъашхочо}} $2 кхоьллина, карара верси ю : $3',
+'enotif_body_intro_moved' => 'Проектан «{{SITENAME}}» агӀо «$1» $PAGEEDITDATE {{gender:$2|декъашхочо}} $2 цӀе хийцина, карара верси ю : $3',
+'enotif_body_intro_restored' => 'Проектан «{{SITENAME}}» агӀо «$1» $PAGEEDITDATE {{gender:$2|декъашхочо}} $2 кхоьллина, карара верси ю : $3',
+'enotif_body_intro_changed' => 'Проектан «{{SITENAME}}» агӀо «$1» $PAGEEDITDATE {{gender:$2|декъашхочо}} $2 хийцам бина, карара верси ю : $3',
 'changed' => 'хийцина',
 
 # Delete
@@ -1994,7 +2124,7 @@ PICT # тайп тайпан
 ** авторан лаамца
 ** авторан бакъонаш талхор',
 'delete-edit-reasonlist' => 'Бахьанин список нисяр',
-'deleting-backlinks-warning' => "'''ДӀахьедар.''' Ахьа дӀайоккхуш йолчун тӀе товжийна кхин агӀонаш ю.",
+'deleting-backlinks-warning' => "'''ДӀахьедар:''' Ахьа дӀайоккхуш йолчун тӀе товжийна [[Special:WhatLinksHere/{{FULLPAGENAME}}|кхин агӀонаш]] ю.",
 
 # Rollback
 'rollback' => 'Юхабаккха хийцам',
@@ -2086,7 +2216,7 @@ PICT # тайп тайпан
 'undeleteviewlink' => 'хьажа',
 'undeleteinvert' => 'Къастае массо',
 'undeletecomment' => 'Бахьан:',
-'undeletedrevisions' => '$1 {{PLURAL:$1|хийцамаш|хийцамаш|хийцамаш}} меттахӀоттайина',
+'undeletedrevisions' => '{{PLURAL:$1|меттахӀоттайина}} $1 {{PLURAL:$1|хийцам}}',
 'undeletedfiles' => '$1 {{PLURAL:$1|файл меттахӀоттайина|файлаш меттахӀоттайина|файлаш меттахӀоттайина}}',
 'undeletedpage' => "'''МеттахӀоттайина агӀо «$1».'''
 
@@ -2129,12 +2259,14 @@ PICT # тайп тайпан
 'sp-contributions-blocked-notice-anon' => 'ХӀара IP-адрес хӀинца блоктоьхна ду.
 Лахахь гойту блоктохаршан тептар чура тӀаьхьарлера дӀаяздар:',
 'sp-contributions-search' => 'Къинхьегам лахар',
+'sp-contributions-suppresslog' => 'Декъашхочун дӀабаьккхина къинхьегам',
 'sp-contributions-username' => 'IP-адрес я декъашхочун цӀе:',
 'sp-contributions-toponly' => 'ТӀаьхьара бина хийцамаш гайта',
+'sp-contributions-newonly' => 'АгӀонаш кхоллар бен ма гайта',
 'sp-contributions-submit' => 'Лаха',
 
 # What links here
-'whatlinkshere' => 'Ð¥Ñ\8cажоÑ\80агаÑ\88 ÐºÑ\85Ñ\83зе',
+'whatlinkshere' => 'Хьажоргаш кхузе',
 'whatlinkshere-title' => 'ХӀокхунца «$1» йолу агӀонаш',
 'whatlinkshere-page' => 'Агlо:',
 'linkshere' => "ТӀаьхьайогӀу агӀонаш оцу '''[[:$1]]''': хьажорагца ю",
@@ -2145,10 +2277,10 @@ PICT # тайп тайпан
 'isimage' => 'Файлан хьажораг',
 'whatlinkshere-prev' => '{{PLURAL:$1|1=хьалхайодарг|хьалхайодарш}} $1',
 'whatlinkshere-next' => '{{PLURAL:$1|тlаьхьайогlург|тlаьхьайогlурш|тlаьхьайогlурш}} $1',
-'whatlinkshere-links' => 'â\86\90 Ñ\85Ñ\8cажоÑ\80агаÑ\88',
-'whatlinkshere-hideredirs' => '$1 дlасахьажйар',
+'whatlinkshere-links' => '← хьажоргаш',
+'whatlinkshere-hideredirs' => '$1 дӀасахьажорш',
 'whatlinkshere-hidetrans' => '$1 латораш',
-'whatlinkshere-hidelinks' => '$1 Ñ\85Ñ\8cажоÑ\80агаÑ\88',
+'whatlinkshere-hidelinks' => '$1 хьажоргаш',
 'whatlinkshere-hideimages' => '$1 файлийн хьажорагаш',
 'whatlinkshere-filters' => 'Литтарш',
 
@@ -2234,6 +2366,7 @@ PICT # тайп тайпан
 'block-log-flags-nousertalk' => 'шин дийцаре агӀо тая лууш дац',
 'block-log-flags-hiddenname' => 'декъашхочун цӀе къайлаяьккхина',
 'ipb-needreblock' => 'ХӀара $1 {{GENDER:$1|блоктоьхна ву|блоктоьхна ю}}. Лаьий хьуна блоктохаран параметраш хийца?',
+'ipb-otherblocks-header' => '{{PLURAL:$1|Кхин блоктохар|Кхин блоктохарш}}',
 'unblock-hideuser' => 'Декъашхочун тӀера блокдӀаяккха хьа таро яц, цуна цӀе хьулйина хилар бахьанехь.',
 
 # Move page
@@ -2397,7 +2530,7 @@ PICT # тайп тайпан
 'tooltip-t-recentchangeslinked' => 'Тlаьхьарлера хийцамаш хlокху агlонашкахь, мичхьа хьажийна хlара агlо',
 'tooltip-feed-rss' => 'Хьагайтар оцу RSS цани хlокху агlон',
 'tooltip-feed-atom' => 'Хьагайтар оцу Atom цани хlокху агlон',
-'tooltip-t-contributions' => 'Хlокху декъашхочо хийцина йолу агlонашан могlам',
+'tooltip-t-contributions' => 'ХӀокху декъашхочо хийцина йолу агӀонийн могӀам',
 'tooltip-t-emailuser' => 'ДӀабахьийта хаам оцу декъашхона',
 'tooltip-t-upload' => 'Чуйаха файлаш',
 'tooltip-t-specialpages' => 'Белха агlонаши могlам',
@@ -2491,7 +2624,7 @@ PICT # тайп тайпан
 'newimages' => 'Керлачу файлийн галерей',
 'newimages-summary' => 'ХӀокху белхан агӀона чохь гойтуш ю дукха хан йоццуш чуйаьхна файлаш.',
 'newimages-legend' => 'Литтар',
-'showhidebots' => '$1 шабелхалой',
+'showhidebots' => '$1 боташ',
 'ilsubmit' => 'Лаха',
 'bydate' => 'терахьашца',
 'sp-newimages-showfrom' => 'Гайта керла файлаш $2, $1 тӀера дуьйна',
@@ -2673,6 +2806,9 @@ PICT # тайп тайпан
 'confirm-watch-top' => 'ТӀетоха хӀара агӀо хьан тергаме могӀам юкъа?',
 'confirm-unwatch-top' => 'ДӀаяккха хӀара агӀо хьай тергаме могӀанан юкъар?',
 
+# Separators for various lists, etc.
+'comma-separator' => ',&#32;',
+
 # Multipage image navigation
 'imgmultipageprev' => '← хьалхара агlо',
 'imgmultipagenext' => 'тlаьхьара агlо →',
@@ -2786,7 +2922,7 @@ MediaWiki яржош ю и шуна пайдане хир яц те аьлла,
 'specialpages-group-users' => 'Декъашхой а бакъонаш',
 'specialpages-group-highuse' => 'Уггаре дукха лелайо агlонаш',
 'specialpages-group-pages' => 'Агlонаши могlамаш',
-'specialpages-group-pagetools' => 'Гlирсаш оцу агlонашан',
+'specialpages-group-pagetools' => 'ГӀирсаш оцу агӀонашан',
 'specialpages-group-wiki' => 'Хаамаш а гӀирсаш а',
 'specialpages-group-redirects' => 'Дlасахьажош йолу гlуллакхан агlонаш',
 'specialpages-group-spam' => 'Спаман дуьхьала гӀирсаш',
@@ -2807,7 +2943,7 @@ MediaWiki яржош ю и шуна пайдане хир яц те аьлла,
 'tags-active-header' => 'Жигара?',
 'tags-hitcount-header' => 'Къастам бина нисдарш',
 'tags-active-yes' => 'ХӀаъ',
-'tags-edit' => 'нисйé',
+'tags-edit' => 'нисъе',
 'tags-hitcount' => '$1 {{PLURAL:$1|хийцам|хийцамаш|хийцамаш}}',
 
 # Special:ComparePages
index 5488a6b..2c9743e 100644 (file)
@@ -193,9 +193,9 @@ $messages = array(
 'tog-extendwatchlist' => 'لیستی چاودێری درێژبکەرەوە بۆ نیشان دانی ھەموو گۆڕانکارییەکان، نەک تەنھا دوایینەکان.',
 'tog-usenewrc' => 'گۆڕانکارییەکان لە دوایین گۆڕانکارییەکان و لیستی چاودێریدا بە پێی پەڕە پۆلێن بکە (پێویستی بە جاڤاسکریپتە)',
 'tog-numberheadings' => 'ژمارەکردنی خۆگەڕی سەردێڕەکان',
-'tog-showtoolbar' => 'شرÛ\8cتÛ\8c Ø¦Ø§Ù\85رازÛ\95کاÙ\86Û\8c Ø¯Û\95ستکارÛ\8c Ù\86Û\8cشاÙ\86 Ø¨Ø¯Û\95 (JavaScript Ù¾Û\8eÙ\88Û\8cستÛ\95)',
-'tog-editondblclick' => 'دەستکاریی پەڕە بە دووکلیک لەسەر دەق (JavaScript پێویستە)',
-'tog-editsectiononrightclick' => 'ڕێگە بدە بۆ دەستکاری کردنی بەشەکان لە ڕێگەی کلیکی ڕاست کردن لەسەر سەردێڕی بەشەکان (JavaScript پێویستە)',
+'tog-showtoolbar' => 'تÙ\88Ù\88ڵاÙ\85رازÛ\8c Ø¯Û\95ستکارÛ\8c Ù\86Û\8cشاÙ\86 Ø¨Ø¯Û\95',
+'tog-editondblclick' => 'دەستکاریی پەڕە بە دووکرتە',
+'tog-editsectiononrightclick' => 'دەستکاریی بەشەکان بە کرتەی ڕاست لەسەر سەردێڕی بەشەکان',
 'tog-rememberpassword' => 'چوونە ژوورەوەم لەسەر ئەم وێبگەڕە پاشەکەوت بکە (ئەو پەڕی $1 {{PLURAL:$1|ڕۆژ|ڕۆژ}}ە)',
 'tog-watchcreations' => 'ئەو پەڕانەی من دروستم کردوون و ئەو پەڕگانە من بارم کردوون زیاد بکە بە لیستی چاودێڕییەکەم',
 'tog-watchdefault' => 'ئەو پەڕانە  و ئەو پەڕگانە من دەستکاریان دەکەم زیاد بکە بە لیستی چاودێڕییەکەم',
@@ -211,7 +211,7 @@ $messages = array(
 'tog-shownumberswatching' => 'ژمارەی بەکارھێنەرە چاودێڕەکان نیشان بدە',
 'tog-oldsig' => 'واژووی ئێستا:',
 'tog-fancysig' => 'وەکوو ویکیدەق واژووەکە لەبەر چاو بگرە (بێ بەستەرێکی خۆگەڕ)',
-'tog-uselivepreview' => 'لە پێشبینینی زیندوو کەڵک وەرگرە (جاڤاسکریپت پێویستە) (تاقیکاری‌)',
+'tog-uselivepreview' => 'لە پێشبینینی زیندوو کەڵک وەربگرە (تاقیکاری‌)',
 'tog-forceeditsummary' => 'ئەگەر کورتەی دەستکاریم نەنووسی پێم بڵێ',
 'tog-watchlisthideown' => 'دەستکارییەکانم بشارەوە لە پێرستی چاودێری',
 'tog-watchlisthidebots' => 'دەستکارییەکانی بات بشارەوە لە لیستی چاودێری',
@@ -222,7 +222,6 @@ $messages = array(
 'tog-ccmeonemails' => 'کۆپییەک لەو ئیمەیلانە کە بۆ بەکارھێنەرانی تر دەنێرم بۆ خۆشم بنێرە',
 'tog-diffonly' => 'ناوەرۆکی پەڕە لە ژێرەوەی جیاوازییەکاندا نیشان مەدە',
 'tog-showhiddencats' => 'پۆلە شاردراوەکان نیشان بدە',
-'tog-noconvertlink' => 'لەکارخستنی ئاڵوگۆڕی سەرناوی بەستەر',
 'tog-norollbackdiff' => 'لە دوای گەڕاندنەوە جیاوازی نیشان مەدە',
 'tog-useeditwarning' => 'ھۆشیارم بکەوە کاتێک لە پەڕەیەکی دەستکاری بە گۆڕانکاریی پاشەکەوت‌نەکراو دەردەچم',
 
@@ -457,8 +456,8 @@ $1',
 'youhavenewmessages' => '$1ت ھەیە ($2).',
 'youhavenewmessagesfromusers' => 'لە {{PLURAL:$3|بەکارھێنەرێک|$3 بەکارھێنەران}} $1ت ھەیە ($2).',
 'youhavenewmessagesmanyusers' => '$1ت  لە ژمارەیەک بەکارھێنەر ھەیە ( $2 ).',
-'newmessageslinkplural' => '{{PLURAL:$1|پەیامێکی نوێ|پەیامی نوێ}}',
-'newmessagesdifflinkplural' => 'دوایین {{PLURAL:$1|گۆڕانکاری|گۆڕانکارییەکان}}',
+'newmessageslinkplural' => '{{PLURAL:$1|پەیامێکی نوێ|999=پەیامی نوێ}}',
+'newmessagesdifflinkplural' => 'دوایین {{PLURAL:$1|گۆڕانکاری|999=گۆڕانکارییەکان}}',
 'youhavenewmessagesmulti' => 'لە $1 دا پەیامی نوێت ھەیە',
 'editsection' => 'دەستکاری',
 'editold' => 'دەستکاری',
@@ -671,7 +670,7 @@ $2',
 تکایە هەوڵ بدەوە.',
 'passwordtooshort' => 'تێپەڕوشەکەت لانی کەم دەبێ {{PLURAL:$1|١ پیت|$1 پیت}} بێت.',
 'password-name-match' => 'تێپەڕوشەکەت ئەبێ جیاواز بێت لە ناوی بەکارهێنەریت.',
-'mailmypassword' => 'تێپەڕوشەیەکی نوێ بنێرە بۆ ئیمەیلەکەم',
+'mailmypassword' => 'تێپەڕوشەکە ڕێک بخەوە',
 'passwordremindertitle' => 'تێپەڕوشەیەکی نوێی کاتی بۆ  {{SITENAME}}',
 'passwordremindertext' => 'کەسێک (لەوانەیە خۆت، لە ئای‌پی ئەدرەسی $1) داوای تێپەڕوشەیەکی نوێی کردووە بۆ {{SITENAME}} ($4). تێپەڕوشەیەکی کاتی بۆ بەکارهێنەر «$2» دروستکراو و وەک «$3» دانراوه. ئەگەر ئەمە داخوازی تۆ بووە، پێویستت بەوەیە ئێستا بچیتە ژوورەوە و تێپەڕوشەیەکی نوێ هەڵبژێریت. ماوەی‌ تێپەڕوشە کاتییەکەت لە {{PLURAL:$5|یەک ڕۆژدا|$5 ڕۆژدا}} بەسەردەچێت.
 
@@ -681,16 +680,16 @@ $2',
 'passwordsent' => 'تێپەڕوشەیەکی نوێ ناردرا بۆ ئەدرەسی ئیمەیلی تۆمارکراوی «$1».
 تکایە دوای وەرگرتنی دیسان بچۆ ژوورەوە.',
 'blocked-mailpassword' => 'ئادرەسی ئای‌پی تۆ بۆ دەستکاری کردن بەستراوه بۆیە بۆ بەرگری لە بەکارهێنانی نابەجێ ئەنجامی گەڕانەوەی تێپەڕوشە ڕیگە نەدراوە.',
-'eauthentsent' => 'ئی‌مەیلێکی بڕواپێکردن ناردرا بۆ ئەدرەسی ئی‌مەیلی پاڵێوراو. <br />
-پێش ئەوەی ئی‌مەیلی‌تر بنێردرێ بۆ ئەم هەژمارە، بۆ ئەوەی بڕوات پێ‌بکرێ کە ئەو هەژمارە بەڕاستی هین تۆیە، دەبێ ڕێنوماییەکانی ناو ئەو ئی‌مەیلە هەنگاو بە هەنگاو ئەنجام بدەیت.',
+'eauthentsent' => 'ئیمەیلێکی پشتڕاستکردنەوە بۆ ناونیشانی ئیمەیلی دیاریکراو ناردرا.
+پێش ئەوەی ئیمەیلی تر بۆ ئەم هەژمارە بنێردرێ، بۆ پشتڕاستکردنەوەی ئەمەی ئەم هەژمارە بەڕاستی ھی تۆیە، دەبێ پەیڕەوی ڕێکارەکانی ناو ئیمەیلەکە بکەیت.',
 'throttled-mailpassword' => 'بیرهێنەرەوەیەکی وشەی نهێنی پێش ئەمە لە {{PLURAL:$1|کاتژمێر}}ی ڕابردوودا ناردراوە.
 بۆ بەرگری لە بەکارهێنانی خراپ، تاکە یەک بیرهێنەرەوەی وشەی نهێنی هەر {{PLURAL:$1|کاتژمێر}} دەنێردرێت.',
 'mailerror' => 'هەڵە ڕوویدا لە ناردنی ئیمەیل: $1',
 'acct_creation_throttle_hit' => 'بینەرانی ویکی بەکەڵک وەرگرتن لەم ئای‌پی ئەدرەسەی تۆ لە ڕۆژانی ڕابردوودا، دەستیان کردە بە درووست‌کردنی {{PLURAL:$1|هەژمارە}}، کە زۆرینە ڕیگەپێدان لە یەک ماوە‌دایە.
 وەک ئەنجامی ئەو ڕووداوە، ئەو بینەرانی لەم ئای‌پی ئەدرەسە کەڵک وەر دەگرن لەم کاتەدا ناتوانن هەژماری دیکە درووست‌بکەن.',
-'emailauthenticated' => 'ئیمەیلەکەت بە ڕاست ناسرا لە $3ی $2 دا',
-'emailnotauthenticated' => 'ئیمەیلەکەت ھێشتا نەناسراوە.
-Ú¾Û\8cÚ\86 Ø¦Û\8cÙ\85Û\95Û\8cÙ\84Û\8eÚ© Ø¨Û\86 Ø¦Û\95Ù\85 Ø¨Ø§Ø¨Û\95تاÙ\86Û\95Û\8c Ø®Ù\88ارەوە نانێردرێت.',
+'emailauthenticated' => 'ناونیشانی ئیمەیلەکەت پشتڕاست کرایەوە لە $3ی $2دا.',
+'emailnotauthenticated' => 'ناونیشانی ئیمەیلەکەت ھێشتا پشتڕاست نەکراوتەوە.
+Ú¾Û\8cÚ\86 Ø¦Û\8cÙ\85Û\95Û\8cÙ\84Û\8eÚ© Ø¨Û\86 Ø¦Û\95Ù\85 ØªØ§Û\8cبÛ\95تÙ\85Û\95Ù\86دÛ\8cÛ\8cاÙ\86Û\95Û\8c Ú\98Û\8eرەوە نانێردرێت.',
 'noemailprefs' => 'بۆ کەوتنە کاری ئەو تایبەتمەندیانە، لە هەڵبژاردەکانت ئەدرەسەکی ئی‌مێڵ دابین بکە.',
 'emailconfirmlink' => 'ئیمەیلەکەت پشت‌ڕاست بکەرەوە',
 'invalidemailaddress' => 'ناونیشانی ئیمەیل پەسند نەکرا، چون لەوە دەچێت شێوازێکی نادروستی ھەبێت.
@@ -706,6 +705,7 @@ $2',
 'login-throttled' => 'ژمارەیەکی زۆر هەوڵت داوە بۆ چوونە ژوورەوە.
 تکایە پێش هەوڵی دووبارە، نەختێک بوەستە.',
 'loginlanguagelabel' => 'زمان: $1',
+'pt-userlogout' => 'بچۆ دەرەوە',
 
 # Change password dialog
 'changepassword' => 'تێپەڕوشە بگۆڕە',
@@ -1082,15 +1082,15 @@ $3 هۆکاری "$2" خستوەتەڕوو',
 * بڵاوکردنەوەی زانیاریی تاکەکەسی نەگونجاو<br />
 *: '' ناونیشانی ماڵ یا ژمارە تەلەفۆن و وەک ئەمانە.''<br />",
 'revdelete-legend' => 'سنووردارکردنی دەرکەوتن',
-'revdelete-hide-text' => 'شاردÙ\86Û\95Ù\88Û\95Û\8c Ø¯Û\95Ù\82Û\8c Ù¾Û\8eداÚ\86Ù\88Ù\88Ù\86Û\95Ù\88Û\95',
+'revdelete-hide-text' => 'دەقی پێداچوونەوە',
 'revdelete-hide-image' => 'ناوەڕۆکی پەڕگە بشارەوە',
 'revdelete-hide-name' => 'داشاردنی مەبەست و کردەوە',
-'revdelete-hide-comment' => 'شاردنەوەی کورتەی دەستکاری',
-'revdelete-hide-user' => 'شاردÙ\86Û\95Ù\88Û\95Û\8c Ù\86اÙ\88Û\8c Ø¨Û\95کارھÛ\8eÙ\86Û\95رÛ\8c/ئاÛ\8c\80\8cÙ¾Û\8c Ø¯Û\95ستکارÛ\8cÚ©Û\95ر',
+'revdelete-hide-comment' => 'کورتەی دەستکاری',
+'revdelete-hide-user' => 'Ù\86اÙ\88Û\8c Ø¨Û\95کارھÛ\8eÙ\86Û\95ر/Ù\86اÙ\88Ù\86Û\8cشاÙ\86Û\8c Ø¦Ø§Û\8cÙ¾Û\8c Ø¯Û\95ستکارÛ\8cÚ©Û\95ر',
 'revdelete-hide-restricted' => 'بەرگری دراوە لە بەڕێوبەران هەر وەک ئەوانی دیکە',
 'revdelete-radio-same' => '(مەیگۆڕە)',
-'revdelete-radio-set' => 'بÛ\95ÚµÛ\8e',
-'revdelete-radio-unset' => 'نا',
+'revdelete-radio-set' => 'شاردراÙ\88Û\95',
+'revdelete-radio-unset' => 'دیار',
 'revdelete-suppress' => 'بەرگری دراوە لە بەڕێوبەران هەر وەک ئەوانی دیکە',
 'revdelete-unsuppress' => 'لابردنی بەربەستەکان لە سەر پێداچوونەوە گەڕێندراوەکان',
 'revdelete-log' => 'هۆکار:',
@@ -1185,7 +1185,7 @@ $1",
 'shown-title' => 'لە هەر پەڕەیەک $1 {{PLURAL:$1|ئەنجام|ئەنجام}} نیشان‌ بدە',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) ببینە',
 'searchmenu-exists' => "'''پەڕەیەک بە ناوی «[[:$1]]» لەم ویکییەدا ھەیە.'''",
-'searchmenu-new' => "'''لەم ویکییەدا پەڕەی « [[:$1]] » دروست بکە!'''",
+'searchmenu-new' => '<strong>لەم ویکییەدا پەڕەی « [[:$1]] » دروست بکە!</strong> {{PLURAL:$2|0=|ھەروەھا بڕوانە پەڕەی دۆزراوەی گەڕانەکەت.|ھەروەھا بڕوانە ئاکامە دۆزراوەکانی گەڕانەکە.}}',
 'searchprofile-articles' => 'پەڕە بە ناوەڕۆکەکان',
 'searchprofile-project' => 'پەڕەکانی یارمەتی و پرۆژە',
 'searchprofile-images' => 'ڕەنگاڵە',
@@ -1250,7 +1250,7 @@ $1",
 'prefs-email' => 'ھەڵبژاردەکانی ئیمەیل',
 'prefs-rendering' => 'ڕواڵەت',
 'saveprefs' => 'پاشەکەوت',
-'restoreprefs' => 'ھەموو ڕێکخستنەکان ببەرەوە بۆ باری بنچینەیی',
+'restoreprefs' => 'ھەموو ڕێکخستنەکان ببەرەوە بۆ باری بنچینەیی (لە ھەموو بەشەکاندا)',
 'prefs-editing' => 'دەستکاریکردن',
 'rows' => 'ڕیزەکان:',
 'columns' => 'ستوونەکان:',
@@ -1303,8 +1303,8 @@ $1",
 'badsig' => 'ئیمزاكه‌ هه‌ڵه‌یه‌، ته‌ماشای كۆدی HTML بكه‌‌',
 'badsiglength' => 'واژووەکەت زۆر درێژە.
 واژوو نابێ لە $1 {{PLURAL:$1|نووسە}} درێژتر بێت.',
-'yourgender' => 'زایەند:',
-'gender-unknown' => 'ئاشکرا نەکراو',
+'yourgender' => 'پێت خۆشە چۆن وەسف بکرێیت؟',
+'gender-unknown' => 'پێم خۆشە باسی نەکەم',
 'gender-male' => 'پیاو',
 'gender-female' => 'ژن',
 'prefs-help-gender' => 'دڵخواز: بۆ بانگ کردنی دروست بە دەستی نەرمامێر.
@@ -1483,8 +1483,8 @@ $1",
 'action-block' => 'بەربەست کردنی ئەم بەکارهێنەرە بۆ دەستکاری‌کردن',
 'action-protect' => 'گۆڕانی ئاستی پارێزراوی بۆ ئەم لاپەڕە',
 'action-rollback' => 'گەڕاندنەوەی خێرای دەستکاریەکانی دوایین بەکارھێنەر کە پەڕەیەکی دیاریکراوی دەستکاری کردووە',
-'action-import' => 'هێنانەناوەی ئەم لاپەڕە لە ویکی‌یەکی دیکە',
-'action-importupload' => 'هێنانەناوەی ئەم لاپەڕە لە پەڕگەیەکی بارکراو',
+'action-import' => 'ھاوردنی پەڕەکان لە ویکییەکی ترەوە',
+'action-importupload' => 'ھاوردنی پەڕەکان لە پەڕگەیەکی بارکراو',
 'action-patrol' => 'نیشانکردنی دەستکاریەکانی کەسانی تر وەک پاس دراو',
 'action-autopatrol' => 'دەستکارییەکانت وەک پاس دراو نیشان بکرێ',
 'action-unwatchedpages' => 'دیتنی پێرستێک لە پەڕە چاودێری نەکراوەکان',
@@ -1508,14 +1508,24 @@ $1",
 'recentchanges-legend-heading' => "'''کورتکراوەکان:'''",
 'recentchanges-legend-newpage' => '(ھەروەھا بڕوانە [[Special:NewPages|پێرستی پەڕە نوێکان]])',
 'recentchanges-legend-plusminus' => "(''±۱٢٣'')",
-'rcnotefrom' => "ئەوی‌ خوارەوە گۆڕانکارییەکانە لە '''$2'''ەوە (ھەتا '''$1''' نیشاندراو).",
+'rcnotefrom' => 'ژێرەوە گۆڕانکارییەکانە لە <strong>$2</strong>ەوە (ھەتا <strong>$1</strong> نیشان دراوە).',
 'rclistfrom' => 'گۆڕانکارییە نوێکان نیشان بدە بە دەستپێکردن لە $1',
 'rcshowhideminor' => 'دەستکارییە بچووکەکان $1',
+'rcshowhideminor-show' => 'نیشان بدە',
+'rcshowhideminor-hide' => 'بشارەوە',
 'rcshowhidebots' => 'بۆتەکان $1',
+'rcshowhidebots-show' => 'نیشان بدە',
+'rcshowhidebots-hide' => 'بشارەوە',
 'rcshowhideliu' => 'بەکارھێنەرە تۆمارکراوەکان $1',
+'rcshowhideliu-show' => 'نیشان بدە',
+'rcshowhideliu-hide' => 'بشارەوە',
 'rcshowhideanons' => 'بەکارھێنەرە نەناسراوەکان $1',
+'rcshowhideanons-show' => 'نیشان بدە',
+'rcshowhideanons-hide' => 'بشارەوە',
 'rcshowhidepatr' => 'گۆرانکارییە پاس دراوەکان $1',
 'rcshowhidemine' => 'دەستکارییەکانم $1',
+'rcshowhidemine-show' => 'نیشان بدە',
+'rcshowhidemine-hide' => 'بشارەوە',
 'rclinks' => 'دوایین $1 گۆڕانکاریی $2 ڕۆژی ڕابردوو نیشان بدە<br />$3',
 'diff' => 'جیاوازی',
 'hist' => 'مێژوو',
@@ -1529,7 +1539,7 @@ $1",
 'rc_categories_any' => 'هەرکام',
 'rc-change-size-new' => '$1 {{PLURAL:$1|بایت}} پاش گۆڕانکاری',
 'newsectionsummary' => '/* $1 */ بەشی نوێ',
-'rc-enhanced-expand' => 'Ù\88ردÛ\95کارÛ\8cÛ\8cÛ\95کاÙ\86 Ù¾Û\8cشاÙ\86 Ø¨Ø¯Û\95 (Ù¾Û\8eÙ\88Û\8cستÛ\8c Ø¨Û\95 Ø¬Ø§Ú¤Ø§Ø³Ú©Ø±Û\8cپتÛ\95)',
+'rc-enhanced-expand' => 'Ù\88ردÛ\95کارÛ\8cÛ\8cÛ\95کاÙ\86 Ù\86Û\8cشاÙ\86 Ø¨Ø¯Û\95',
 'rc-enhanced-hide' => 'وردەکارییەکان بشارەوە',
 'rc-old-title' => 'بە ناوی سەرەکیی «$1» دروست کراوە',
 
@@ -1708,8 +1718,7 @@ $1',
 'upload_source_file' => ' (پەڕگەیەک لەسەر کۆمپیوتەرەکەت)',
 
 # Special:ListFiles
-'listfiles-summary' => 'ئەم پەڕە تایبەتە هەموو پەڕگە بارکراوەکانت پێ نیشان دەدات.
-لە کاتی پاڵاوتن بۆ بەکارھێنەرێکی تایبەت، تەنیا ئەو پەڕگانە کە بەکارھێنەرەکە دوایین وەشانیانی بارکردبێت نیشان دەدرێن.',
+'listfiles-summary' => 'ئەم پەڕە تایبەتە ھەموو پەڕگە بارکراوەکان نیشان دەدات.',
 'listfiles_search_for' => 'بگەڕێ بۆ ناوی میدیای:',
 'imgfile' => 'پەڕگە',
 'listfiles' => 'پێرستی پەڕگەکان',
@@ -2316,7 +2325,7 @@ $1',
 'contributions' => 'بەشدارییەکانی {{GENDER:$1|بەکارھێنەر}}',
 'contributions-title' => 'بەشدارییەکانی بەکارھێنەر $1',
 'mycontris' => 'بەشدارییەکان',
-'contribsub2' => 'بۆ $1 ($2)',
+'contribsub2' => 'بۆ {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'هیچ گۆڕانکاریەکی هاوتای ئەم پێوەرانە نودۆزرایەوە',
 'uctop' => '(ھەنووکە)',
 'month' => 'لە مانگی (و پێشترەوە):',
@@ -2660,7 +2669,7 @@ $1',
 بوخچەیەکی کاتی بزر بووە.',
 'import-parse-failure' => 'سەرنەکەوتن لە شیکردنەوەی ھاوردنی XML',
 'import-noarticle' => 'ھیچ پەڕەیەک بۆ ھاوردن نییە!',
-'import-nonewrevisions' => 'Ú¾Û\95Ù\85Ù\88Ù\88 Ù¾Û\8eداÚ\86Ù\88Ù\88Ù\86Û\95Ù\88Û\95کاÙ\86 Ù¾Û\8eشتر Ú¾Ø§Ù\88ردÛ\95 Ú©Ø±Ø§Ù\88Ù\86.',
+'import-nonewrevisions' => 'Ú¾Û\8cÚ\86 Ù¾Û\8eداÚ\86Ù\88Ù\88Ù\86Û\95Ù\88Û\95Û\8cÛ\95Ú© Ú¾Ø§Ù\88ردÛ\95 Ù\86Û\95کراÙ\88Û\95 (Ú¾Û\95Ù\85Ù\88Ù\88Û\8c Û\8cا Ú¾Û\95ر Ø¦Û\8eستا Ú¾Û\95Û\8cÛ\95Ø\8c Û\8cاÙ\86 Ù\84Û\95بÛ\95ر Ú¾Û\95ÚµÛ\95کاÙ\86 Ú\86اÙ\88Ù¾Û\86Ø´Û\8c Ù\84Û\8e Ú©Ø±Ø§Ù\88Û\95).',
 'xml-error-string' => '$1 لە دێڕی $2، ستوونی $3 (بایت $4): $5',
 'import-upload' => 'بارکردنی دراوەی XML',
 'import-token-mismatch' => 'لەدەستدانی دراوەکانی کۆڕ.
@@ -2787,12 +2796,12 @@ $1',
 'pageinfo-article-id' => 'زنجیرەی پەڕە',
 'pageinfo-language' => 'زمانی ناوەرۆکی پەڕە',
 'pageinfo-robot-policy' => 'چۆنێتیی مۆتۆڕی گەڕان',
-'pageinfo-robot-index' => 'شیاو بۆ پێرستکردن',
-'pageinfo-robot-noindex' => 'نەشیاو بۆ پێرستکردن',
+'pageinfo-robot-index' => 'ڕێ پێدراو',
+'pageinfo-robot-noindex' => 'ڕێ پێنەدراوه',
 'pageinfo-views' => 'ژمارەی بینینەکان',
 'pageinfo-watchers' => 'ژمارەی چاودێرانی پەڕە',
 'pageinfo-few-watchers' => 'کەمتر لە $1 {{PLURAL:$1|چاودێر}}',
-'pageinfo-redirects-name' => 'ڕەوانەکەرەکان بۆ ئەم پەڕەیە',
+'pageinfo-redirects-name' => 'Ú\98Ù\85ارÛ\95Û\8c Ú\95Û\95Ù\88اÙ\86Û\95Ú©Û\95رÛ\95کاÙ\86 Ø¨Û\86 Ø¦Û\95Ù\85 Ù¾Û\95Ú\95Û\95Û\8cÛ\95',
 'pageinfo-subpages-name' => 'ژێرپەڕەکانی ئەم پەڕەیە',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|ڕەوانەکەر}}; $3 {{PLURAL:$3|ڕەوانەنەکەر}})',
 'pageinfo-firstuser' => 'دروستکەری پەڕە',
@@ -2862,7 +2871,7 @@ $1',
 'file-nohires' => 'رەزۆلوشنی سەرتر لەمە لە بەردەست دا نیە.',
 'svg-long-desc' => 'پەڕگەی SVG، بە ناو $1 × $2 پیکسەڵ، قەبارەی پەڕگە: $3',
 'svg-long-error' => 'پەڕگەی SVGی نادروست: $1',
-'show-big-image' => 'گەورەکردنەوە',
+'show-big-image' => 'پەڕگەی سەرەکی',
 'show-big-image-preview' => 'قەبارەی ئەم پێشبینینە: $1.',
 'show-big-image-other' => '{{PLURAL:$2|ڕەزەلووشنی|ڕەزەلووشنەکانی}} تر: $1.',
 'show-big-image-size' => '$1 لە $2 پیکسەڵ',
@@ -3220,18 +3229,18 @@ $3
 $5
 
 ئەم کۆدی بڕواپێکردنە لە $4 ماوەی بەسەردێت.',
-'confirmemail_body_set' => 'کەسێک، لەوانەیە خۆت، لە ئای‌پی ئەدرەسی $1،
-ئەدرەسی ئەیمەیلی ھەژماری «$2» لە {{SITENAME}}دا کردووە بەم ئەدرەسە.
+'confirmemail_body_set' => 'کەسێک، لەوانەیە خۆت، لە ناونیشانی ئایپیی $1،
+ناونیشانیی ئەیمەیلی ھەژماری «$2» لە {{SITENAME}}دا کردووە بەم ناونیشانە.
 
-بۆ ئەوەی بڕوا بکرێت کە ئەم ھەژمارە لە ڕاستیدا بۆتۆیە و بۆ چالاککردنەوەی تایبەتمەندیەکانی ئیمەیل لە {{SITENAME}}دا، ئەم بەستەرەی خوارەوە لە وێبگەڕەکەتدا بکەوە:
+بۆ پشتڕاستکردنەوەی ئەمەی ئەم ھەژمارە بەڕاستی ھی تۆیە و بۆ چالاککردنی تایبەتمەندیەکانی ئیمەیل لە {{SITENAME}}دا، ئەم بەستەرە لە وێبگەڕەکەتدا بکەوە:
 
 $3
 
-ئەگەر ھەژمارە ھی تۆ *نییە*، بۆ هەڵوەشاندنەوەی بڕوا‌پێکردنی ئەدرەسی ئیمەیل بەدوای ئەم بەستەرە بکەوە:
+ئەگەر ھەژمارەکە ھی تۆ *نییە*، بۆ هەڵوەشاندنەوەی پشتڕاستکردنەوەی ناونیشانی ئیمەیل، شوێنی ئەم بەستەرە بکەوە:
 
 $5
 
-ئÛ\95Ù\85 Ú©Û\86دÛ\8c Ø¨Ú\95Ù\88اپÛ\8eکردÙ\86Û\95 Ù\84Û\95 $4 Ù\85اÙ\88Û\95Û\8c Ø¨Û\95سÛ\95ردێت.',
+ئÛ\95Ù\85 Ú©Û\86دÛ\95Û\8c Ù¾Ø´ØªÚ\95استکردÙ\86Û\95Ù\88Û\95Û\8cÛ\95 Ù\84Û\95 $4 Ù\85اÙ\88Û\95Û\8c Ø¨Û\95سÛ\95ر Ø¯Û\95Ú\86ێت.',
 'confirmemail_invalidated' => 'بڕواپی‌کردنی ناونیشانی ئی‌مەیل هەڵوەشێندراوە',
 'invalidateemail' => 'هەڵوەشاندنەوەی بڕواپێ‌کردنی ئی‌مەیل',
 
@@ -3377,7 +3386,7 @@ $5
 'version-hook-name' => 'ناوی قولاپ',
 'version-hook-subscribedby' => 'بەشداربوو لە لایەن',
 'version-version' => '(وەشانی $1)',
-'version-license' => 'مۆڵەت',
+'version-license' => 'مۆڵەتنامە',
 'version-poweredby-others' => 'دیکە',
 'version-software' => 'نەرمەکاڵای دامەزراو',
 'version-software-product' => 'بەرهەم',
index c5c3837..173f523 100644 (file)
@@ -802,6 +802,7 @@ Parechji mudelli ùn seranu micca inclusi.",
 'tags-edit' => 'mudificà',
 
 # New logging system
+'logentry-move-move' => '$1 {{GENDER:$2|hà spustatu}} a pagina $3 à $4',
 'rightsnone' => '(nessunu)',
 
 # Special:ExpandTemplates
index 6ac7edd..68d79ca 100644 (file)
@@ -403,7 +403,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Zasílat mi kopie e-mailů, které pošlu jiným uživatelům',
 'tog-diffonly' => 'Nezobrazovat obsah stránky pod rozdílem verzí',
 'tog-showhiddencats' => 'Zobrazit skryté kategorie',
-'tog-noconvertlink' => 'Vypnout konverzi názvů',
 'tog-norollbackdiff' => 'Po vrácení změny nezobrazovat porovnání rozdílů',
 'tog-useeditwarning' => 'Upozornit, když budu opouštět editaci bez uložení změn',
 'tog-prefershttps' => 'Po přihlášení používat vždy zabezpečené spojení',
@@ -706,7 +705,7 @@ Správce serveru, který databázi zamkl, poskytl toto zdůvodnění: $1',
 
 Toto je obvykle způsobeno tím, že jste následovali zastaralý odkaz na rozdíl verzí nebo historickou verzi stránky, jež byla smazána.
 
-Pokud toto není váš případ, možná jste nalezli chybu v software. Prosíme, ohlaste to [[Special:ListUsers/sysop|správcům]] spolu s URL této stránky.',
+Není-li toto váš případ, možná jste nalezli chybu v softwaru. Prosíme, ohlaste to [[Special:ListUsers/sysop|správcům]] spolu s URL této stránky.',
 'missingarticle-rev' => '(číslo revize: $1)',
 'missingarticle-diff' => '(Rozdíl: $1, $2)',
 'readonly_lag' => 'Databáze byla automaticky dočasně uzamčena kvůli zpoždění ostatních databázových serverů oproti hlavnímu',
@@ -937,7 +936,7 @@ Abyste dokončili přihlášení, nastavte si zde nové heslo:',
 'resetpass-temp-password' => 'Dočasné heslo:',
 'resetpass-abort-generic' => 'Změna hesla byla zablokována rozšířením.',
 'resetpass-expired' => 'Platnost vašeho hesla vypršela. Pro přihlášení si nastavte nové heslo.',
-'resetpass-expired-soft' => 'Platnost vašeho hesla vypršela, musíte si nastavit nové. Zvolte si nové heslo nebo klikněte na storno a nastavte si ho později.',
+'resetpass-expired-soft' => 'Platnost vašeho hesla vypršela, musíte si nastavit nové. Zvolte si nové heslo nebo klikněte na „{{int:resetpass-submit-cancel}}“ a nastavte si ho později.',
 
 # Special:PasswordReset
 'passwordreset' => 'Reset hesla',
@@ -1779,14 +1778,26 @@ Vaše adresa v takovém případě není prozrazena.',
 'recentchanges-legend-heading' => "'''Legenda:'''",
 'recentchanges-legend-newpage' => '(vizte též [[Special:NewPages|seznam nových stránek]])',
 'recentchanges-legend-plusminus' => "(''±123'')",
-'rcnotefrom' => 'Níže {{PLURAL:$1|je|jsou|je}} nejvýše <b>$1</b> {{PLURAL:$1|změna|změny|změn}} od <b>$2</b>.',
+'rcnotefrom' => 'Níže jsou změny od <strong>$2</strong> ({{PLURAL:$1|zobrazena|zobrazeny|zobrazeno}} nejvýše <strong>$1</strong>).',
 'rclistfrom' => 'Ukázat nové změny, počínaje od $1',
 'rcshowhideminor' => '$1 malé editace',
+'rcshowhideminor-show' => 'Zobrazit',
+'rcshowhideminor-hide' => 'Skrýt',
 'rcshowhidebots' => '$1 roboty',
+'rcshowhidebots-show' => 'Zobrazit',
+'rcshowhidebots-hide' => 'Skrýt',
 'rcshowhideliu' => '$1 registrované uživatele',
+'rcshowhideliu-show' => 'Zobrazit',
+'rcshowhideliu-hide' => 'Skrýt',
 'rcshowhideanons' => '$1 anonymní uživatele',
+'rcshowhideanons-show' => 'Zobrazit',
+'rcshowhideanons-hide' => 'Skrýt',
 'rcshowhidepatr' => '$1 prověřené editace',
+'rcshowhidepatr-show' => 'Zobrazit',
+'rcshowhidepatr-hide' => 'Skrýt',
 'rcshowhidemine' => '$1 moje editace',
+'rcshowhidemine-show' => 'Zobrazit',
+'rcshowhidemine-hide' => 'Skrýt',
 'rclinks' => 'Ukázat $1 posledních změn během posledních $2 dnů<br />
 $3',
 'diff' => 'rozdíl',
@@ -1908,6 +1919,8 @@ Před tím, než soubor znovu nahrajete, byste měli požádat někoho, kdo mů
 'uploaddisabledtext' => 'Načítání souborů je vypnuto.',
 'php-uploaddisabledtext' => 'V PHP je vypnuto načítání souborů. Prosím, zkontrolujte nastavení file_uploads.',
 'uploadscripted' => 'Tento soubor obsahuje HTML nebo kód skriptu, který by mohl být prohlížečem chybně interpretován.',
+'uploadscriptednamespace' => 'Tento SVG soubor obsahuje nedovolený jmenný prostor „$1“',
+'uploadinvalidxml' => 'XML v načteném souboru nelze zpracovat.',
 'uploadvirus' => 'Tento soubor obsahuje virus! Podrobnosti: $1',
 'uploadjava' => 'Tento soubor je ZIP, který obsahuje javový soubor .class.
 Načítání javových souborů není dovoleno, neboť by mohly umožnit obcházení bezpečnostních omezení.',
@@ -2559,7 +2572,7 @@ $2 zaznamenává poslední smazání.',
 'delete-edit-reasonlist' => 'Editovat důvody smazání',
 'delete-toobig' => 'Tato stránka má velkou historii editací, přes $1 {{PLURAL:$1|verzi|verze|verzí}}. Mazání takových stránek je omezeno, aby se předešlo nechtěnému narušení {{grammar:2sg|{{SITENAME}}}}.',
 'delete-warning-toobig' => 'Tato stránka má velkou historii editací, přes $1 {{PLURAL:$1|verzi|verze|verzí}}. Mazání takových stránek může narušit databázové operace {{grammar:2sg|{{SITENAME}}}}; postupujte opatrně.',
-'deleting-backlinks-warning' => "'''Upozornění:''' Stránka, kterou se chystáte smazat, je na jiných stránkách odkazována nebo je do nich vložena.",
+'deleting-backlinks-warning' => "'''Upozornění:''' Stránka, kterou se chystáte smazat, je [[Special:WhatLinksHere/{{FULLPAGENAME}}|na jiných stránkách]] odkazována nebo je do nich vložena.",
 
 # Rollback
 'rollback' => 'Vrátit zpět editace',
@@ -2729,8 +2742,10 @@ $1',
 'sp-contributions-blocked-notice-anon' => 'Tato IP adresa je momentálně zablokována.
 Zde je pro přehled zobrazen nejnovější záznam z knihy zablokování:',
 'sp-contributions-search' => 'Zobrazení příspěvků',
+'sp-contributions-suppresslog' => 'utajené příspěvky uživatele',
 'sp-contributions-username' => 'IP adresa nebo uživatelské jméno:',
-'sp-contributions-toponly' => 'Zobrazit pouze aktuální revize',
+'sp-contributions-toponly' => 'Zobrazit pouze editace na aktuální revizi',
+'sp-contributions-newonly' => 'Zobrazovat pouze editace zakládající stránku',
 'sp-contributions-submit' => 'Zobrazit',
 
 # What links here
@@ -4320,6 +4335,4 @@ V podstatě rozbalí prakticky všechno v dvojitých složených závorkách.',
 'expand_templates_generate_rawhtml' => 'Zobrazit surové HTML',
 'expand_templates_preview' => 'Náhled',
 
-# Unknown messages
-'uploadinvalidxml' => 'XML v načteném souboru nelze zpracovat.',
 );
index f4fe54c..e9ac3d5 100644 (file)
@@ -75,7 +75,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Sélôj do mie kòpije e-mailów, chtërné sélóm do jinych brëkòwników',
 'tog-diffonly' => 'Nie wëskrzëniôj zamkłoscë starnë niżi przërónaniô zjinaków',
 'tog-showhiddencats' => 'Wëskrzëni zataconé kategòrëje',
-'tog-noconvertlink' => 'Wëłączë kònwersëjã titlów w lënkach',
 'tog-norollbackdiff' => 'Pòcësni wëskrzënianié zjinaków pò copniãcô sã',
 
 'underline-always' => 'Wiedno',
index e86553c..6b11952 100644 (file)
@@ -767,7 +767,7 @@ $messages = array(
 'contributions' => '{{GENDER:$1|польꙃєватєлꙗ}} добродѣꙗниꙗ',
 'contributions-title' => 'польꙃєватєлꙗ ⁖ $1 ⁖ добродѣꙗниꙗ',
 'mycontris' => 'добродѣꙗниꙗ',
-'contribsub2' => 'польꙃєватєлꙗ имѧ ⁖ $1 ⁖ ѥстъ ($2)',
+'contribsub2' => 'польꙃєватєлꙗ имѧ ⁖ {{GENDER:$3|$1}} ⁖ ѥстъ ($2)',
 'uctop' => '(нꙑнѣщьн҄ь обраꙁъ)',
 
 'sp-contributions-blocklog' => 'ꙁаграждєниꙗ їсторїꙗ',
@@ -882,7 +882,7 @@ $messages = array(
 # Media information
 'file-info-size' => '$1 × $2 п҃ѯ · дѣла мѣра : $3 · MIME тѷпъ : $4',
 'svg-long-desc' => 'дѣло SVG · обꙑчьнъ обраꙁъ : $1 × $2 п҃ѯ · дѣла мѣра : $3',
-'show-big-image' => 'плÑ\8cнÑ\8a Ð²Ð¸Ð´а обраꙁъ',
+'show-big-image' => 'иÑ\81Ñ\82оÑ\87Ñ\8cнÑ\8a Ð´Ñ£Ð»а обраꙁъ',
 'show-big-image-size' => '$1 × $2 пиѯєлъ',
 
 # Special:NewFiles
index 9cf9ab9..f7b8ee5 100644 (file)
@@ -647,7 +647,7 @@ Oedwch $1 cyn mentro eto.',
 'suspicious-userlogout' => 'Gwrthodwyd eich cais i allgofnodi oherwydd ei fod yn ymddangos mai gweinydd wedi torri neu ddirprwy gelc a anfonodd y cais.',
 'createacct-another-realname-tip' => "Gallwch ddewis roi eich enw go iawn.
 Os y gwnewch, fe gaiff yr enw go iawn ei defnyddio wrth dadogi'ch gwaith.",
-'pt-login' => 'Mewngofnodwch',
+'pt-login' => 'Mewngofnodi',
 'pt-createaccount' => 'Creu cyfri',
 'pt-userlogout' => 'Allgofnodi',
 
@@ -678,7 +678,7 @@ Gall fod eich bod wedi llwyddo newid eich cyfrinair eisoes neu eich bod wedi gof
 'resetpass-temp-password' => 'Cyfrinair dros dro:',
 'resetpass-abort-generic' => 'Mae estyniad wedi atal newid y cyfrinair.',
 'resetpass-expired' => 'Mae oes eich cyfrinair wedi dod i ben. Gosodwch gyfrinair newydd i fewngofnodi.',
-'resetpass-expired-soft' => "Mae eich cyfrinair wedi dod i ben ac mae'n rhaid ei ailosod. Dewisiwch gyfrinair newydd sbon nawr, neu ailosodwch ef rywdro eto.",
+'resetpass-expired-soft' => 'Mae eich cyfrinair wedi dod i ben ac mae\'n rhaid ei ailosod. Dewisiwch gyfrinair newydd sbon nawr, neu cliciwch "{{int:resetpass-submit-cancel}}" a\'i ailosod rywdro eto.',
 
 # Special:PasswordReset
 'passwordreset' => 'Ailosod cyfrinair',
@@ -938,7 +938,7 @@ Mae ar gael yn barod.',
 'editwarning-warning' => 'Os y gadewch y dudalen hon mae\'n bosib y collwch eich newidiadau iddi.
 Os ydych wedi mewngofnodi gallwch ddiddymu\'r rhybudd hwn yn yr adran "{{int:prefs-editing}}" yn eich dewisiadau.',
 'editpage-notsupportedcontentformat-title' => 'Dydy fformat y cynnwys hwn ddim yn cael ei gefnogi gennym.',
-'editpage-notsupportedcontentformat-text' => 'Dydy fformat y cynnwys ddim yn cael ei gefnogi gan gynnwys model $2.',
+'editpage-notsupportedcontentformat-text' => "Dydy'r fformat $1 ar y cynnwys ddim yn cael ei gefnogi gan y model $2.",
 
 # Content models
 'content-model-wikitext' => 'cystrawen wici',
@@ -1153,7 +1153,8 @@ Pan yn gwneud hyn dylid sicrhau nad yw dilyniant hanes tudalennau yn cael ei ddi
 'showhideselectedversions' => 'Dangos/cuddio y diwygiadau dewisedig',
 'editundo' => 'dadwneud',
 'diff-empty' => '(Dim gwahaniaeth)',
-'diff-multi-sameuser' => 'Mae ({{PLURAL:$1|un golygiad|$1 golygiadau}} gan yr un defnyddiwr heb ei ddangos.',
+'diff-multi-sameuser' => '(Ni ddangosir y {{PLURAL:$1||golygiad|$1 olygiad|$1 golygiad}} yn y canol gan yr un defnyddiwr)',
+'diff-multi-otherusers' => '(Ni ddangosir y {{PLURAL:$1||golygiad|$1 olygiad|$1 golygiad}} yn y canol gan {{PLURAL:$2||ddefnyddiwr|$2 ddefnyddiwr|$2 defnyddiwr}} arall)',
 'diff-multi-manyusers' => '(Ni ddangosir {{PLURAL:$1|yr $1 diwygiad|yr $1 diwygiad|y $1 ddiwygiad|y $1 diwygiad|y $1 diwygiad|y $1 diwygiad}} rhyngol gan mwy na $2 {{PLURAL:$2|o ddefnyddwyr}}.)',
 'difference-missing-revision' => "Ni chafwyd hyd i $1 {{PLURAL:$2|diwygiad|diwygiad|ddiwygiad|diwygiad}} o'r gwahaniaeth ($1) {{PLURAL:$2|hwn}}.
 
@@ -1199,7 +1200,7 @@ Mae manylion pellach i'w cael yn [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'searchrelated' => 'erthyglau eraill tebyg',
 'searchall' => 'oll',
 'showingresults' => "Yn dangos $1 {{PLURAL:$1|canlyniad|canlyniad|ganlyniad|chanlyniad|chanlyniad|canlyniad}} isod gan ddechrau gyda rhif '''$2'''.",
-'showingresultsinrange' => 'Yn cael ei ddangos isod yn y rhediad Showing below up to {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} #<strong>$2</strong> i #<strong>$3</strong>.',
+'showingresultsinrange' => 'Yn dangos hyd at {{PLURAL:$1||<strong>1</strong> canlyniad|<strong>$1</strong> ganlyniad|$1 o ganlyniadau}} isod yn yr ystod #<strong>$2</strong> i #<strong>$3</strong>.',
 'showingresultsnum' => "Yn dangos $3 {{PLURAL:$3|canlyniad|canlyniad|ganlyniad|chanlyniad|chanlyniad|canlyniad}} isod gan ddechrau gyda rhif '''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5||Canlyniad '''$1''' o blith '''$3'''|Canlyniadau '''$1 - $2''' o blith '''$3'''|Canlyniadau '''$1 - $2''' o blith '''$3'''|Canlyniadau '''$1 - $2''' o blith '''$3'''|Canlyniadau '''$1 - $2''' o blith '''$3'''}} ar gyfer '''$4'''",
 'search-nonefound' => "Ni chafwyd dim canlyniadau i'r ymholiad.",
@@ -1519,14 +1520,26 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
 'recentchanges-legend-heading' => "'''Allwedd:'''",
 'recentchanges-legend-newpage' => '(gweler hefyd [[Special:NewPages|restr y tudalennau newydd]])',
 'recentchanges-legend-plusminus' => "(''±123'')",
-'rcnotefrom' => "Isod rhestrir pob newid ers '''$2''' (hyd at '''$1''' ohonynt).",
+'rcnotefrom' => "Isod rhestrir pob newid er <strong>'''$2'''</strong> (ymddengys hyd at <strong>'''$1'''</strong> ohonynt).",
 'rclistfrom' => 'Dangos newidiadau newydd, gan ddechrau ers $1',
 'rcshowhideminor' => '$1 golygiadau bychain',
+'rcshowhideminor-show' => 'Dangoser',
+'rcshowhideminor-hide' => 'Cuddier',
 'rcshowhidebots' => '$1 botiau',
+'rcshowhidebots-show' => 'Dangoser',
+'rcshowhidebots-hide' => 'Cuddier',
 'rcshowhideliu' => '$1 o ddefnyddwyr cofrestredig',
+'rcshowhideliu-show' => 'Dangoser',
+'rcshowhideliu-hide' => 'Cuddier',
 'rcshowhideanons' => '$1 defnyddwyr anhysbys',
+'rcshowhideanons-show' => 'Dangoser',
+'rcshowhideanons-hide' => 'Cuddier',
 'rcshowhidepatr' => '$1 golygiadau wedi derbyn ymweliad patrôl',
+'rcshowhidepatr-show' => 'Dangoser',
+'rcshowhidepatr-hide' => 'Cuddier',
 'rcshowhidemine' => '$1 fy ngolygiadau',
+'rcshowhidemine-show' => 'Dangoser',
+'rcshowhidemine-hide' => 'Cuddier',
 'rclinks' => 'Dangos y $1 newid diweddaraf yn ystod y(r) $2 diwrnod diwethaf<br />$3',
 'diff' => 'gwahan',
 'hist' => 'hanes',
@@ -1653,6 +1666,8 @@ Cyn i chi ail-lwytho'r ffeil, dylech holi i rywun â'r gallu ganddo i weld data
 'php-uploaddisabledtext' => 'Anablwyd uwchlwytho ffeiliau yn PHP.
 Gwiriwch y gosodiad ar file_uploads.',
 'uploadscripted' => "Mae'r ffeil hon yn cynnwys HTML neu sgript a all achosi problemau i borwyr gwe.",
+'uploadscriptednamespace' => "Mae'r ffeil SVG hon yn cynnwys yr enw '$1' sy'n enw annilys ar barth",
+'uploadinvalidxml' => "Ni ellid dosrannu'r XML yn y ffeil a uwchlwythwyd.",
 'uploadvirus' => 'Mae firws gan y ffeil hon! Manylion: $1',
 'uploadjava' => "Ffeil ZIP yw hwn sy'n cynnwys ffeil Java .class.
 Ni chaniateir uwchlwytho ffeiliau Java, oherwydd y gallant osgoi cyfyngiadau diogelwch.",
@@ -2209,7 +2224,7 @@ Pan fydd y dudalen hon, neu ei thudalen sgwrs, yn newid, fe fyddant yn ymddangos
 'watchmethod-list' => "yn chwilio'r tudalennau ar y rhestr wylio am ddiwygiadau diweddar",
 'watchlistcontains' => '{{PLURAL:$1|Nid oes dim tudalennau|Mae $1 dudalen|Mae $1 dudalen|Mae $1 tudalen|Mae $1 thudalen|Mae $1 o dudalennau}} ar eich rhestr wylio.',
 'iteminvalidname' => "Problem gyda'r eitem '$1', enw annilys...",
-'wlnote2' => 'Isod, fe welwch y newidiadau yn yr  {{PLURAL:$1|hour|<strong>$1</strong> awr diwethaf}}, a hynny ar $2, $3.',
+'wlnote2' => 'Isod, fe welwch y newidiadau yn ystod {{PLURAL:$1|yr awr|yr awr|y ddwyawr ddiwethaf|teirawr diwethaf|<strong>$1</strong> awr diwethaf}}, hyd at $2, $3.',
 'wlshowlast' => "Dangoser newidiadau'r $1 awr ddiwethaf neu'r $2 {{PLURAL:$2|diwrnod|diwrnod|ddiwrnod|diwrnod|diwrnod|diwrnod}} diwethaf neu'r $3 newidiadau.",
 'watchlist-options' => 'Dewisiadau ar gyfer y rhestr wylio',
 
@@ -2297,7 +2312,7 @@ Gwelwch y $2 am gofnod o\'r dileuon diweddar.',
 Cyfyngwyd ar y gallu i ddileu tudalennau sydd wedi eu golygu cymaint â hyn, er mwyn osgoi amharu ar weithrediad databas {{SITENAME}} yn ddamweiniol.",
 'delete-warning-toobig' => "Cafwyd dros $1 {{PLURAL:$1|o olygiadau}} i'r dudalen hon.
 Gallai dileu tudalen, gyda hanes golygu cymaint â hyn iddi, beri dryswch i weithrediadau'r databas ar {{SITENAME}}; ewch ati'n ofalus.",
-'deleting-backlinks-warning' => "'''Rhybudd:''' Mae tudalennau eraill yn cysylltu i'r dudalen yr ydych ar fin ei dileu, neu'n trawsgynnwys y dudalen hon.",
+'deleting-backlinks-warning' => "'''Rhybudd:''' Mae [[Special:WhatLinksHere/{{FULLPAGENAME}}|tudalennau eraill]] yn cysylltu i'r dudalen yr ydych ar fin ei dileu, neu'n trawsgynnwys y dudalen hon.",
 
 # Rollback
 'rollback' => 'Gwrthdroi golygiadau',
@@ -2474,6 +2489,7 @@ Mae'r cofnod diweddaraf yn y lòg blocio i'w weld isod:",
 'sp-contributions-search' => 'Chwilio am gyfraniadau',
 'sp-contributions-username' => 'Cyfeiriad IP neu enw defnyddiwr:',
 'sp-contributions-toponly' => "Dangos golygiadau sy'n olygiadau diweddaraf yn unig",
+'sp-contributions-newonly' => "Dangos y golygiadau hynny sy'n dechrau tudalen yn unig",
 'sp-contributions-submit' => 'Chwilier',
 
 # What links here
@@ -2785,7 +2801,7 @@ $2',
 'thumbnail_image-type' => "Nid yw'r math hwn o ddelwedd yn cael ei gynnal",
 'thumbnail_gd-library' => 'Mae ffurfwedd y llyfrgell GD yn anghyflawn: y ffwythiant $1 yn eisiau',
 'thumbnail_image-missing' => "Mae'n debyg bod y ffeil yn eisiau: $1",
-'thumbnail_image-failure-limit' => "'Da chi 'di methu gormod o weithiau (\$ neu fwy) i rendro'r ciplun. Ceisiwch eto nes ymlaen.",
+'thumbnail_image-failure-limit' => "'Da chi 'di methu gormod o weithiau ($1 neu fwy) i rendro'r ciplun. Ceisiwch eto nes ymlaen.",
 
 # Special:Import
 'import' => 'Mewnforio tudalennau',
@@ -3975,6 +3991,4 @@ Defnydd:
 'expand_templates_generate_rawhtml' => 'Dangos HTML crai',
 'expand_templates_preview' => 'Rhagolwg',
 
-# Unknown messages
-'uploadinvalidxml' => "Ni ellid dosrannu'r XML yn y ffeil a uwchlwythwyd.",
 );
index 3ebab3b..8908de6 100644 (file)
@@ -199,19 +199,19 @@ $messages = array(
 'tog-hidepatrolled' => 'Skjul patruljerede redigeringer i seneste ændringer',
 'tog-newpageshidepatrolled' => 'Skjul patruljerede sider på listen over nye sider',
 'tog-extendwatchlist' => 'Udvid overvågningslisten til at vise alle ændringer og ikke kun den nyeste',
-'tog-usenewrc' => 'Gruppér ændringerne per side i listen over seneste ændringer og i overvågningslisten',
+'tog-usenewrc' => 'Gruppér ændringer per side i listen over seneste ændringer og i overvågningslisten',
 'tog-numberheadings' => 'Automatisk nummerering af overskrifter',
 'tog-showtoolbar' => 'Vis værktøjslinje til redigering',
 'tog-editondblclick' => 'Redigér sider med dobbeltklik',
 'tog-editsectiononrightclick' => 'Redigér afsnit ved at højreklikke på deres titler',
-'tog-rememberpassword' => 'Husk mig i denne browser (i højst $1 {{PLURAL:$1|dag|dage}})',
+'tog-rememberpassword' => 'Husk min login i denne browser (i højst $1 {{PLURAL:$1|dag|dage}})',
 'tog-watchcreations' => 'Tilføj sider, jeg opretter, og filer, jeg lægger op, til min overvågningsliste',
 'tog-watchdefault' => 'Tilføj sider og filer, jeg redigerer, til min overvågningsliste',
 'tog-watchmoves' => 'Tilføj sider og filer, jeg flytter, til min overvågningsliste',
 'tog-watchdeletion' => 'Tilføj sider og filer, jeg sletter, til min overvågningsliste',
-'tog-minordefault' => 'Markér som standard alle redigeringer som mindre redigeringer',
+'tog-minordefault' => 'Markér som standard alle redigeringer som mindre',
 'tog-previewontop' => 'Vis forhåndsvisning over redigeringsboksen',
-'tog-previewonfirst' => 'Vis forhåndsvisning når du starter med at redigere',
+'tog-previewonfirst' => 'Vis forhåndsvisning ved første redigering',
 'tog-enotifwatchlistpages' => 'Send mig en e-mail ved ændringer til en side eller fil på min overvågningsliste',
 'tog-enotifusertalkpages' => 'Send mig en e-mail når min brugerdiskussionsside ændres',
 'tog-enotifminoredits' => 'Send mig også en e-mail ved mindre ændringer af sider og filer på min overvågningsliste',
@@ -228,9 +228,8 @@ $messages = array(
 'tog-watchlisthideanons' => 'Skjul anonyme brugeres redigeringer i overvågningslisten',
 'tog-watchlisthidepatrolled' => 'Skjul patrujerede ændringer fra overvågningslisten',
 'tog-ccmeonemails' => 'Send mig kopier af e-mails som jeg sender til andre brugere',
-'tog-diffonly' => 'Vis ved versionssammenligninger kun forskelle, ikke hele siden',
+'tog-diffonly' => 'Vis ikke sideindhold neden under versionssammenligninger',
 'tog-showhiddencats' => 'Vis skjulte kategorier',
-'tog-noconvertlink' => 'Slå konvertering af sidetitler fra',
 'tog-norollbackdiff' => 'Vis ikke forskel efter tilbagerulning',
 'tog-useeditwarning' => 'Advar mig, hvis jeg forlader en redigeringsside med ændringer, der ikke er gemt.',
 'tog-prefershttps' => 'Brug altid en sikker forbindelse, når du er logget ind',
@@ -731,6 +730,9 @@ Vent venligst $1, før du prøver igen.',
 'suspicious-userlogout' => 'Din anmodning om at logge af blev nægtet, fordi det ser ud som den blev sendt af en ødelagt browser eller caching proxy.',
 'createacct-another-realname-tip' => 'Angivelse af rigtigt navn er valgfrit.
 Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit arbejde.',
+'pt-login' => 'Log på',
+'pt-createaccount' => 'Opret konto',
+'pt-userlogout' => 'Log af',
 
 # Email sending
 'php-mail-error-unknown' => 'Ukendt fejl i PHP funktionen mail()',
@@ -739,7 +741,7 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
 
 # Change password dialog
 'changepassword' => 'Skift adgangskode',
-'resetpass_announce' => 'Du loggede på med den via e-mail tilsendte adgangskode. For at afslutte tilmeldingen, skal du nu vælge en ny adgangskode.',
+'resetpass_announce' => 'For at afslutte indlogningen skal du vælge en ny adgangskode.',
 'resetpass_text' => '<!-- Tilføj tekst her -->',
 'resetpass_header' => 'Skift adgangskode',
 'oldpassword' => 'Gammel adgangskode:',
@@ -755,8 +757,13 @@ Vent venligst $1, før du prøver igen.',
 'resetpass-submit-cancel' => 'Annuller',
 'resetpass-wrong-oldpass' => 'Ugyldig midlertidig eller gældende adgangskode.
 Du har muligvis allerede skiftet din adgangskode eller anmodet om en ny midlertidig kode.',
+'resetpass-recycled' => 'Vær venlig at ændre dit kodeord til et andet end dit nuværende kodeord.',
+'resetpass-temp-emailed' => 'Du loggede på med en midlertidig kode tilsendt på e-mail.
+For at afslutte indlogning, skal du oprette et nyt kodeord:',
 'resetpass-temp-password' => 'Midlertidig adgangskode',
 'resetpass-abort-generic' => 'Ændring af adgangskode er blevet afbrudt af en udvidelse',
+'resetpass-expired' => 'Dit kodeord er udløbet. Vær venlig at ændre det til et nyt.',
+'resetpass-expired-soft' => 'Dit kodeord er udløbet og skal ændres. Vær venlig at ændre det nu, eller tryk annuller for at ændre det senere.',
 
 # Special:PasswordReset
 'passwordreset' => 'Nulstil adgangskode',
@@ -1020,6 +1027,8 @@ Den ser du til at være slettet.',
 'content-not-allowed-here' => '"$1" indhold er ikke tilladt på siden [[$2]]',
 'editwarning-warning' => 'Hvis du forlader siden nu, risikerer du at miste alle ændringer, som du har lavet.
 Denne advarsel kan slås fra under "{{int:prefs-editing}}" i dine indstillinger.',
+'editpage-notsupportedcontentformat-title' => 'Indholdsformatet understøttes ikke',
+'editpage-notsupportedcontentformat-text' => 'Indholdsformatet $1 understøttes ikke af indholdsmodellen $2',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1052,6 +1061,7 @@ Der bør være færre end {{PLURAL:$2|$2 kald}}, lige nu er der {{PLURAL:$1|$1 k
 Kontroller venligst sammenligningen herunder for at bekræfte at det er hvad du ønsker at gøre, og gem så ændringerne for at fuldføre fjernelsen.',
 'undo-failure' => 'Redigeringen kunne ikke fjernes på grund af konflikter med efterfølgende redigeringer.',
 'undo-norev' => 'Redigeringen kunne ikke fjernes fordi den ikke findes eller er blevet slettet.',
+'undo-nochange' => 'Ændringen ser ud til allerede at være blevet fjernet.',
 'undo-summary' => 'Fjerner version $1 af [[Special:Contributions/$2|$2]] ([[User talk:$2|diskussion]])',
 'undo-summary-username-hidden' => 'Fortryde revision $1 af en skjult bruger',
 
@@ -1231,6 +1241,8 @@ Vær opmæksom på at bevare kontinuiteten i sidehistorikken.
 'showhideselectedversions' => 'Vis/skjul udvalgte versioner',
 'editundo' => 'fjern redigering',
 'diff-empty' => '(Ingen forskel)',
+'diff-multi-sameuser' => '({{PLURAL:$1|En mellemliggende version|$1 mellemliggende versioner}} af den samme bruger vises ikke)',
+'diff-multi-otherusers' => '({{PLURAL:$1|En mellemliggende version|$1 mellemliggende versioner}} af {{PLURAL:$2|en anden bruger|$2 andre brugere}} ikke vist)',
 'diff-multi-manyusers' => '({{PLURAL:$1|En mellemliggende version|$1 mellemliggende versioner}} af mere end $2 {{PLURAL:$2|bruger|brugere}} ikke vist)',
 'difference-missing-revision' => '{{PLURAL:$2|En revision|$2 revisioner}} af denne forskel ($1) {{PLURAL:$2|blev|blev}} ikke fundet.
 
@@ -1251,7 +1263,7 @@ Detaljer kan findes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'shown-title' => 'Vis $1 {{PLURAL:$1|resultat|resultater}} per side',
 'viewprevnext' => 'Vis ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''Der er en side med navnet \"[[:\$1]]\" på denne wiki'''",
-'searchmenu-new' => "'''Opret siden \"[[:\$1]]\" i denne wiki'''",
+'searchmenu-new' => '<strong>Opret siden "[[:$1]]" på denne wiki!</strong> {{PLURAL:$2|0=|Se også siden der blev fundet for din søgning.|Se også de søgeresultater der blev fundet.}}',
 'searchprofile-articles' => 'Indholdssider',
 'searchprofile-project' => 'Hjælpe- og projektsider',
 'searchprofile-images' => 'Multimedia',
@@ -1597,11 +1609,23 @@ Vær venlig at gennemse og bekræft dine ændringer.',
 'rcnotefrom' => "Nedenfor er op til '''$1''' ændringer siden '''$2''' vist.",
 'rclistfrom' => 'Vis nye ændringer startende fra $1',
 'rcshowhideminor' => '$1 mindre ændringer',
+'rcshowhideminor-show' => 'Vis',
+'rcshowhideminor-hide' => 'Skjul',
 'rcshowhidebots' => '$1 robotter',
+'rcshowhidebots-show' => 'Vis',
+'rcshowhidebots-hide' => 'Skjul',
 'rcshowhideliu' => '$1 registrerede brugere',
+'rcshowhideliu-show' => 'Vis',
+'rcshowhideliu-hide' => 'Skjul',
 'rcshowhideanons' => '$1 anonyme brugere',
+'rcshowhideanons-show' => 'Vis',
+'rcshowhideanons-hide' => 'Skjul',
 'rcshowhidepatr' => '$1 kontrollerede ændringer',
+'rcshowhidepatr-show' => 'Vis',
+'rcshowhidepatr-hide' => 'Skjul',
 'rcshowhidemine' => '$1 egne bidrag',
+'rcshowhidemine-show' => 'Vis',
+'rcshowhidemine-hide' => 'Skjul',
 'rclinks' => 'Vis seneste $1 ændringer i de sidste $2 dage<br />$3',
 'diff' => 'forskel',
 'hist' => 'historik',
@@ -1726,6 +1750,7 @@ Du bør spørge en person med evnen til at se undertrykte fildata for at gennemg
 'uploaddisabledtext' => 'Oplægning af filer er deaktiveret.',
 'php-uploaddisabledtext' => 'Oplægning af filer er forhindret i PHP. Tjek indstillingen for file_uploads.',
 'uploadscripted' => 'Denne fil indeholder HTML eller script-kode, der i visse tilfælde can fejlfortolkes af en browser.',
+'uploadinvalidxml' => 'XML i den uploadede fil kunne ikke tolkes.',
 'uploadvirus' => 'Denne fil indeholder en virus! Virusnavn: $1',
 'uploadjava' => 'Denne fil er en ZIP-fil, der indeholder en Java .class-fil.
 Det er ikke tilladt at uploade Javafiler, da det kan forårsage, at sikkerhedsrestriktioner bliver sprunget over.',
@@ -2092,10 +2117,20 @@ Hver linje indeholder henvisninger til den første og den anden omdirigering, s
 'deadendpagestext' => 'De følgende sider henviser ikke til andre sider i denne wiki.',
 'protectedpages' => 'Skrivebeskyttede sider',
 'protectedpages-indef' => 'Kun beskyttelser på ubestemt tid',
+'protectedpages-summary' => 'Denne side indeholder en liste over eksisterende sider, der i øjeblikket er beskyttet. For en liste over titler, der er beskyttet fra oprettelse, se [[{{#special:ProtectedTitles}}]].',
 'protectedpages-cascade' => 'Kun nedarvende beskyttelser',
 'protectedpages-noredirect' => 'Skjul omdirigeringer',
 'protectedpagesempty' => 'I øjeblikket er ingen sider beskyttet på denne måde.',
+'protectedpages-timestamp' => 'Tidsstempel',
+'protectedpages-page' => 'Side',
+'protectedpages-expiry' => 'Udløber',
+'protectedpages-performer' => 'Beskyttende bruger',
+'protectedpages-params' => 'Beskyttelsesparametre',
+'protectedpages-reason' => 'Årsag',
+'protectedpages-unknown-timestamp' => 'Ukendt',
+'protectedpages-unknown-performer' => 'Ukendt bruger',
 'protectedtitles' => 'Beskyttede sidenavne',
+'protectedtitles-summary' => 'Denne side indeholder en liste over titler, der i øjeblikket er beskyttet fra oprettelse. For en liste over eksisterende sider, der er beskyttet, se [[{{#special:ProtectedPages}}]].',
 'protectedtitlesempty' => 'Der er ingen sidetitler der er beskyttet med disse parametre.',
 'listusers' => 'Brugerliste',
 'listusers-editsonly' => 'Vis kun brugere med redigeringer',
@@ -2282,6 +2317,7 @@ Fremtidige ændringer af denne side og dens tilknyttede diskussionsside vil bliv
 'watchmethod-list' => 'Tjekker seneste ændringer for sider i din overvågningsliste',
 'watchlistcontains' => 'Din overvågningsliste indeholder $1 {{PLURAL:$1|side|sider}}.',
 'iteminvalidname' => "Problem med '$1', ugyldigt navn...",
+'wlnote2' => 'Nedenfor ses ændringerne i {{PLURAL:$1|den sidste time|de sidste <strong>$1</strong> timer}} op til den $2 kl. $3.',
 'wlshowlast' => 'Vis de seneste $1 timer $2 dage $3',
 'watchlist-options' => 'Indstillinger for overvågningslisten',
 
@@ -2366,7 +2402,7 @@ Bekræft venligst at du virkelig vil gøre dette, at du forstår konsekvenserne,
 'delete-edit-reasonlist' => 'Rediger sletningsårsager',
 'delete-toobig' => 'Denne side har en stor historik, over {{PLURAL:$1|en version|$1 versioner}}. Sletning af sådanne sider er begrænset, for at forhindre utilsigtet forstyrrelse af {{SITENAME}}.',
 'delete-warning-toobig' => 'Denne side har en stor historik, over {{PLURAL:$1|en version|$1 versioner}} versioner, slettes den kan det forstyrre driften af {{SITENAME}}, gå forsigtigt frem.',
-'deleting-backlinks-warning' => "'''Advarsel:''' Andre sider linker til den side, du er ved at slette.",
+'deleting-backlinks-warning' => "'''Advarsel:''' Andre sider linker til eller inkluderer den side, du er ved at slette.",
 
 # Rollback
 'rollback' => 'Fjern redigeringer',
@@ -2542,6 +2578,7 @@ Den seneste post i blokeringsloggen vises nedenfor:',
 'sp-contributions-search' => 'Søg efter bidrag',
 'sp-contributions-username' => 'IP-adresse eller brugernavn:',
 'sp-contributions-toponly' => 'Vis kun redigeringer, der er aktuelle versioner',
+'sp-contributions-newonly' => 'Vis kun redigeringer, der er sideoprettelser',
 'sp-contributions-submit' => 'Søg',
 
 # What links here
@@ -2601,6 +2638,7 @@ Angiv en konkret begrundelse herunder (for eksempel med angivelse af sider der h
 Se [[Special:BlockList|blokeringslisten]] for alle blokeringer.',
 'ipb-blockingself' => 'Du er ved at blokere dig selv! Er du sikker på, du vil gøre det?',
 'ipb-confirmhideuser' => 'Du er ved at blokere en bruger med "skjul bruger" aktiveret. Dette vil skjule brugerens navn på alle lister og logposter. Er du sikker på du vil gøre det?',
+'ipb-confirmaction' => 'Hvis du er sikker på, at du virkelig ønsker at gøre det, kan du markerer feltet "{{int:ipb-confirm}}" nederst.',
 'ipb-edit-dropdown' => 'Rediger blokeringsbegrundelser',
 'ipb-unblock-addr' => 'Ophæv blokeringen af "$1"',
 'ipb-unblock' => 'Frigive IP-adresse/bruger',
@@ -2642,8 +2680,8 @@ Se [[Special:BlockList|blokeringslisten]] for alle blokeringer.',
 'change-blocklink' => 'ændring af blokering',
 'contribslink' => 'bidrag',
 'emaillink' => 'send e-mail',
-'autoblocker' => 'Du er automatisk blokeret, fordi du deler IP-adresse med "[[User:$1|$1]]".
-Begrundelse: "$2".',
+'autoblocker' => 'Du er automatisk blokeret, fordi din IP-adresse for nylig er blevet brugt af "[[User:$1|$1]]".
+Begrundelsen for blokeringen af $1 er "$2".',
 'blocklogpage' => 'Blokeringslog',
 'blocklog-showlog' => 'Denne bruger har tidligere været blokeret.
 Blokeringsloggen vises nedenfor som reference:',
@@ -2665,7 +2703,7 @@ Se [[Special:BlockList|blokeringslisten]] for den nuværende liste med aktuelle
 'range_block_disabled' => 'Sysop-muligheden for at oprette blokeringsklasser er slået fra.',
 'ipb_expiry_invalid' => 'Udløbstiden er ugyldig.',
 'ipb_expiry_temp' => 'Brugernavnet kan kun skjules ved permanente blokeringer.',
-'ipb_hide_invalid' => 'Kan ikke skjule denne konto; den kan have for mange redigeringer.',
+'ipb_hide_invalid' => 'Kan ikke skjule denne konto; den har mere end {{PLURAL:$1|en redigering|$1 redigeringer}}.',
 'ipb_already_blocked' => '„$1“ er allerede blokeret',
 'ipb-needreblock' => '$1 er allerede blokeret. Vil du ændre indstillingerne?',
 'ipb-otherblocks-header' => 'Yderligere {{PLURAL:$1|blokering|blokeringer}}',
@@ -2827,6 +2865,7 @@ Besøg venligst [https://www.mediawiki.org/wiki/Localisation MediaWiki-lokaliser
 'allmessages-prefix' => 'Filtrér efter forstavelse:',
 'allmessages-language' => 'Sprog:',
 'allmessages-filter-submit' => 'Udfør',
+'allmessages-filter-translate' => 'Oversæt',
 
 # Thumbnails
 'thumbnail-more' => 'Forstør',
@@ -2877,7 +2916,7 @@ Alle Transwiki import-aktioner protokolleres i [[Special:Log/import|import-logge
 'importuploaderrortemp' => 'Upload af importfil mislykkedes da en midlertidig mappe mangler.',
 'import-parse-failure' => 'XML fortolkningsfejl under importering',
 'import-noarticle' => 'Der er ingen sider at importere!',
-'import-nonewrevisions' => 'Alle versioner er allerede importeret.',
+'import-nonewrevisions' => 'Ingen versioner importeret (alle var enten allerede til stede, eller blev sprunget over på grund af fejl).',
 'xml-error-string' => '$1 på linje $2, kolonne $3 (byte $4): $5',
 'import-upload' => 'Upload XML-data',
 'import-token-mismatch' => 'Sessionsdata er mistet. Prøv venligst igen.',
@@ -2888,6 +2927,7 @@ Alle Transwiki import-aktioner protokolleres i [[Special:Log/import|import-logge
 'import-error-special' => 'Siden "$1" importeres ikke, da den tilhører et særligt navnerum, der ikke tillader sider.',
 'import-error-invalid' => 'Siden "$1" importeres ikke, da dens navn er ugyldigt.',
 'import-error-unserialize' => 'Ændring $2 af siden "$1" kunne ikke afserialiseres. Ændringen brugte indholdsmodel $3 serialiseret som $4.',
+'import-error-bad-location' => 'Version $2 der bruger indholdsmodellen $3 kan ikke gemmes på "$1" på denne wiki, da denne model ikke understøttes på denne side.',
 'import-options-wrong' => '{{PLURAL:$2|Ugyldig indstilling|Ugyldige indstillinger}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'Den rodside der er angivet har en ugyldig titel.',
 'import-rootpage-nosubpage' => 'Navnerummet "$1" tillader ikke undersider af rodsiderne.',
index 1adc184..293de6d 100644 (file)
@@ -461,7 +461,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Schicke mir Kopien der E-Mails, die ich anderen Benutzern sende',
 'tog-diffonly' => 'Beim Versionsvergleich nur die Unterschiede und nicht die vollständige Seite anzeigen',
 'tog-showhiddencats' => 'Anzeige versteckter Kategorien',
-'tog-noconvertlink' => 'Konvertierung des Titels deaktivieren',
 'tog-norollbackdiff' => 'Unterschied nach dem Zurücksetzen unterdrücken',
 'tog-useeditwarning' => 'Warnen, sofern eine zur Bearbeitung geöffnete Seite verlassen wird, die nicht gespeicherte Änderungen enthält',
 'tog-prefershttps' => 'Wenn angemeldet, immer eine sichere Verbindung benutzen.',
@@ -977,7 +976,7 @@ Wenn du ihn angibst, wird er für die Zuordnung der Beiträge verwendet.',
 
 # Change password dialog
 'changepassword' => 'Passwort ändern',
-'resetpass_announce' => 'Um die Anmeldung abzuschließen, musst du ein neues Passwort wählen.',
+'resetpass_announce' => 'Um die Anmeldung abzuschließen, musst du ein neues Passwort festlegen.',
 'resetpass_text' => '<!-- Ergänze den Text hier -->',
 'resetpass_header' => 'Passwort ändern',
 'oldpassword' => 'Altes Passwort:',
@@ -999,7 +998,7 @@ Um die Anmeldung abzuschließen, musst du jetzt ein neues Passwort festlegen:',
 'resetpass-temp-password' => 'Temporäres Passwort:',
 'resetpass-abort-generic' => 'Die Passwortänderung wurde durch eine Erweiterung abgebrochen.',
 'resetpass-expired' => 'Dein Passwort ist abgelaufen. Bitte lege ein neues Passwort zur Anmeldung fest.',
-'resetpass-expired-soft' => 'Dein Passwort ist abgelaufen und muss zurückgesetzt werden. Bitte wähle jetzt ein neues Passwort aus oder klicke auf „Abbrechen“, um es später zurückzusetzen.',
+'resetpass-expired-soft' => 'Dein Passwort ist abgelaufen und muss zurückgesetzt werden. Bitte wähle jetzt ein neues Passwort aus oder klicke auf „{{int:resetpass-submit-cancel}}“, um es später zurückzusetzen.',
 
 # Special:PasswordReset
 'passwordreset' => 'Passwort zurücksetzen',
@@ -1242,8 +1241,7 @@ Zur Information folgt der aktuelle Logbucheintrag:",
 'sectioneditnotsupported-text' => 'Die Bearbeitung von Abschnitten wird auf dieser Bearbeitungsseite nicht unterstützt.',
 'permissionserrors' => 'Berechtigungsfehler',
 'permissionserrorstext' => 'Du bist nicht berechtigt, die Aktion auszuführen. {{PLURAL:$1|Grund|Gründe}}:',
-'permissionserrorstext-withaction' => 'Du bist nicht berechtigt, $2.
-{{PLURAL:$1|Grund|Gründe}}:',
+'permissionserrorstext-withaction' => 'Du bist aus {{PLURAL:$1|dem folgenden Grund|den folgenden Gründen}} nicht berechtigt, $2:',
 'recreate-moveddeleted-warn' => "'''Achtung: Du erstellst eine Seite, die bereits früher gelöscht wurde.'''
 
 Bitte prüfe sorgfältig, ob die erneute Seitenerstellung den Richtlinien entspricht.
@@ -1498,7 +1496,7 @@ Einzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'shown-title' => 'Zeige $1 {{PLURAL:$1|Ergebnis|Ergebnisse}} pro Seite',
 'viewprevnext' => 'Zeige ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''Es gibt eine Seite, die den Namen „[[:$1]]“ hat.'''",
-'searchmenu-new' => '<strong>Erstelle die Seite „[[:$1]]“ in diesem Wiki.</strong> {{PLURAL:$2|0=|Siehe auch die mit deiner Suche gefundene Seite.|Siehe auch die gefundenen Suchergebnisse.}}',
+'searchmenu-new' => '<strong>Erstelle die Seite „[[:$1]]“ in diesem Wiki.</strong> {{PLURAL:$2|0=|Siehe auch die über deine Suche gefundene Seite.|Siehe auch die gefundenen Suchergebnisse.}}',
 'searchprofile-articles' => 'Inhaltsseiten',
 'searchprofile-project' => 'Hilfe- und Projektseiten',
 'searchprofile-images' => 'Multimedia',
@@ -1652,7 +1650,7 @@ Diese Information ist öffentlich.',
 'prefs-displaywatchlist' => 'Anzeigeoptionen',
 'prefs-tokenwatchlist' => 'Token',
 'prefs-diffs' => 'Versionsvergleich',
-'prefs-help-prefershttps' => 'Diese Einstellung wird bei deiner nächsten Anmeldung wirksam',
+'prefs-help-prefershttps' => 'Diese Einstellung wird bei deiner nächsten Anmeldung wirksam.',
 'prefs-tabs-navigation-hint' => 'Tipp: Du kannst die linke und rechte Pfeiltasten benutzen, um zwischen den Registerkarten in der Reiterliste zu navigieren.',
 
 # User preference: email validation using jQuery
@@ -1844,14 +1842,26 @@ Diese Information ist öffentlich.',
 'recentchanges-legend-heading' => "'''Legende:'''",
 'recentchanges-legend-newpage' => '(siehe auch die [[Special:NewPages|Liste neuer Seiten]])',
 'recentchanges-legend-plusminus' => "''(±123)''",
-'rcnotefrom' => "Angezeigt werden die Änderungen seit '''$2''' (max. '''$1''' Einträge).",
-'rclistfrom' => 'Nur Änderungen seit $1 zeigen.',
+'rcnotefrom' => 'Angezeigt werden die Änderungen seit <strong>$2</strong> (max. <strong>$1</strong> Einträge).',
+'rclistfrom' => 'Nur Änderungen seit $3, $2 Uhr zeigen.',
 'rcshowhideminor' => 'Kleine Änderungen $1',
+'rcshowhideminor-show' => 'anzeigen',
+'rcshowhideminor-hide' => 'ausblenden',
 'rcshowhidebots' => 'Bots $1',
+'rcshowhidebots-show' => 'anzeigen',
+'rcshowhidebots-hide' => 'ausblenden',
 'rcshowhideliu' => 'Registrierte Benutzer $1',
+'rcshowhideliu-show' => 'anzeigen',
+'rcshowhideliu-hide' => 'ausblenden',
 'rcshowhideanons' => 'Unangemeldete Benutzer $1',
+'rcshowhideanons-show' => 'anzeigen',
+'rcshowhideanons-hide' => 'ausblenden',
 'rcshowhidepatr' => 'Kontrollierte Änderungen $1',
+'rcshowhidepatr-show' => 'anzeigen',
+'rcshowhidepatr-hide' => 'ausblenden',
 'rcshowhidemine' => 'Eigene Beiträge $1',
+'rcshowhidemine-show' => 'anzeigen',
+'rcshowhidemine-hide' => 'ausblenden',
 'rclinks' => 'Zeige die letzten $1 Änderungen der letzten $2 Tage.<br />$3',
 'diff' => 'Unterschied',
 'hist' => 'Versionen',
@@ -1976,6 +1986,8 @@ Du solltest jemanden fragen, der die Möglichkeit hat, die unterdrückten Dateid
 'php-uploaddisabledtext' => 'Das Hochladen von Dateien wurde in PHP deaktiviert.
 Bitte überprüfe die <code>file_uploads</code>-Einstellung.',
 'uploadscripted' => 'Diese Datei enthält HTML- oder Scriptcode, der irrtümlich von einem Webbrowser ausgeführt werden könnte.',
+'uploadscriptednamespace' => 'Diese SVG-Datei enthält den ungültigen Namensraum „$1“.',
+'uploadinvalidxml' => 'Das XML in der hochgeladenen Datei konnte nicht geparst werden.',
 'uploadvirus' => 'Diese Datei enthält einen Virus! Details: $1',
 'uploadjava' => 'Dies ist eine ZIP-Datei, die ein CLASS-Datei von Java enthält.
 Das Hochladen von Java-Dateien ist nicht gestattet, da sie die Umgehung von Sicherheitseinschränkungen ermöglichen könnten.',
@@ -2621,7 +2633,7 @@ Rückmeldungen und weitere Hilfe: {{canonicalurl:{{MediaWiki:Helppage}}}}',
 'delete-edit-reasonlist' => 'Löschgründe bearbeiten',
 'delete-toobig' => 'Diese Seite hat mit mehr als $1 {{PLURAL:$1|Version|Versionen}} eine sehr lange Versionsgeschichte. Das Löschen solcher Seiten wurde eingeschränkt, um eine versehentliche Überlastung der Server zu verhindern.',
 'delete-warning-toobig' => 'Diese Seite hat mit mehr als $1 {{PLURAL:$1|Version|Versionen}} eine sehr lange Versionsgeschichte. Das Löschen kann zu Störungen im Datenbankbetrieb führen.',
-'deleting-backlinks-warning' => "'''Warnung:''' Es verweisen noch andere Seiten auf die zu löschende Seite oder diese Seite ist noch woanders eingebunden.",
+'deleting-backlinks-warning' => "'''Warnung:''' Es verweisen noch [[Special:WhatLinksHere/{{FULLPAGENAME}}|andere Seiten]] auf die zu löschende Seite oder diese Seite ist noch woanders eingebunden.",
 
 # Rollback
 'rollback' => 'Zurücksetzen der Änderungen',
@@ -2793,8 +2805,10 @@ $1',
 'sp-contributions-blocked-notice-anon' => 'Diese IP-Adresse ist zurzeit gesperrt.
 Zur Information folgt der aktuelle Auszug aus dem Sperr-Logbuch:',
 'sp-contributions-search' => 'Suche nach Benutzerbeiträgen',
+'sp-contributions-suppresslog' => 'Unterdrückte Benutzerbeiträge',
 'sp-contributions-username' => 'IP-Adresse oder Benutzername:',
 'sp-contributions-toponly' => 'Nur aktuelle Versionen zeigen',
+'sp-contributions-newonly' => 'Nur Seitenerstellungen anzeigen',
 'sp-contributions-submit' => 'Suchen',
 
 # What links here
@@ -4355,6 +4369,4 @@ faktisch alles was in doppelten geschweiften Klammern enthalten ist.',
 'expand_templates_generate_rawhtml' => 'Rohes HTML anzeigen',
 'expand_templates_preview' => 'Vorschau',
 
-# Unknown messages
-'uploadinvalidxml' => 'Das XML in der hochgeladenen Datei konnte nicht geparst werden.',
 );
index 7df29e4..925491c 100644 (file)
@@ -367,7 +367,6 @@ $messages = array(
 'tog-ccmeonemails' => 'E-posteyanê ke ez karberanê binan rê rışenan, mı rê kopya inan bırışe',
 'tog-diffonly' => 'Qıyasê versiyonan de tek ferqan bımocne, pela butıne nê',
 'tog-showhiddencats' => 'Kategoriyanê dızdiye bımocne',
-'tog-noconvertlink' => 'Greyê sernami çerx kerdışi bıqefılne',
 'tog-norollbackdiff' => 'Peyserardışi ra dıme ferqi caverde',
 'tog-useeditwarning' => 'Wexto ke mı yew pela nizami be vurnayışanê nêqeydbiyayeyan caverdê, hay be mı ser de',
 'tog-prefershttps' => 'Ronışten akerden de  greyo itimadın bıkarne',
@@ -633,8 +632,8 @@ $1',
 'feed-atom' => 'Atom',
 'feed-rss' => 'RSS',
 'red-link-title' => '$1 (çınya)',
-'sort-descending' => 'Ratnayışê qemeyayışi',
-'sort-ascending' => 'Ratnayışê Zeydnayışi',
+'sort-descending' => 'Rêzkerdışo kêmbiyaye',
+'sort-ascending' => 'Rêzkerdışo zêdiyaye',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Wesiqe',
@@ -659,7 +658,7 @@ Keyepelê {{SITENAME}} eşkeno xeta eşkera bıkero.',
 Seba lista pelanê xasanê vêrdeyan reca kena: [[Special:SpecialPages|{{int:specialpages}}]].',
 
 # General errors
-'error' => 'Ğeta',
+'error' => 'Xeta',
 'databaseerror' => 'Ğetay ardoği',
 'databaseerror-text' => 'Tabanda malumati de ğırabiya persayışi bi
 Na nusteber  zew ğırabin asınena.',
@@ -779,7 +778,7 @@ Wexta ke verhafızayê cıgerayoxê şıma pak beno no benate de taye peli de he
 'userlogin-joinproject' => 'Cıkewe {{SITENAME}}',
 'nologin' => "Hesabê şıma çıniyo? '''$1'''.",
 'nologinlink' => 'Yew hesab ake',
-'createaccount' => 'Hesab vıraşten',
+'createaccount' => 'Hesab vıraze',
 'gotaccount' => "Hesabê şıma esto? '''$1'''.",
 'gotaccountlink' => 'Cı kewe',
 'userlogin-resetlink' => 'Melumatê cıkewtışi xo vira kerdê?',
@@ -875,6 +874,9 @@ Bıne vındere u newe ra dest pê bıkere.',
 'suspicious-userlogout' => 'Waştişê tu ya veciyayişi kebul nibiya cunki ihtimal o ke waştiş yew browser ya zi proksiyê heripiyaye ra ameya.',
 'createacct-another-realname-tip' => 'Nameyo raştıkên keyfiyo.
 Şıma nameyo xoyo raştıkên ke bımocnê, seba iştırakanê karberi be ney ra istıfade beno.',
+'pt-login' => 'Cı kewe',
+'pt-createaccount' => 'Hesab vıraze',
+'pt-userlogout' => 'Veciyayış',
 
 # Email sending
 'php-mail-error-unknown' => "PHP's mail() fonksiyoni de xırabin vıcyê.",
@@ -883,7 +885,7 @@ Bıne vındere u newe ra dest pê bıkere.',
 
 # Change password dialog
 'changepassword' => 'Parola bıvurne',
-'resetpass_announce' => 'Şıma pê yew parolayê muweqqet hesab kerd a, qey qedyayişe dekewtış newe yew parola bınuse:',
+'resetpass_announce' => 'Seba temamkerdışê cıkewtışi rê, şıma gani yew parolaya newiye bınusê.',
 'resetpass_text' => 'Parolayê hesab bıvurn',
 'resetpass_header' => 'Parola hesabi bıvurne',
 'oldpassword' => 'Parola kıhane:',
@@ -898,6 +900,7 @@ Bıne vındere u newe ra dest pê bıkere.',
 'resetpass-submit-cancel' => 'Bıtexelne',
 'resetpass-wrong-oldpass' => 'parolayo parola maqbul niyo.
 şıma ya parolaye xo vurnayo ya zi parolayo muwaqqat waşto.',
+'resetpass-recycled' => 'Parolaya şımaya newiye wa paroloya şımaya verêne ra ferqıne bo.',
 'resetpass-temp-password' => 'parolayo muweqet:',
 'resetpass-abort-generic' => 'Parola vurnayış jew derganey ra tepya ibtal biyo',
 
@@ -1046,13 +1049,12 @@ Qey na hesabê newe parola, cıkewtış dıma şıma eşkeni na qısım de ''[[S
 Seba afernayışê pele ra, qutiya metnê cêrêni bıgurene (seba melumati qaytê [[{{MediaWiki:Helppage}}|pela peşti]] ke).
 Eke be ğeletine ameya tiya, wa gocega '''peyser'''i programê xo de bıtıkne.",
 'anontalkpagetext' => "----''No pel, pel o karbero hesab a nêkerdeyan o, ya zi karbero hesab akerdeyan o labele pê hesabê xo nêkewto de. No sebeb ra ma IP adres şuxulneni û ney IP adresan herkes eşkeno bıvino. Eke şıma qayil niye ina bo xo ri [[Special:UserLogin/signup|yew hesab bıvıraze]] veyaxut [[Special:UserLogin|hesab akere]].''",
-'noarticletext' => 'Na per enewke venga.
-Tı şenay na perer, peran de [[Special:Search/{{PAGENAME}}|binan miyan de bıgeyrè]],
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}  qeyda miyande bıgeyre],
-ya na [{{fullurl:{{FULLPAGENAME}}|action=edit}} ena perer vırazé]</span>.',
-'noarticletext-nopermission' => 'Na pela dı eno metin enewke vengo
-Na sernuşteya şıma [[Special:Search/{{PAGENAME}}|pelanê binan de şeni bıgeyri]]
-ya zi <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} itara şeni bıgeyri cı].</span> feqet şıma nişeni biizın teba bıkeri.',
+'noarticletext' => 'Ena pele de hewna theba çıniyo.
+Tı şenay zerreyê pelanê binan de [[Special:Search/{{PAGENAME}}|seba sernameyê ena pele cı geyre]],
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} qeydan miyan de cı geyre],
+ya zi [{{fullurl:{{FULLPAGENAME}}|action=edit}} ena pele bıvurne]</span>.',
+'noarticletext-nopermission' => 'Ena pele de hewna theba çıniyo.
+Tı şenay zerreyê pelanê binan de [[Special:Search/{{PAGENAME}}|seba sernameyê na pele cı geyre]], ya zi <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} qeydan miyan de cı geyre]</span>, ema destur çıniyo ke na pele vırazê.',
 'missing-revision' => 'Rewizyonê name dê pela da #$1 "{{PAGENAME}}" dı çıniyo.
 
 No normal de tarix dê pelanê besterneyan dı ena xırabin asena.
@@ -1155,7 +1157,7 @@ Hewna kerde aseno.',
 'postedit-confirmation' => 'Vurnayışê to qeyd bi.',
 'edit-already-exists' => 'Pelo newe nêvıraziyeno.
 Pel ca ra esto.',
-'defaultmessagetext' => 'Hesıbyaye metne mesaci',
+'defaultmessagetext' => 'Metnê mesacê hesabiyayey',
 'content-failed-to-parse' => 'Qandê madela $3 zereyê $1, $2 sero nêagozyayo',
 'invalid-content-data' => 'Zerrey malumati nêravêrdeyo',
 'content-not-allowed-here' => '"$1" sero per da [[$2]] rê mısade nêdeyêno',
@@ -1410,7 +1412,7 @@ Detayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'search-section' => '(qısmê $1)',
 'search-file-match' => '(zerreyê dosya yewbini gêno)',
 'search-suggest' => 'To va: $1',
-'search-interwiki-caption' => 'Projey Bıray',
+'search-interwiki-caption' => 'Proceyê bıray',
 'search-interwiki-default' => '$1 neticeyan:',
 'search-interwiki-more' => '(véşi)',
 'search-relatedarticle' => 'Eleqeyın',
@@ -1430,7 +1432,7 @@ Detayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'powersearch-togglenone' => 'Çıniyo',
 'search-external' => 'Cıgeyrayışê teberi',
 'searchdisabled' => '{{SITENAME}} no keyepel de cıgerayiş muweqqet bıryayo. no benatê de şıma pê Google eşkeni zerreyê {{SITENAME}} de cıgerayiş bıkeri.',
-'search-error' => 'Cı geyrayış de zu ğeta emé meydan:$1',
+'search-error' => 'Cıgeyrayış de yew xeta emê meydan: $1',
 
 # Preferences page
 'preferences' => 'Tercihi',
@@ -1742,11 +1744,23 @@ Eka tu wazene ke nameyo raşt xo bide, ma nameyo raşt ti iştirakanê ti de moc
 'rcnotefrom' => "Cêr de '''$2''' ra nata vurnayışiyê asenê (tewr vêşi <b> '''$1'''</b> asenê).",
 'rclistfrom' => '$1 ra tepiya vurnayışanê neweyan bımocne',
 'rcshowhideminor' => 'Vurnayışanê werdiyan $1',
+'rcshowhideminor-show' => 'Bımocne',
+'rcshowhideminor-hide' => 'Bınımne',
 'rcshowhidebots' => 'Botan $1',
+'rcshowhidebots-show' => 'Bımocne',
+'rcshowhidebots-hide' => 'Bınımne',
 'rcshowhideliu' => 'Karberanê qeydbiyayeyan $1',
+'rcshowhideliu-show' => 'Bımocne',
+'rcshowhideliu-hide' => 'Bınımne',
 'rcshowhideanons' => 'Karberanê bênameyan $1',
+'rcshowhideanons-show' => 'Bımocne',
+'rcshowhideanons-hide' => 'Bınımne',
 'rcshowhidepatr' => '$1 vurnayışê ke dewriya geyrayê',
+'rcshowhidepatr-show' => 'Bımocne',
+'rcshowhidepatr-hide' => 'Bınımne',
 'rcshowhidemine' => 'Vurnayışanê mı $1',
+'rcshowhidemine-show' => 'Bımocne',
+'rcshowhidemine-hide' => 'Bınımne',
 'rclinks' => 'Peyniya $2 rocan de $1 vurnayışan bımocne <br />$3',
 'diff' => 'ferq',
 'hist' => 'verên',
@@ -1869,6 +1883,7 @@ Semedê ancia barkerdışi dewamkerdış ra ver tarixê esterışê dosya gani q
 'uploaddisabledtext' => 'Bar kerdişê dosyayî iptal biyo',
 'php-uploaddisabledtext' => 'barkerdışê dosyayê PHP nıka çino. kerem kere eyarê file_uploads korol bıkerê.',
 'uploadscripted' => 'Ena dosya de yew HTML ya zi kodê scriptî este ke belki browserê webî fam nikeno.',
+'uploadinvalidxml' => 'Dosyaya barkerdiye de XML nêgureniya.',
 'uploadvirus' => 'Ena dosya de yew virus estê: Qe detayan: $1',
 'uploadjava' => 'Dosya, zerre de cıdı jew Java .class dosyaya ZIP esta.
 Dosyayn de Java barkerdışi rê icazet nêdeyê, çıkı emeleya merduman nêbena.',
@@ -3092,7 +3107,7 @@ dosyaya emaneti vindbiyo',
 'tooltip-pt-login' => 'Mayê şıma ronıştış akerdışi rê dawet keme; labelê ronıştış mecburi niyo',
 'tooltip-pt-logout' => 'Sistem ra vıcyayış',
 'tooltip-ca-talk' => 'Zerrekê pele sero werênayış',
-'tooltip-ca-edit' => 'Tı şenay na perer bıvurné.Verdé qeyd kerdışi ver gocega verqayti bıkarné.',
+'tooltip-ca-edit' => 'Tı şenay na pele bıvurnê. Kerem ke, qeydkerdış ra ver gocega verqayti bıgurene.',
 'tooltip-ca-addsection' => 'Zu bınnusteya newi ak',
 'tooltip-ca-viewsource' => 'Ena pele kılit biya.
 Şıma şenê çımeyê aye bıvênê',
@@ -3103,14 +3118,14 @@ dosyaya emaneti vindbiyo',
 'tooltip-ca-undelete' => 'peli biyarê halê ver hewnakerdışi',
 'tooltip-ca-move' => 'Ena pele bere',
 'tooltip-ca-watch' => 'Ena pele lista xoya seyrkerdışi ke',
-'tooltip-ca-unwatch' => 'Ena pele listeya seyir-kerdışi xo ra bıvec',
+'tooltip-ca-unwatch' => 'Ena pele lista xoya seyrkerdışi ra vece',
 'tooltip-search' => '{{SITENAME}} miyan de bıvin',
 'tooltip-search-go' => 'Ebe nê namey tami şo yew pela ke esta',
 'tooltip-search-fulltext' => 'Nê  metni peran dı cı geyre',
 'tooltip-p-logo' => 'Şo pela seri',
 'tooltip-n-mainpage' => 'Şo pela seri',
 'tooltip-n-mainpage-description' => 'Şo pela seri',
-'tooltip-n-portal' => 'Heqa projey de, kes çı şeno bıkero, çıçiyo koti deyo',
+'tooltip-n-portal' => 'Heqa procey de, çı şenay bıkerê, çı koti vêniyeno',
 'tooltip-n-currentevents' => 'Vurnayışanê peyênan de melumatê pey bıvêne',
 'tooltip-n-recentchanges' => 'Wiki de lista vurnayışanê peyênan',
 'tooltip-n-randompage' => 'Perake raşt amé',
@@ -3131,7 +3146,7 @@ dosyaya emaneti vindbiyo',
 'tooltip-ca-nstab-special' => 'Na yew pela xasa, şıma nêşenê sero vurnayış bıkerê',
 'tooltip-ca-nstab-project' => 'Pela procey bıvêne',
 'tooltip-ca-nstab-image' => 'Pera dosyayer bıvin',
-'tooltip-ca-nstab-mediawiki' => 'Mesacané sistemi bıvin',
+'tooltip-ca-nstab-mediawiki' => 'Mesacê sistemi bıvêne',
 'tooltip-ca-nstab-template' => 'Şabloni bıvin',
 'tooltip-ca-nstab-help' => 'Pela peşti bıvêne',
 'tooltip-ca-nstab-category' => 'Pela kategoriye bıvêne',
@@ -3140,7 +3155,7 @@ dosyaya emaneti vindbiyo',
 'tooltip-preview' => 'Vurnayışané ğo çımra ravyarné. Verdé qeyd kerdışi eneri bıkarné!',
 'tooltip-diff' => 'Metni sero vurnayışan mocneno',
 'tooltip-compareselectedversions' => 'Ena per de ferqê rewziyonan de dı weçinaya bıvinê',
-'tooltip-watch' => 'Eno pele listey tıyo seyir-kerdişi ri dek',
+'tooltip-watch' => 'Ena pele lista xoya seyrkerdışi ke',
 'tooltip-watchlistedit-normal-submit' => 'Sernuşteya hewad',
 'tooltip-watchlistedit-raw-submit' => 'Listeyê seyri newen ke',
 'tooltip-recreate' => 'pel hewn a bışiyo zi tepiya biya',
@@ -3963,7 +3978,7 @@ Ma rica keno tesdiq bike ke ti raştî wazeno eno pel bivirazo.",
 'imgmultigoto' => 'Şo pela da $1',
 
 # Language selector for translatable SVGs
-'img-lang-default' => '(hesıbyayi zıwan)',
+'img-lang-default' => '(zıwano hesabiyaye)',
 'img-lang-info' => 'Resimé $1, $2 ya teké pé ke.',
 'img-lang-go' => 'Bırş',
 
@@ -3972,7 +3987,7 @@ Ma rica keno tesdiq bike ke ti raştî wazeno eno pel bivirazo.",
 'descending_abbrev' => 'nızm',
 'table_pager_next' => 'Pela peyêne',
 'table_pager_prev' => 'Pela verêne',
-'table_pager_first' => 'Pela jûyıne',
+'table_pager_first' => 'Pela sıfteyêne',
 'table_pager_last' => 'Pela peyêne',
 'table_pager_limit' => 'her per de $1 unsuran bımocne',
 'table_pager_limit_label' => 'Her pele ra xacetan',
@@ -4415,6 +4430,4 @@ Eneri Medya wiki sera xo keno.',
 'expand_templates_generate_rawhtml' => "Xam HTML'i bıvin",
 'expand_templates_preview' => 'Verqayt',
 
-# Unknown messages
-'uploadinvalidxml' => 'Dosyaya barkerdiye de XML nêgureniya.',
 );
index 3b076f1..e2351d6 100644 (file)
@@ -714,7 +714,7 @@ Sy snaź swójo gronidło južo wuspěšnje změnił abo nowe nachylne gronidło
 'resetpass-temp-password' => 'Nachylne gronidło:',
 'resetpass-abort-generic' => 'Změnjanje gronidła jo se pśez rozšyrjenje pśetergnuło.',
 'resetpass-expired' => 'Twójo gronidło jo pśepadnyło. Pšosym póstaj nowe gronidło za pśizjawjenje.',
-'resetpass-expired-soft' => 'Twójo gronidło jo pśepadnyło a musy se slědk stajiś. Pšosym wubjeŕ něnto druge gronidło abo klikni na "Pśetergnuś", aby jo pózdźej slědk stajił.',
+'resetpass-expired-soft' => 'Twójo gronidło jo pśepadnyło a musy se slědk stajiś. Pšosym wubjeŕ něnto druge gronidło abo klikni na "{{int:resetpass-submit-cancel}}", aby jo pózdźej slědk stajił.',
 
 # Special:PasswordReset
 'passwordreset' => 'Gronidło slědk stajiś',
@@ -1542,14 +1542,26 @@ Toś ta informacija buźo zjawna.',
 'recentchanges-legend-heading' => "'''Legenda:'''",
 'recentchanges-legend-newpage' => '(glej teke [[Special:NewPages|lisćinu nowych bokow]])',
 'recentchanges-legend-plusminus' => "(''±123'')",
-'rcnotefrom' => "Dołojce pokazuju se změny wót '''$2''' (maks. '''$1''' zapisow).",
+'rcnotefrom' => 'Dołojce pokazuju se změny wót <strong>$2</strong> (maks. <strong>$1</strong> zapisow).',
 'rclistfrom' => 'Nowe změny wót $1 pokazaś.',
 'rcshowhideminor' => 'Snadne změny $1',
+'rcshowhideminor-show' => 'Pokazaś',
+'rcshowhideminor-hide' => 'Schowaś',
 'rcshowhidebots' => 'awtomatiske programy (boty) $1',
+'rcshowhidebots-show' => 'Pokazaś',
+'rcshowhidebots-hide' => 'Schowaś',
 'rcshowhideliu' => 'Zregistrěrowane wužywarje $1',
+'rcshowhideliu-show' => 'Pokazaś',
+'rcshowhideliu-hide' => 'Schowaś',
 'rcshowhideanons' => 'anonymne wužywarje $1',
+'rcshowhideanons-show' => 'Pokazaś',
+'rcshowhideanons-hide' => 'Schowaś',
 'rcshowhidepatr' => 'kontrolěrowane změny $1',
+'rcshowhidepatr-show' => 'Pokazaś',
+'rcshowhidepatr-hide' => 'Schowaś',
 'rcshowhidemine' => 'móje pśinoski $1',
+'rcshowhidemine-show' => 'Pokazaś',
+'rcshowhidemine-hide' => 'Schowaś',
 'rclinks' => 'Slědne $1 změny slědnych $2 dnjow pokazaś<br />$3',
 'diff' => 'rozdźěl',
 'hist' => 'wersije',
@@ -1673,6 +1685,8 @@ Jolic maš toś ten wobraz w połnem rozeznaśu, nagraj jen, howac změń pšosy
 'uploaddisabledtext' => 'Nagraśa datajow su znjemóžnjone.',
 'php-uploaddisabledtext' => 'Nagraśa PHP-datajow su znjemóžnjone. Pšosym pśekontrolěruj nastajenje file_uploads.',
 'uploadscripted' => 'Toś ta dataja wopśimjejo HTML abo script code, kótaryž móžo wót browsera se zamólnje wuwjasć.',
+'uploadscriptednamespace' => "Toś ta SVG-dataja wopśimujo njedowólony mjenjowy rum '$1'",
+'uploadinvalidxml' => 'XML w nagratej dataji njedajo se parsowaś.',
 'uploadvirus' => 'Toś ta dataja ma wirus! Nadrobnosći: $1',
 'uploadjava' => 'Toś ta dataja jo ZIP-dataja, kótaraž wopśimujo dataju .class z Javy.
 Nagrawanje datajow Javy njejo dowólone, dokulaž mógli wobjeźenje wěstotnych wobgranicowanjow zmóžniś.',
@@ -2487,8 +2501,10 @@ $1',
 'sp-contributions-blocked-notice-anon' => 'Toś ta IP-adresa jo tuchylu zablokěrowana.
 Nejnowšy zapisk protokola blokěrowanjow pódawa se dołojce ako referenca:',
 'sp-contributions-search' => 'Pśinoski pytaś',
+'sp-contributions-suppresslog' => 'pódtłocone wužywarske pśinoski',
 'sp-contributions-username' => 'IP-adresa abo wužywarske mě:',
 'sp-contributions-toponly' => 'Jano wuše wersije pokazaś',
+'sp-contributions-newonly' => 'Jano změny pokazaś, kótarež su napóranja bokow',
 'sp-contributions-submit' => 'Pytaś',
 
 # What links here
@@ -3992,6 +4008,4 @@ Hować móžoš slědujucy jadnory formular wužywaś. Twój komentar pśidajo s
 'expand_templates_generate_rawhtml' => 'Gropny HTML pokazaś',
 'expand_templates_preview' => 'Pśeglěd',
 
-# Unknown messages
-'uploadinvalidxml' => 'XML w nagratej dataji njedajo se parsowaś.',
 );
index 5557021..897ea5c 100644 (file)
@@ -528,6 +528,9 @@ Se l'inscrisiòun l'é stêda fâta per şbâli, es pōl scanşlêr sté mesâg.
 'loginlanguagelabel' => 'Léngva: $1',
 'suspicious-userlogout' => "La tó dmânda per destachêret l'é stēda rifiutêda perchè la sèmbra spidîda da un navigadōr ch' al funsiòuna mìa o da un proxy di caching.",
 'createacct-another-realname-tip' => "Druvêr al nòm vèira l'é 'na siēlta personêla; s' es pèinsa 'd ruvêrel al gnirâ uşê per dêr la paternitê di lavōr spidî.",
+'pt-login' => 'Và dèinter',
+'pt-createaccount' => 'Fà la tó inscrisiòun',
+'pt-userlogout' => 'Và fōra',
 
 # Email sending
 'php-mail-error-unknown' => 'Erōr mìa cngusû int la funsiòun PHP mail().',
@@ -550,8 +553,12 @@ Se l'inscrisiòun l'é stêda fâta per şbâli, es pōl scanşlêr sté mesâg.
 'resetpass-submit-cancel' => 'Scanşèla',
 'resetpass-wrong-oldpass' => "Cêva 'd ingrès pruvişôria o còla 'd adès mìa vâlida.
 La cêva 'd ingrès la pré èser stêda bèle cambiêda, opór n'in pré èser stê dmandê 'na nōva pruvişôria.",
+'resetpass-recycled' => "Mèt dèinter 'na cêva 'd ingrès divêrsa da còla 'd adès.",
+'resetpass-temp-emailed' => "L'ingrès l'é stê fât cun un côdis pruvişôri. Per finîr la registrasiòun, l'é necesâri impustêr 'na nōva cêva 'd ingrès ché:",
 'resetpass-temp-password' => "Cêva 'd ingrès pruvişôria:",
 'resetpass-abort-generic' => "La mudéfica 'd la cêva 'd ingrès l'é stêda fermêda da un şlungamèint.",
+'resetpass-expired' => "La cêva 'd ingrès l'é scadûda. Mèt dèinter 'na cêva 'd ingrès nōva per fêr l'ingrès.",
+'resetpass-expired-soft' => "La tó cêva 'd ingrès l'é scadûda. T'é perghê ed siēlier 'na nōva o clichêr insém a \"{{int:resetpass-submit-cancel}}\" per turnêrla a mèter dèinter in sègvit.",
 
 # Special:PasswordReset
 'passwordreset' => "Câmbia la cêva 'd ingrès",
@@ -604,6 +611,7 @@ Cêva 'd ingrès pruvişôria: $2",
 'resettokens-text' => "Ché 't pō turnêr a impustêr al cêvi ch'ét permèten l'ingrès a precîşi infurmasiòun privêdi lighêdi a la tó utèinsa. Ét duvrés fêrel se per chêş ét j ê spartîdi cun quelchidûn o se al j infurmasiòun ed la tó utèinsa în  in perécol.",
 'resettokens-no-tokens' => "An gh'é mìa di token da turnêr a impustêr.",
 'resettokens-legend' => "Tōrna 'd impustêr la cêva",
+'resettokens-tokens' => ' Token:',
 'resettokens-token-label' => "$1 (valōr 'd adèsa: $2)",
 'resettokens-watchlist-token' => "Token p'r al feed web (Atom/RSS) dal [[Special:Watchlist|mudéfichi al pàgini ch'ét tîn sòt' ôc]]",
 'resettokens-done' => 'Token turnê a impustêr.',
@@ -717,7 +725,9 @@ Al tō mudéfichi în MIA incòra stêdi salvêdi.",
 'editingsection' => 'Mudéfica ed $1 (sesiòun)',
 'editingcomment' => 'Mudéfica e $1 (sesiòun nōva)',
 'editconflict' => "Cuntrâst 'd edisiòun só $1",
+'explainconflict' => "Un êter utèint l'à salvê 'na nōva versiòun ed la pàgina mèinter t'ēr adrē fêr dal mudéfichi. Int la caşèla 'd mudéfica ché 'd sōver a gh'é al tèst ed la pàgina che adès l'é in lénia, acsé cme l'é stêda salvêda da cl'êter utèint. La versiòun cun al tō mudéfichi invēci l'é int la caşèla dal mudéfichi ché sòta. S' ét vō cunfermêri, ét dēv purtêr al tō mudéfichi int al tèst che gh'é bèle (caşèla ché 'd sōver). Se té schés al ptòun '{{int:savearticle}}', a gnirà salvê '''sōl''' al tèst dèinter a la caşèla 'd mudéfica ché 'd sōver.",
 'yourtext' => 'Al tó tèst',
+'storedversion' => 'La versiòun in memôria',
 'yourdiff' => 'Diferèinsi',
 'templatesused' => '{{PLURAL:$1|Mudèl druvê|Mudē druvê}} in cla pàgina ché:',
 'template-protected' => '(prutèt)',
@@ -896,7 +906,7 @@ Per cumditê còst l'é l'èlèinch dal scanşladûri e di spustamèint relatîv
 'recentchanges-label-minor' => "Còsta l'é 'na mudéfica céca",
 'recentchanges-label-bot' => "Cla mudéfica ché l'é stêda fâta da un bot.",
 'recentchanges-label-unpatrolled' => "Cla mudéfica ché an n'é mìa incòra stêda verifichêda.",
-'rcnotefrom' => "Ché sòt a gh'é la lésta dal mudéfichi fâti a partîr da '''$2''' (fîn a '''$1''').",
+'rcnotefrom' => "Ché sòt a gh'é la lésta dal mudéfichi fâti a partîr da <strong>$2</strong>(fîn a <strong>$1</strong>).",
 'rclistfrom' => 'Fà vèder al mudéfichi fâti a partîr da $1.',
 'rcshowhideminor' => '$1 al mudéfichi céchi',
 'rcshowhidebots' => '$1 i bot',
index b1a80a0..b3c1c39 100644 (file)
@@ -11,6 +11,7 @@
  * @author Aitolos
  * @author Assassingr
  * @author Astralnet
+ * @author Axil
  * @author Azimout
  * @author Badseed
  * @author Chomwitt
@@ -407,7 +408,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Να μου αποστέλλονται αντίγραφα των μηνυμάτων ηλεκτρονικού ταχυδρομείου που στέλνω σε άλλους χρήστες',
 'tog-diffonly' => 'Να μην εμφανίζεται περιεχόμενο σελίδων κάτω από τις διαφορές των εκδόσεων',
 'tog-showhiddencats' => 'Εμφάνιση κρυμμένων κατηγοριών',
-'tog-noconvertlink' => 'Απενεργοποίησε την μετατροπή τίτλου συνδέσμου',
 'tog-norollbackdiff' => 'Παράλειψη διαφοράς μετά την εκτέλεση επαναφοράς',
 'tog-useeditwarning' => 'Προειδοποίηση όταν εγκαταλείπω μία σελίδα επεξεργασίας χωρίς να έχω πρώτα αποθηκεύσει τις αλλαγές',
 'tog-prefershttps' => 'Να γίνεται πάντα χρήση ασφαλούς σύνδεσης όταν ο χρήστης είναι συνδεδεμένος',
@@ -662,8 +662,8 @@ $1',
 'feed-unavailable' => 'Οι ροές δεδομένων δεν είναι διαθέσιμες',
 'site-rss-feed' => '$1 ροή RSS',
 'site-atom-feed' => '$1 ροή Atom',
-'page-rss-feed' => '«$1» ροή RSS',
-'page-atom-feed' => '«$1» ροή Atom',
+'page-rss-feed' => 'Ροή RSS «$1»',
+'page-atom-feed' => 'Ροή Atom «$1»',
 'red-link-title' => '$1 (η σελίδα δεν υπάρχει)',
 'sort-descending' => 'Φθίνουσα ταξινόμηση',
 'sort-ascending' => 'Αύξουσα ταξινόμηση',
@@ -705,7 +705,7 @@ $1',
 'readonlytext' => 'Η βάση δεδομένων είναι επί του παρόντος κλειδωμένη απέναντι σε νέες καταχωρίσεις και άλλες τροποποιήσεις, πιθανότατα λόγω συντήρησης ρουτίνας, μετά την οποία θα επανέλθει σε κανονική λειτουργία.  
 
 Ο διαχειριστής που την κλείδωσε έδωσε την ακόλουθη εξήγηση: $1',
-'missing-article' => 'Η βάση δεδομένων δεν βρήκε κείμενο μιας σελίδας που θα έπρεπε να βρεθεί, με όνομα "$1" $2.
+'missing-article' => 'Η βάση δεδομένων δεν βρήκε κείμενο μιας σελίδας που θα έπρεπε να βρεθεί, με όνομα «$1» $2.
 
 Αυτό συνήθως προκαλείται ακολουθώντας ένα σύνδεσμο "διαφοράς" ή σύνδεσμο προς ιστορικό μιας σελίδας που έχει διαγραφεί.
 
@@ -716,20 +716,20 @@ $1',
 'readonly_lag' => 'Η βάση δεδομένων έχει κλειδωθεί αυτόματα για να μπορέσουν οι επιμέρους servers των αντιγράφων της βάσης δεδομένων (slaves) να καλύψουν τη διαφορά με τον κεντρικό server του πρωτοτύπου της βάσης (master).',
 'internalerror' => 'Εσωτερικό σφάλμα',
 'internalerror_info' => 'Εσωτερικό σφάλμα: $1',
-'fileappenderrorread' => 'Δεν ήταν δυνατή η ανάγνωση του "$1" κατά τη διάρκεια της επισύναψης.',
-'fileappenderror' => 'Δεν ήταν δυνατή η προσάρτηση του αρχείου "$1" στο "$2".',
-'filecopyerror' => 'Δεν ήταν δυνατή η αντιγραφή του αρχείου "$1" στο "$2".',
-'filerenameerror' => 'Δεν είναι δυνατή η μετονομασία του αρχείου "$1" σε "$2".',
-'filedeleteerror' => 'Δεν ήταν δυνατή η διαγραφή του αρχείου "$1".',
-'directorycreateerror' => 'Δεν μπορούσε να δημιουργηθεί η κατηγορία "$1".',
-'filenotfound' => 'Δεν είναι δυνατή η ανεύρεση του αρχείου "$1".',
-'fileexistserror' => 'Αδύνατον να εγγραφεί στο αρχείο "$1": το αρχείο υπάρχει',
-'unexpected' => 'Μη προσδοκώμενη τιμή: "$1"="$2"',
+'fileappenderrorread' => 'Δεν ήταν δυνατή η ανάγνωση του «$1» κατά τη διάρκεια της επισύναψης.',
+'fileappenderror' => 'Δεν ήταν δυνατή η προσάρτηση του αρχείου «$1» στο «$2».',
+'filecopyerror' => 'Δεν ήταν δυνατή η αντιγραφή του αρχείου «$1» στο «$2».',
+'filerenameerror' => 'Δεν είναι δυνατή η μετονομασία του αρχείου «$1» σε «$2».',
+'filedeleteerror' => 'Δεν ήταν δυνατή η διαγραφή του αρχείου «$1».',
+'directorycreateerror' => 'Δεν μπορούσε να δημιουργηθεί η κατηγορία «$1».',
+'filenotfound' => 'Δεν είναι δυνατή η ανεύρεση του αρχείου «$1».',
+'fileexistserror' => 'Αδύνατον να εγγραφεί στο αρχείο «$1»: το αρχείο υπάρχει',
+'unexpected' => 'Μη προσδοκώμενη τιμή: «$1»=«$2».',
 'formerror' => 'Σφάλμα: Δεν ήταν δυνατή η υποβολή της φόρμας!',
 'badarticleerror' => 'Η ενέργεια αυτή δεν μπορεί να εκτελεσθεί στη συγκεκριμένη σελίδα.',
 'cannotdelete' => 'Η σελίδα ή το αρχείο «$1» δεν μπόρεσε να διαγραφεί.
 Ενδεχομένως να έχει ήδη διαγραφεί από κάποιον άλλον.',
-'cannotdelete-title' => 'Αδύνατη η διαγραφή της σελίδας "$1"',
+'cannotdelete-title' => 'Αδύνατη η διαγραφή της σελίδας «$1»',
 'delete-hook-aborted' => 'Η επεξεργασία ματαιώθηκε από το άγκιστρο του συντακτικού αναλυτή.
 Δεν έδωσε εξήγηση.',
 'badtitle' => 'Ακατάλληλος τίτλος',
@@ -759,11 +759,11 @@ $2',
 'myprivateinfoprotected' => 'Δεν έχετε άδεια για να επεξεργαστείτε τα προσωπικά σας στοιχεία.',
 'mypreferencesprotected' => 'Δεν έχετε άδεια για να επεξεργαστείτε τις προτιμήσεις σας.',
 'ns-specialprotected' => 'Σελίδες στον τομέα {{ns:special}} δεν γίνεται να επεξεργαστούν.',
-'titleprotected' => "Αυτός ο τίτλος έχει προστατευθεί από την δημιουργία από τον [[User:$1|$1]].
-Ο λόγος που δίνεται είναι ''$2''.",
-'filereadonlyerror' => 'Δεν είναι δυνατή η τροποποίηση του αρχείου " $1 " επειδή το αποθετήριο αρχείων " $2 " είναι σε κατάσταση λειτουργίας μόνο για ανάγνωση.
+'titleprotected' => 'Αυτός ο τίτλος έχει προστατευθεί από την δημιουργία από τον [[User:$1|$1]].
+Ο λόγος που δίνεται είναι «$2».',
+'filereadonlyerror' => 'Δεν είναι δυνατή η τροποποίηση του αρχείου «$1» επειδή το αποθετήριο αρχείων «$2» είναι σε κατάσταση λειτουργίας μόνο για ανάγνωση.
 
-Ο διαχειριστής που το κλείδωσε προσφέρει αυτή την αιτιολόγηση: " $3 ".',
+Ο διαχειριστής που το κλείδωσε προσφέρει αυτή την αιτιολόγηση: «$3».',
 'invalidtitle-knownnamespace' => 'Μη έγκυρος τίτλος με χώρο ονομάτων «$2» και κείμενο «$3»',
 'invalidtitle-unknownnamespace' => 'Μη έγκυρος τίτλος με άγνωστο αριθμό χώρου ονομάτων $1 και κείμενο «$2»',
 'exception-nologin' => 'Δεν έχετε συνδεθεί.',
@@ -912,7 +912,7 @@ $2',
 
 # Change password dialog
 'changepassword' => 'Αλλαγή κωδικού',
-'resetpass_announce' => 'ΣÏ\85νδεθήκαÏ\84ε Î¼Îµ Î­Î½Î± Ï\80Ï\81οÏ\83Ï\89Ï\81ινÏ\8c ÎºÏ\89δικÏ\8c, Ï\83Ï\84αλμένο Î¼Îµ e-mail. Î\93ια Î½Î± Î¿Î»Î¿ÎºÎ»Î·Ï\81Ï\8eÏ\83εÏ\84ε Ï\84ην Ï\83Ï\8dνδεÏ\83η, Ï\80Ï\81έÏ\80ει Î½Î± Ï\83Ï\84είλεÏ\84ε Î­Î½Î± Î½Î­Î¿ ÎºÏ\89δικÏ\8c ÎµÎ´Ï\8e:',
+'resetpass_announce' => 'Για να ολοκληρώσετε την σύνδεση, πρέπει να στείλετε ένα νέο κωδικό εδώ:',
 'resetpass_text' => '<!-- Προσθέστε κείμενο εδώ -->',
 'resetpass_header' => 'Αλλαγή κωδικού πρόσβασης',
 'oldpassword' => 'Παλιός κωδικός',
@@ -928,6 +928,7 @@ $2',
 'resetpass-submit-cancel' => 'Ακύρωση',
 'resetpass-wrong-oldpass' => 'Λάθος προσωρινός ή κανονικός κωδικός.
 Μπορεί να έχετε ήδη αλλάξει επιτυχώς τον κωδικό σας ή να έχετε ζητήσει έναν νέο προσωρινό κωδικό.',
+'resetpass-recycled' => 'Παρακαλούμε επαναφέρετε τον κωδικό πρόσβασής σας σε κάτι διαφορετικό από τον τρέχοντα κωδικό πρόσβασης.',
 'resetpass-temp-password' => 'Προσωρινός κωδικός:',
 'resetpass-abort-generic' => 'Η αλλαγή του κωδικού έχει απορριφθεί από μια προέκταση.',
 
@@ -1082,7 +1083,7 @@ $2
 Αυτό συνήθως προκαλείται από παλιό σύνδεσμο ιστορικού προς σελίδα που έχει διαγραφεί.
 Λεπτομέρειες θα βρείτε στο [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ημερολόγιο καταγραφής διαγραφών].',
 'userpage-userdoesnotexist' => 'Ο Λογαριασμός του χρήστη "<nowiki>$1</nowiki>" δεν είναι καταχωρημένος. Παρακαλώ δείτε αν θα θέλατε να δημιουργήσετε/επεξεργαστείτε αυτή τη σελίδα.',
-'userpage-userdoesnotexist-view' => 'Ο λογαριασμός χρήστη "$1" δεν είναι εγγεγραμμένος.',
+'userpage-userdoesnotexist-view' => 'Ο λογαριασμός χρήστη «$1» δεν είναι εγγεγραμμένος.',
 'blocked-notice-logextract' => 'Επί του παρόντος, αυτός ο χρήστης έχει υποστεί φραγή. Παρακάτω παρέχεται για αναφορά η πιο πρόσφατη καταχώρηση του αρχείου φραγών.',
 'clearyourcache' => "''' Σημείωση:''' μετά την αποθήκευση, ίσως χρειαστεί να παρακάμψετε την προσωρινή μνήμη του προγράμματος περιήγησής σας για να δείτε τις αλλαγές.
  * '''Firefox / Safari:''' Κρατήστε πατημένο το ''Shift'' κάνοντας ταυτόχρονα κλικ στο κουμπί ''Ανανέωση'' ή πιέστε ''Ctrl-F5'' ή ''Ctrl-R'' ('' ⌘-R'' σε Mac)
@@ -1764,6 +1765,8 @@ $1",
 'rcnotefrom' => "Παρακάτω είναι οι αλλαγές από τις '''$2''' (εμφανίζονται μέχρι '''$1''').",
 'rclistfrom' => 'Εμφάνιση νέων αλλαγών αρχίζοντας από $1',
 'rcshowhideminor' => '$1 μικροεπεξεργασιών',
+'rcshowhideminor-show' => 'Εμφάνιση',
+'rcshowhideminor-hide' => 'Απόκρυψη',
 'rcshowhidebots' => '$1 ρομπότ',
 'rcshowhideliu' => '$1 εγγεγραμμένων χρηστών',
 'rcshowhideanons' => '$1 ανωνύμων χρηστών',
index 3fffec2..62eb98a 100644 (file)
@@ -694,7 +694,6 @@ future releases. Also note that since each list value is wrapped in a unique
 'tog-ccmeonemails'            => 'Send me copies of emails I send to other users',
 'tog-diffonly'                => 'Do not show page content below diffs',
 'tog-showhiddencats'          => 'Show hidden categories',
-'tog-noconvertlink'           => 'Disable link title conversion', # only translate this message to other languages if you have to change it
 'tog-norollbackdiff'          => 'Omit diff after performing a rollback',
 'tog-useeditwarning'          => 'Warn me when I leave an edit page with unsaved changes',
 'tog-prefershttps'            => 'Always use a secure connection when logged in',
@@ -808,31 +807,31 @@ future releases. Also note that since each list value is wrapped in a unique
 'and'           => '&#32;and',
 
 # Cologne Blue skin
-'qbfind'         => 'Find',
-'qbbrowse'       => 'Browse',
-'qbedit'         => 'Edit',
-'qbpageoptions'  => 'This page',
-'qbmyoptions'    => 'My pages',
-'faq'            => 'FAQ',
-'faqpage'        => 'Project:FAQ',
-'sitetitle'      => '{{SITENAME}}', # do not translate or duplicate this message to other languages
-'sitesubtitle'   => '', # do not translate or duplicate this message to other languages
+'qbfind'        => 'Find',
+'qbbrowse'      => 'Browse',
+'qbedit'        => 'Edit',
+'qbpageoptions' => 'This page',
+'qbmyoptions'   => 'My pages',
+'faq'           => 'FAQ',
+'faqpage'       => 'Project:FAQ',
+'sitetitle'     => '{{SITENAME}}', # do not translate or duplicate this message to other languages
+'sitesubtitle'  => '', # do not translate or duplicate this message to other languages
 
 # Vector skin
-'vector-action-addsection'       => 'Add topic',
-'vector-action-delete'           => 'Delete',
-'vector-action-move'             => 'Move',
-'vector-action-protect'          => 'Protect',
-'vector-action-undelete'         => 'Undelete',
-'vector-action-unprotect'        => 'Change protection',
-'vector-view-create'             => 'Create',
-'vector-view-edit'               => 'Edit',
-'vector-view-history'            => 'View history',
-'vector-view-view'               => 'Read',
-'vector-view-viewsource'         => 'View source',
-'actions'                        => 'Actions',
-'namespaces'                     => 'Namespaces',
-'variants'                       => 'Variants',
+'vector-action-addsection' => 'Add topic',
+'vector-action-delete'     => 'Delete',
+'vector-action-move'       => 'Move',
+'vector-action-protect'    => 'Protect',
+'vector-action-undelete'   => 'Undelete',
+'vector-action-unprotect'  => 'Change protection',
+'vector-view-create'       => 'Create',
+'vector-view-edit'         => 'Edit',
+'vector-view-history'      => 'View history',
+'vector-view-view'         => 'Read',
+'vector-view-viewsource'   => 'View source',
+'actions'                  => 'Actions',
+'namespaces'               => 'Namespaces',
+'variants'                 => 'Variants',
 
 'navigation-heading' => 'Navigation menu',
 'errorpagetitle'     => 'Error',
@@ -971,8 +970,6 @@ See [[Special:Version|version page]].',
 'red-link-title'               => '$1 (page does not exist)',
 'sort-descending'              => 'Sort descending',
 'sort-ascending'               => 'Sort ascending',
-'interlanguage-link-title'     => '$1 – $2', # only translate this message to other languages if you have to change it
-'interlanguage-link-title-langonly' => '$1', # do not translate or duplicate this message to other languages
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main'      => 'Page',
@@ -1062,7 +1059,7 @@ Changes to this page will affect the appearance of the user interface for other
 To add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.',
 'cascadeprotected'              => 'This page has been protected from editing because it is included in the following {{PLURAL:$1|page, which is|pages, which are}} protected with the "cascading" option turned on:
 $2',
-'namespaceprotected'            => "You do not have permission to edit pages in the <strong>$1</strong> namespace.",
+'namespaceprotected'            => 'You do not have permission to edit pages in the <strong>$1</strong> namespace.',
 'customcssprotected'            => "You do not have permission to edit this CSS page because it contains another user's personal settings.",
 'customjsprotected'             => "You do not have permission to edit this JavaScript page because it contains another user's personal settings.",
 'mycustomcssprotected'          => 'You do not have permission to edit this CSS page.',
@@ -1082,14 +1079,14 @@ The administrator who locked it offered this explanation: "$3".',
 'exception-nologin-text-manual' => 'Please $1 to be able to access this page or action.',
 
 # Virus scanner
-'virus-badscanner'     => "Bad configuration: Unknown virus scanner: <em>$1</em>",
+'virus-badscanner'     => 'Bad configuration: Unknown virus scanner: <em>$1</em>',
 'virus-scanfailed'     => 'scan failed (code $1)',
 'virus-unknownscanner' => 'unknown antivirus:',
 
 # Login and logout pages
-'logouttext'                      => "<strong>You are now logged out.</strong>
+'logouttext'                      => '<strong>You are now logged out.</strong>
 
-Note that some pages may continue to be displayed as if you were still logged in, until you clear your browser cache.",
+Note that some pages may continue to be displayed as if you were still logged in, until you clear your browser cache.',
 'welcomeuser'                     => 'Welcome, $1!',
 'welcomecreation-msg'             => 'Your account has been created.
 You can change your {{SITENAME}} [[Special:Preferences|preferences]] if you wish.',
@@ -1178,7 +1175,7 @@ Ensure you have cookies enabled, reload this page and try again.',
 'nocookiesforlogin'               => '{{int:nocookieslogin}}', # only translate this message to other languages if you have to change it
 'noname'                          => 'You have not specified a valid username.',
 'loginsuccesstitle'               => 'Login successful',
-'loginsuccess'                    => "<strong>You are now logged in to {{SITENAME}} as \"\$1\".</strong>",
+'loginsuccess'                    => '<strong>You are now logged in to {{SITENAME}} as "$1".</strong>',
 'nosuchuser'                      => 'There is no user by the name "$1".
 Usernames are case sensitive.
 Check your spelling, or [[Special:UserLogin/signup|create a new account]].',
@@ -1254,8 +1251,9 @@ Please wait $1 before trying again.',
 'suspicious-userlogout'           => 'Your request to log out was denied because it looks like it was sent by a broken browser or caching proxy.',
 'createacct-another-realname-tip' => 'Real name is optional.
 If you choose to provide it, this will be used for giving the user attribution for their work.',
-'pt-createaccount'                => 'Create account',
 'pt-login'                        => 'Log in',
+'pt-login-button'                 => 'Log in',
+'pt-createaccount'                => 'Create account',
 'pt-userlogout'                   => 'Log out',
 
 # Email sending
@@ -1268,8 +1266,6 @@ If you choose to provide it, this will be used for giving the user attribution f
 # Change password dialog
 'changepassword'            => 'Change password',
 'changepassword-summary'    => '', # do not translate or duplicate this message to other languages
-'changepassword-throttled'  => 'You have made too many recent login attempts.
-Please wait $1 before trying again.',
 'resetpass_announce'        => 'To finish logging in, you must set a new password.',
 'resetpass_text'            => '<!-- Add text here -->', # only translate this message to other languages if you have to change it
 'resetpass_header'          => 'Change account password',
@@ -1278,6 +1274,8 @@ Please wait $1 before trying again.',
 'retypenew'                 => 'Retype new password:',
 'resetpass_submit'          => 'Set password and log in',
 'changepassword-success'    => 'Your password has been changed successfully!',
+'changepassword-throttled'  => 'You have made too many recent login attempts.
+Please wait $1 before trying again.',
 'resetpass_forbidden'       => 'Passwords cannot be changed',
 'resetpass-no-info'         => 'You must be logged in to access this page directly.',
 'resetpass-submit-loggedin' => 'Change password',
@@ -1289,8 +1287,8 @@ You may have already successfully changed your password or requested a new tempo
 To finish logging in, you must set a new password here:',
 'resetpass-temp-password'   => 'Temporary password:',
 'resetpass-abort-generic'   => 'Password change has been aborted by an extension.',
-'resetpass-expired' => 'Your password has expired. Please set a new password to login.',
-'resetpass-expired-soft' => 'Your password has expired, and needs to be reset. Please choose a new password now, or click cancel to reset it later.',
+'resetpass-expired'         => 'Your password has expired. Please set a new password to log in.',
+'resetpass-expired-soft'    => 'Your password has expired and needs to be reset. Please choose a new password now, or click "{{int:resetpass-submit-cancel}}" to reset it later.',
 
 # Special:PasswordReset
 'passwordreset'                    => 'Reset password',
@@ -1333,17 +1331,17 @@ Temporary password: $2',
 'passwordreset-emailerror-capture' => 'A password reset email was generated, which is shown below, but sending it to the {{GENDER:$2|user}} failed: $1',
 
 # Special:ChangeEmail
-'changeemail'          => 'Change email address',
-'changeemail-summary'  => '', # do not translate or duplicate this message to other languages
-'changeemail-header'   => 'Change account email address',
-'changeemail-text'     => 'Complete this form to change your email address. You will need to enter your password to confirm this change.',
-'changeemail-no-info'  => 'You must be logged in to access this page directly.',
-'changeemail-oldemail' => 'Current email address:',
-'changeemail-newemail' => 'New email address:',
-'changeemail-none'     => '(none)',
-'changeemail-password' => 'Your {{SITENAME}} password:',
-'changeemail-submit'   => 'Change email',
-'changeemail-cancel'   => 'Cancel',
+'changeemail'           => 'Change email address',
+'changeemail-summary'   => '', # do not translate or duplicate this message to other languages
+'changeemail-header'    => 'Change account email address',
+'changeemail-text'      => 'Complete this form to change your email address. You will need to enter your password to confirm this change.',
+'changeemail-no-info'   => 'You must be logged in to access this page directly.',
+'changeemail-oldemail'  => 'Current email address:',
+'changeemail-newemail'  => 'New email address:',
+'changeemail-none'      => '(none)',
+'changeemail-password'  => 'Your {{SITENAME}} password:',
+'changeemail-submit'    => 'Change email',
+'changeemail-cancel'    => 'Cancel',
 'changeemail-throttled' => 'You have made too many login attempts.
 Please wait $1 before trying again.',
 
@@ -1382,27 +1380,27 @@ You should do it if you accidentally shared them with someone or if your account
 'hr_tip'          => 'Horizontal line (use sparingly)',
 
 # Edit pages
-'summary'                          => 'Summary:',
-'subject'                          => 'Subject/headline:',
-'minoredit'                        => 'This is a minor edit',
-'watchthis'                        => 'Watch this page',
-'savearticle'                      => 'Save page',
-'preview'                          => 'Preview',
-'showpreview'                      => 'Show preview',
-'showlivepreview'                  => 'Live preview',
-'showdiff'                         => 'Show changes',
-'anoneditwarning'                  => "<strong>Warning:</strong> You are not logged in.
+'summary'                                  => 'Summary:',
+'subject'                                  => 'Subject/headline:',
+'minoredit'                                => 'This is a minor edit',
+'watchthis'                                => 'Watch this page',
+'savearticle'                              => 'Save page',
+'preview'                                  => 'Preview',
+'showpreview'                              => 'Show preview',
+'showlivepreview'                          => 'Live preview',
+'showdiff'                                 => 'Show changes',
+'anoneditwarning'                          => "<strong>Warning:</strong> You are not logged in.
 Your IP address will be recorded in this page's edit history.",
-'anonpreviewwarning'               => "<em>You are not logged in. Saving will record your IP address in this page's edit history.</em>",
-'missingsummary'                   => "<strong>Reminder:</strong> You have not provided an edit summary.
-If you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
-'missingcommenttext'               => 'Please enter a comment below.',
-'missingcommentheader'             => "<strong>Reminder:</strong> You have not provided a subject/headline for this comment.
-If you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
-'summary-preview'                  => 'Summary preview:',
-'subject-preview'                  => 'Subject/headline preview:',
-'blockedtitle'                     => 'User is blocked',
-'blockedtext'                      => "<strong>Your username or IP address has been blocked.</strong>
+'anonpreviewwarning'                       => "<em>You are not logged in. Saving will record your IP address in this page's edit history.</em>",
+'missingsummary'                           => '<strong>Reminder:</strong> You have not provided an edit summary.
+If you click "{{int:savearticle}}" again, your edit will be saved without one.',
+'missingcommenttext'                       => 'Please enter a comment below.',
+'missingcommentheader'                     => '<strong>Reminder:</strong> You have not provided a subject/headline for this comment.
+If you click "{{int:savearticle}}" again, your edit will be saved without one.',
+'summary-preview'                          => 'Summary preview:',
+'subject-preview'                          => 'Subject/headline preview:',
+'blockedtitle'                             => 'User is blocked',
+'blockedtext'                              => '<strong>Your username or IP address has been blocked.</strong>
 
 The block was made by $1.
 The reason given is <em>$2</em>.
@@ -1412,10 +1410,10 @@ The reason given is <em>$2</em>.
 * Intended blockee: $7
 
 You can contact $1 or another [[{{MediaWiki:Grouppage-sysop}}|administrator]] to discuss the block.
-You cannot use the \"email this user\" feature unless a valid email address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.
+You cannot use the "email this user" feature unless a valid email address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.
 Your current IP address is $3, and the block ID is #$5.
-Please include all above details in any queries you make.",
-'autoblockedtext'                  => "Your IP address has been automatically blocked because it was used by another user, who was blocked by $1.
+Please include all above details in any queries you make.',
+'autoblockedtext'                          => 'Your IP address has been automatically blocked because it was used by another user, who was blocked by $1.
 The reason given is:
 
 :<em>$2</em>
@@ -1426,168 +1424,168 @@ The reason given is:
 
 You may contact $1 or one of the other [[{{MediaWiki:Grouppage-sysop}}|administrators]] to discuss the block.
 
-Note that you may not use the \"email this user\" feature unless you have a valid email address registered in your [[Special:Preferences|user preferences]] and you have not been blocked from using it.
+Note that you may not use the "email this user" feature unless you have a valid email address registered in your [[Special:Preferences|user preferences]] and you have not been blocked from using it.
 
 Your current IP address is $3, and the block ID is #$5.
-Please include all above details in any queries you make.",
-'blockednoreason'                  => 'no reason given',
-'whitelistedittext'                => 'Please $1 to edit pages.',
-'confirmedittext'                  => 'You must confirm your email address before editing pages.
+Please include all above details in any queries you make.',
+'blockednoreason'                          => 'no reason given',
+'whitelistedittext'                        => 'Please $1 to edit pages.',
+'confirmedittext'                          => 'You must confirm your email address before editing pages.
 Please set and validate your email address through your [[Special:Preferences|user preferences]].',
-'nosuchsectiontitle'               => 'Cannot find section',
-'nosuchsectiontext'                => 'You tried to edit a section that does not exist.
+'nosuchsectiontitle'                       => 'Cannot find section',
+'nosuchsectiontext'                        => 'You tried to edit a section that does not exist.
 It may have been moved or deleted while you were viewing the page.',
-'loginreqtitle'                    => 'Login required',
-'loginreqlink'                     => 'log in',
-'loginreqpagetext'                 => 'Please $1 to view other pages.',
-'accmailtitle'                     => 'Password sent',
-'accmailtext'                      => "A randomly generated password for [[User talk:$1|$1]] has been sent to $2. It can be changed on the <em>[[Special:ChangePassword|change password]]</em> page upon logging in.",
-'newarticle'                       => '(New)',
-'newarticletext'                   => "You have followed a link to a page that does not exist yet.
+'loginreqtitle'                            => 'Login required',
+'loginreqlink'                             => 'log in',
+'loginreqpagetext'                         => 'Please $1 to view other pages.',
+'accmailtitle'                             => 'Password sent',
+'accmailtext'                              => 'A randomly generated password for [[User talk:$1|$1]] has been sent to $2. It can be changed on the <em>[[Special:ChangePassword|change password]]</em> page upon logging in.',
+'newarticle'                               => '(New)',
+'newarticletext'                           => "You have followed a link to a page that does not exist yet.
 To create the page, start typing in the box below (see the [[{{MediaWiki:Helppage}}|help page]] for more info).
 If you are here by mistake, click your browser's <strong>back</strong> button.",
-'newarticletextanon'               => '{{int:newarticletext}}', # do not translate or duplicate this message to other languages
-'talkpagetext'                     => '<!-- MediaWiki:talkpagetext -->', # do not translate or duplicate this message to other languages
-'anontalkpagetext'                 => "----
+'newarticletextanon'                       => '{{int:newarticletext}}', # do not translate or duplicate this message to other languages
+'talkpagetext'                             => '<!-- MediaWiki:talkpagetext -->', # do not translate or duplicate this message to other languages
+'anontalkpagetext'                         => '----
 <em>This is the discussion page for an anonymous user who has not created an account yet, or who does not use it.</em>
 We therefore have to use the numerical IP address to identify him/her.
 Such an IP address can be shared by several users.
-If you are an anonymous user and feel that irrelevant comments have been directed at you, please [[Special:UserLogin/signup|create an account]] or [[Special:UserLogin|log in]] to avoid future confusion with other anonymous users.",
-'noarticletext'                    => 'There is currently no text in this page.
+If you are an anonymous user and feel that irrelevant comments have been directed at you, please [[Special:UserLogin/signup|create an account]] or [[Special:UserLogin|log in]] to avoid future confusion with other anonymous users.',
+'noarticletext'                            => 'There is currently no text in this page.
 You can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],
 or [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit this page]</span>.',
-'noarticletext-nopermission'       => 'There is currently no text in this page.
+'noarticletext-nopermission'               => 'There is currently no text in this page.
 You can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages, or <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>, but you do not have permission to create this page.',
-'noarticletextanon'                => '{{int:noarticletext}}', # do not translate or duplicate this message to other languages
-'missing-revision'                 => 'The revision #$1 of the page named "{{PAGENAME}}" does not exist.
+'noarticletextanon'                        => '{{int:noarticletext}}', # do not translate or duplicate this message to other languages
+'missing-revision'                         => 'The revision #$1 of the page named "{{PAGENAME}}" does not exist.
 
 This is usually caused by following an outdated history link to a page that has been deleted.
 Details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].',
-'userpage-userdoesnotexist'        => 'User account "$1" is not registered.
+'userpage-userdoesnotexist'                => 'User account "$1" is not registered.
 Please check if you want to create/edit this page.',
-'userpage-userdoesnotexist-view'   => 'User account "$1" is not registered.',
-'blocked-notice-logextract'        => 'This user is currently blocked.
+'userpage-userdoesnotexist-view'           => 'User account "$1" is not registered.',
+'blocked-notice-logextract'                => 'This user is currently blocked.
 The latest block log entry is provided below for reference:',
-'clearyourcache'                   => "<strong>Note:</strong> After saving, you may have to bypass your browser's cache to see the changes.
+'clearyourcache'                           => "<strong>Note:</strong> After saving, you may have to bypass your browser's cache to see the changes.
 * <strong>Firefox / Safari:</strong> Hold <em>Shift</em> while clicking <em>Reload</em>, or press either <em>Ctrl-F5</em> or <em>Ctrl-R</em> (<em>⌘-R</em> on a Mac)
 * <strong>Google Chrome:</strong> Press <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> on a Mac)
 * <strong>Internet Explorer:</strong> Hold <em>Ctrl</em> while clicking <em>Refresh</em>, or press <em>Ctrl-F5</em>
 * <strong>Opera:</strong> Clear the cache in <em>Tools → Preferences</em>",
-'usercssyoucanpreview'             => "<strong>Tip:</strong> Use the \"{{int:showpreview}}\" button to test your new CSS before saving.",
-'userjsyoucanpreview'              => "<strong>Tip:</strong> Use the \"{{int:showpreview}}\" button to test your new JavaScript before saving.",
-'usercsspreview'                   => "<strong>Remember that you are only previewing your user CSS.
-It has not yet been saved!</strong>",
-'userjspreview'                    => "<strong>Remember that you are only testing/previewing your user JavaScript.
-It has not yet been saved!</strong>",
-'sitecsspreview'                   => "<strong>Remember that you are only previewing this CSS.
-It has not yet been saved!</strong>",
-'sitejspreview'                    => "<strong>Remember that you are only previewing this JavaScript code.
-It has not yet been saved!</strong>",
-'userinvalidcssjstitle'            => "<strong>Warning:</strong> There is no skin \"\$1\".
-Custom .css and .js pages use a lowercase title, e.g. {{ns:user}}:Foo/vector.css as opposed to {{ns:user}}:Foo/Vector.css.",
-'updated'                          => '(Updated)',
-'note'                             => "<strong>Note:</strong>",
-'previewnote'                      => "<strong>Remember that this is only a preview.</strong>
-Your changes have not yet been saved!",
-'continue-editing'                 => 'Go to editing area',
-'previewconflict'                  => 'This preview reflects the text in the upper text editing area as it will appear if you choose to save.',
-'session_fail_preview'             => "<strong>Sorry! We could not process your edit due to a loss of session data.</strong>
+'usercssyoucanpreview'                     => '<strong>Tip:</strong> Use the "{{int:showpreview}}" button to test your new CSS before saving.',
+'userjsyoucanpreview'                      => '<strong>Tip:</strong> Use the "{{int:showpreview}}" button to test your new JavaScript before saving.',
+'usercsspreview'                           => '<strong>Remember that you are only previewing your user CSS.
+It has not yet been saved!</strong>',
+'userjspreview'                            => '<strong>Remember that you are only testing/previewing your user JavaScript.
+It has not yet been saved!</strong>',
+'sitecsspreview'                           => '<strong>Remember that you are only previewing this CSS.
+It has not yet been saved!</strong>',
+'sitejspreview'                            => '<strong>Remember that you are only previewing this JavaScript code.
+It has not yet been saved!</strong>',
+'userinvalidcssjstitle'                    => '<strong>Warning:</strong> There is no skin "$1".
+Custom .css and .js pages use a lowercase title, e.g. {{ns:user}}:Foo/vector.css as opposed to {{ns:user}}:Foo/Vector.css.',
+'updated'                                  => '(Updated)',
+'note'                                     => '<strong>Note:</strong>',
+'previewnote'                              => '<strong>Remember that this is only a preview.</strong>
+Your changes have not yet been saved!',
+'continue-editing'                         => 'Go to editing area',
+'previewconflict'                          => 'This preview reflects the text in the upper text editing area as it will appear if you choose to save.',
+'session_fail_preview'                     => '<strong>Sorry! We could not process your edit due to a loss of session data.</strong>
 Please try again.
-If it still does not work, try [[Special:UserLogout|logging out]] and logging back in.",
-'session_fail_preview_html'        => "<strong>Sorry! We could not process your edit due to a loss of session data.</strong>
+If it still does not work, try [[Special:UserLogout|logging out]] and logging back in.',
+'session_fail_preview_html'                => '<strong>Sorry! We could not process your edit due to a loss of session data.</strong>
 
 <em>Because {{SITENAME}} has raw HTML enabled, the preview is hidden as a precaution against JavaScript attacks.</em>
 
 <strong>If this is a legitimate edit attempt, please try again.</strong>
-If it still does not work, try [[Special:UserLogout|logging out]] and logging back in.",
-'token_suffix_mismatch'            => "<strong>Your edit has been rejected because your client mangled the punctuation characters in the edit token.</strong>
+If it still does not work, try [[Special:UserLogout|logging out]] and logging back in.',
+'token_suffix_mismatch'                    => '<strong>Your edit has been rejected because your client mangled the punctuation characters in the edit token.</strong>
 The edit has been rejected to prevent corruption of the page text.
-This sometimes happens when you are using a buggy web-based anonymous proxy service.",
-'edit_form_incomplete'             => "<strong>Some parts of the edit form did not reach the server; double-check that your edits are intact and try again.</strong>",
-'editing'                          => 'Editing $1',
-'creating'                         => 'Creating $1',
-'editingsection'                   => 'Editing $1 (section)',
-'editingcomment'                   => 'Editing $1 (new section)',
-'editconflict'                     => 'Edit conflict: $1',
-'explainconflict'                  => "Someone else has changed this page since you started editing it.
+This sometimes happens when you are using a buggy web-based anonymous proxy service.',
+'edit_form_incomplete'                     => '<strong>Some parts of the edit form did not reach the server; double-check that your edits are intact and try again.</strong>',
+'editing'                                  => 'Editing $1',
+'creating'                                 => 'Creating $1',
+'editingsection'                           => 'Editing $1 (section)',
+'editingcomment'                           => 'Editing $1 (new section)',
+'editconflict'                             => 'Edit conflict: $1',
+'explainconflict'                          => 'Someone else has changed this page since you started editing it.
 The upper text area contains the page text as it currently exists.
 Your changes are shown in the lower text area.
 You will have to merge your changes into the existing text.
-<strong>Only</strong> the text in the upper text area will be saved when you press \"{{int:savearticle}}\".",
-'yourtext'                         => 'Your text',
-'storedversion'                    => 'Stored revision',
-'nonunicodebrowser'                => "<strong>Warning: Your browser is not Unicode compliant.</strong>
-A workaround is in place to allow you to safely edit pages: Non-ASCII characters will appear in the edit box as hexadecimal codes.",
-'editingold'                       => "<strong>Warning: You are editing an out-of-date revision of this page.</strong>
-If you save it, any changes made since this revision will be lost.",
-'yourdiff'                         => 'Differences',
-'copyrightwarning'                 => "Please note that all contributions to {{SITENAME}} are considered to be released under the $2 (see $1 for details).
+<strong>Only</strong> the text in the upper text area will be saved when you press "{{int:savearticle}}".',
+'yourtext'                                 => 'Your text',
+'storedversion'                            => 'Stored revision',
+'nonunicodebrowser'                        => '<strong>Warning: Your browser is not Unicode compliant.</strong>
+A workaround is in place to allow you to safely edit pages: Non-ASCII characters will appear in the edit box as hexadecimal codes.',
+'editingold'                               => '<strong>Warning: You are editing an out-of-date revision of this page.</strong>
+If you save it, any changes made since this revision will be lost.',
+'yourdiff'                                 => 'Differences',
+'copyrightwarning'                         => 'Please note that all contributions to {{SITENAME}} are considered to be released under the $2 (see $1 for details).
 If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.<br />
 You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource.
-<strong>Do not submit copyrighted work without permission!</strong>",
-'copyrightwarning2'                => "Please note that all contributions to {{SITENAME}} may be edited, altered, or removed by other contributors.
+<strong>Do not submit copyrighted work without permission!</strong>',
+'copyrightwarning2'                        => 'Please note that all contributions to {{SITENAME}} may be edited, altered, or removed by other contributors.
 If you do not want your writing to be edited mercilessly, then do not submit it here.<br />
 You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see $1 for details).
-<strong>Do not submit copyrighted work without permission!</strong>",
-'editpage-head-copy-warn'          => '-', # do not translate or duplicate this message to other languages
-'editpage-tos-summary'             => '-', # do not translate or duplicate this message to other languages
-'longpage-hint'                    => '-', # do not translate or duplicate this message to other languages
-'longpageerror'                    => "<strong>Error: The text you have submitted is {{PLURAL:$1|one kilobyte|$1 kilobytes}} long, which is longer than the maximum of {{PLURAL:$2|one kilobyte|$2 kilobytes}}.</strong>
-It cannot be saved.",
-'readonlywarning'                  => "<strong>Warning: The database has been locked for maintenance, so you will not be able to save your edits right now.</strong>
+<strong>Do not submit copyrighted work without permission!</strong>',
+'editpage-head-copy-warn'                  => '-', # do not translate or duplicate this message to other languages
+'editpage-tos-summary'                     => '-', # do not translate or duplicate this message to other languages
+'longpage-hint'                            => '-', # do not translate or duplicate this message to other languages
+'longpageerror'                            => '<strong>Error: The text you have submitted is {{PLURAL:$1|one kilobyte|$1 kilobytes}} long, which is longer than the maximum of {{PLURAL:$2|one kilobyte|$2 kilobytes}}.</strong>
+It cannot be saved.',
+'readonlywarning'                          => '<strong>Warning: The database has been locked for maintenance, so you will not be able to save your edits right now.</strong>
 You may wish to copy and paste your text into a text file and save it for later.
 
-The administrator who locked it offered this explanation: $1",
-'protectedpagewarning'             => "<strong>Warning: This page has been protected so that only users with administrator privileges can edit it.</strong>
-The latest log entry is provided below for reference:",
-'semiprotectedpagewarning'         => "<strong>Note:</strong> This page has been protected so that only registered users can edit it.
-The latest log entry is provided below for reference:",
-'cascadeprotectedwarning'          => "<strong>Warning:</strong> This page has been protected so that only users with administrator privileges can edit it because it is included in the following cascade-protected {{PLURAL:$1|page|pages}}:",
-'titleprotectedwarning'            => "<strong>Warning: This page has been protected so that [[Special:ListGroupRights|specific rights]] are needed to create it.</strong>
-The latest log entry is provided below for reference:",
-'templatesused'                    => '{{PLURAL:$1|Template|Templates}} used on this page:',
-'templatesusedpreview'             => '{{PLURAL:$1|Template|Templates}} used in this preview:',
-'templatesusedsection'             => '{{PLURAL:$1|Template|Templates}} used in this section:',
-'template-protected'               => '(protected)',
-'template-semiprotected'           => '(semi-protected)',
-'hiddencategories'                 => 'This page is a member of {{PLURAL:$1|1 hidden category|$1 hidden categories}}:',
-'edittools'                        => '<!-- Text here will be shown below edit and upload forms. -->', # only translate this message to other languages if you have to change it
-'edittools-upload'                 => '-', # only translate this message to other languages if you have to change it
-'nocreatetext'                     => '{{SITENAME}} has restricted the ability to create new pages.
+The administrator who locked it offered this explanation: $1',
+'protectedpagewarning'                     => '<strong>Warning: This page has been protected so that only users with administrator privileges can edit it.</strong>
+The latest log entry is provided below for reference:',
+'semiprotectedpagewarning'                 => '<strong>Note:</strong> This page has been protected so that only registered users can edit it.
+The latest log entry is provided below for reference:',
+'cascadeprotectedwarning'                  => '<strong>Warning:</strong> This page has been protected so that only users with administrator privileges can edit it because it is included in the following cascade-protected {{PLURAL:$1|page|pages}}:',
+'titleprotectedwarning'                    => '<strong>Warning: This page has been protected so that [[Special:ListGroupRights|specific rights]] are needed to create it.</strong>
+The latest log entry is provided below for reference:',
+'templatesused'                            => '{{PLURAL:$1|Template|Templates}} used on this page:',
+'templatesusedpreview'                     => '{{PLURAL:$1|Template|Templates}} used in this preview:',
+'templatesusedsection'                     => '{{PLURAL:$1|Template|Templates}} used in this section:',
+'template-protected'                       => '(protected)',
+'template-semiprotected'                   => '(semi-protected)',
+'hiddencategories'                         => 'This page is a member of {{PLURAL:$1|1 hidden category|$1 hidden categories}}:',
+'edittools'                                => '<!-- Text here will be shown below edit and upload forms. -->', # only translate this message to other languages if you have to change it
+'edittools-upload'                         => '-', # only translate this message to other languages if you have to change it
+'nocreatetext'                             => '{{SITENAME}} has restricted the ability to create new pages.
 You can go back and edit an existing page, or [[Special:UserLogin|log in or create an account]].',
-'nocreate-loggedin'                => 'You do not have permission to create new pages.',
-'sectioneditnotsupported-title'    => 'Section editing not supported',
-'sectioneditnotsupported-text'     => 'Section editing is not supported in this page.',
-'permissionserrors'                => 'Permission error',
-'permissionserrorstext'            => 'You do not have permission to do that, for the following {{PLURAL:$1|reason|reasons}}:',
-'permissionserrorstext-withaction' => 'You do not have permission to $2, for the following {{PLURAL:$1|reason|reasons}}:',
-'recreate-moveddeleted-warn'       => "<strong>Warning: You are recreating a page that was previously deleted.</strong>
+'nocreate-loggedin'                        => 'You do not have permission to create new pages.',
+'sectioneditnotsupported-title'            => 'Section editing not supported',
+'sectioneditnotsupported-text'             => 'Section editing is not supported in this page.',
+'permissionserrors'                        => 'Permission error',
+'permissionserrorstext'                    => 'You do not have permission to do that, for the following {{PLURAL:$1|reason|reasons}}:',
+'permissionserrorstext-withaction'         => 'You do not have permission to $2, for the following {{PLURAL:$1|reason|reasons}}:',
+'recreate-moveddeleted-warn'               => '<strong>Warning: You are recreating a page that was previously deleted.</strong>
 
 You should consider whether it is appropriate to continue editing this page.
-The deletion and move log for this page are provided here for convenience:",
-'moveddeleted-notice'              => 'This page has been deleted.
+The deletion and move log for this page are provided here for convenience:',
+'moveddeleted-notice'                      => 'This page has been deleted.
 The deletion and move log for the page are provided below for reference.',
-'log-fulllog'                      => 'View full log',
-'edit-hook-aborted'                => 'Edit aborted by hook.
+'log-fulllog'                              => 'View full log',
+'edit-hook-aborted'                        => 'Edit aborted by hook.
 It gave no explanation.',
-'edit-gone-missing'                => 'Could not update the page.
+'edit-gone-missing'                        => 'Could not update the page.
 It appears to have been deleted.',
-'edit-conflict'                    => 'Edit conflict.',
-'edit-no-change'                   => 'Your edit was ignored because no change was made to the text.',
-'postedit-confirmation'            => 'Your edit was saved.',
-'edit-already-exists'              => 'Could not create a new page.
+'edit-conflict'                            => 'Edit conflict.',
+'edit-no-change'                           => 'Your edit was ignored because no change was made to the text.',
+'postedit-confirmation'                    => 'Your edit was saved.',
+'edit-already-exists'                      => 'Could not create a new page.
 It already exists.',
-'addsection-preload'               => '', # do not translate or duplicate this message to other languages
-'addsection-editintro'             => '', # do not translate or duplicate this message to other languages
-'defaultmessagetext'               => 'Default message text',
-'content-failed-to-parse'          => 'Failed to parse $2 content for $1 model: $3',
-'invalid-content-data'             => 'Invalid content data',
-'content-not-allowed-here'         => '"$1" content is not allowed on page [[$2]]',
-'editwarning-warning'              => 'Leaving this page may cause you to lose any changes you have made.
+'addsection-preload'                       => '', # do not translate or duplicate this message to other languages
+'addsection-editintro'                     => '', # do not translate or duplicate this message to other languages
+'defaultmessagetext'                       => 'Default message text',
+'content-failed-to-parse'                  => 'Failed to parse $2 content for $1 model: $3',
+'invalid-content-data'                     => 'Invalid content data',
+'content-not-allowed-here'                 => '"$1" content is not allowed on page [[$2]]',
+'editwarning-warning'                      => 'Leaving this page may cause you to lose any changes you have made.
 If you are logged in, you can disable this warning in the "{{int:prefs-editing}}" section of your preferences.',
-'editpage-notsupportedcontentformat-title'=> 'Content format not supported',
-'editpage-notsupportedcontentformat-text' => 'The content format $1 is not supported by the content model $2.',
+'editpage-notsupportedcontentformat-title' => 'Content format not supported',
+'editpage-notsupportedcontentformat-text'  => 'The content format $1 is not supported by the content model $2.',
 
 # Content models
 'content-model-wikitext'   => 'wikitext',
@@ -1596,15 +1594,15 @@ If you are logged in, you can disable this warning in the "{{int:prefs-editing}}
 'content-model-css'        => 'CSS',
 
 # Parser/template warnings
-'expensive-parserfunction-warning'        => "<strong>Warning:</strong> This page contains too many expensive parser function calls.
+'expensive-parserfunction-warning'        => '<strong>Warning:</strong> This page contains too many expensive parser function calls.
 
-It should have less than $2 {{PLURAL:$2|call|calls}}, there {{PLURAL:$1|is now $1 call|are now $1 calls}}.",
+It should have less than $2 {{PLURAL:$2|call|calls}}, there {{PLURAL:$1|is now $1 call|are now $1 calls}}.',
 'expensive-parserfunction-category'       => 'Pages with too many expensive parser function calls',
-'post-expand-template-inclusion-warning'  => "<strong>Warning:</strong> Template include size is too large.
-Some templates will not be included.",
+'post-expand-template-inclusion-warning'  => '<strong>Warning:</strong> Template include size is too large.
+Some templates will not be included.',
 'post-expand-template-inclusion-category' => 'Pages where template include size is exceeded',
-'post-expand-template-argument-warning'   => "<strong>Warning:</strong> This page contains at least one template argument that has a too large expansion size.
-These arguments have been omitted.",
+'post-expand-template-argument-warning'   => '<strong>Warning:</strong> This page contains at least one template argument that has a too large expansion size.
+These arguments have been omitted.',
 'post-expand-template-argument-category'  => 'Pages containing omitted template arguments',
 'parser-template-loop-warning'            => 'Template loop detected: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Template recursion depth limit exceeded ($1)',
@@ -1627,14 +1625,14 @@ Please check the comparison below to verify that this is what you want to do, an
 'undo-summary-username-hidden' => 'Undo revision $1 by a hidden user',
 
 # Account creation failure
-'cantcreateaccounttitle' => 'Cannot create account',
+'cantcreateaccounttitle'       => 'Cannot create account',
+'cantcreateaccount-text'       => 'Account creation from this IP address (<strong>$1</strong>) has been blocked by [[User:$3|$3]].
+
+The reason given by $3 is <em>$2</em>',
 'cantcreateaccount-range-text' => "Account creation from IP addresses in the range '''$1''', which includes your IP address ('''$4'''), has been blocked by [[User:$3|$3]].
 
 The reason given by $3 is ''$2''",
-'cantcreateaccount-text' => "Account creation from this IP address (<strong>$1</strong>) has been blocked by [[User:$3|$3]].
-
-The reason given by $3 is <em>$2</em>",
-'createaccount-hook-aborted' => '$1', # do not translate or duplicate this message to other languages
+'createaccount-hook-aborted'   => '$1', # do not translate or duplicate this message to other languages
 
 # History pages
 'viewpagelogs'           => 'View logs for this page',
@@ -1653,8 +1651,8 @@ The reason given by $3 is <em>$2</em>",
 'last'                   => 'prev',
 'page_first'             => 'first',
 'page_last'              => 'last',
-'histlegend'             => "Diff selection: Mark the radio boxes of the revisions to compare and hit enter or the button at the bottom.<br />
-Legend: <strong>({{int:cur}})</strong> = difference with latest revision, <strong>({{int:last}})</strong> = difference with preceding revision, <strong>{{int:minoreditletter}}</strong> = minor edit.",
+'histlegend'             => 'Diff selection: Mark the radio boxes of the revisions to compare and hit enter or the button at the bottom.<br />
+Legend: <strong>({{int:cur}})</strong> = difference with latest revision, <strong>({{int:last}})</strong> = difference with preceding revision, <strong>{{int:minoreditletter}}</strong> = minor edit.',
 'history-fieldset-title' => 'Browse history',
 'history-show-deleted'   => 'Deleted only',
 'history_copyright'      => '-', # do not translate or duplicate this message to other languages
@@ -1676,31 +1674,31 @@ Try [[Special:Search|searching on the wiki]] for relevant new pages.',
 'rev-deleted-user'            => '(username removed)',
 'rev-deleted-event'           => '(log action removed)',
 'rev-deleted-user-contribs'   => '[username or IP address removed - edit hidden from contributions]',
-'rev-deleted-text-permission' => "This page revision has been <strong>deleted</strong>.
-Details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
-'rev-deleted-text-unhide'     => "This page revision has been <strong>deleted</strong>.
+'rev-deleted-text-permission' => 'This page revision has been <strong>deleted</strong>.
+Details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].',
+'rev-deleted-text-unhide'     => 'This page revision has been <strong>deleted</strong>.
 Details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].
-You can still [$1 view this revision] if you wish to proceed.",
-'rev-suppressed-text-unhide'  => "This page revision has been <strong>suppressed</strong>.
+You can still [$1 view this revision] if you wish to proceed.',
+'rev-suppressed-text-unhide'  => 'This page revision has been <strong>suppressed</strong>.
 Details can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].
-You can still [$1 view this revision] if you wish to proceed.",
-'rev-deleted-text-view'       => "This page revision has been <strong>deleted</strong>.
-You can view it; details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
-'rev-suppressed-text-view'    => "This page revision has been <strong>suppressed</strong>.
-You can view it; details can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].",
-'rev-deleted-no-diff'         => "You cannot view this diff because one of the revisions has been <strong>deleted</strong>.
-Details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
-'rev-suppressed-no-diff'      => "You cannot view this diff because one of the revisions has been <strong>deleted</strong>.",
-'rev-deleted-unhide-diff'     => "One of the revisions of this diff has been <strong>deleted</strong>.
+You can still [$1 view this revision] if you wish to proceed.',
+'rev-deleted-text-view'       => 'This page revision has been <strong>deleted</strong>.
+You can view it; details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].',
+'rev-suppressed-text-view'    => 'This page revision has been <strong>suppressed</strong>.
+You can view it; details can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].',
+'rev-deleted-no-diff'         => 'You cannot view this diff because one of the revisions has been <strong>deleted</strong>.
+Details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].',
+'rev-suppressed-no-diff'      => 'You cannot view this diff because one of the revisions has been <strong>deleted</strong>.',
+'rev-deleted-unhide-diff'     => 'One of the revisions of this diff has been <strong>deleted</strong>.
 Details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].
-You can still [$1 view this diff] if you wish to proceed.",
-'rev-suppressed-unhide-diff'  => "One of the revisions of this diff has been <strong>suppressed</strong>.
+You can still [$1 view this diff] if you wish to proceed.',
+'rev-suppressed-unhide-diff'  => 'One of the revisions of this diff has been <strong>suppressed</strong>.
 Details can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].
-You can still [$1 view this diff] if you wish to proceed.",
-'rev-deleted-diff-view'       => "One of the revisions of this diff has been <strong>deleted</strong>.
-You can view this diff; details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
-'rev-suppressed-diff-view'    => "One of the revisions of this diff has been <strong>suppressed</strong>.
-You can view this diff; details can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].",
+You can still [$1 view this diff] if you wish to proceed.',
+'rev-deleted-diff-view'       => 'One of the revisions of this diff has been <strong>deleted</strong>.
+You can view this diff; details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].',
+'rev-suppressed-diff-view'    => 'One of the revisions of this diff has been <strong>suppressed</strong>.
+You can view this diff; details can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].',
 'rev-delundel'                => 'change visibility',
 'rev-showdeleted'             => 'show',
 'revisiondelete'              => 'Delete/undelete revisions',
@@ -1710,15 +1708,15 @@ function, the specified revision does not exist, or you are attempting to hide t
 'revdelete-no-file'           => 'The file specified does not exist.',
 'revdelete-show-file-confirm' => 'Are you sure you want to view a deleted revision of the file "<nowiki>$1</nowiki>" from $2 at $3?',
 'revdelete-show-file-submit'  => 'Yes',
-'revdelete-selected'          => "<strong>{{PLURAL:$2|Selected revision|Selected revisions}} of [[:$1]]:</strong>",
-'logdelete-selected'          => "<strong>{{PLURAL:$1|Selected log event|Selected log events}}:</strong>",
-'revdelete-text'              => "<strong>Deleted revisions and events will still appear in the page history and logs, but parts of their content will be inaccessible to the public.</strong>
-Other administrators on {{SITENAME}} will still be able to access the hidden content and can undelete it again through this same interface, unless additional restrictions are set.",
+'revdelete-selected'          => '<strong>{{PLURAL:$2|Selected revision|Selected revisions}} of [[:$1]]:</strong>',
+'logdelete-selected'          => '<strong>{{PLURAL:$1|Selected log event|Selected log events}}:</strong>',
+'revdelete-text'              => '<strong>Deleted revisions and events will still appear in the page history and logs, but parts of their content will be inaccessible to the public.</strong>
+Other administrators on {{SITENAME}} will still be able to access the hidden content and can undelete it again through this same interface, unless additional restrictions are set.',
 'revdelete-confirm'           => 'Please confirm that you intend to do this, that you understand the consequences, and that you are doing this in accordance with [[{{MediaWiki:Policy-url}}|the policy]].',
-'revdelete-suppress-text'     => "Suppression should <strong>only</strong> be used for the following cases:
+'revdelete-suppress-text'     => 'Suppression should <strong>only</strong> be used for the following cases:
 * potentially libelous information
 * inappropriate personal information
-*: <em>home addresses and telephone numbers, national identification numbers, etc.</em>",
+*: <em>home addresses and telephone numbers, national identification numbers, etc.</em>',
 'revdelete-legend'            => 'Set visibility restrictions',
 'revdelete-hide-text'         => 'Revision text',
 'revdelete-hide-image'        => 'Hide file content',
@@ -1733,12 +1731,12 @@ Other administrators on {{SITENAME}} will still be able to access the hidden con
 'revdelete-unsuppress'        => 'Remove restrictions on restored revisions',
 'revdelete-log'               => 'Reason:',
 'revdelete-submit'            => 'Apply to selected {{PLURAL:$1|revision|revisions}}',
-'revdelete-success'           => "<strong>Revision visibility successfully updated.</strong>",
-'revdelete-failure'           => "<strong>Revision visibility could not be updated:</strong>
-$1",
-'logdelete-success'           => "<strong>Log visibility successfully set.</strong>",
-'logdelete-failure'           => "<strong>Log visibility could not be set:</strong>
-$1",
+'revdelete-success'           => '<strong>Revision visibility successfully updated.</strong>',
+'revdelete-failure'           => '<strong>Revision visibility could not be updated:</strong>
+$1',
+'logdelete-success'           => '<strong>Log visibility successfully set.</strong>',
+'logdelete-failure'           => '<strong>Log visibility could not be set:</strong>
+$1',
 'revdel-restore'              => 'change visibility',
 'pagehist'                    => 'Page history',
 'deletedhist'                 => 'Deleted history',
@@ -1749,7 +1747,7 @@ You do not have access to it.',
 'revdelete-modify-no-access'  => 'Error modifying the item dated $2, $1: This item has been marked "restricted".
 You do not have access to it.',
 'revdelete-modify-missing'    => 'Error modifying item ID $1: It is missing from the database!',
-'revdelete-no-change'         => "<strong>Warning:</strong> The item dated $2, $1 already had the requested visibility settings.",
+'revdelete-no-change'         => '<strong>Warning:</strong> The item dated $2, $1 already had the requested visibility settings.',
 'revdelete-concurrent-change' => 'Error modifying the item dated $2, $1: Its status appears to have been changed by someone else while you attempted to modify it.
 Please check the logs.',
 'revdelete-only-restricted'   => 'Error hiding the item dated $2, $1: You cannot suppress items from view by administrators without also selecting one of the other visibility options.',
@@ -1832,8 +1830,8 @@ Details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 'nextn-title'                      => 'Next $1 {{PLURAL:$1|result|results}}',
 'shown-title'                      => 'Show $1 {{PLURAL:$1|result|results}} per page',
 'viewprevnext'                     => 'View ($1 {{int:pipe-separator}} $2) ($3)',
-'searchmenu-exists'                => "<strong>There is a page named \"[[:\$1]]\" on this wiki.</strong> {{PLURAL:$2|0=|See also the other search results found.}}",
-'searchmenu-new'                   => "<strong>Create the page \"[[:\$1]]\" on this wiki!</strong> {{PLURAL:$2|0=|See also the page found with your search.|See also the search results found.}}",
+'searchmenu-exists'                => '<strong>There is a page named "[[:$1]]" on this wiki.</strong> {{PLURAL:$2|0=|See also the other search results found.}}',
+'searchmenu-new'                   => '<strong>Create the page "[[:$1]]" on this wiki!</strong> {{PLURAL:$2|0=|See also the page found with your search.|See also the search results found.}}',
 'searchmenu-new-nocreate'          => '', # do not translate or duplicate this message to other languages
 'searchprofile-articles'           => 'Content pages',
 'searchprofile-project'            => 'Help and Project pages',
@@ -1853,17 +1851,17 @@ Details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 'search-file-match'                => '(matches file content)',
 'search-suggest'                   => 'Did you mean: $1',
 'search-interwiki-caption'         => 'Sister projects',
-'search-interwiki-default'         => '$1 results:',
+'search-interwiki-default'         => 'Results from $1:',
 'search-interwiki-custom'          => '', # do not translate or duplicate this message to other languages
 'search-interwiki-more'            => '(more)',
 'search-relatedarticle'            => 'Related',
 'searcheverything-enable'          => 'Search in all namespaces',
 'searchrelated'                    => 'related',
 'searchall'                        => 'all',
-'showingresults'                   => "Showing below up to {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} starting with #<strong>$2</strong>.",
-'showingresultsinrange'            => "Showing below up to {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} in range #<strong>$2</strong> to #<strong>$3</strong>.",
-'showingresultsnum'                => "Showing below {{PLURAL:$3|<strong>1</strong> result|<strong>$3</strong> results}} starting with #<strong>$2</strong>.",
-'showingresultsheader'             => "{{PLURAL:$5|Result <strong>$1</strong> of <strong>$3</strong>|Results <strong>$1 - $2</strong> of <strong>$3</strong>}} for <strong>$4</strong>",
+'showingresults'                   => 'Showing below up to {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} starting with #<strong>$2</strong>.',
+'showingresultsinrange'            => 'Showing below up to {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} in range #<strong>$2</strong> to #<strong>$3</strong>.',
+'showingresultsnum'                => 'Showing below {{PLURAL:$3|<strong>1</strong> result|<strong>$3</strong> results}} starting with #<strong>$2</strong>.',
+'showingresultsheader'             => '{{PLURAL:$5|Result <strong>$1</strong> of <strong>$3</strong>|Results <strong>$1 - $2</strong> of <strong>$3</strong>}} for <strong>$4</strong>',
 'search-nonefound'                 => 'There were no results matching the query.',
 'powersearch-legend'               => 'Advanced search',
 'powersearch-ns'                   => 'Search in namespaces:',
@@ -2025,7 +2023,7 @@ Your email address is not revealed when other users contact you.',
 'userrights-lookup-user'         => 'Manage user groups',
 'userrights-user-editname'       => 'Enter a username:',
 'editusergroup'                  => 'Edit user groups',
-'editinguser'                    => "Changing user rights of user <strong>[[User:$1|$1]]</strong> $2",
+'editinguser'                    => 'Changing user rights of user <strong>[[User:$1|$1]]</strong> $2',
 'userrights-editusergroup'       => 'Edit user groups',
 'saveusergroups'                 => 'Save user groups',
 'userrights-groupsmember'        => 'Member of:',
@@ -2207,15 +2205,27 @@ Your email address is not revealed when other users contact you.',
 'recentchanges-label-plusminus'     => 'The page size changed by this number of bytes',
 'recentchanges-legend-heading'      => "'''Legend:'''",
 'recentchanges-legend-newpage'      => '(also see [[Special:NewPages|list of new pages]])',
-'recentchanges-legend-plusminus'    => "(<em>±123</em>)",
-'rcnotefrom'                        => "Below are the changes since <strong>$2</strong> (up to <strong>$1</strong> shown).",
-'rclistfrom'                        => 'Show new changes starting from $1',
+'recentchanges-legend-plusminus'    => '(<em>±123</em>)', # only translate this message to other languages if you have to change it
+'rcnotefrom'                        => 'Below are the changes since <strong>$2</strong> (up to <strong>$1</strong> shown).',
+'rclistfrom'                        => 'Show new changes starting from $2, $3',
 'rcshowhideminor'                   => '$1 minor edits',
+'rcshowhideminor-show'              => 'Show',
+'rcshowhideminor-hide'              => 'Hide',
 'rcshowhidebots'                    => '$1 bots',
+'rcshowhidebots-show'               => 'Show',
+'rcshowhidebots-hide'               => 'Hide',
 'rcshowhideliu'                     => '$1 registered users',
+'rcshowhideliu-show'                => 'Show',
+'rcshowhideliu-hide'                => 'Hide',
 'rcshowhideanons'                   => '$1 anonymous users',
+'rcshowhideanons-show'              => 'Show',
+'rcshowhideanons-hide'              => 'Hide',
 'rcshowhidepatr'                    => '$1 patrolled edits',
+'rcshowhidepatr-show'               => 'Show',
+'rcshowhidepatr-hide'               => 'Hide',
 'rcshowhidemine'                    => '$1 my edits',
+'rcshowhidemine-show'               => 'Show',
+'rcshowhidemine-hide'               => 'Hide',
 'rclinks'                           => 'Show last $1 changes in last $2 days<br />$3',
 'diff'                              => 'diff',
 'hist'                              => 'hist',
@@ -2241,139 +2251,140 @@ Your email address is not revealed when other users contact you.',
 'recentchangeslinked-feed'    => 'Related changes',
 'recentchangeslinked-toolbox' => 'Related changes',
 'recentchangeslinked-title'   => 'Changes related to "$1"',
-'recentchangeslinked-summary' => "This is a list of changes made recently to pages linked from a specified page (or to members of a specified category).
-Pages on [[Special:Watchlist|your watchlist]] are <strong>bold</strong>.",
+'recentchangeslinked-summary' => 'This is a list of changes made recently to pages linked from a specified page (or to members of a specified category).
+Pages on [[Special:Watchlist|your watchlist]] are <strong>bold</strong>.',
 'recentchangeslinked-page'    => 'Page name:',
 'recentchangeslinked-to'      => 'Show changes to pages linked to the given page instead',
 
 # Upload
-'upload'                      => 'Upload file',
-'uploadbtn'                   => 'Upload file',
-'reuploaddesc'                => 'Cancel upload and return to the upload form',
-'upload-tryagain'             => 'Submit modified file description',
-'uploadnologin'               => 'Not logged in',
-'uploadnologintext'           => 'Please $1 to upload files.',
-'upload_directory_missing'    => 'The upload directory ($1) is missing and could not be created by the webserver.',
-'upload_directory_read_only'  => 'The upload directory ($1) is not writable by the webserver.',
-'uploaderror'                 => 'Upload error',
-'upload-summary'              => '', # do not translate or duplicate this message to other languages
-'upload-recreate-warning'     => "<strong>Warning: A file by that name has been deleted or moved.</strong>
-
-The deletion and move log for this page are provided here for convenience:",
-'uploadtext'                  => "Use the form below to upload files.
+'upload'                         => 'Upload file',
+'uploadbtn'                      => 'Upload file',
+'reuploaddesc'                   => 'Cancel upload and return to the upload form',
+'upload-tryagain'                => 'Submit modified file description',
+'uploadnologin'                  => 'Not logged in',
+'uploadnologintext'              => 'Please $1 to upload files.',
+'upload_directory_missing'       => 'The upload directory ($1) is missing and could not be created by the webserver.',
+'upload_directory_read_only'     => 'The upload directory ($1) is not writable by the webserver.',
+'uploaderror'                    => 'Upload error',
+'upload-summary'                 => '', # do not translate or duplicate this message to other languages
+'upload-recreate-warning'        => '<strong>Warning: A file by that name has been deleted or moved.</strong>
+
+The deletion and move log for this page are provided here for convenience:',
+'uploadtext'                     => 'Use the form below to upload files.
 To view or search previously uploaded files go to the [[Special:FileList|list of uploaded files]], (re)uploads are also logged in the [[Special:Log/upload|upload log]], deletions in the [[Special:Log/delete|deletion log]].
 
 To include a file in a page, use a link in one of the following forms:
 * <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> to use the full version of the file
-* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> to use a 200 pixel wide rendition in a box in the left margin with \"alt text\" as description
-* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> for directly linking to the file without displaying the file",
-'upload-permitted'            => 'Permitted file types: $1.',
-'upload-preferred'            => 'Preferred file types: $1.',
-'upload-prohibited'           => 'Prohibited file types: $1.',
-'uploadfooter'                => '-', # do not translate or duplicate this message to other languages
-'upload-default-description'  => '-', # do not translate or duplicate this message to other languages
-'uploadlog'                   => 'upload log',
-'uploadlogpage'               => 'Upload log',
-'uploadlogpagetext'           => 'Below is a list of the most recent file uploads.
+* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> to use a 200 pixel wide rendition in a box in the left margin with "alt text" as description
+* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> for directly linking to the file without displaying the file',
+'upload-permitted'               => 'Permitted file types: $1.',
+'upload-preferred'               => 'Preferred file types: $1.',
+'upload-prohibited'              => 'Prohibited file types: $1.',
+'uploadfooter'                   => '-', # do not translate or duplicate this message to other languages
+'upload-default-description'     => '-', # do not translate or duplicate this message to other languages
+'uploadlog'                      => 'upload log',
+'uploadlogpage'                  => 'Upload log',
+'uploadlogpagetext'              => 'Below is a list of the most recent file uploads.
 See the [[Special:NewFiles|gallery of new files]] for a more visual overview.',
-'filename'                    => 'Filename',
-'filedesc'                    => 'Summary',
-'fileuploadsummary'           => 'Summary:',
-'filereuploadsummary'         => 'File changes:',
-'filestatus'                  => 'Copyright status:',
-'filesource'                  => 'Source:',
-'uploadedfiles'               => 'Uploaded files',
-'ignorewarning'               => 'Ignore warning and save file anyway',
-'ignorewarnings'              => 'Ignore any warnings',
-'minlength1'                  => 'Filenames must be at least one letter.',
-'illegalfilename'             => 'The filename "$1" contains characters that are not allowed in page titles.
+'filename'                       => 'Filename',
+'filedesc'                       => 'Summary',
+'fileuploadsummary'              => 'Summary:',
+'filereuploadsummary'            => 'File changes:',
+'filestatus'                     => 'Copyright status:',
+'filesource'                     => 'Source:',
+'uploadedfiles'                  => 'Uploaded files',
+'ignorewarning'                  => 'Ignore warning and save file anyway',
+'ignorewarnings'                 => 'Ignore any warnings',
+'minlength1'                     => 'Filenames must be at least one letter.',
+'illegalfilename'                => 'The filename "$1" contains characters that are not allowed in page titles.
 Please rename the file and try uploading it again.',
-'filename-toolong'            => 'Filenames may not be longer than 240 bytes.',
-'badfilename'                 => 'Filename has been changed to "$1".',
-'filetype-mime-mismatch'      => 'File extension ".$1" does not match the detected MIME type of the file ($2).',
-'filetype-badmime'            => 'Files of the MIME type "$1" are not allowed to be uploaded.',
-'filetype-bad-ie-mime'        => 'Cannot upload this file because Internet Explorer would detect it as "$1", which is a disallowed and potentially dangerous file type.',
-'filetype-unwanted-type'      => "<strong>\".\$1\"</strong> is an unwanted file type.
-Preferred {{PLURAL:\$3|file type is|file types are}} \$2.",
-'filetype-banned-type'        => '<strong>".$1"</strong> {{PLURAL:$4|is not a permitted file type|are not permitted file types}}.
+'filename-toolong'               => 'Filenames may not be longer than 240 bytes.',
+'badfilename'                    => 'Filename has been changed to "$1".',
+'filetype-mime-mismatch'         => 'File extension ".$1" does not match the detected MIME type of the file ($2).',
+'filetype-badmime'               => 'Files of the MIME type "$1" are not allowed to be uploaded.',
+'filetype-bad-ie-mime'           => 'Cannot upload this file because Internet Explorer would detect it as "$1", which is a disallowed and potentially dangerous file type.',
+'filetype-unwanted-type'         => '<strong>".$1"</strong> is an unwanted file type.
+Preferred {{PLURAL:$3|file type is|file types are}} $2.',
+'filetype-banned-type'           => '<strong>".$1"</strong> {{PLURAL:$4|is not a permitted file type|are not permitted file types}}.
 Permitted {{PLURAL:$3|file type is|file types are}} $2.',
-'filetype-missing'            => 'The file has no extension (like ".jpg").',
-'empty-file'                  => 'The file you submitted was empty.',
-'file-too-large'              => 'The file you submitted was too large.',
-'filename-tooshort'           => 'The filename is too short.',
-'filetype-banned'             => 'This type of file is banned.',
-'verification-error'          => 'This file did not pass file verification.',
-'hookaborted'                 => 'The modification you tried to make was aborted by an extension.',
-'illegal-filename'            => 'The filename is not allowed.',
-'overwrite'                   => 'Overwriting an existing file is not allowed.',
-'unknown-error'               => 'An unknown error occurred.',
-'tmp-create-error'            => 'Could not create temporary file.',
-'tmp-write-error'             => 'Error writing temporary file.',
-'large-file'                  => 'It is recommended that files are no larger than $1;
+'filetype-missing'               => 'The file has no extension (like ".jpg").',
+'empty-file'                     => 'The file you submitted was empty.',
+'file-too-large'                 => 'The file you submitted was too large.',
+'filename-tooshort'              => 'The filename is too short.',
+'filetype-banned'                => 'This type of file is banned.',
+'verification-error'             => 'This file did not pass file verification.',
+'hookaborted'                    => 'The modification you tried to make was aborted by an extension.',
+'illegal-filename'               => 'The filename is not allowed.',
+'overwrite'                      => 'Overwriting an existing file is not allowed.',
+'unknown-error'                  => 'An unknown error occurred.',
+'tmp-create-error'               => 'Could not create temporary file.',
+'tmp-write-error'                => 'Error writing temporary file.',
+'large-file'                     => 'It is recommended that files are no larger than $1;
 this file is $2.',
-'largefileserver'             => 'This file is bigger than the server is configured to allow.',
-'emptyfile'                   => 'The file you uploaded seems to be empty.
+'largefileserver'                => 'This file is bigger than the server is configured to allow.',
+'emptyfile'                      => 'The file you uploaded seems to be empty.
 This might be due to a typo in the filename.
 Please check whether you really want to upload this file.',
-'windows-nonascii-filename'   => 'This wiki does not support filenames with special characters.',
-'fileexists'                  => 'A file with this name exists already, please check <strong>[[:$1]]</strong> if you are not sure if you want to change it.
+'windows-nonascii-filename'      => 'This wiki does not support filenames with special characters.',
+'fileexists'                     => 'A file with this name exists already, please check <strong>[[:$1]]</strong> if you are not sure if you want to change it.
 [[$1|thumb]]',
-'filepageexists'              => 'The description page for this file has already been created at <strong>[[:$1]]</strong>, but no file with this name currently exists.
+'filepageexists'                 => 'The description page for this file has already been created at <strong>[[:$1]]</strong>, but no file with this name currently exists.
 The summary you enter will not appear on the description page.
 To make your summary appear there, you will need to manually edit it.
 [[$1|thumb]]',
-'fileexists-extension'        => 'A file with a similar name exists: [[$2|thumb]]
+'fileexists-extension'           => 'A file with a similar name exists: [[$2|thumb]]
 * Name of the uploading file: <strong>[[:$1]]</strong>
 * Name of the existing file: <strong>[[:$2]]</strong>
 Please choose a different name.',
-'fileexists-thumbnail-yes'    => "The file seems to be an image of reduced size <em>(thumbnail)</em>.
+'fileexists-thumbnail-yes'       => 'The file seems to be an image of reduced size <em>(thumbnail)</em>.
 [[$1|thumb]]
 Please check the file <strong>[[:$1]]</strong>.
-If the checked file is the same image of original size it is not necessary to upload an extra thumbnail.",
-'file-thumbnail-no'           => "The filename begins with <strong>$1</strong>.
+If the checked file is the same image of original size it is not necessary to upload an extra thumbnail.',
+'file-thumbnail-no'              => 'The filename begins with <strong>$1</strong>.
 It seems to be an image of reduced size <em>(thumbnail)</em>.
-If you have this image in full resolution upload this one, otherwise change the filename please.",
-'fileexists-forbidden'        => 'A file with this name already exists, and cannot be overwritten.
+If you have this image in full resolution upload this one, otherwise change the filename please.',
+'fileexists-forbidden'           => 'A file with this name already exists, and cannot be overwritten.
 If you still want to upload your file, please go back and use a new name.
 [[File:$1|thumb|center|$1]]',
-'fileexists-shared-forbidden' => 'A file with this name exists already in the shared file repository.
+'fileexists-shared-forbidden'    => 'A file with this name exists already in the shared file repository.
 If you still want to upload your file, please go back and use a new name.
 [[File:$1|thumb|center|$1]]',
-'file-exists-duplicate'       => 'This file is a duplicate of the following {{PLURAL:$1|file|files}}:',
-'file-deleted-duplicate'      => "A file identical to this file ([[:$1]]) has previously been deleted.
+'file-exists-duplicate'          => 'This file is a duplicate of the following {{PLURAL:$1|file|files}}:',
+'file-deleted-duplicate'         => "A file identical to this file ([[:$1]]) has previously been deleted.
 You should check that file's deletion history before proceeding to re-upload it.",
-'file-deleted-duplicate-notitle' => "A file identical to this file has previously been deleted, and the title has been suppressed.
-You should ask someone with the ability to view suppressed file data to review the situation before proceeding to re-upload it.",
-'uploadwarning'               => 'Upload warning',
-'uploadwarning-text'          => 'Please modify the file description below and try again.',
-'savefile'                    => 'Save file',
-'uploadedimage'               => 'uploaded "[[$1]]"',
-'overwroteimage'              => 'uploaded a new version of "[[$1]]"',
-'uploaddisabled'              => 'Uploads disabled.',
-'copyuploaddisabled'          => 'Upload by URL disabled.',
-'uploadfromurl-queued'        => 'Your upload has been queued.',
-'uploaddisabledtext'          => 'File uploads are disabled.',
-'php-uploaddisabledtext'      => 'File uploads are disabled in PHP.
+'file-deleted-duplicate-notitle' => 'A file identical to this file has previously been deleted, and the title has been suppressed.
+You should ask someone with the ability to view suppressed file data to review the situation before proceeding to re-upload it.',
+'uploadwarning'                  => 'Upload warning',
+'uploadwarning-text'             => 'Please modify the file description below and try again.',
+'savefile'                       => 'Save file',
+'uploadedimage'                  => 'uploaded "[[$1]]"',
+'overwroteimage'                 => 'uploaded a new version of "[[$1]]"',
+'uploaddisabled'                 => 'Uploads disabled.',
+'copyuploaddisabled'             => 'Upload by URL disabled.',
+'uploadfromurl-queued'           => 'Your upload has been queued.',
+'uploaddisabledtext'             => 'File uploads are disabled.',
+'php-uploaddisabledtext'         => 'File uploads are disabled in PHP.
 Please check the file_uploads setting.',
-'uploadscripted'              => 'This file contains HTML or script code that may be erroneously interpreted by a web browser.',
-'uploadinvalidxml'            => 'The XML in the uploaded file could not be parsed.',
-'uploadvirus'                 => 'The file contains a virus!
+'uploadscripted'                 => 'This file contains HTML or script code that may be erroneously interpreted by a web browser.',
+'uploadscriptednamespace'        => 'This SVG file contains an illegal namespace "$1"',
+'uploadinvalidxml'               => 'The XML in the uploaded file could not be parsed.',
+'uploadvirus'                    => 'The file contains a virus!
 Details: $1',
-'uploadjava'                  => 'The file is a ZIP file that contains a Java .class file.
+'uploadjava'                     => 'The file is a ZIP file that contains a Java .class file.
 Uploading Java files is not allowed because they can cause security restrictions to be bypassed.',
-'upload-source'               => 'Source file',
-'sourcefilename'              => 'Source filename:',
-'sourceurl'                   => 'Source URL:',
-'destfilename'                => 'Destination filename:',
-'upload-maxfilesize'          => 'Maximum file size: $1',
-'upload-description'          => 'File description',
-'upload-options'              => 'Upload options',
-'watchthisupload'             => 'Watch this file',
-'filewasdeleted'              => 'A file of this name has been previously uploaded and subsequently deleted.
+'upload-source'                  => 'Source file',
+'sourcefilename'                 => 'Source filename:',
+'sourceurl'                      => 'Source URL:',
+'destfilename'                   => 'Destination filename:',
+'upload-maxfilesize'             => 'Maximum file size: $1',
+'upload-description'             => 'File description',
+'upload-options'                 => 'Upload options',
+'watchthisupload'                => 'Watch this file',
+'filewasdeleted'                 => 'A file of this name has been previously uploaded and subsequently deleted.
 You should check the $1 before proceeding to upload it again.',
-'filename-bad-prefix'         => "The name of the file you are uploading begins with <strong>\"\$1\"</strong>, which is a non-descriptive name typically assigned automatically by digital cameras.
-Please choose a more descriptive name for your file.",
-'filename-prefix-blacklist'   => ' #<!-- leave this line exactly as it is --> <pre>
+'filename-bad-prefix'            => 'The name of the file you are uploading begins with <strong>"$1"</strong>, which is a non-descriptive name typically assigned automatically by digital cameras.
+Please choose a more descriptive name for your file.',
+'filename-prefix-blacklist'      => ' #<!-- leave this line exactly as it is --> <pre>
 # Syntax is as follows:
 #   * Everything from a "#" character to the end of the line is a comment
 #   * Every non-blank line is a prefix for typical filenames assigned automatically by digital cameras
@@ -2387,14 +2398,14 @@ JD # Jenoptik
 MGP # Pentax
 PICT # misc.
  #</pre> <!-- leave this line exactly as it is -->', # only translate this message to other languages if you have to change it
-'upload-success-subj'         => 'Successful upload',
-'upload-success-msg'          => 'Your upload from [$2] was successful. It is available here: [[:{{ns:file}}:$1]]',
-'upload-failure-subj'         => 'Upload problem',
-'upload-failure-msg'          => 'There was a problem with your upload from [$2]:
+'upload-success-subj'            => 'Successful upload',
+'upload-success-msg'             => 'Your upload from [$2] was successful. It is available here: [[:{{ns:file}}:$1]]',
+'upload-failure-subj'            => 'Upload problem',
+'upload-failure-msg'             => 'There was a problem with your upload from [$2]:
 
 $1',
-'upload-warning-subj'         => 'Upload warning',
-'upload-warning-msg'          => 'There was a problem with your upload from [$2]. You may return to the [[Special:Upload/stash/$1|upload form]] to correct this problem.',
+'upload-warning-subj'            => 'Upload warning',
+'upload-warning-msg'             => 'There was a problem with your upload from [$2]. You may return to the [[Special:Upload/stash/$1|upload form]] to correct this problem.',
 
 'upload-proto-error'                => 'Incorrect protocol',
 'upload-proto-error-text'           => 'Remote upload requires URLs beginning with <code>http://</code> or <code>ftp://</code>.',
@@ -2581,24 +2592,24 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 # File reversion
 'filerevert'                => 'Revert $1',
 'filerevert-legend'         => 'Revert file',
-'filerevert-intro'          => "You are about to revert the file <strong>[[Media:$1|$1]]</strong> to the [$4 version as of $3, $2].",
+'filerevert-intro'          => 'You are about to revert the file <strong>[[Media:$1|$1]]</strong> to the [$4 version as of $3, $2].',
 'filerevert-comment'        => 'Reason:',
 'filerevert-defaultcomment' => 'Reverted to version as of $2, $1',
 'filerevert-submit'         => 'Revert',
-'filerevert-success'        => "<strong>[[Media:$1|$1]]</strong> has been reverted to the [$4 version as of $3, $2].",
+'filerevert-success'        => '<strong>[[Media:$1|$1]]</strong> has been reverted to the [$4 version as of $3, $2].',
 'filerevert-badversion'     => 'There is no previous local version of this file with the provided timestamp.',
 
 # File deletion
 'filedelete'                   => 'Delete $1',
 'filedelete-legend'            => 'Delete file',
-'filedelete-intro'             => "You are about to delete the file <strong>[[Media:$1|$1]]</strong> along with all of its history.",
-'filedelete-intro-old'         => "You are deleting the version of <strong>[[Media:$1|$1]]</strong> as of [$4 $3, $2].",
+'filedelete-intro'             => 'You are about to delete the file <strong>[[Media:$1|$1]]</strong> along with all of its history.',
+'filedelete-intro-old'         => 'You are deleting the version of <strong>[[Media:$1|$1]]</strong> as of [$4 $3, $2].',
 'filedelete-comment'           => 'Reason:',
 'filedelete-submit'            => 'Delete',
-'filedelete-success'           => "<strong>$1</strong> has been deleted.",
-'filedelete-success-old'       => "The version of <strong>[[Media:$1|$1]]</strong> as of $3, $2 has been deleted.",
-'filedelete-nofile'            => "<strong>$1</strong> does not exist.",
-'filedelete-nofile-old'        => "There is no archived version of <strong>$1</strong> with the specified attributes.",
+'filedelete-success'           => '<strong>$1</strong> has been deleted.',
+'filedelete-success-old'       => 'The version of <strong>[[Media:$1|$1]]</strong> as of $3, $2 has been deleted.',
+'filedelete-nofile'            => '<strong>$1</strong> does not exist.',
+'filedelete-nofile-old'        => 'There is no archived version of <strong>$1</strong> with the specified attributes.',
 'filedelete-otherreason'       => 'Other/additional reason:',
 'filedelete-reason-otherlist'  => 'Other reason',
 'filedelete-reason-dropdown'   => '*Common delete reasons
@@ -2703,113 +2714,113 @@ It now redirects to [[$2]].',
 'fewestrevisions-summary' => '', # do not translate or duplicate this message to other languages
 
 # Miscellaneous special pages
-'nbytes'                          => '$1 {{PLURAL:$1|byte|bytes}}',
-'ncategories'                     => '$1 {{PLURAL:$1|category|categories}}',
-'ninterwikis'                     => '$1 {{PLURAL:$1|interwiki|interwikis}}',
-'nlinks'                          => '$1 {{PLURAL:$1|link|links}}',
-'nmembers'                        => '$1 {{PLURAL:$1|member|members}}',
-'nmemberschanged'                 => '$1 → $2 {{PLURAL:$2|member|members}}',
-'nrevisions'                      => '$1 {{PLURAL:$1|revision|revisions}}',
-'nviews'                          => '$1 {{PLURAL:$1|view|views}}',
-'nimagelinks'                     => 'Used on $1 {{PLURAL:$1|page|pages}}',
-'ntransclusions'                  => 'used on $1 {{PLURAL:$1|page|pages}}',
-'specialpage-empty'               => 'There are no results for this report.',
-'lonelypages'                     => 'Orphaned pages',
-'lonelypages-summary'             => '', # do not translate or duplicate this message to other languages
-'lonelypagestext'                 => 'The following pages are not linked from or transcluded into other pages in {{SITENAME}}.',
-'uncategorizedpages'              => 'Uncategorized pages',
-'uncategorizedpages-summary'      => '', # do not translate or duplicate this message to other languages
-'uncategorizedcategories'         => 'Uncategorized categories',
-'uncategorizedcategories-summary' => '', # do not translate or duplicate this message to other languages
-'uncategorizedimages'             => 'Uncategorized files',
-'uncategorizedimages-summary'     => '', # do not translate or duplicate this message to other languages
-'uncategorizedtemplates'          => 'Uncategorized templates',
-'uncategorizedtemplates-summary'  => '', # do not translate or duplicate this message to other languages
-'unusedcategories'                => 'Unused categories',
-'unusedcategories-summary'        => '', # do not translate or duplicate this message to other languages
-'unusedimages'                    => 'Unused files',
-'unusedimages-summary'            => '', # do not translate or duplicate this message to other languages
-'popularpages'                    => 'Popular pages',
-'popularpages-summary'            => '', # do not translate or duplicate this message to other languages
-'wantedcategories'                => 'Wanted categories',
-'wantedcategories-summary'        => '', # do not translate or duplicate this message to other languages
-'wantedpages'                     => 'Wanted pages',
-'wantedpages-summary'             => '', # do not translate or duplicate this message to other languages
-'wantedpages-badtitle'            => 'Invalid title in result set: $1',
-'wantedfiles'                     => 'Wanted files',
-'wantedfiles-summary'             => '', # do not translate or duplicate this message to other languages
-'wantedfiletext-cat'              => 'The following files are used but do not exist. Files from foreign repositories may be listed despite existing. Any such false positives will be <del>struck out</del>. Additionally, pages that embed files that do not exist are listed in [[:$1]].',
-'wantedfiletext-nocat'            => 'The following files are used but do not exist. Files from foreign repositories may be listed despite existing. Any such false positives will be <del>struck out</del>.',
-'wantedtemplates'                 => 'Wanted templates',
-'wantedtemplates-summary'         => '', # do not translate or duplicate this message to other languages
-'mostlinked'                      => 'Most linked-to pages',
-'mostlinked-summary'              => '', # do not translate or duplicate this message to other languages
-'mostlinkedcategories'            => 'Most linked-to categories',
-'mostlinkedcategories-summary'    => '', # do not translate or duplicate this message to other languages
-'mostlinkedtemplates'             => 'Most linked-to templates',
-'mostlinkedtemplates-summary'     => '', # do not translate or duplicate this message to other languages
-'mostcategories'                  => 'Pages with the most categories',
-'mostcategories-summary'          => '', # do not translate or duplicate this message to other languages
-'mostimages'                      => 'Most linked-to files',
-'mostimages-summary'              => '', # do not translate or duplicate this message to other languages
-'mostinterwikis'                  => 'Pages with the most interwikis',
-'mostinterwikis-summary'          => '', # do not translate or duplicate this message to other languages
-'mostrevisions'                   => 'Pages with the most revisions',
-'mostrevisions-summary'           => '', # do not translate or duplicate this message to other languages
-'prefixindex'                     => 'All pages with prefix',
-'prefixindex-namespace'           => 'All pages with prefix ($1 namespace)',
-'prefixindex-summary'             => '', # do not translate or duplicate this message to other languages
-'prefixindex-strip'               => 'Strip prefix in list',
-'shortpages'                      => 'Short pages',
-'shortpages-summary'              => '', # do not translate or duplicate this message to other languages
-'longpages'                       => 'Long pages',
-'longpages-summary'               => '', # do not translate or duplicate this message to other languages
-'deadendpages'                    => 'Dead-end pages',
-'deadendpages-summary'            => '', # do not translate or duplicate this message to other languages
-'deadendpagestext'                => 'The following pages do not link to other pages in {{SITENAME}}.',
-'protectedpages'                  => 'Protected pages',
-'protectedpages-indef'            => 'Indefinite protections only',
-'protectedpages-summary'          => 'This page lists existing pages that are currently protected. For a list of titles that are protected from creation, see [[{{#special:ProtectedTitles}}]].',
-'protectedpages-cascade'          => 'Cascading protections only',
-'protectedpages-noredirect'       => 'Hide redirects',
-'protectedpagesempty'             => 'No pages are currently protected with these parameters.',
-'protectedpages-timestamp'        => 'Timestamp',
-'protectedpages-page'             => 'Page',
-'protectedpages-expiry'           => 'Expires',
-'protectedpages-performer'        => 'Protecting user',
-'protectedpages-params'           => 'Protection parameters',
-'protectedpages-reason'           => 'Reason',
+'nbytes'                           => '$1 {{PLURAL:$1|byte|bytes}}',
+'ncategories'                      => '$1 {{PLURAL:$1|category|categories}}',
+'ninterwikis'                      => '$1 {{PLURAL:$1|interwiki|interwikis}}',
+'nlinks'                           => '$1 {{PLURAL:$1|link|links}}',
+'nmembers'                         => '$1 {{PLURAL:$1|member|members}}',
+'nmemberschanged'                  => '$1 → $2 {{PLURAL:$2|member|members}}',
+'nrevisions'                       => '$1 {{PLURAL:$1|revision|revisions}}',
+'nviews'                           => '$1 {{PLURAL:$1|view|views}}',
+'nimagelinks'                      => 'Used on $1 {{PLURAL:$1|page|pages}}',
+'ntransclusions'                   => 'used on $1 {{PLURAL:$1|page|pages}}',
+'specialpage-empty'                => 'There are no results for this report.',
+'lonelypages'                      => 'Orphaned pages',
+'lonelypages-summary'              => '', # do not translate or duplicate this message to other languages
+'lonelypagestext'                  => 'The following pages are not linked from or transcluded into other pages in {{SITENAME}}.',
+'uncategorizedpages'               => 'Uncategorized pages',
+'uncategorizedpages-summary'       => '', # do not translate or duplicate this message to other languages
+'uncategorizedcategories'          => 'Uncategorized categories',
+'uncategorizedcategories-summary'  => '', # do not translate or duplicate this message to other languages
+'uncategorizedimages'              => 'Uncategorized files',
+'uncategorizedimages-summary'      => '', # do not translate or duplicate this message to other languages
+'uncategorizedtemplates'           => 'Uncategorized templates',
+'uncategorizedtemplates-summary'   => '', # do not translate or duplicate this message to other languages
+'unusedcategories'                 => 'Unused categories',
+'unusedcategories-summary'         => '', # do not translate or duplicate this message to other languages
+'unusedimages'                     => 'Unused files',
+'unusedimages-summary'             => '', # do not translate or duplicate this message to other languages
+'popularpages'                     => 'Popular pages',
+'popularpages-summary'             => '', # do not translate or duplicate this message to other languages
+'wantedcategories'                 => 'Wanted categories',
+'wantedcategories-summary'         => '', # do not translate or duplicate this message to other languages
+'wantedpages'                      => 'Wanted pages',
+'wantedpages-summary'              => '', # do not translate or duplicate this message to other languages
+'wantedpages-badtitle'             => 'Invalid title in result set: $1',
+'wantedfiles'                      => 'Wanted files',
+'wantedfiles-summary'              => '', # do not translate or duplicate this message to other languages
+'wantedfiletext-cat'               => 'The following files are used but do not exist. Files from foreign repositories may be listed despite existing. Any such false positives will be <del>struck out</del>. Additionally, pages that embed files that do not exist are listed in [[:$1]].',
+'wantedfiletext-nocat'             => 'The following files are used but do not exist. Files from foreign repositories may be listed despite existing. Any such false positives will be <del>struck out</del>.',
+'wantedtemplates'                  => 'Wanted templates',
+'wantedtemplates-summary'          => '', # do not translate or duplicate this message to other languages
+'mostlinked'                       => 'Most linked-to pages',
+'mostlinked-summary'               => '', # do not translate or duplicate this message to other languages
+'mostlinkedcategories'             => 'Most linked-to categories',
+'mostlinkedcategories-summary'     => '', # do not translate or duplicate this message to other languages
+'mostlinkedtemplates'              => 'Most linked-to templates',
+'mostlinkedtemplates-summary'      => '', # do not translate or duplicate this message to other languages
+'mostcategories'                   => 'Pages with the most categories',
+'mostcategories-summary'           => '', # do not translate or duplicate this message to other languages
+'mostimages'                       => 'Most linked-to files',
+'mostimages-summary'               => '', # do not translate or duplicate this message to other languages
+'mostinterwikis'                   => 'Pages with the most interwikis',
+'mostinterwikis-summary'           => '', # do not translate or duplicate this message to other languages
+'mostrevisions'                    => 'Pages with the most revisions',
+'mostrevisions-summary'            => '', # do not translate or duplicate this message to other languages
+'prefixindex'                      => 'All pages with prefix',
+'prefixindex-namespace'            => 'All pages with prefix ($1 namespace)',
+'prefixindex-summary'              => '', # do not translate or duplicate this message to other languages
+'prefixindex-strip'                => 'Strip prefix in list',
+'shortpages'                       => 'Short pages',
+'shortpages-summary'               => '', # do not translate or duplicate this message to other languages
+'longpages'                        => 'Long pages',
+'longpages-summary'                => '', # do not translate or duplicate this message to other languages
+'deadendpages'                     => 'Dead-end pages',
+'deadendpages-summary'             => '', # do not translate or duplicate this message to other languages
+'deadendpagestext'                 => 'The following pages do not link to other pages in {{SITENAME}}.',
+'protectedpages'                   => 'Protected pages',
+'protectedpages-indef'             => 'Indefinite protections only',
+'protectedpages-summary'           => 'This page lists existing pages that are currently protected. For a list of titles that are protected from creation, see [[{{#special:ProtectedTitles}}]].',
+'protectedpages-cascade'           => 'Cascading protections only',
+'protectedpages-noredirect'        => 'Hide redirects',
+'protectedpagesempty'              => 'No pages are currently protected with these parameters.',
+'protectedpages-timestamp'         => 'Timestamp',
+'protectedpages-page'              => 'Page',
+'protectedpages-expiry'            => 'Expires',
+'protectedpages-performer'         => 'Protecting user',
+'protectedpages-params'            => 'Protection parameters',
+'protectedpages-reason'            => 'Reason',
 'protectedpages-unknown-timestamp' => 'Unknown',
 'protectedpages-unknown-performer' => 'Unknown user',
-'protectedpages-unknown-reason'   => '—', # do not translate or duplicate this message to other languages
-'protectedtitles'                 => 'Protected titles',
-'protectedtitles-summary'         => 'This page lists titles that are currently protected from creation. For a list of existing pages that are protected, see [[{{#special:ProtectedPages}}]].',
-'protectedtitlesempty'            => 'No titles are currently protected with these parameters.',
-'listusers'                       => 'User list',
-'listusers-summary'               => '', # do not translate or duplicate this message to other languages
-'listusers-editsonly'             => 'Show only users with edits',
-'listusers-creationsort'          => 'Sort by creation date',
-'listusers-desc'                  => 'Sort in descending order',
-'usereditcount'                   => '$1 {{PLURAL:$1|edit|edits}}',
-'usercreated'                     => '{{GENDER:$3|Created}} on $1 at $2',
-'newpages'                        => 'New pages',
-'newpages-summary'                => '', # do not translate or duplicate this message to other languages
-'newpages-username'               => 'Username:',
-'ancientpages'                    => 'Oldest pages',
-'ancientpages-summary'            => '', # do not translate or duplicate this message to other languages
-'move'                            => 'Move',
-'movethispage'                    => 'Move this page',
-'unusedimagestext'                => 'The following files exist but are not embedded in any page.
+'protectedpages-unknown-reason'    => '—', # do not translate or duplicate this message to other languages
+'protectedtitles'                  => 'Protected titles',
+'protectedtitles-summary'          => 'This page lists titles that are currently protected from creation. For a list of existing pages that are protected, see [[{{#special:ProtectedPages}}]].',
+'protectedtitlesempty'             => 'No titles are currently protected with these parameters.',
+'listusers'                        => 'User list',
+'listusers-summary'                => '', # do not translate or duplicate this message to other languages
+'listusers-editsonly'              => 'Show only users with edits',
+'listusers-creationsort'           => 'Sort by creation date',
+'listusers-desc'                   => 'Sort in descending order',
+'usereditcount'                    => '$1 {{PLURAL:$1|edit|edits}}',
+'usercreated'                      => '{{GENDER:$3|Created}} on $1 at $2',
+'newpages'                         => 'New pages',
+'newpages-summary'                 => '', # do not translate or duplicate this message to other languages
+'newpages-username'                => 'Username:',
+'ancientpages'                     => 'Oldest pages',
+'ancientpages-summary'             => '', # do not translate or duplicate this message to other languages
+'move'                             => 'Move',
+'movethispage'                     => 'Move this page',
+'unusedimagestext'                 => 'The following files exist but are not embedded in any page.
 Please note that other web sites may link to a file with a direct URL, and so may still be listed here despite being in active use.',
-'unusedcategoriestext'            => 'The following category pages exist, although no other page or category makes use of them.',
-'notargettitle'                   => 'No target',
-'notargettext'                    => 'You have not specified a target page or user to perform this function on.',
-'nopagetitle'                     => 'No such target page',
-'nopagetext'                      => 'The target page you have specified does not exist.',
-'pager-newer-n'                   => '{{PLURAL:$1|newer 1|newer $1}}',
-'pager-older-n'                   => '{{PLURAL:$1|older 1|older $1}}',
-'suppress'                        => 'Oversight',
-'querypage-disabled'              => 'This special page is disabled for performance reasons.',
+'unusedcategoriestext'             => 'The following category pages exist, although no other page or category makes use of them.',
+'notargettitle'                    => 'No target',
+'notargettext'                     => 'You have not specified a target page or user to perform this function on.',
+'nopagetitle'                      => 'No such target page',
+'nopagetext'                       => 'The target page you have specified does not exist.',
+'pager-newer-n'                    => '{{PLURAL:$1|newer 1|newer $1}}',
+'pager-older-n'                    => '{{PLURAL:$1|older 1|older $1}}',
+'suppress'                         => 'Oversight',
+'querypage-disabled'               => 'This special page is disabled for performance reasons.',
 
 # Book sources
 'booksources'               => 'Book sources',
@@ -2984,12 +2995,12 @@ Future changes to this page and its associated talk page will be listed there.',
 'notvisiblerev'        => 'The last revision by a different user has been deleted',
 'watchlist-details'    => '{{PLURAL:$1|$1 page|$1 pages}} on your watchlist, not counting talk pages.',
 'wlheader-enotif'      => 'Email notification is enabled.',
-'wlheader-showupdated' => "Pages that have been changed since you last visited them are shown in <strong>bold</strong>.",
+'wlheader-showupdated' => 'Pages that have been changed since you last visited them are shown in <strong>bold</strong>.',
 'watchmethod-recent'   => 'checking recent edits for watched pages',
 'watchmethod-list'     => 'checking watched pages for recent edits',
 'watchlistcontains'    => 'Your watchlist contains $1 {{PLURAL:$1|page|pages}}.',
 'iteminvalidname'      => 'Problem with item "$1", invalid name...',
-'wlnote2'              => "Below are the changes in the last {{PLURAL:$1|hour|<strong>$1</strong> hours}}, as of $2, $3.",
+'wlnote2'              => 'Below are the changes in the last {{PLURAL:$1|hour|<strong>$1</strong> hours}}, as of $2, $3.',
 'wlshowlast'           => 'Show last $1 hours $2 days $3',
 'watchlist-options'    => 'Watchlist options',
 
@@ -3044,41 +3055,41 @@ Feedback and further assistance:
 'changed'                      => 'changed', # only translate this message to other languages if you have to change it
 
 # Delete
-'deletepage'             => 'Delete page',
-'confirm'                => 'Confirm',
-'excontent'              => 'content was: "$1"',
-'excontentauthor'        => 'content was: "$1" (and the only contributor was "[[Special:Contributions/$2|$2]]")',
-'exbeforeblank'          => 'content before blanking was: "$1"',
-'exblank'                => 'page was empty',
-'delete-confirm'         => 'Delete "$1"',
-'delete-legend'          => 'Delete',
-'historywarning'         => "<strong>Warning:</strong> The page you are about to delete has a history with approximately $1 {{PLURAL:$1|revision|revisions}}:",
-'confirmdeletetext'      => 'You are about to delete a page along with all of its history.
+'deletepage'                 => 'Delete page',
+'confirm'                    => 'Confirm',
+'excontent'                  => 'content was: "$1"',
+'excontentauthor'            => 'content was: "$1" (and the only contributor was "[[Special:Contributions/$2|$2]]")',
+'exbeforeblank'              => 'content before blanking was: "$1"',
+'exblank'                    => 'page was empty',
+'delete-confirm'             => 'Delete "$1"',
+'delete-legend'              => 'Delete',
+'historywarning'             => '<strong>Warning:</strong> The page you are about to delete has a history with approximately $1 {{PLURAL:$1|revision|revisions}}:',
+'confirmdeletetext'          => 'You are about to delete a page along with all of its history.
 Please confirm that you intend to do this, that you understand the consequences, and that you are doing this in accordance with [[{{MediaWiki:Policy-url}}|the policy]].',
-'deleting-backlinks-warning' => "'''Warning:''' Other pages link to or transclude from the page you are about to delete.",
-'actioncomplete'         => 'Action complete',
-'actionfailed'           => 'Action failed',
-'deletedtext'            => '"$1" has been deleted.
+'actioncomplete'             => 'Action complete',
+'actionfailed'               => 'Action failed',
+'deletedtext'                => '"$1" has been deleted.
 See $2 for a record of recent deletions.',
-'dellogpage'             => 'Deletion log',
-'dellogpagetext'         => 'Below is a list of the most recent deletions.',
-'deletionlog'            => 'deletion log',
-'reverted'               => 'Reverted to earlier revision',
-'deletecomment'          => 'Reason:',
-'deleteotherreason'      => 'Other/additional reason:',
-'deletereasonotherlist'  => 'Other reason',
-'deletereason-dropdown'  => '* Common delete reasons
+'dellogpage'                 => 'Deletion log',
+'dellogpagetext'             => 'Below is a list of the most recent deletions.',
+'deletionlog'                => 'deletion log',
+'reverted'                   => 'Reverted to earlier revision',
+'deletecomment'              => 'Reason:',
+'deleteotherreason'          => 'Other/additional reason:',
+'deletereasonotherlist'      => 'Other reason',
+'deletereason-dropdown'      => '* Common delete reasons
 ** Spam
 ** Vandalism
 ** Copyright violation
 ** Author request
 ** Broken redirect',
-'delete-edit-reasonlist' => 'Edit deletion reasons',
-'delete-toobig'          => 'This page has a large edit history, over $1 {{PLURAL:$1|revision|revisions}}.
+'delete-edit-reasonlist'     => 'Edit deletion reasons',
+'delete-toobig'              => 'This page has a large edit history, over $1 {{PLURAL:$1|revision|revisions}}.
 Deletion of such pages has been restricted to prevent accidental disruption of {{SITENAME}}.',
-'delete-warning-toobig'  => 'This page has a large edit history, over $1 {{PLURAL:$1|revision|revisions}}.
+'delete-warning-toobig'      => 'This page has a large edit history, over $1 {{PLURAL:$1|revision|revisions}}.
 Deleting it may disrupt database operations of {{SITENAME}};
 proceed with caution.',
+'deleting-backlinks-warning' => "'''Warning:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Other pages]] link to or transclude the page you are about to delete.",
 
 # Rollback
 'rollback'                   => 'Roll back edits',
@@ -3126,13 +3137,13 @@ See the [[Special:ProtectedPages|protected pages list]] for the list of currentl
 'protect_expiry_invalid'           => 'Expiry time is invalid.',
 'protect_expiry_old'               => 'Expiry time is in the past.',
 'protect-unchain-permissions'      => 'Unlock further protect options',
-'protect-text'                     => "Here you may view and change the protection level for the page <strong>$1</strong>.",
-'protect-locked-blocked'           => "You cannot change protection levels while blocked.
-Here are the current settings for the page <strong>$1</strong>:",
-'protect-locked-dblock'            => "Protection levels cannot be changed due to an active database lock.
-Here are the current settings for the page <strong>$1</strong>:",
-'protect-locked-access'            => "Your account does not have permission to change page protection levels.
-Here are the current settings for the page <strong>$1</strong>:",
+'protect-text'                     => 'Here you may view and change the protection level for the page <strong>$1</strong>.',
+'protect-locked-blocked'           => 'You cannot change protection levels while blocked.
+Here are the current settings for the page <strong>$1</strong>:',
+'protect-locked-dblock'            => 'Protection levels cannot be changed due to an active database lock.
+Here are the current settings for the page <strong>$1</strong>:',
+'protect-locked-access'            => 'Your account does not have permission to change page protection levels.
+Here are the current settings for the page <strong>$1</strong>:',
 'protect-cascadeon'                => "This page is currently protected because it is included in the following {{PLURAL:$1|page, which has|pages, which have}} cascading protection turned on.
 You can change this page's protection level, but it will not affect the cascading protection.",
 'protect-default'                  => 'Allow all users',
@@ -3179,7 +3190,7 @@ You can change this page's protection level, but it will not affect the cascadin
 'undelete'                     => 'View deleted pages',
 'undelete-summary'             => '', # do not translate or duplicate this message to other languages
 'undeletepage'                 => 'View and restore deleted pages',
-'undeletepagetitle'            => "<strong>The following consists of deleted revisions of [[:$1|$1]]</strong>.",
+'undeletepagetitle'            => '<strong>The following consists of deleted revisions of [[:$1|$1]]</strong>.',
 'viewdeletedpage'              => 'View deleted pages',
 'undeletepagetext'             => 'The following {{PLURAL:$1|page has been deleted but is|$1 pages have been deleted but are}} still in the archive and can be restored.
 The archive may be periodically cleaned out.',
@@ -3208,9 +3219,9 @@ You may have a bad link, or the revision may have been restored or removed from
 'undeletedfiles'               => '{{PLURAL:$1|1 file|$1 files}} restored',
 'cannotundelete'               => 'Undelete failed:
 $1',
-'undeletedpage'                => "<strong>$1 has been restored</strong>
+'undeletedpage'                => '<strong>$1 has been restored</strong>
 
-Consult the [[Special:Log/delete|deletion log]] for a record of recent deletions and restorations.",
+Consult the [[Special:Log/delete|deletion log]] for a record of recent deletions and restorations.',
 'undelete-header'              => 'See [[Special:Log/delete|the deletion log]] for recently deleted pages.',
 'undelete-search-title'        => 'Search deleted pages',
 'undelete-search-box'          => 'Search deleted pages',
@@ -3229,7 +3240,7 @@ It may have already been undeleted.',
 $1',
 'undelete-show-file-confirm'   => 'Are you sure you want to view the deleted revision of the file "<nowiki>$1</nowiki>" from $2 at $3?',
 'undelete-show-file-submit'    => 'Yes',
-'undelete-revision-row'         => '$1 $2 ($3) $4 . . $5 $6 $7 $8 $9', # only translate this message to other languages if you have to change it
+'undelete-revision-row'        => '$1 $2 ($3) $4 . . $5 $6 $7 $8 $9', # only translate this message to other languages if you have to change it
 
 # Namespace form on various pages
 'namespace'                     => 'Namespace:',
@@ -3254,6 +3265,7 @@ $1',
 'sp-contributions-newbies-sub'         => 'For new accounts',
 'sp-contributions-newbies-title'       => 'User contributions for new accounts',
 'sp-contributions-blocklog'            => 'block log',
+'sp-contributions-suppresslog'         => 'suppressed user contributions',
 'sp-contributions-deleted'             => 'deleted user contributions',
 'sp-contributions-uploads'             => 'uploads',
 'sp-contributions-logs'                => 'logs',
@@ -3266,6 +3278,7 @@ The latest block log entry is provided below for reference:',
 'sp-contributions-search'              => 'Search for contributions',
 'sp-contributions-username'            => 'IP address or username:',
 'sp-contributions-toponly'             => 'Only show edits that are latest revisions',
+'sp-contributions-newonly'             => 'Only show edits that are page creations',
 'sp-contributions-submit'              => 'Search',
 'sp-contributions-explain'             => '', # only translate this message to other languages if you have to change it
 'sp-contributions-footer'              => '-', # do not translate or duplicate this message to other languages
@@ -3277,9 +3290,9 @@ The latest block log entry is provided below for reference:',
 'whatlinkshere-title'      => 'Pages that link to "$1"',
 'whatlinkshere-summary'    => '', # do not translate or duplicate this message to other languages
 'whatlinkshere-page'       => 'Page:',
-'linkshere'                => "The following pages link to <strong>[[:$1]]</strong>:",
-'nolinkshere'              => "No pages link to <strong>[[:$1]]</strong>.",
-'nolinkshere-ns'           => "No pages link to <strong>[[:$1]]</strong> in the chosen namespace.",
+'linkshere'                => 'The following pages link to <strong>[[:$1]]</strong>:',
+'nolinkshere'              => 'No pages link to <strong>[[:$1]]</strong>.',
+'nolinkshere-ns'           => 'No pages link to <strong>[[:$1]]</strong> in the chosen namespace.',
 'isredirect'               => 'redirect page',
 'istemplate'               => 'transclusion',
 'isimage'                  => 'file link',
@@ -3447,7 +3460,7 @@ To lock or unlock the database, this needs to be writable by the web server.',
 'move-page'                    => 'Move $1',
 'movepage-summary'             => '', # do not translate or duplicate this message to other languages
 'move-page-legend'             => 'Move page',
-'movepagetext'                 => "Using the form below will rename a page, moving all of its history to the new name.
+'movepagetext'                 => 'Using the form below will rename a page, moving all of its history to the new name.
 The old title will become a redirect page to the new title.
 You can update redirects that point to the original title automatically.
 If you choose not to, be sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].
@@ -3458,8 +3471,8 @@ This means that you can rename a page back to where it was renamed from if you m
 
 <strong>Warning!</strong>
 This can be a drastic and unexpected change for a popular page;
-please be sure you understand the consequences of this before proceeding.",
-'movepagetext-noredirectfixer' => "Using the form below will rename a page, moving all of its history to the new name.
+please be sure you understand the consequences of this before proceeding.',
+'movepagetext-noredirectfixer' => 'Using the form below will rename a page, moving all of its history to the new name.
 The old title will become a redirect page to the new title.
 Be sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].
 You are responsible for making sure that links continue to point where they are supposed to go.
@@ -3469,14 +3482,14 @@ This means that you can rename a page back to where it was renamed from if you m
 
 <strong>Warning!</strong>
 This can be a drastic and unexpected change for a popular page;
-please be sure you understand the consequences of this before proceeding.",
-'movepagetalktext'             => "The associated talk page will be automatically moved along with it <strong>unless:</strong>
+please be sure you understand the consequences of this before proceeding.',
+'movepagetalktext'             => 'The associated talk page will be automatically moved along with it <strong>unless:</strong>
 *A non-empty talk page already exists under the new name, or
 *You uncheck the box below.
 
-In those cases, you will have to move or merge the page manually if desired.",
+In those cases, you will have to move or merge the page manually if desired.',
 'movearticle'                  => 'Move page:',
-'moveuserpage-warning'         => "<strong>Warning:</strong> You are about to move a user page. Please note that only the page will be moved and the user will <em>not</em> be renamed.",
+'moveuserpage-warning'         => '<strong>Warning:</strong> You are about to move a user page. Please note that only the page will be moved and the user will <em>not</em> be renamed.',
 'movenologintext'              => 'You must be a registered user and [[Special:UserLogin|logged in]] to move a page.',
 'movenotallowed'               => 'You do not have permission to move pages.',
 'movenotallowedfile'           => 'You do not have permission to move files.',
@@ -3527,10 +3540,10 @@ cannot move a page over itself.',
 'imageinvalidfilename'         => 'The target filename is invalid',
 'fix-double-redirects'         => 'Update any redirects that point to the original title',
 'move-leave-redirect'          => 'Leave a redirect behind',
-'protectedpagemovewarning'     => "<strong>Warning:</strong> This page has been protected so that only users with administrator privileges can move it.
-The latest log entry is provided below for reference:",
-'semiprotectedpagemovewarning' => "<strong>Note:</strong> This page has been protected so that only registered users can move it.
-The latest log entry is provided below for reference:",
+'protectedpagemovewarning'     => '<strong>Warning:</strong> This page has been protected so that only users with administrator privileges can move it.
+The latest log entry is provided below for reference:',
+'semiprotectedpagemovewarning' => '<strong>Note:</strong> This page has been protected so that only registered users can move it.
+The latest log entry is provided below for reference:',
 'move-over-sharedrepo'         => '== File exists ==
 [[:$1]] exists on a shared repository. Moving a file to this title will override the shared file.',
 'file-exists-sharedrepo'       => 'The filename chosen is already in use on a shared repository.
@@ -3547,8 +3560,8 @@ To export pages, enter the titles in the text box below, one title per line, and
 In the latter case you can also use a link, for example [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] for the page "[[{{MediaWiki:Mainpage}}]]".',
 'exportall'         => 'Export all pages',
 'exportcuronly'     => 'Include only the current revision, not the full history',
-'exportnohistory'   => "----
-<strong>Note:</strong> Exporting the full history of pages through this form has been disabled due to performance reasons.",
+'exportnohistory'   => '----
+<strong>Note:</strong> Exporting the full history of pages through this form has been disabled due to performance reasons.',
 'exportlistauthors' => 'Include a full list of contributors for each page',
 'export-submit'     => 'Export',
 'export-addcattext' => 'Add pages from category:',
@@ -3566,7 +3579,7 @@ In the latter case you can also use a link, for example [[{{#Special:Export}}/{{
 'allmessagescurrent'            => 'Current message text',
 'allmessagestext'               => 'This is a list of system messages available in the MediaWiki namespace.
 Please visit [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.',
-'allmessagesnotsupportedDB'     => "This page cannot be used because <strong>\$wgUseDatabaseMessages</strong> has been disabled.",
+'allmessagesnotsupportedDB'     => 'This page cannot be used because <strong>$wgUseDatabaseMessages</strong> has been disabled.',
 'allmessages-filter-legend'     => 'Filter',
 'allmessages-filter'            => 'Filter by customization state:',
 'allmessages-filter-unmodified' => 'Unmodified',
@@ -3578,20 +3591,20 @@ Please visit [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation
 'allmessages-filter-translate'  => 'Translate',
 
 # Thumbnails
-'thumbnail-more'           => 'Enlarge',
-'filemissing'              => 'File missing',
-'thumbnail_error'          => 'Error creating thumbnail: $1',
-'thumbnail_error_remote'   => 'Error message from $1:
+'thumbnail-more'                => 'Enlarge',
+'filemissing'                   => 'File missing',
+'thumbnail_error'               => 'Error creating thumbnail: $1',
+'thumbnail_error_remote'        => 'Error message from $1:
 $2',
-'djvu_page_error'          => 'DjVu page out of range',
-'djvu_no_xml'              => 'Unable to fetch XML for DjVu file',
-'thumbnail-temp-create'    => 'Unable to create temporary thumbnail file',
-'thumbnail-dest-create'    => 'Unable to save thumbnail to destination',
-'thumbnail_invalid_params' => 'Invalid thumbnail parameters',
-'thumbnail_dest_directory' => 'Unable to create destination directory',
-'thumbnail_image-type'     => 'Image type not supported',
-'thumbnail_gd-library'     => 'Incomplete GD library configuration: Missing function $1',
-'thumbnail_image-missing'  => 'File seems to be missing: $1',
+'djvu_page_error'               => 'DjVu page out of range',
+'djvu_no_xml'                   => 'Unable to fetch XML for DjVu file',
+'thumbnail-temp-create'         => 'Unable to create temporary thumbnail file',
+'thumbnail-dest-create'         => 'Unable to save thumbnail to destination',
+'thumbnail_invalid_params'      => 'Invalid thumbnail parameters',
+'thumbnail_dest_directory'      => 'Unable to create destination directory',
+'thumbnail_image-type'          => 'Image type not supported',
+'thumbnail_gd-library'          => 'Incomplete GD library configuration: Missing function $1',
+'thumbnail_image-missing'       => 'File seems to be missing: $1',
 'thumbnail_image-failure-limit' => 'There have been too many recent failed attempts ($1 or more) to render this thumbnail. Please try again later.',
 
 # Special:Import
@@ -3806,6 +3819,8 @@ You can view its source',
 'tooltip-undo'                        => '"Undo" reverts this edit and opens the edit form in preview mode. It allows adding a reason in the summary.',
 'tooltip-preferences-save'            => 'Save preferences',
 'tooltip-summary'                     => 'Enter a short summary',
+'interlanguage-link-title'            => '$1 – $2', # only translate this message to other languages if you have to change it
+'interlanguage-link-title-langonly'   => '$1', # do not translate or duplicate this message to other languages
 
 # Stylesheets
 'common.css'              => '/* CSS placed here will be applied to all skins */', # only translate this message to other languages if you have to change it
@@ -3849,16 +3864,16 @@ You can view its source',
 'nocredits'        => 'There is no credits info available for this page.',
 
 # Spam protection
-'spamprotectiontitle' => 'Spam protection filter',
-'spamprotectiontext'  => 'The text you wanted to save was blocked by the spam filter.
+'spamprotectiontitle'  => 'Spam protection filter',
+'spamprotectiontext'   => 'The text you wanted to save was blocked by the spam filter.
 This is probably caused by a link to a blacklisted external site.',
-'spamprotectionmatch' => 'The following text is what triggered our spam filter: $1',
-'spambot_username'    => 'MediaWiki spam cleanup',
-'spam_reverting'      => 'Reverting to last revision not containing links to $1',
-'spam_blanking'       => 'All revisions contained links to $1, blanking',
-'spam_deleting'       => 'All revisions contained links to $1, deleting',
-'simpleantispam-label' => "Anti-spam check.
-Do <strong>NOT</strong> fill this in!",
+'spamprotectionmatch'  => 'The following text is what triggered our spam filter: $1',
+'spambot_username'     => 'MediaWiki spam cleanup',
+'spam_reverting'       => 'Reverting to last revision not containing links to $1',
+'spam_blanking'        => 'All revisions contained links to $1, blanking',
+'spam_deleting'        => 'All revisions contained links to $1, deleting',
+'simpleantispam-label' => 'Anti-spam check.
+Do <strong>NOT</strong> fill this in!',
 
 # Info page
 'pageinfo-header'                 => '-', # do not translate or duplicate this message to other languages
@@ -3951,9 +3966,9 @@ $1',
 'nextdiff'     => 'Newer edit →',
 
 # Media information
-'mediawarning'                => "<strong>Warning:</strong> This file type may contain malicious code.
-By executing it, your system may be compromised.",
-'imagemaxsize'                => "Image size limit:<br /><em>(for file description pages)</em>",
+'mediawarning'                => '<strong>Warning:</strong> This file type may contain malicious code.
+By executing it, your system may be compromised.',
+'imagemaxsize'                => 'Image size limit:<br /><em>(for file description pages)</em>',
 'thumbsize'                   => 'Thumbnail size:',
 'widthheight'                 => '$1 × $2', # only translate this message to other languages if you have to change it
 'widthheightpage'             => '$1 × $2, $3 {{PLURAL:$3|page|pages}}',
@@ -3973,12 +3988,12 @@ By executing it, your system may be compromised.",
 'file-info-png-looped'        => 'looped',
 'file-info-png-repeat'        => 'played $1 {{PLURAL:$1|time|times}}',
 'file-info-png-frames'        => '$1 {{PLURAL:$1|frame|frames}}',
-'file-no-thumb-animation'     => "<strong>Note: Due to technical limitations, thumbnails of this file will not be animated.</strong>",
-'file-no-thumb-animation-gif' => "<strong>Note: Due to technical limitations, thumbnails of high resolution GIF images such as this one will not be animated.</strong>",
+'file-no-thumb-animation'     => '<strong>Note: Due to technical limitations, thumbnails of this file will not be animated.</strong>',
+'file-no-thumb-animation-gif' => '<strong>Note: Due to technical limitations, thumbnails of high resolution GIF images such as this one will not be animated.</strong>',
 
 # Special:NewFiles
 'newimages'             => 'Gallery of new files',
-'imagelisttext'         => "Below is a list of <strong>$1</strong> {{PLURAL:$1|file|files}} sorted $2.",
+'imagelisttext'         => 'Below is a list of <strong>$1</strong> {{PLURAL:$1|file|files}} sorted $2.',
 'newimages-summary'     => 'This special page shows the last uploaded files.',
 'newimages-legend'      => 'Filter',
 'newimages-label'       => 'Filename (or a part of it):',
@@ -4099,7 +4114,7 @@ Others will be hidden by default.
 * gpslatitude
 * gpslongitude
 * gpsaltitude',
-'metadata-langitem'         => "<strong>$2:</strong> $1", # only translate this message to other languages if you have to change it
+'metadata-langitem'         => '<strong>$2:</strong> $1', # only translate this message to other languages if you have to change it
 'metadata-langitem-default' => '$1', # only translate this message to other languages if you have to change it
 
 # Exif tags
@@ -4617,10 +4632,10 @@ This confirmation code will expire at $4.',
 'scarytranscludetoolong'           => '[URL is too long]',
 
 # Delete conflict
-'deletedwhileediting'      => "<strong>Warning:</strong> This page was deleted after you started editing!",
-'confirmrecreate'          => "User [[User:$1|$1]] ([[User talk:$1|talk]]) deleted this page after you started editing with reason:
+'deletedwhileediting'      => '<strong>Warning:</strong> This page was deleted after you started editing!',
+'confirmrecreate'          => 'User [[User:$1|$1]] ([[User talk:$1|talk]]) deleted this page after you started editing with reason:
 : <em>$2</em>
-Please confirm that you really want to recreate this page.",
+Please confirm that you really want to recreate this page.',
 'confirmrecreate-noreason' => 'User [[User:$1|$1]] ([[User talk:$1|talk]]) deleted this page after you started editing. Please confirm that you really want to recreate this page.',
 'recreate'                 => 'Recreate',
 
@@ -4656,10 +4671,11 @@ Please confirm that you really want to recreate this page.",
 'imgmultigo'       => 'Go!',
 'imgmultigoto'     => 'Go to page $1',
 
-'img-lang-opt' => '$2 ($1)',
+# Language selector for translatable SVGs
+'img-lang-opt'     => '$2 ($1)', # only translate this message to other languages if you have to change it
 'img-lang-default' => '(default language)',
-'img-lang-info' => 'Render this image in $1. $2',
-'img-lang-go' => 'Go',
+'img-lang-info'    => 'Render this image in $1. $2',
+'img-lang-go'      => 'Go',
 
 # Table pager
 'ascending_abbrev'         => 'asc',
@@ -4849,20 +4865,20 @@ You can also [[Special:EditWatchlist|use the standard editor]].',
 'version-parser-function-hooks'         => 'Parser function hooks',
 'version-hook-name'                     => 'Hook name',
 'version-hook-subscribedby'             => 'Subscribed by',
-'version-version'                       => '($1)',
+'version-version'                       => '($1)', # only translate this message to other languages if you have to change it
 'version-svn-revision'                  => 'r$1', # only translate this message to other languages if you have to change it
 'version-license'                       => 'MediaWiki License',
-'version-license-title'                 => 'License for $1',
-'version-license-not-found'             => 'No detailed license information was found for this extension.',
-'version-credits-title'                 => 'Credits for $1',
-'version-credits-not-found'             => 'No detailed credits information was found for this extension.',
 'version-ext-license'                   => 'License',
 'version-ext-colheader-name'            => 'Extension',
 'version-ext-colheader-version'         => 'Version',
 'version-ext-colheader-license'         => 'License',
 'version-ext-colheader-description'     => 'Description',
 'version-ext-colheader-credits'         => 'Authors',
-'version-poweredby-credits'             => "This wiki is powered by <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.",
+'version-license-title'                 => 'License for $1',
+'version-license-not-found'             => 'No detailed license information was found for this extension.',
+'version-credits-title'                 => 'Credits for $1',
+'version-credits-not-found'             => 'No detailed credits information was found for this extension.',
+'version-poweredby-credits'             => 'This wiki is powered by <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.',
 'version-poweredby-others'              => 'others',
 'version-poweredby-translators'         => 'translatewiki.net translators',
 'version-credits-summary'               => 'We would like to recognize the following persons for their contribution to [[Special:Version|MediaWiki]].',
@@ -4899,8 +4915,8 @@ You should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU Gen
 'redirect-lookup'     => 'Lookup:',
 'redirect-value'      => 'Value:',
 'redirect-user'       => 'User ID',
-'redirect-revision'   => 'Page revision',
 'redirect-page'       => 'Page ID',
+'redirect-revision'   => 'Page revision',
 'redirect-file'       => 'File name',
 'redirect-not-exists' => 'Value not found',
 
@@ -4989,13 +5005,13 @@ You should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU Gen
 'dberr-cachederror' => 'This is a cached copy of the requested page, and may not be up to date.',
 
 # HTML forms
-'htmlform-invalid-input'       => 'There are problems with some of your input',
+'htmlform-invalid-input'       => 'There are problems with some of your input.',
 'htmlform-select-badoption'    => 'The value you specified is not a valid option.',
 'htmlform-int-invalid'         => 'The value you specified is not an integer.',
 'htmlform-float-invalid'       => 'The value you specified is not a number.',
-'htmlform-int-toolow'          => 'The value you specified is below the minimum of $1',
-'htmlform-int-toohigh'         => 'The value you specified is above the maximum of $1',
-'htmlform-required'            => 'This value is required',
+'htmlform-int-toolow'          => 'The value you specified is below the minimum of $1.',
+'htmlform-int-toohigh'         => 'The value you specified is above the maximum of $1.',
+'htmlform-required'            => 'This value is required.',
 'htmlform-submit'              => 'Submit',
 'htmlform-reset'               => 'Undo changes',
 'htmlform-selectorother-other' => 'Other',
@@ -5121,6 +5137,7 @@ Otherwise, you can use the easy form below. Your comment will be added to the pa
 'api-error-overwrite'                     => 'Overwriting an existing file is not allowed.',
 'api-error-stashfailed'                   => 'Internal error: Server failed to store temporary file.',
 'api-error-publishfailed'                 => 'Internal error: Server failed to publish temporary file.',
+'api-error-stasherror'                    => 'There was an error while uploading the file to stash.',
 'api-error-timeout'                       => 'The server did not respond within the expected time.',
 'api-error-unclassified'                  => 'An unknown error occurred.',
 'api-error-unknown-code'                  => 'Unknown error: "$1".',
@@ -5129,7 +5146,6 @@ Otherwise, you can use the easy form below. Your comment will be added to the pa
 'api-error-unknownerror'                  => 'Unknown error: "$1".',
 'api-error-uploaddisabled'                => 'Uploading is disabled on this wiki.',
 'api-error-verification-error'            => 'This file might be corrupt, or have the wrong extension.',
-'api-error-stasherror'                    => 'There was an error while uploading the file to stash.',
 
 # Durations
 'duration-seconds'   => '$1 {{PLURAL:$1|second|seconds}}',
@@ -5164,7 +5180,7 @@ Otherwise, you can use the easy form below. Your comment will be added to the pa
 'limitreport-expensivefunctioncount'       => 'Expensive parser function count',
 'limitreport-expensivefunctioncount-value' => '$1/$2', # only translate this message to other languages if you have to change it
 
-# ExpandTemplates
+# Special:ExpandTemplates
 'expandtemplates'                   => 'Expand templates',
 'expand_templates_intro'            => 'This special page takes text and expands all templates in it recursively.
 It also expands supported parser functions like
@@ -5182,4 +5198,5 @@ In fact, it expands pretty much everything in double-braces.',
 'expand_templates_generate_xml'     => 'Show XML parse tree',
 'expand_templates_generate_rawhtml' => 'Show raw HTML',
 'expand_templates_preview'          => 'Preview',
+
 );
index 40888f6..e2405f4 100644 (file)
@@ -868,6 +868,9 @@ Bonvolu ĝisatendi $1 antaŭ reprovi.',
 'suspicious-userlogout' => 'Via peto por elsaluti estis malpermesita, ĉar verŝajne ĝi estis sendita de trompita retumilo aŭ kaŝiĝanta prokura servilo.',
 'createacct-another-realname-tip' => 'La vera nomo estas nenecesa.
 Se vi decidas indiki ĝin, ĝi estos uzata por montri atribuadon de viaj kontribuoj.',
+'pt-login' => 'Ensaluti',
+'pt-createaccount' => 'Krei novan konton',
+'pt-userlogout' => 'Elsaluti',
 
 # Email sending
 'php-mail-error-unknown' => 'Nekonata eraro en la funkcio mail() de PHP',
@@ -876,7 +879,7 @@ Se vi decidas indiki ĝin, ĝi estos uzata por montri atribuadon de viaj kontrib
 
 # Change password dialog
 'changepassword' => 'Ŝanĝi pasvorton',
-'resetpass_announce' => 'Vi ensalutis kun provizora retpoŝtita pasvorto. Por kompleti ensalutadon, vi devas fari novan pasvorton ĉi tie:',
+'resetpass_announce' => 'Por kompleti ensaluton vi devas agordi novan pasvorton.',
 'resetpass_text' => '<!-- Aldonu tekston ĉi tien -->',
 'resetpass_header' => 'Ŝanĝi kontan pasvorton',
 'oldpassword' => 'Malnova pasvorto',
@@ -884,12 +887,15 @@ Se vi decidas indiki ĝin, ĝi estos uzata por montri atribuadon de viaj kontrib
 'retypenew' => 'Retajpi novan pasvorton',
 'resetpass_submit' => 'Fari pasvorton kaj ensaluti',
 'changepassword-success' => 'Via pasvorto estis sukcese ŝanĝita!',
+'changepassword-throttled' => 'Vi tro ofte provis ensaluti al ĉi tiu konto.
+Bonvolu atendi $1 antaŭ ol reprovi.',
 'resetpass_forbidden' => 'Pasvortoj ne estas ŝanĝeblaj',
 'resetpass-no-info' => 'Vi devas ensaluti por atingi ĉi tiun paĝon rekte.',
 'resetpass-submit-loggedin' => 'Ŝanĝi pasvorton',
 'resetpass-submit-cancel' => 'Nuligi',
 'resetpass-wrong-oldpass' => 'Malvalida provizora aŭ nuna pasvorto.
 Vi eble jam ŝanĝis vian pasvorton aŭ petis novan provizoran pasvorton.',
+'resetpass-recycled' => 'Bonvolu agordi vian novan pasvorton, kiu estu alia ol via nuntempa pasvorto.',
 'resetpass-temp-password' => 'Provizora pasvorto:',
 'resetpass-abort-generic' => 'Ŝanĝo de pasvorto estis nuligita per kromprogramo.',
 
@@ -1719,15 +1725,28 @@ indekso pro troŝarĝita servilo. Intertempe, vi povas serĉi per <i>guglo</i> a
 'recentchanges-label-minor' => 'Ĉi tiu estas eta redakto',
 'recentchanges-label-bot' => 'Ĉi tiu redakto estis farita per roboto.',
 'recentchanges-label-unpatrolled' => 'Ĉi tiu redakto ne jam estis patrolata.',
+'recentchanges-legend-heading' => "'''Klarigo:'''",
 'recentchanges-legend-newpage' => '(vidu ankaŭ [[Special:NewPages|liston de novaj paĝoj]])',
 'rcnotefrom' => "Jen la ŝanĝoj ekde '''$2''' (lastaj ĝis '''$1''').",
 'rclistfrom' => 'Montri novajn ŝanĝojn ekde "$1"',
 'rcshowhideminor' => '$1 redaktetojn',
+'rcshowhideminor-show' => 'Montri',
+'rcshowhideminor-hide' => 'Kaŝi',
 'rcshowhidebots' => '$1 robotojn',
+'rcshowhidebots-show' => 'Montri',
+'rcshowhidebots-hide' => 'Kaŝi',
 'rcshowhideliu' => '$1 registriĝintojn',
+'rcshowhideliu-show' => 'Montri',
+'rcshowhideliu-hide' => 'Kaŝi',
 'rcshowhideanons' => '$1 anonimajn redaktojn',
+'rcshowhideanons-show' => 'Montri',
+'rcshowhideanons-hide' => 'Kaŝi',
 'rcshowhidepatr' => '$1 patrolitajn redaktojn',
+'rcshowhidepatr-show' => 'Montri',
+'rcshowhidepatr-hide' => 'Kaŝi',
 'rcshowhidemine' => '$1 miajn redaktojn',
+'rcshowhidemine-show' => 'Montri',
+'rcshowhidemine-hide' => 'Kaŝi',
 'rclinks' => 'Montri $1 lastajn ŝanĝojn dum la $2 lastaj tagoj.<br />$3',
 'diff' => 'malsamoj',
 'hist' => 'historio',
@@ -1853,6 +1872,7 @@ Se vi ankoraŭ volas alŝuti vian dosieron, bonvolu retroigi kaj uzi novan nomon
 'uploaddisabledtext' => 'Alŝutado de dosieroj estas malebligita.',
 'php-uploaddisabledtext' => 'Dosiera alŝutado estas malŝalta en PHP. Bonvolu kontroli la preferon file_uploads.',
 'uploadscripted' => 'HTML-aĵo aŭ skriptokodaĵo troviĝas en tiu ĉi tiu dosiero, kiun TTT-foliumilo eble interpretus erare.',
+'uploadinvalidxml' => 'Ne eblas interpreti la XML-sintakson en la alŝutita dosiero',
 'uploadvirus' => 'Viruso troviĝas en la dosiero! Detaloj: $1',
 'uploadjava' => 'La dosiero estas ZIP-dosiero kiu enhavas .class-dosieron de Java.
 Alŝutante Java-dosieron estas malpermesita, ĉar ili povas kaŭzi sekureco-limigojn esti preterpasitaj.',
@@ -2196,6 +2216,7 @@ Bonvolu kontroli aliajn ligilojn al la ŝablonoj antaŭ ol forigi ilin.',
 'mostrevisions' => 'Artikoloj kun la plej multaj versioj',
 'prefixindex' => 'Ĉiuj paĝoj kun prefikso',
 'prefixindex-namespace' => 'Ĉiuj paĝoj kun prefikso ($1 nomspaco)',
+'prefixindex-strip' => 'Ne montri prefikson en listo',
 'shortpages' => 'Mallongaj paĝoj',
 'longpages' => 'Longaj paĝoj',
 'deadendpages' => 'Paĝoj sen interna ligilo',
@@ -2203,6 +2224,7 @@ Bonvolu kontroli aliajn ligilojn al la ŝablonoj antaŭ ol forigi ilin.',
 'protectedpages' => 'Protektitaj paĝoj',
 'protectedpages-indef' => 'Nur ĉiamaj protektaĵoj',
 'protectedpages-cascade' => 'Nur kaskadaj protektoj',
+'protectedpages-noredirect' => 'Kaŝi alidirektilojn',
 'protectedpagesempty' => 'Neniuj paĝoj estas momente protektitaj kun ĉi tiuj parametroj.',
 'protectedpages-timestamp' => 'Tempindiko',
 'protectedpages-page' => 'Paĝo',
@@ -2948,6 +2970,7 @@ se vi volus kontribui al la komuna MediaWiki-asimilado.',
 'allmessages-prefix' => 'Filtri laŭ prefikso:',
 'allmessages-language' => 'Lingvo:',
 'allmessages-filter-submit' => 'Ek!',
+'allmessages-filter-translate' => 'Traduki',
 
 # Thumbnails
 'thumbnail-more' => 'Pligrandigi',
@@ -3814,6 +3837,10 @@ Bonvolu konfirmi ke vi ja volas rekrei la paĝon.',
 'imgmultigo' => 'Ek!',
 'imgmultigoto' => 'Iri al paĝo $1',
 
+# Language selector for translatable SVGs
+'img-lang-default' => '(defaŭlta lingvo)',
+'img-lang-go' => 'Ek',
+
 # Table pager
 'ascending_abbrev' => 'sprn',
 'descending_abbrev' => 'subn',
@@ -3949,6 +3976,13 @@ Vi povas ankaŭ [[Special:EditWatchlist|redakti norme]].',
 'version-hook-subscribedby' => 'Abonita de',
 'version-version' => '($1)',
 'version-license' => 'Permesilo de MediaWiki',
+'version-ext-license' => 'Permesilo',
+'version-ext-colheader-version' => 'Versio',
+'version-ext-colheader-license' => 'Permesilo',
+'version-ext-colheader-description' => 'Priskribo',
+'version-ext-colheader-credits' => 'Aŭtoroj',
+'version-license-title' => 'Permesilo por $1',
+'version-credits-title' => 'Agnosko por $1',
 'version-poweredby-credits' => "Ĉi tiu vikio funkcias per '''[https://www.mediawiki.org/ MediaWiki]''', aŭtorrajto ©&thinsp;2001–$1 $2.",
 'version-poweredby-others' => 'aliaj',
 'version-poweredby-translators' => 'tradukantoj de translatewiki.net',
@@ -3966,10 +4000,12 @@ Oni devis doni al vi [{{SERVER}}{{SCRIPTPATH}}/COPYING ekzempleron de la GNU Gen
 'version-entrypoints-header-url' => 'Retadreso',
 
 # Special:Redirect
+'redirect-legend' => 'Alidirektilo al dosiero aŭ paĝo',
 'redirect-submit' => 'Ek',
 'redirect-lookup' => 'Traserĉi:',
 'redirect-value' => 'Valoro:',
 'redirect-user' => 'Salutnomo',
+'redirect-page' => 'Paĝa identigo',
 'redirect-revision' => 'Revizio de la paĝo',
 'redirect-file' => 'Dosiernomo',
 'redirect-not-exists' => 'Valoro ne trovita',
@@ -3987,6 +4023,7 @@ Oni devis doni al vi [{{SERVER}}{{SCRIPTPATH}}/COPYING ekzempleron de la GNU Gen
 
 # Special:SpecialPages
 'specialpages' => 'Specialaj paĝoj',
+'specialpages-note-top' => 'Klarigo',
 'specialpages-note' => '* Normaj specialaj paĝoj.
 * <span class="mw-specialpagerestricted">Limigitaj specialaj paĝoj.</span>',
 'specialpages-group-maintenance' => 'Raportoj pri prizorgado',
@@ -4186,8 +4223,12 @@ Aŭ vi povas uzi la facilan formularon sube. Via komento estos aldonita al la pa
 'rotate-comment' => 'Bildo pivotita $1 {{PLURAL:$1|gradon|gradojn}} dekstren',
 
 # Limit report
+'limitreport-cputime' => 'Uzo de procesora tempo',
 'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekundo|sekundoj}}',
+'limitreport-walltime' => 'Uzo de reala tempo',
 'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekundo|sekundoj}}',
+'limitreport-ppvisitednodes' => 'Nombro da nodoj vizititaj de antaŭtraktilo',
+'limitreport-ppgeneratednodes' => 'Nombro da nodoj kreitaj de antaŭtraktilo',
 'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|bitoko|bitokoj}}',
 'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|bitoko|bitokoj}}',
 
@@ -4201,12 +4242,12 @@ Aŭ vi povas uzi la facilan formularon sube. Via komento estos aldonita al la pa
 'expand_templates_input' => 'Enigita teksto:',
 'expand_templates_output' => 'Rezulto',
 'expand_templates_xml_output' => 'XML-eligo',
+'expand_templates_html_output' => 'Kruda eliga HTML',
 'expand_templates_ok' => 'Ek!',
 'expand_templates_remove_comments' => 'Forigi komentojn',
 'expand_templates_remove_nowiki' => 'Nuligi <nowiki> etikedojn en rezulto',
 'expand_templates_generate_xml' => 'Montri XML-sintaksarbon',
+'expand_templates_generate_rawhtml' => 'Montri krudan HTML-n',
 'expand_templates_preview' => 'Antaŭrigardo',
 
-# Unknown messages
-'uploadinvalidxml' => 'Ne eblas interpreti la XML-sintakson en la alŝutita dosiero',
 );
index 21d63d7..ad82636 100644 (file)
@@ -26,6 +26,7 @@
  * @author Candalua
  * @author Capmo
  * @author Carlitosag
+ * @author Carlosz22
  * @author Cerealito
  * @author Ciencia Al Poder
  * @author Clerc
@@ -94,6 +95,7 @@
  * @author Sethladan
  * @author Shirayuki
  * @author Spacebirdy
+ * @author Sporeunai
  * @author Stephensuleeman
  * @author Technorum
  * @author The Evil IP address
@@ -315,7 +317,7 @@ $magicWords = array(
        'img_link'                  => array( '1', 'vínculo=$1', 'vinculo=$1', 'enlace=$1', 'link=$1' ),
        'sitename'                  => array( '1', 'NOMBREDELSITIO', 'SITENAME' ),
        'ns'                        => array( '0', 'EN:', 'NS:' ),
-       'localurl'                  => array( '0', 'URLLOCAL', 'LOCALURL:' ),
+       'localurl'                  => array( '0', 'URLLOCAL:', 'LOCALURL:' ),
        'localurle'                 => array( '0', 'URLLOCALC:', 'LOCALURLE:' ),
        'server'                    => array( '0', 'SERVIDOR', 'SERVER' ),
        'servername'                => array( '0', 'NOMBRESERVIDOR', 'SERVERNAME' ),
@@ -340,11 +342,11 @@ $magicWords = array(
        'fullurle'                  => array( '0', 'URLCOMPLETAC:', 'FULLURLE:' ),
        'canonicalurl'              => array( '0', 'URLCANONICA:', 'CANONICALURL:' ),
        'canonicalurle'             => array( '0', 'URLCANONICAC:', 'CANONICALURLE:' ),
-       'lcfirst'                   => array( '0', 'PRIMEROMINUS;', 'PRIMEROMINÚS:', 'LCFIRST:' ),
-       'ucfirst'                   => array( '0', 'PRIMEROMAYUS;', 'PRIMEROMAYÚS:', 'UCFIRST:' ),
+       'lcfirst'                   => array( '0', 'PRIMEROMINUS:', 'PRIMEROMINÚS:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'PRIMEROMAYUS:', 'PRIMEROMAYÚS:', 'UCFIRST:' ),
        'lc'                        => array( '0', 'MINUS:', 'MINÚS:', 'LC:' ),
        'uc'                        => array( '0', 'MAYUS:', 'MAYÚS:', 'UC:' ),
-       'raw'                       => array( '0', 'SINFORMATO', 'SINPUNTOS', 'RAW:' ),
+       'raw'                       => array( '0', 'SINFORMATO:', 'SINPUNTOS:', 'RAW:' ),
        'displaytitle'              => array( '1', 'MOSTRARTÍTULO', 'MOSTRARTITULO', 'DISPLAYTITLE' ),
        'rawsuffix'                 => array( '1', 'SF', 'R' ),
        'newsectionlink'            => array( '1', '__VINCULARANUEVASECCION__', '__ENLACECREARSECCIÓN__', '__NEWSECTIONLINK__' ),
@@ -422,7 +424,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Recibir copias de los correos que envío a otros usuarios',
 'tog-diffonly' => "No mostrar bajo las ''diferencias'' el contenido de la página",
 'tog-showhiddencats' => 'Mostrar las categorías escondidas',
-'tog-noconvertlink' => 'Desactivar la conversión de título de enlace',
 'tog-norollbackdiff' => 'Omitir la diferencia después de revertir',
 'tog-useeditwarning' => 'Advertirme cuando abandone una página editada con cambios sin grabar',
 'tog-prefershttps' => 'Utiliza una conexión segura siempre que haya iniciado una sesión',
@@ -958,7 +959,7 @@ Para terminar la sesión, debes establecer una nueva contraseña aquí:',
 'resetpass-temp-password' => 'Contraseña temporal:',
 'resetpass-abort-generic' => 'Una extensión ha cancelado el cambio de la contraseña.',
 'resetpass-expired' => 'Tu contraseña ha caducado. Por favor, establece una nueva contraseña para iniciar sesión.',
-'resetpass-expired-soft' => 'Tu contraseña ha expirado y necesita ser restablecida. Elije una nueva contraseña ahora, o haz clic en cancelar para restablecerla más tarde.',
+'resetpass-expired-soft' => 'Su contraseña ha caducado y necesita reajustarse. Elija una nueva contraseña ahora, o haga clic en "{{int:resetpass-enviar-cancelar}}" para restaurarla más adelante.',
 
 # Special:PasswordReset
 'passwordreset' => 'Restablecimiento de contraseña',
@@ -1810,14 +1811,26 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
 'recentchanges-label-plusminus' => 'El tamaño de la página cambió esta cantidad de bytes',
 'recentchanges-legend-heading' => "'''Leyenda:'''",
 'recentchanges-legend-newpage' => '(véase también la [[Special:NewPages|lista de páginas nuevas]])',
-'rcnotefrom' => 'A continuación se muestran los cambios desde <b>$2</b> (hasta <b>$1</b>).',
+'rcnotefrom' => 'A continuación se presentan los cambios desde <strong> $2 </strong> (hasta <strong> $1 </strong> se muestra).',
 'rclistfrom' => 'Mostrar nuevos cambios desde $1',
 'rcshowhideminor' => '$1 ediciones menores',
+'rcshowhideminor-show' => 'Mostrar',
+'rcshowhideminor-hide' => 'Ocultar',
 'rcshowhidebots' => '$1 bots',
+'rcshowhidebots-show' => 'Mostrar',
+'rcshowhidebots-hide' => 'Ocultar',
 'rcshowhideliu' => '$1 usuarios registrados',
+'rcshowhideliu-show' => 'Mostrar',
+'rcshowhideliu-hide' => 'Ocultar',
 'rcshowhideanons' => '$1 usuarios anónimos',
+'rcshowhideanons-show' => 'Mostrar',
+'rcshowhideanons-hide' => 'Ocultar',
 'rcshowhidepatr' => '$1 ediciones patrulladas',
+'rcshowhidepatr-show' => 'Mostrar',
+'rcshowhidepatr-hide' => 'Ocultar',
 'rcshowhidemine' => '$1 mis ediciones',
+'rcshowhidemine-show' => 'Mostrar',
+'rcshowhidemine-hide' => 'Ocultar',
 'rclinks' => 'Ver los últimos $1 cambios en los últimos $2 días.<br />$3',
 'diff' => 'dif',
 'hist' => 'hist',
@@ -1940,6 +1953,8 @@ Si todavía quiere subir su archivo, por favor, regrese a la página anterior y
 'uploaddisabledtext' => 'No es posible subir archivos.',
 'php-uploaddisabledtext' => 'La subida de archivos está deshabilitada en PHP. Por favor compruebe <code>file_uploads</code> en php.ini.',
 'uploadscripted' => 'Este archivo contiene script o código HTML que puede ser interpretado erróneamente por un navegador web.',
+'uploadscriptednamespace' => "Este archivo SVG contiene un espacio de nombre no permitido '$1'",
+'uploadinvalidxml' => 'No se pudo analizar el XML del archivo cargado.',
 'uploadvirus' => '¡El archivo contiene un virus!
 Detalles: $1',
 'uploadjava' => 'El archivo es un ZIP que contiene un archivo .class de Java.
@@ -2311,7 +2326,7 @@ Las entradas <del>tachadas</del> han sido resueltas.',
 'deadendpagestext' => 'Las siguientes páginas no enlazan a otras páginas de {{SITENAME}}.',
 'protectedpages' => 'Páginas protegidas',
 'protectedpages-indef' => 'Sólo protecciones indefinidas',
-'protectedpages-summary' => 'Esta página enumera las páginas existentes que actualmente están protegidas. Para obtener una lista de títulos que están protegidos desde su creación, véase [[{{#special: ProtectedTitles}}]].',
+'protectedpages-summary' => 'Esta página enumera las páginas existentes que actualmente están protegidas. Para obtener una lista de títulos que están protegidos desde su creación, véase [[{{#special:ProtectedTitles}}]].',
 'protectedpages-cascade' => 'Sólo protecciones en cascada',
 'protectedpages-noredirect' => 'Ocultar redirecciones',
 'protectedpagesempty' => 'Actualmente no hay ninguna página protegida con esos parámetros.',
@@ -2324,7 +2339,7 @@ Las entradas <del>tachadas</del> han sido resueltas.',
 'protectedpages-unknown-timestamp' => 'Desconocido',
 'protectedpages-unknown-performer' => 'Usuario desconocido',
 'protectedtitles' => 'Títulos protegidos',
-'protectedtitles-summary' => 'Esta página enumera títulos que actualmente están protegidos desde su creación. Para una lista de las páginas existentes que están protegidos, véase [[{{#special: ProtectedPages}}]].',
+'protectedtitles-summary' => 'Esta página enumera títulos que actualmente están protegidos desde su creación. Para una lista de las páginas existentes que están protegidos, véase [[{{#special:ProtectedPages}}]].',
 'protectedtitlesempty' => 'Actualmente no existen entradas protegidas con esos parámetros.',
 'listusers' => 'Lista de usuarios',
 'listusers-editsonly' => 'Muestra sólo usuarios con ediciones',
@@ -2770,8 +2785,10 @@ $1',
 'sp-contributions-blocked-notice-anon' => 'Esta dirección IP se encuentra actualmente bloqueada.
 A continuación se muestra la última entrada del registro de bloqueos para mayor referencia.',
 'sp-contributions-search' => 'Buscar contribuciones',
+'sp-contributions-suppresslog' => 'Contribuciones borradas de usuario',
 'sp-contributions-username' => 'Dirección IP o nombre de usuario:',
 'sp-contributions-toponly' => 'Solo mostrar últimas ediciones de página',
+'sp-contributions-newonly' => 'Mostrar solo ediciones que son creaciones de páginas',
 'sp-contributions-submit' => 'Buscar',
 
 # What links here
@@ -4313,6 +4330,4 @@ También expande las funciones sintácticas como <code><nowiki>{{</nowiki>#langu
 'expand_templates_generate_rawhtml' => 'Mostrar HTML en crudo',
 'expand_templates_preview' => 'Previsualización',
 
-# Unknown messages
-'uploadinvalidxml' => 'No se pudo analizar el XML del archivo cargado.',
 );
index 417d85e..b145235 100644 (file)
@@ -18,6 +18,7 @@
  * @author KaidoKikkas
  * @author KalmerE.
  * @author Ker
+ * @author Kristian.kankainen
  * @author Kyng
  * @author Morel
  * @author Nemo bis
@@ -448,7 +449,7 @@ $messages = array(
 'morenotlisted' => 'See loend pole täielik.',
 'mypage' => 'Minu lehekülg',
 'mytalk' => 'Arutelu',
-'anontalk' => 'Selle IP-aadressi artuelu',
+'anontalk' => 'Selle IP-aadressi arutelu',
 'navigation' => 'Navigeerimine',
 'and' => '&#32;ja',
 
@@ -838,6 +839,9 @@ Palun oota $1, enne kui uuesti proovid.',
 'suspicious-userlogout' => 'Sinu väljalogimiskatse nurjus, sest see näis olevat katkise veebilehitseja või puhverserveri saadetud.',
 'createacct-another-realname-tip' => 'Tegelik nimi on valikuline.
 Kui otsustad selle sisestada, kasutatakse seda kasutaja töö temale omistamiseks.',
+'pt-login' => 'Logi sisse',
+'pt-createaccount' => 'Loo konto',
+'pt-userlogout' => 'Logi välja',
 
 # Email sending
 'php-mail-error-unknown' => 'Tundmatu tõrge PHP funktsioonis mail().',
@@ -846,8 +850,7 @@ Kui otsustad selle sisestada, kasutatakse seda kasutaja töö temale omistamisek
 
 # Change password dialog
 'changepassword' => 'Muuda parool',
-'resetpass_announce' => 'Logisid sisse e-posti teel saadud ajutise koodiga.
-Sisselogimise lõpetamiseks pead siia uue parooli sisestama:',
+'resetpass_announce' => 'Pead määrama uue parooli, et sisselogimine lõpule viia.',
 'resetpass_text' => '<!-- Lisa tekst siia -->',
 'resetpass_header' => 'Konto parooli muutmine',
 'oldpassword' => 'Vana parool:',
@@ -864,8 +867,13 @@ Palun oota $1, enne kui uuesti proovid.',
 'resetpass-submit-cancel' => 'Loobu',
 'resetpass-wrong-oldpass' => 'Vigane ajutine või praegune salasõna.
 Võib-olla oled juba edukalt muudnud oma salasõna või taotlenud uut ajutist salasõna.',
+'resetpass-recycled' => 'Palun vali uus salasõna, mis erineb praegusest.',
+'resetpass-temp-emailed' => 'Logisid sisse e-posti teel saadud ajutise koodiga.
+Et sisselogimine lõpule viia, pead määrama siin uue parooli:',
 'resetpass-temp-password' => 'Ajutine parool:',
 'resetpass-abort-generic' => 'Tarkvaralisa on paroolimuudatuse abortinud.',
+'resetpass-expired' => 'Sinu parool on iganenud. Palun määra uus parool, et sisse logida.',
+'resetpass-expired-soft' => 'Sinu parool on iganenud ja tuleb uuesti määrata. Palun vali kohe uus parool või klõpsa "{{int:resetpass-submit-cancel}}", et määrata see hiljem.',
 
 # Special:PasswordReset
 'passwordreset' => 'Parooli lähtestamine',
@@ -1710,14 +1718,26 @@ See teave on avalik.',
 'recentchanges-label-unpatrolled' => 'Seda muudatust ei ole veel kontrollitud',
 'recentchanges-label-plusminus' => 'Lehekülje suuruse muutus baitides',
 'recentchanges-legend-newpage' => '(vaata ka [[Special:NewPages|uute lehekülgede loendit]])',
-'rcnotefrom' => "Allpool on toodud muudatused alates: '''$2''' (näidatakse kuni '''$1''' muudatust)",
+'rcnotefrom' => 'Allpool on toodud muudatused alates: <strong>$2</strong> (näidatakse kuni <strong>$1</strong> muudatust)',
 'rclistfrom' => 'Näita muudatusi alates: $1',
 'rcshowhideminor' => 'Pisiparandused ($1)',
+'rcshowhideminor-show' => 'näita',
+'rcshowhideminor-hide' => 'peida',
 'rcshowhidebots' => 'Robotid ($1)',
+'rcshowhidebots-show' => 'näita',
+'rcshowhidebots-hide' => 'peida',
 'rcshowhideliu' => 'Registreeritud kasutajad ($1)',
+'rcshowhideliu-show' => 'näita',
+'rcshowhideliu-hide' => 'peida',
 'rcshowhideanons' => 'Anonüümsed kasutajad ($1)',
+'rcshowhideanons-show' => 'näita',
+'rcshowhideanons-hide' => 'peida',
 'rcshowhidepatr' => 'Kontrollitud muudatused ($1)',
+'rcshowhidepatr-show' => 'näita',
+'rcshowhidepatr-hide' => 'peida',
 'rcshowhidemine' => 'Minu parandused ($1)',
+'rcshowhidemine-show' => 'näita',
+'rcshowhidemine-hide' => 'peida',
 'rclinks' => 'Näita viimast $1 muudatust viimase $2 päeva jooksul<br />$3',
 'diff' => 'erin',
 'hist' => 'ajal',
@@ -1847,6 +1867,8 @@ Enne kui jätkad uuesti üleslaadimisega, peaksid paluma olukorda hinnata kellel
 'php-uploaddisabledtext' => 'Failide üleslaadmine on PHP seadetes keelatud.
 Palun vaata <code>file_uploads</code> sätet.',
 'uploadscripted' => 'See fail sisaldab HTML- või skriptikoodi, mida veebilehitseja võib valesti kuvada.',
+'uploadscriptednamespace' => 'See SVG-fail sisaldab keelatud nimeruumi "$1".',
+'uploadinvalidxml' => 'Üleslaaditud failis sisalduvat XMLi ei õnnestunud liigendada.',
 'uploadvirus' => 'Fail sisaldab viirust! Täpsemalt: $1',
 'uploadjava' => 'See fail on ZIP-fail, milles on Java .class-fail.
 Java failide üleslaadimine on keelatud, kuna nende kaudu võidaks turvapiiranguist mööda minna.',
@@ -2188,6 +2210,7 @@ Igal real on ära toodud esimene ja teine ümbersuunamisleht ning samuti teise 
 'deadendpagestext' => 'Järgmised leheküljed ei viita ühelegi teisele {{GRAMMAR:genitive|{{SITENAME}}}} leheküljele.',
 'protectedpages' => 'Kaitstud leheküljed',
 'protectedpages-indef' => 'Ainult määramata ajani kaitstud',
+'protectedpages-summary' => 'Siin on loetletud olemasolevad leheküljed, mis on praegu kaitstud. Loomise eest kaitstud pealkirjade loendi leiad leheküljelt [[{{#special:ProtectedTitles}}]].',
 'protectedpages-cascade' => 'Ainult kaskaadkaitsega',
 'protectedpages-noredirect' => 'Peida ümbersuunamised',
 'protectedpagesempty' => 'Selliste parameetritega ei ole praegu ühtegi lehekülge kaitstud.',
@@ -2200,6 +2223,7 @@ Igal real on ära toodud esimene ja teine ümbersuunamisleht ning samuti teise 
 'protectedpages-unknown-timestamp' => 'Teadmata',
 'protectedpages-unknown-performer' => 'Teadmata kasutaja',
 'protectedtitles' => 'Kaitstud pealkirjad',
+'protectedtitles-summary' => 'Siin on loetletud pealkirjad, mis on praegu loomise eest kaitstud. Olemasolevate kaitstud lehekülgede loendi leiad leheküljelt [[{{#special:ProtectedPages}}]].',
 'protectedtitlesempty' => 'Hetkel pole ükski pealkiri kaitstud.',
 'listusers' => 'Kasutajad',
 'listusers-editsonly' => 'Näita vaid kasutajaid, kes on teinud muudatusi',
@@ -2650,8 +2674,10 @@ $1',
 'sp-contributions-blocked-notice-anon' => 'See IP-aadress on parajasti blokeeritud.
 Allpool on toodud viimane blokeerimislogi sissekanne:',
 'sp-contributions-search' => 'Kaastöö otsimine',
+'sp-contributions-suppresslog' => 'varjatud kaastöö',
 'sp-contributions-username' => 'IP-aadress või kasutajanimi:',
 'sp-contributions-toponly' => 'Ainult uusimad redaktsioonid',
+'sp-contributions-newonly' => 'Näita ainult uute lehekülgedega alustamist',
 'sp-contributions-submit' => 'Otsi',
 
 # What links here
@@ -4167,6 +4193,4 @@ Samuti hõrendab see parserifunktsioonid nagu
 'expand_templates_generate_rawhtml' => 'Näita toor-HTMLi',
 'expand_templates_preview' => 'Eelvaade',
 
-# Unknown messages
-'uploadinvalidxml' => 'Üleslaaditud failis sisalduvat XMLi ei õnnestunud liigendada.',
 );
index f717947..06891a3 100644 (file)
@@ -291,7 +291,7 @@ $messages = array(
 'vector-action-unprotect' => 'Babesa aldatu',
 'vector-view-create' => 'Sortu',
 'vector-view-edit' => 'Aldatu',
-'vector-view-history' => 'Historia ikusi',
+'vector-view-history' => 'Ikusi historia',
 'vector-view-view' => 'Irakurri',
 'vector-view-viewsource' => 'Kodea ikusia',
 'actions' => 'Ekintzak',
@@ -862,8 +862,8 @@ Hau batzuetan gertatzen da buggyan oinarritutako web proxy zerbitzua erabiltzean
 'edit_form_incomplete' => "'''Aldaketa formularioaren atal batzuk ez dira iritsi zerbitzarira; bi aldiz ziurtatu zure aldaketak osorik daudela eta berriro saiatu.'''",
 'editing' => '«$1» aldatzen',
 'creating' => '$1 sortzen',
-'editingsection' => '$1 aldatzen (atala)',
-'editingcomment' => '$1 aldatzen (atal berria)',
+'editingsection' => '«$1» aldatzen (atala)',
+'editingcomment' => '«$1» aldatzen (atal berria)',
 'editconflict' => 'Aldaketa gatazka: $1',
 'explainconflict' => "Zu orrialdea aldatzen hasi ondoren beste norbaitek ere aldaketak egin ditu.
 Goiko testu koadroan ikus daiteke orrialdeak uneotan duen edukia.
@@ -1454,7 +1454,7 @@ Informazio hau publikoa da.',
 'action-writeapi' => 'idazteko APIa erabili',
 'action-delete' => 'orrialde hau ezabatu',
 'action-deleterevision' => 'berrikuspen hau ezabatu',
-'action-deletedhistory' => 'orrialde honetako ezabatutako historia ikusi',
+'action-deletedhistory' => 'ikusi orri honen historia ezabatua',
 'action-browsearchive' => 'ezabatutako orrialdeak bilatu',
 'action-undelete' => 'ezabatutako orrialde hau bergaitu',
 'action-suppressrevision' => 'izkutuko berrikuspen hau berrikusi eta gaitu',
index 0881d5a..dd79ead 100644 (file)
@@ -15,6 +15,7 @@
  * @author Asoxor
  * @author Baqeri
  * @author Behdarvandyani
+ * @author Calak
  * @author Dalba
  * @author E THP
  * @author Ebraminio
@@ -454,7 +455,7 @@ $imageFiles = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'پیوند خط کشی شده در زیر:',
+'tog-underline' => 'خط کشیدن زیر پیوندها:',
 'tog-hideminor' => 'تغییرات جزئی از فهرست تغییرات اخیر پنهان شوند',
 'tog-hidepatrolled' => 'ویرایش‌های گشت‌خورده از فهرست تغییرات اخیر پنهان شوند',
 'tog-newpageshidepatrolled' => 'صفحه‌های گشت‌خورده از فهرست صفحه‌های تازه پنهان شوند',
@@ -490,7 +491,6 @@ $messages = array(
 'tog-ccmeonemails' => 'رونوشتی از نامه‌ای که به دیگران ارسال می‌کنم برای خودم هم فرستاده شود',
 'tog-diffonly' => 'محتوای صفحه، زیر تفاوت نمایش داده نشود',
 'tog-showhiddencats' => 'رده‌های پنهان نمایش داده شود',
-'tog-noconvertlink' => 'تبدیل عنوان پیوند غیرفعال شود',
 'tog-norollbackdiff' => 'بعد از واگردانی تفاوت نشان داده نشود',
 'tog-useeditwarning' => 'زمان خروج از صفحهٔ ویرایش در صورت داشتن ویرایش‌های‌ ذخیره‌نشده به من هشدار داده شود',
 'tog-prefershttps' => 'در حالت ورود به سامانه همواره از اتصال امن استفاده شود',
@@ -908,7 +908,7 @@ $2',
 'userlogin-resetpassword-link' => 'گذرواژه‌تان را فراموش کردید؟',
 'helplogin-url' => 'Help:ورود به سامانه',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|راهنمای ورود به سامانه]]',
-'userlogin-loggedin' => 'Ø´Ù\85ا Ø¯Ø± Ø­Ø§Ù\84 Ø­Ø§Ø¶Ø± Ø¨Ù\87â\80\8cعÙ\86Ù\88اÙ\86 {{GENDER:$1|$1}} Ù\88ارد Ø³Û\8cستÙ\85 Ø´Ø¯Ù\87â\80\8cاÛ\8cد.
+'userlogin-loggedin' => 'شما در حال حاضر به‌عنوان {{GENDER:$1|$1}} وارد شده‌اید.
 از فرم پایین برای ورود به‌عنوان یک کاربر دیگر استفاده کنید.',
 'userlogin-createanother' => 'ایجاد یک حساب کاربری دیگر',
 'createacct-join' => 'اطلاعاتتان را در زیر وارد کنید',
@@ -917,7 +917,7 @@ $2',
 'createacct-emailoptional' => 'نشانی رایانامه (اختیاری)',
 'createacct-email-ph' => 'نشانی رایانامه را وارد کنید',
 'createacct-another-email-ph' => 'نشانی رایانامه را وارد کنید',
-'createaccountmail' => 'استÙ\81ادÙ\87 Ø§Ø² Ø±Ù\85ز Ø¹Ø¨Ù\88ر Ù\85Ù\88Ù\82ت ØªØµØ§Ø¯Ù\81Û\8c Ù\88 Ù\81رستادÙ\86 Ø¢Ù\86 Ø¨Ù\87 Ù\86شاÙ\86Û\8c Ø§Û\8cÙ\85Û\8cÙ\84 مشخص‌شده',
+'createaccountmail' => 'استÙ\81ادÙ\87 Ø§Ø² Ø±Ù\85ز Ø¹Ø¨Ù\88ر Ù\85Ù\88Ù\82ت ØªØµØ§Ø¯Ù\81Û\8c Ù\88 Ù\81رستادÙ\86 Ø¢Ù\86 Ø¨Ù\87 Ù\86شاÙ\86Û\8c Ø±Ø§Û\8cاÙ\86اÙ\85Ù\87 مشخص‌شده',
 'createacct-realname' => 'نام واقعی (اختیاری)',
 'createaccountreason' => 'دلیل:',
 'createacct-reason' => 'دلیل',
@@ -1001,7 +1001,7 @@ $2',
 'usernamehasherror' => 'نام کاربری نمی‌تواند شامل نویسه‌های درهم باشد',
 'login-throttled' => 'شما به تازگی چندین‌بار برای ثبت ورود تلاش کرده‌اید.
 لطفاً پیش از آنکه دوباره تلاش کنید $1 صبر کنید.',
-'login-abort-generic' => 'ورود شما به سیستم ناموفق بود - خاتمهٔ ناگهانی داده شد',
+'login-abort-generic' => 'ورود شما ناموفق بود - خاتمهٔ ناگهانی داده شد',
 'loginlanguagelabel' => 'زبان: $1',
 'suspicious-userlogout' => 'درخواست شما برای خروج از سامانه رد شد زیرا به نظر می‌رسد که این درخواست توسط یک مرورگر معیوب یا پروکسی میانگیر ارسال شده باشد.',
 'createacct-another-realname-tip' => 'نام واقعی اختیاری است.
@@ -1017,7 +1017,7 @@ $2',
 
 # Change password dialog
 'changepassword' => 'تغییر گذرواژه',
-'resetpass_announce' => 'شما باید برای پایان ورود به سیستم،رمز عبور جدیدی را تنظیم کنید.',
+'resetpass_announce' => 'شما باید برای پایان ورود به سامانه، گذرواژهٔ جدیدی را تنظیم کنید.',
 'resetpass_text' => '<!-- اینجا متن اضافه کنید -->',
 'resetpass_header' => 'تغییر گذرواژهٔ حساب کاربری',
 'oldpassword' => 'گذرواژهٔ پیشین:',
@@ -1039,7 +1039,7 @@ $2',
 'resetpass-temp-password' => 'گذرواژهٔ موقت:',
 'resetpass-abort-generic' => 'تغییر گذرواژه به دست یکی از افزونه‌ها لغو شده است.',
 'resetpass-expired' => 'رمز عبور شما منقضی شده‌است. لطفاً برای ورود رمز عبور جدیدی را تنظیم کنید.',
-'resetpass-expired-soft' => 'رمز عبور شما منقضی شده‌است، و نیاز به تنظیم مجدد دارد. لطفاً اکنون رمز عبور جدیدی را انتخاب کنید، یا برای تنظیم مجدد آن بعدآً، دکمهٔ لغو را کلیک کنید.',
+'resetpass-expired-soft' => 'رمز عبور شما منقضی شده‌است، و نیاز به تنظیم مجدد دارد. لطفاً اکنون رمز عبور جدیدی را انتخاب کنید، یا برای تنظیم مجدد آن بعدآً، دکمه "{{int:resetpass-submit-cancel}}" را کلیک کنید.',
 
 # Special:PasswordReset
 'passwordreset' => 'بازنشانی گذرواژه',
@@ -1191,7 +1191,7 @@ $2
 'noarticletext-nopermission' => 'این صفحه هم‌اکنون متنی ندارد.
 شما می‌توانید در دیگر صفحه‌ها [[Special:Search/{{PAGENAME}}|این عنوان را جستجو کنید]]،
 یا <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} سیاهه‌های مرتبط را بگردید]</span> ولی شما اجازه ایجاد این صفحه را ندارید.',
-'missing-revision' => 'ویرایش #$1 از صفحهٔ "{{PAGENAME}}" موجود نیست.
+'missing-revision' => 'ویرایش #$1 از صفحهٔ «{{PAGENAME}}» موجود نیست.
 
 معمولاً در اثر پیوند به تاریخچهٔ به‌روز نشدهٔ صفحهٔ حذف شده است.
 می‌توانید جزئیات بیشتر را در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] بیابید.',
@@ -1205,8 +1205,8 @@ $2
 *'''گوگل کروم:'''کلیدهای ''Ctrl+Shift+R'' را با هم فشار دهید. (در رایانه‌های اپل مکینتاش کلید‌های ''⌘-Shift-R'')
 *'''اینترنت اکسپلورر:''' کلید ''Ctrl'' را نگه‌دارید و روی دکمهٔ ''Refresh'' کلیک کنید، یا کلید‌های ''Ctrl-F5'' را با هم فشار دهید
 *'''اپرا:''' حافظهٔ نهانی مرورگر را از طریق منوی ''Tools &rarr; Preferences'' پاک کنید",
-'usercssyoucanpreview' => "'''Ù\86کتÙ\87:''' Ù¾Û\8cØ´ Ø§Ø² Ø°Ø®Û\8cرÙ\87â\80\8cکردÙ\86 Ù\81اÛ\8cÙ\84 سی‌اس‌اس خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
-'userjsyoucanpreview' => "'''Ù\86کتÙ\87:''' Ù¾Û\8cØ´ Ø§Ø² Ø°Ø®Û\8cرÙ\87â\80\8cکردÙ\86 Ù\81اÛ\8cÙ\84 جاوااسکریپت خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
+'usercssyoucanpreview' => "'''Ù\86کتÙ\87:''' Ù¾Û\8cØ´ Ø§Ø² Ø°Ø®Û\8cرÙ\87â\80\8cکردÙ\86 Ù¾Ø±Ù\88Ù\86دÙ\87 سی‌اس‌اس خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
+'userjsyoucanpreview' => "'''Ù\86کتÙ\87:''' Ù¾Û\8cØ´ Ø§Ø² Ø°Ø®Û\8cرÙ\87â\80\8cکردÙ\86 Ù¾Ø±Ù\88Ù\86دÙ\87Ù\94 جاوااسکریپت خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
 'usercsspreview' => "'''فراموش مکنید که شما فقط دارید پیش‌نمایش سی‌اس‌اس کاربری‌تان را می‌بینید.'''
 '''این سی‌اس‌اس هنوز ذخیره نشده‌است!'''",
 'userjspreview' => "'''به یاد داشته باشید که شما فقط دارید جاوااسکریپت کاربری‌تان را امتحان می‌کنید/پیش‌نمایش آن را می‌بینید.'''
@@ -1226,7 +1226,7 @@ $2
 'session_fail_preview' => "'''شرمنده! به علت از دست رفتن اطلاعات نشست کاربری نمی‌توانیم ویرایش شما را پردازش کنیم.'''
 لطفاً دوباره سعی کنید.
 اگر دوباره به همین پیام برخوردید از سامانه [[Special:UserLogout|خارج شوید]] و دوباره وارد شوید.",
-'session_fail_preview_html' => "'''Ù\85تاسفانه امکان ثبت ویرایش شما به خاطر از دست رفتن اطلاعات نشست کاربری وجود ندارد.'''
+'session_fail_preview_html' => "'''Ù\85تأسفانه امکان ثبت ویرایش شما به خاطر از دست رفتن اطلاعات نشست کاربری وجود ندارد.'''
 
 ''با توجه به این که در {{SITENAME}} امکان درج اچ‌تی‌ام‌ال خام فعال است، پیش‌نمایش صفحه پنهان شده تا امکان حملات مبتنی بر جاوااسکریپت وجود نداشته باشد.''
 
@@ -1309,8 +1309,8 @@ $2
 'content-failed-to-parse' => 'عدم موفقیت در تجزیه محتوای $2 برای مدل $1: $3',
 'invalid-content-data' => 'داده محتوای نامعتبر',
 'content-not-allowed-here' => 'محتوای «$1» در صفحهٔ [[$2]] مجاز نیست',
-'editwarning-warning' => 'خروج از این صفحه ممکن است باعث شود که شما هر شانسی که به وجود آورده اید را از دست بدهید.
-اگر شما وارد سیستم شده‌اید، می‌توانید این هشدار را در بخش «در حال ویرایش» ترجیحاتتان غیرفعال کنید.',
+'editwarning-warning' => 'خروج از این صفحه ممکن است باعث شود که شما هر شانسی که به وجود آوردهاید را از دست بدهید.
+اگر شما وارد سامانه شده‌اید، می‌توانید این هشدار را در بخش «{{int:prefs-editing}}» ترجیحاتتان غیرفعال کنید.',
 'editpage-notsupportedcontentformat-title' => 'فرمت محتوا پشتیبانی نشده',
 'editpage-notsupportedcontentformat-text' => 'فرمت محتوای $1 توسط مدل محتوای $2 پشتیبانی نشده‌است.',
 
@@ -1547,7 +1547,7 @@ $1",
 'shown-title' => 'نمایش $1 {{PLURAL:$1|نتیجه|نتیجه}} در هر صفحه',
 'viewprevnext' => 'نمایش ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''صفحه‌ای با عنوان «[[:$1]]» در این ویکی وجود دارد.'''",
-'searchmenu-new' => '<strong>ایجاد صفحه "[[:$1]]" در این ویکی!</strong> {{PLURAL:$2|0=|همچنین مشاهدهٔ صفحهٔ پیدا شده با جستجوی شما.|همچنین مشاهدهٔ جستجوی نتایج پیدا شده.}}',
+'searchmenu-new' => '<strong>ایجاد صفحهٔ «[[:$1]]» در این ویکی!</strong> {{PLURAL:$2|0=|همچنین مشاهدهٔ صفحهٔ پیدا شده با جستجوی شما.|همچنین مشاهدهٔ جستجوی نتایج پیدا شده.}}',
 'searchprofile-articles' => 'صفحه‌های محتوایی',
 'searchprofile-project' => 'صفحه‌های راهنما و پروژه',
 'searchprofile-images' => 'چندرسانه‌ای',
@@ -1895,14 +1895,26 @@ $1",
 'recentchanges-legend-heading' => "'''اختصارها:'''",
 'recentchanges-legend-newpage' => '(همچنین به [[Special:NewPages|فهرست صفحات جدید]] نگاه کنید)',
 'recentchanges-legend-plusminus' => "('' ±۱۲۳'')",
-'rcnotefrom' => 'در زیر تغییرات از تاریخ <b>$2</b> آمده‌اند (تا <b>$1</b> مورد نشان داده می‌شود).',
+'rcnotefrom' => 'در زیر تغییرات از <strong>$2</strong> (تا <strong>$1</strong> نشان داده شده‌است).',
 'rclistfrom' => 'نمایش تغییرات جدید با شروع از $1',
 'rcshowhideminor' => '$1 ویرایش‌های جزئی',
+'rcshowhideminor-show' => 'نمایش',
+'rcshowhideminor-hide' => 'پنهان‌ کردن',
 'rcshowhidebots' => '$1 ربات‌ها',
-'rcshowhideliu' => 'کاربران نسخهٔ $1 ثبت‌نام‌ کردند',
+'rcshowhidebots-show' => 'نمایش',
+'rcshowhidebots-hide' => 'پنهان کردن',
+'rcshowhideliu' => '$1 کاربران ثبت‌نام‌کردە',
+'rcshowhideliu-show' => 'نمایش',
+'rcshowhideliu-hide' => 'پنهان کردن',
 'rcshowhideanons' => '$1 کاربران ناشناس',
+'rcshowhideanons-show' => 'نمایش',
+'rcshowhideanons-hide' => 'پنهان کردن',
 'rcshowhidepatr' => '$1 ویرایش‌های گشت‌خورده',
+'rcshowhidepatr-show' => 'نمایش',
+'rcshowhidepatr-hide' => 'پنهان کردن',
 'rcshowhidemine' => '$1 ویرایش‌های من',
+'rcshowhidemine-show' => 'نمایش',
+'rcshowhidemine-hide' => 'پنهان کردن',
 'rclinks' => 'نمایش آخرین $1 تغییر در $2 روز اخیر<br />$3',
 'diff' => 'تفاوت',
 'hist' => 'تاریخچه',
@@ -2023,8 +2035,8 @@ $1",
 'file-exists-duplicate' => 'به نظر می‌رسد این پرونده نسخه‌ای تکراری از {{PLURAL:$1|پروندهٔ|پرونده‌های}} زیر باشد:',
 'file-deleted-duplicate' => 'یک پرونده نظیر این پرونده ([[:$1]]) قبلاً حذف شده‌است.
 شما باید تاریخچهٔ حذف آن پرونده را قبل از بارگذاری مجدد آن ببینید.',
-'file-deleted-duplicate-notitle' => 'یک پرونده یکسان بااین پرونده قبلا حذف شده است و عنوان متوقف شده‌است.
-Ø´Ù\85ا Ø¨Ø§Û\8cد Ø§Ø² Ú©Ø³Û\8c Ú©Ù\87 Ø¯Ø³ØªØ±Ø³Û\8c Ù\85شاÙ\87دÙ\87Ù\94 Ù\81اÛ\8cÙ\84 متوقف شده را دارد، درخواست کنید تا شرایط را قبل از بارگذاری مجدد بررسی کند.',
+'file-deleted-duplicate-notitle' => 'یک پرونده یکسان بااین پرونده قبلاً حذف شده است و عنوان متوقف شده‌است.
+Ø´Ù\85ا Ø¨Ø§Û\8cد Ø§Ø² Ú©Ø³Û\8c Ú©Ù\87 Ø¯Ø³ØªØ±Ø³Û\8c Ù\85شاÙ\87دÙ\87Ù\94 Ù¾Ø±Ù\88Ù\86دÙ\87 متوقف شده را دارد، درخواست کنید تا شرایط را قبل از بارگذاری مجدد بررسی کند.',
 'uploadwarning' => 'هشدار بارگذاری',
 'uploadwarning-text' => 'لطفاً توضیحات پرونده را در زیر تغییر دهید و دوباره تلاش کنید.',
 'savefile' => 'ذخیرهٔ پرونده',
@@ -2037,6 +2049,8 @@ $1",
 'php-uploaddisabledtext' => 'بارگذاری پرونده‌های پی‌اچ‌پی غیرفعال است.
 لطفاً تنظیمات file_uploads را بررسی کنید.',
 'uploadscripted' => 'این صفحه حاوی کد اچ‌تی‌ام‌ال یا اسکریپتی است که ممکن است به‌نادرست توسط مرورگر وب تفسیر شود.',
+'uploadscriptednamespace' => "این پوشه اس‌وی‌جی شامل فضای نام غیرقانونی '$1' است",
+'uploadinvalidxml' => 'XML در پروندهٔ بارگذاری‌شده نمی‌تواند تجزیه شود.',
 'uploadvirus' => 'این پرونده ویروس دارد!
 جزئیات : $1',
 'uploadjava' => 'این پرونده یک پرونده زیپ است که حاوی پرونده‌ای از نوع ‎‎.class جاوا است.
@@ -2239,7 +2253,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'shared-repo-from' => 'از $1',
 'shared-repo' => 'یک مخزن مشترک',
 'shared-repo-name-wikimediacommons' => 'ویکی‌انبار',
-'upload-disallowed-here' => 'Ù\85تاسÙ\81اÙ\86Ù\87 Ø´Ù\85ا Ù\86Ù\85Û\8c توانید این پرونده را بازنویس کنید.',
+'upload-disallowed-here' => 'Ù\85تأسÙ\81اÙ\86Ù\87 Ø´Ù\85ا Ù\86Ù\85Û\8câ\80\8cتوانید این پرونده را بازنویس کنید.',
 
 # File reversion
 'filerevert' => 'واگردانی $1',
@@ -2633,7 +2647,7 @@ $PAGEINTRO $NEWPAGE
 نامه: $PAGEEDITOR_EMAIL
 ویکی: $PAGEEDITOR_WIKI
 
-تا هنگامی که به صفحه سر نزده‌اید، در صورت رخ‌دادنِ احتمالیِ فعالیت بیشتر، تا زمانی که در با کاربریتان در سیستم هستید، اعلانیه‌ای برای شما فرستاده نخواهد شد.
+تا هنگامی که به صفحه سر نزده‌اید، در صورت رخ‌دادنِ احتمالیِ فعالیت بیشتر، تا زمانی که در با کاربریتان در سامانه هستید، اعلانیه‌ای برای شما فرستاده نخواهد شد.
 شما همچنین می‌توانید در صفحهٔ پی‌گیری‌های خود پرچم‌های مربوط به آگاهی‌رسانی را صفر کنید همچنین می‌توانید پرچم‌های آگاهی‌سازی را بازنشانی کنید.
 
 دوستدار شما، سامانهٔ آگاهی‌رسانی {{SITENAME}}
@@ -2686,7 +2700,7 @@ $PAGEINTRO $NEWPAGE
 'delete-warning-toobig' => 'این صفحه تاریخچهٔ ویرایشی بزرگی دارد، که شامل بیش از $1 {{PLURAL:$1|نسخه|نسخه}} است.
 حذف آن ممکن است که عملکرد پایگاه دادهٔ {{SITENAME}} را مختل کند;
 با احتیاط ادامه دهید.',
-'deleting-backlinks-warning' => "''' هشدار:''' صفحات دیگر پیوند یا تراگنجایش به صفحه شما  برای حذف هستند.",
+'deleting-backlinks-warning' => "''' هشدار:''' پیوند [[Special:WhatLinksHere/{{FULLPAGENAME}}|صفحات دیگر]] یا تراگنجایش صفحهٔ شما برای حذف.",
 
 # Rollback
 'rollback' => 'واگردانی ویرایش‌ها',
@@ -2868,8 +2882,10 @@ $1',
 'sp-contributions-blocked-notice-anon' => 'این نشانی آی‌پی در حال حاضر بسته است.
 آخرین سیاههٔ بسته شدن در زیر آمده‌است:',
 'sp-contributions-search' => 'جستجوی مشارکت‌ها',
+'sp-contributions-suppresslog' => 'کمک‌های کاربر متوقف شده',
 'sp-contributions-username' => 'نشانی آی‌پی یا نام کاربری:',
 'sp-contributions-toponly' => 'فقط ویرایش‌هایی که آخرین نسخه‌اند نمایش داده شود',
+'sp-contributions-newonly' => 'فقط نمایش ویرایش‌هایی که تولید‌های صفحه هستند',
 'sp-contributions-submit' => 'جستجو',
 
 # What links here
@@ -3359,7 +3375,7 @@ $2',
 
 # Info page
 'pageinfo-title' => 'اطلاعات در مورد «$1»',
-'pageinfo-not-current' => 'Ù\85تاسفانه تهیه اطلاعات ویرایش‌های قدیمی غیرممکن است.',
+'pageinfo-not-current' => 'Ù\85تأسفانه تهیه اطلاعات ویرایش‌های قدیمی غیرممکن است.',
 'pageinfo-header-basic' => 'اطلاعات اولیه',
 'pageinfo-header-edits' => 'ویرایش تاریخچه',
 'pageinfo-header-restrictions' => 'حفاظت از صفحه',
@@ -4349,7 +4365,7 @@ $5
 'logentry-newusers-newusers' => 'حساب کاربری $1 {{GENDER:$2|ایجاد شد}}',
 'logentry-newusers-create' => 'حساب کاربری $1 {{GENDER:$2|ایجاد شد}}',
 'logentry-newusers-create2' => 'حساب کاربری $3 توسط $1 {{GENDER:$2|ایجاد شد}}',
-'logentry-newusers-byemail' => 'حساب کاربری  $3  توسط $1 {{GENDER:$2|ایجاد شد}} و رمز عبور به وسیلهٔ ایمیل ارسال شد',
+'logentry-newusers-byemail' => 'حساب کاربری $3 توسط $1 {{GENDER:$2|ایجاد شد}} و رمز عبور به‌وسیلهٔ رایانامه ارسال شد',
 'logentry-newusers-autocreate' => 'حساب $1  به شکل خودکار {{GENDER:$2|ایجاد شد}}',
 'logentry-rights-rights' => '$1 عضویت $3 را از گروه $4 به $5 {{GENDER:$2|تغییر داد}}',
 'logentry-rights-rights-legacy' => '$1 گروه عضویت $3 را {{GENDER:$2|تغییر داد}}',
@@ -4462,6 +4478,4 @@ $5
 'expand_templates_generate_rawhtml' => 'نمایش اچ‌تی‌ام‌ال خام',
 'expand_templates_preview' => 'پیش‌نمایش',
 
-# Unknown messages
-'uploadinvalidxml' => 'XML در پروندهٔ بارگذاری‌شده نمی‌تواند تجزیه شود.',
 );
index 88a2d18..9ae59ec 100644 (file)
@@ -356,7 +356,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Lähetä minulle kopio MediaWikin kautta lähetetyistä sähköposteista',
 'tog-diffonly' => 'Älä näytä sivun sisältöä eroavaisuusvertailun alapuolella',
 'tog-showhiddencats' => 'Näytä piilotetut luokat',
-'tog-noconvertlink' => 'Älä muunna linkkien otsikoita toiseen kirjoitusjärjestelmään',
 'tog-norollbackdiff' => 'Älä näytä eroavaisuuksia, kun olet palauttanut muokkauksen palauta-työkalulla',
 'tog-useeditwarning' => 'Varoita minua, kun poistun muokkaussivulta tallentamatta muutoksia',
 'tog-prefershttps' => 'Käytä aina suojattua yhteyttä, kun olet kirjautunut sisään',
@@ -886,7 +885,7 @@ Jotta pääset kirjautumaan sisään kunnolla, sinun on nyt asetettava uusi sala
 'resetpass-temp-password' => 'Väliaikainen salasana:',
 'resetpass-abort-generic' => 'Laajennus keskeytti salasanan vaihdon.',
 'resetpass-expired' => 'Salasanasi on vanhentunut. Valitse uusi salasana, jotta pääset kirjautumaan sisään.',
-'resetpass-expired-soft' => 'Salasanasi on vanhentunut ja se pitää uudistaa. Valitse nyt uusi salasana tai peruuta toiminto, niin voit uudistaa salasanan myöhemmin.',
+'resetpass-expired-soft' => 'Salasanasi on vanhentunut ja se pitää uudistaa. Valitse uusi salasana nyt tai paina "{{int:resetpass-submit-cancel}}", niin voit uudistaa salasanan myöhemmin.',
 
 # Special:PasswordReset
 'passwordreset' => 'Salasanan uudistus',
@@ -1727,11 +1726,23 @@ Tämä tieto on julkinen.',
 'rcnotefrom' => 'Alla on muutokset <b>$2</b> lähtien. Enintään <b>$1</b> merkintää näytetään.',
 'rclistfrom' => 'Näytä uudet muutokset $1 alkaen',
 'rcshowhideminor' => '$1 pienet muutokset',
+'rcshowhideminor-show' => 'Näytä',
+'rcshowhideminor-hide' => 'Piilota',
 'rcshowhidebots' => '$1 botit',
+'rcshowhidebots-show' => 'Näytä',
+'rcshowhidebots-hide' => 'Piilota',
 'rcshowhideliu' => '$1 rekisteröityneet käyttäjät',
+'rcshowhideliu-show' => 'Näytä',
+'rcshowhideliu-hide' => 'Piilota',
 'rcshowhideanons' => '$1 anonyymit käyttäjät',
+'rcshowhideanons-show' => 'Näytä',
+'rcshowhideanons-hide' => 'Piilota',
 'rcshowhidepatr' => '$1 tarkastetut muutokset',
+'rcshowhidepatr-show' => 'Näytä',
+'rcshowhidepatr-hide' => 'Piilota',
 'rcshowhidemine' => '$1 omat muutokset',
+'rcshowhidemine-show' => 'Näytä',
+'rcshowhidemine-hide' => 'Piilota',
 'rclinks' => 'Näytä $1 tuoretta muutosta viimeisten $2 päivän ajalta.<br />$3',
 'diff' => 'ero',
 'hist' => 'historia',
@@ -1850,6 +1861,8 @@ Sinun on syytä pyytää jotakuta häivytettyjen tietojen näkemiseen oikeutettu
 'uploaddisabledtext' => 'Tiedostojen tallennus on poistettu käytöstä.',
 '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.',
+'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',
 'uploadjava' => 'Tämä tiedosto on ZIP-tiedosto, joka sisältää Java .class-tiedoston.
 Java-tiedostojen tallentaminen ei ole sallittua, sillä ne saattavat aiheuttaa tietoturvariskejä.',
@@ -2662,8 +2675,10 @@ $1',
 'sp-contributions-blocked-notice-anon' => 'Tämä IP-osoite on tällä hetkellä estetty.
 Alla on viimeisin estolokin tapahtuma:',
 'sp-contributions-search' => 'Etsi muokkauksia',
+'sp-contributions-suppresslog' => 'häivytetyt käyttäjän muokkaukset',
 'sp-contributions-username' => 'IP-osoite tai käyttäjätunnus',
 'sp-contributions-toponly' => 'Näytä vain muokkaukset, jotka ovat viimeisimpiä versioita',
+'sp-contributions-newonly' => 'Näytä vain muokkaukset, joilla on luotu sivu',
 'sp-contributions-submit' => 'Hae',
 
 # What links here
@@ -3012,6 +3027,7 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 'import-error-special' => 'Sivua $1 ei tuotu, koska se kuuluu erityiseen nimiavaruuteen, joka ei salli sivuja.',
 'import-error-invalid' => 'Sivua $1 ei tuotu, koska sen nimi ei kelpaa.',
 'import-error-unserialize' => 'Versiota $2 sivusta $1 ei voida jakaa osiin. Version ilmoitettiin käyttävän sisältömallia $3 ja sarjoitusmuotoilua $4.',
+'import-error-bad-location' => 'Sivun versiota $2, joka käyttää sisällön mallia $3, ei voi tallettaa kohteeseen "$1" tässä wikissä, koska tuota mallia ei tueta kyseisellä sivulla.',
 'import-options-wrong' => '{{PLURAL:$2|Väärä asetus|Väärät asetukset}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'Annettu perussivun nimi ei kelpaa.',
 'import-rootpage-nosubpage' => 'Annetun perussivun nimiavaruus "$1" ei salli alasivuja.',
@@ -4185,6 +4201,4 @@ Käytännössä se laajentaa melkein kaiken, joka on kaksoisaaltosulkeiden sisä
 'expand_templates_generate_rawhtml' => 'Näytä raaka HTML',
 'expand_templates_preview' => 'Esikatselu',
 
-# Unknown messages
-'uploadinvalidxml' => 'Ladatun tiedoston XML-koodia ei voitu jäsentää kunnolla.',
 );
index a90a14a..e71d267 100644 (file)
@@ -70,6 +70,7 @@
  * @author McDutchie
  * @author Meithal
  * @author Metroitendo
+ * @author Momo50WM
  * @author Moyg
  * @author Nicolas NALLET
  * @author Nicolas Raoul
@@ -77,6 +78,7 @@
  * @author Nobody
  * @author Od1n
  * @author Omnipaedista
+ * @author Orlodrim
  * @author Peter17
  * @author PieRRoMaN
  * @author ProgVal
@@ -427,20 +429,20 @@ $messages = array(
 'tog-extendwatchlist' => 'Étendre la liste de suivi pour afficher toutes les modifications et pas uniquement les plus récentes',
 'tog-usenewrc' => 'Grouper les changements par page dans les modifications récentes et la liste de suivi (nécessite JavaScript)',
 'tog-numberheadings' => 'Numéroter automatiquement les titres de section',
-'tog-showtoolbar' => "Montrer la barre d'outils de modification (nécessite JavaScript)",
+'tog-showtoolbar' => "Afficher la barre d'outils de modification (nécessite JavaScript)",
 'tog-editondblclick' => 'Modifier des pages sur double-clic (nécessite JavaScript)',
 'tog-editsectiononrightclick' => 'Activer la modification de sections par clic droit sur les titres (nécessite JavaScript)',
-'tog-rememberpassword' => 'Se souvenir de mon identification avec ce navigateur (au maximum $1 {{PLURAL:$1|jour|jours}})',
+'tog-rememberpassword' => 'Me reconnecter automatiquement lors des prochaines visites avec ce navigateur (au maximum $1&nbsp;{{PLURAL:$1|jour|jours}})',
 'tog-watchcreations' => "Ajouter les pages que je crée et les fichiers que j'importe à ma liste de suivi",
 'tog-watchdefault' => 'Ajouter les pages et les fichiers que je modifie à ma liste de suivi',
 'tog-watchmoves' => 'Ajouter les pages et les fichiers que je renomme à ma liste de suivi',
 'tog-watchdeletion' => 'Ajouter les pages et les fichiers que je supprime à ma liste de suivi',
-'tog-minordefault' => 'Marquer mes modifications comme mineures par défaut',
+'tog-minordefault' => 'Marquer toutes mes modifications comme mineures par défaut',
 'tog-previewontop' => 'Afficher la prévisualisation au-dessus de la zone de modification',
 'tog-previewonfirst' => 'Afficher la prévisualisation lors de la première modification',
 'tog-enotifwatchlistpages' => "M'avertir par courriel lorsqu'une page ou un fichier de ma liste de suivi est modifiée",
 'tog-enotifusertalkpages' => "M'avertir par courriel si ma page de discussion est modifiée",
-'tog-enotifminoredits' => "M'avertir par courriel pour les modifications mineures de pages ou de fichiers également",
+'tog-enotifminoredits' => "M'avertir par courriel également lors des modifications mineures de pages ou de fichiers",
 'tog-enotifrevealaddr' => 'Afficher mon adresse de courriel dans les courriels de notification',
 'tog-shownumberswatching' => "Afficher le nombre d'utilisateurs qui suivent la page",
 'tog-oldsig' => 'Signature existante :',
@@ -456,7 +458,6 @@ $messages = array(
 'tog-ccmeonemails' => "M'envoyer une copie des courriels que j'envoie aux autres utilisateurs",
 'tog-diffonly' => 'Ne pas afficher le contenu des pages sous les diffs',
 'tog-showhiddencats' => 'Afficher les catégories cachées',
-'tog-noconvertlink' => 'Désactiver la conversion des titres',
 'tog-norollbackdiff' => "Ne pas afficher le diff lors d'une révocation",
 'tog-useeditwarning' => "M'avertir quand je quitte une page de modification sans publier les changements",
 'tog-prefershttps' => 'Toujours utiliser une connexion sécurisée en étant connecté',
@@ -469,8 +470,8 @@ $messages = array(
 'editfont-style' => 'Style de police de la zone de modification :',
 'editfont-default' => 'Police par défaut du navigateur',
 'editfont-monospace' => 'Police à chasse fixe',
-'editfont-sansserif' => 'Police sans empattement',
-'editfont-serif' => 'Police avec empattement',
+'editfont-sansserif' => 'Police sans-serif',
+'editfont-serif' => 'Police serif',
 
 # Dates
 'sunday' => 'dimanche',
@@ -480,13 +481,13 @@ $messages = array(
 'thursday' => 'jeudi',
 'friday' => 'vendredi',
 'saturday' => 'samedi',
-'sun' => 'dim',
-'mon' => 'lun',
-'tue' => 'mar',
-'wed' => 'mer',
-'thu' => 'jeu',
-'fri' => 'ven',
-'sat' => 'sam',
+'sun' => 'Dim.',
+'mon' => 'Lun.',
+'tue' => 'Mar.',
+'wed' => 'Mer.',
+'thu' => 'Jeu.',
+'fri' => 'Ven.',
+'sat' => 'Sam.',
 'january' => 'janvier',
 'february' => 'février',
 'march' => 'mars',
@@ -615,7 +616,7 @@ $messages = array(
 'delete' => 'Supprimer',
 'deletethispage' => 'Supprimer cette page',
 'undeletethispage' => 'Annuler la suppression de cette page',
-'undelete_short' => 'Restaurer $1 modification{{PLURAL:$1||s}}',
+'undelete_short' => 'Restaurer {{PLURAL:$1|une modification|$1 modifications}}',
 'viewdeleted_short' => 'Voir {{PLURAL:$1|une modification supprimée|$1 modifications supprimées}}',
 'protect' => 'Protéger',
 'protect_change' => 'modifier',
@@ -632,30 +633,30 @@ $messages = array(
 'talk' => 'Discussion',
 'views' => 'Affichages',
 'toolbox' => 'Outils',
-'userpage' => 'Page utilisateur',
-'projectpage' => 'Page méta',
+'userpage' => 'Voir la page utilisateur',
+'projectpage' => 'Voir la page du projet',
 'imagepage' => 'Voir la page du fichier',
 'mediawikipage' => 'Voir la page du message',
 'templatepage' => 'Voir la page du modèle',
 'viewhelppage' => "Voir la page d'aide",
 'categorypage' => 'Voir la page de catégorie',
-'viewtalkpage' => 'Page de discussion',
+'viewtalkpage' => 'Voir la page de discussion',
 'otherlanguages' => 'Autres langues',
 'redirectedfrom' => '(Redirigé depuis $1)',
 'redirectpagesub' => 'Page de redirection',
 'lastmodifiedat' => 'Dernière modification de cette page le $1 à $2.<br />',
-'viewcount' => 'Cette page a été consultée $1 fois.',
+'viewcount' => 'Cette page a été consultée {{PLURAL:$1|une fois|$1 fois}}.',
 'protectedpage' => 'Page protégée',
 'jumpto' => 'Aller à :',
-'jumptonavigation' => 'Navigation',
+'jumptonavigation' => 'navigation',
 'jumptosearch' => 'rechercher',
 'view-pool-error' => "Désolé, les serveurs sont surchargés en ce moment.
 Trop d'utilisateurs cherchent à consulter cette page.
 Veuillez attendre un moment avant de retenter l'accès à cette page.
 
 $1",
-'pool-timeout' => "Délai dépassé durant l'attente du verrou",
-'pool-queuefull' => 'La file de travail est pleine',
+'pool-timeout' => "Délai d'attente dépassé",
+'pool-queuefull' => "La file d'attente est pleine",
 'pool-errorunknown' => 'Erreur inconnue',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
@@ -679,7 +680,7 @@ $1",
 
 'badaccess' => 'Erreur de permissions',
 'badaccess-group0' => 'Vous n’avez pas les droits suffisants pour réaliser l’action demandée.',
-'badaccess-groups' => 'L’action que vous essayez de réaliser n’est permise qu’aux utilisateurs {{PLURAL:$2|du groupe|des groupes}} : $1.',
+'badaccess-groups' => "L’action que vous essayez de réaliser n’est permise qu’aux utilisateurs {{PLURAL:$2|du groupe|d'un des groupes}} : $1.",
 
 'versionrequired' => 'Version $1 de MediaWiki nécessaire',
 'versionrequiredtext' => 'La version $1 de MediaWiki est nécessaire pour utiliser cette page. Consultez [[Special:Version|la page des versions]]',
@@ -991,7 +992,7 @@ Pour terminer la connexion, vous devez fournir un nouveau mot de passe ici :',
 'resetpass-temp-password' => 'Mot de passe temporaire :',
 'resetpass-abort-generic' => 'La modification du mot de passe a été annulée par une extension.',
 'resetpass-expired' => 'Votre mot de passe a expiré. Veuillez en fournir un nouveau pour vous connecter.',
-'resetpass-expired-soft' => 'Votre mot de passe a expiré, et doit être réinitialisé. Veuillez en choisir un nouveau maintenant, ou cliquer sur annuler pour le faire plus tard.',
+'resetpass-expired-soft' => 'Votre mot de passe a expiré, et doit être réinitialisé. Veuillez en choisir un nouveau maintenant, ou cliquer sur « {{int:resetpass-submit-cancel}} » pour le faire plus tard.',
 
 # Special:PasswordReset
 'passwordreset' => 'Remise à zéro du mot de passe',
@@ -1286,7 +1287,7 @@ Il devrait y avoir moins de $2 appel{{PLURAL:$2||s}}, alors qu'il y en a mainten
 'undo-success' => 'Cette modification va être défaite. Veuillez vérifier les modifications ci-dessous, puis publier si c’est bien ce que vous voulez faire.',
 'undo-failure' => 'Cette modification ne peut pas être défaite : cela entrerait en conflit avec les modifications intermédiaires.',
 'undo-norev' => 'La modification n’a pas pu être défaite parce qu’elle est inexistante ou qu’elle a été supprimée.',
-'undo-nochange' => 'Il semble que la modification aie déjà été annulée.',
+'undo-nochange' => 'Il semblerait que la modification ait déjà été annulée.',
 'undo-summary' => 'Annulation des modifications $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussion]])',
 'undo-summary-username-hidden' => 'Annuler la révision $1 par un utilisateur masqué',
 
@@ -1593,7 +1594,7 @@ Toute personne la connaissant pourra lire votre liste de suivi, ne la communique
 'prefs-files' => 'Fichiers',
 'prefs-custom-css' => 'CSS personnalisé',
 'prefs-custom-js' => 'JavaScript personnalisé',
-'prefs-common-css-js' => 'JavaScript et CSS partagé pour tous les habillages :',
+'prefs-common-css-js' => 'CSS et JavaScript communs à tous les habillages :',
 'prefs-reset-intro' => 'Vous pouvez utiliser cette page pour restaurer vos préférences aux valeurs par défaut du site. Ceci ne peut pas être défait.',
 'prefs-emailconfirm-label' => 'Confirmation du courriel :',
 'youremail' => 'Courriel :',
@@ -1831,14 +1832,26 @@ Cette information sera publique.',
 'recentchanges-legend-heading' => "'''Légende :'''",
 'recentchanges-legend-newpage' => '(voir aussi la [[Special:NewPages|liste des nouvelles pages]]).',
 'recentchanges-legend-plusminus' => "(''±123'')",
-'rcnotefrom' => "Voici les modifications effectuées depuis le '''$2''' ('''$1''' au maximum).",
+'rcnotefrom' => 'Ci-dessous les modifications effectuées depuis le <strong>$2</strong> (jusqu’à <strong>$1</strong> affichés).',
 'rclistfrom' => 'Afficher les nouvelles modifications depuis le $1.',
 'rcshowhideminor' => '$1 les modifications mineures',
+'rcshowhideminor-show' => 'Afficher',
+'rcshowhideminor-hide' => 'Masquer',
 'rcshowhidebots' => '$1 les robots',
+'rcshowhidebots-show' => 'Afficher',
+'rcshowhidebots-hide' => 'Masquer',
 'rcshowhideliu' => '$1 les utilisateurs enregistrés',
+'rcshowhideliu-show' => 'Afficher',
+'rcshowhideliu-hide' => 'Masquer',
 'rcshowhideanons' => '$1 les utilisateurs anonymes',
+'rcshowhideanons-show' => 'Afficher',
+'rcshowhideanons-hide' => 'Masquer',
 'rcshowhidepatr' => '$1 les modifications surveillées',
+'rcshowhidepatr-show' => 'Afficher',
+'rcshowhidepatr-hide' => 'Masquer',
 'rcshowhidemine' => '$1 mes modifications',
+'rcshowhidemine-show' => 'Afficher',
+'rcshowhidemine-hide' => 'Masquer',
 'rclinks' => 'Afficher les $1 dernières modifications effectuées au cours des $2 derniers jours<br />$3.',
 'diff' => 'diff',
 'hist' => 'hist',
@@ -1965,6 +1978,8 @@ Vous devriez demander à quelqu'un la possibilité de vérifier le journal de ce
 'uploaddisabledtext' => 'L’import de fichiers est désactivé sur ce wiki.',
 'php-uploaddisabledtext' => "L'import de fichiers a été désactivé dans PHP. Vérifiez l'option de configuration file_uploads.",
 'uploadscripted' => 'Ce fichier contient du code HTML ou un script qui pourrait être interprété de façon incorrecte par un navigateur web.',
+'uploadscriptednamespace' => "Ce fichier SVG contient un espace de noms '$1' non autorisé.",
+'uploadinvalidxml' => 'Le XML dans le fichier importé n’a pas pu être analysé.',
 'uploadvirus' => 'Ce fichier contient un virus ! Pour plus de détails, consultez : $1',
 'uploadjava' => 'C’est un fichier ZIP qui contient un fichier Java .class.
 Le téléchargement de fichiers Java n’est pas autorisé, car ils peuvent contourner certaines restrictions de sécurité.',
@@ -2268,7 +2283,7 @@ N’oubliez pas de vérifier s’il n’y a pas d’autres liens vers les modèl
 'pageswithprop-legend' => 'Pages avec une propriété de page',
 'pageswithprop-text' => 'Cette page liste les pages qui utilisent une propriété de page particulière.',
 'pageswithprop-prop' => 'Nom de la propriété :',
-'pageswithprop-submit' => 'Aller',
+'pageswithprop-submit' => 'Lister',
 'pageswithprop-prophidden-long' => 'valeur de propriété de texte long masquée ($1)',
 'pageswithprop-prophidden-binary' => 'valeur de propriété binaire masquée ($1)',
 
@@ -2336,6 +2351,7 @@ Les entrées <del>barrées</del> ont été résolues.',
 'deadendpagestext' => "Les pages suivantes ne contiennent aucun lien vers d'autres pages du wiki.",
 'protectedpages' => 'Pages protégées',
 'protectedpages-indef' => 'Uniquement les protections permanentes',
+'protectedpages-summary' => 'Cette page liste les pages existantes actuellement protégées. Pour une liste des titres protégés contre la création, voir [[{{#special:ProtectedTitles}}]].',
 'protectedpages-cascade' => 'Uniquement les protections en cascade',
 'protectedpages-noredirect' => 'Masquer les redirections',
 'protectedpagesempty' => "Aucune page n'est protégée de cette façon.",
@@ -2348,6 +2364,7 @@ Les entrées <del>barrées</del> ont été résolues.',
 'protectedpages-unknown-timestamp' => 'Inconnu',
 'protectedpages-unknown-performer' => 'Utilisateur inconnu',
 'protectedtitles' => 'Titres protégés',
+'protectedtitles-summary' => 'Cette page liste les titres actuellement protégés contre la création. Pour une liste des pages protégées existantes, voir [[{{#special:ProtectedPages}}]].',
 'protectedtitlesempty' => "Aucun titre n'est actuellement protégé avec ces paramètres.",
 'listusers' => 'Liste des utilisateurs',
 'listusers-editsonly' => 'Ne montrer que les utilisateurs ayant au moins une contribution',
@@ -2622,7 +2639,7 @@ La suppression de telles pages a été restreinte pour prévenir des perturbatio
 'delete-warning-toobig' => "Cette page possède un historique important de modifications, dépassant $1 version{{PLURAL:$1||s}}.
 La supprimer peut perturber le fonctionnement de la base de données de {{SITENAME}} ;
 veuiller ne procéder qu'avec prudence.",
-'deleting-backlinks-warning' => "'''Attention :''' D’autres pages ont un lien vers ou incorporent la page que vous allez supprimer.",
+'deleting-backlinks-warning' => "'''Attention :''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|D’autres pages]] ont un lien vers ou incorporent la page que vous allez supprimer.",
 
 # Rollback
 'rollback' => 'Révoquer les modifications',
@@ -2803,8 +2820,10 @@ $1',
 'sp-contributions-blocked-notice-anon' => "Cette adresse IP est actuellement bloquée.
 La dernière entrée du journal des blocages est indiquée ci-dessous à titre d'information :",
 'sp-contributions-search' => 'Rechercher les contributions',
+'sp-contributions-suppresslog' => 'contributions des utilisateurs supprimées',
 'sp-contributions-username' => "Adresse IP ou nom d'utilisateur :",
 'sp-contributions-toponly' => 'Ne montrer que les contributions qui sont les dernières des articles',
+'sp-contributions-newonly' => 'Afficher uniquement les modifications qui sont des créations de page',
 'sp-contributions-submit' => 'Rechercher',
 
 # What links here
@@ -4470,6 +4489,4 @@ En fait, elle réalise l'expansion de pratiquement tout ce qui est encadré par
 'expand_templates_generate_rawhtml' => 'Afficher le HTML brut',
 'expand_templates_preview' => 'Aperçu du rendu',
 
-# Unknown messages
-'uploadinvalidxml' => 'Le XML dans le fichier importé n’a pas pu être analysé.',
 );
index a11e965..fae921b 100644 (file)
@@ -348,7 +348,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Mè mandar na copia des mèssâjos que mando ux ôtros utilisators',
 'tog-diffonly' => 'Pas montrar lo contegnu de les pâges desot les difs',
 'tog-showhiddencats' => 'Montrar les catègories cachiêes',
-'tog-noconvertlink' => 'Dèsactivar la convèrsion des titros des lims',
 'tog-norollbackdiff' => 'Pas fâre vêre la dif pendent na rèvocacion',
 'tog-useeditwarning' => 'M’avèrtir quand quito una pâge de changement sen sôvar los changements',
 
@@ -522,7 +521,7 @@ $messages = array(
 'articlepage' => 'Vêde la pâge de contegnu',
 'talk' => 'Discussion',
 'views' => 'Vues',
-'toolbox' => 'Bouèta d’outils',
+'toolbox' => 'Outils',
 'userpage' => 'Vêde la pâge utilisator',
 'projectpage' => 'Vêde la pâge projèt',
 'imagepage' => 'Vêde la pâge du fichiér',
@@ -805,7 +804,7 @@ Se vos plét, tornâd èprovar.',
 'passwordtooshort' => 'Voutron contresegno dêt contegnir por lo muens $1 caractèro{{PLURAL:$1||s}}.',
 'password-name-match' => 'Voutron contresegno dêt étre difèrent de voutron nom d’utilisator.',
 'password-login-forbidden' => 'L’usâjo de cél nom d’utilisator et de cél contresegno est étâ dèfendu.',
-'mailmypassword' => 'Recêvre un contresegno novél per mèssageria èlèctronica',
+'mailmypassword' => 'Rebetar a zérô lo contresegno',
 'passwordremindertitle' => 'Contresegno temporèro novél por {{SITENAME}}',
 'passwordremindertext' => 'Yon (probâblament vos, dês l’adrèce IP $1) at demandâ un contresegno
 novél por {{SITENAME}} ($4). Un contresegno temporèro est étâ fêt por
@@ -1715,7 +1714,7 @@ Se vos chouèsésséd de lo balyér, serat empleyê por vos atribuar voutres ôv
 'rc_categories_any' => 'Totes',
 'rc-change-size-new' => '$1 octèt{{PLURAL:$1||s}} aprés changement',
 'newsectionsummary' => '/* $1 */ novèla sèccion',
-'rc-enhanced-expand' => 'Montrar los dètalys (at fôta de JavaScript)',
+'rc-enhanced-expand' => 'Fâre vêre los dètalys',
 'rc-enhanced-hide' => 'Cachiér los dètalys',
 'rc-old-title' => 'fêta avouéc lo titro originâl « $1 »',
 
@@ -2632,9 +2631,9 @@ $1',
 'contributions' => 'Contribucions de l’utilisat{{GENDER:$1|or|rice}}',
 'contributions-title' => 'Lista de les contribucions a l’usanciér $1',
 'mycontris' => 'Contribucions',
-'contribsub2' => 'Por $1 ($2)',
+'contribsub2' => 'Por {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Y at gins de changement que corrèspond a cetos critèros.',
-'uctop' => '(dèrriére)',
+'uctop' => '(d’ora)',
 'month' => 'Dês lo mês (et devant) :',
 'year' => 'Dês l’an (et devant) :',
 
@@ -3234,7 +3233,7 @@ Se vos l’ègzécutâd, voutron sistèmo pôt étre compromês.",
 'file-nohires' => 'Gins de rèsolucion ples hôta disponibla.',
 'svg-long-desc' => 'Fichiér SVG, rèsolucion de $1 × $2 pixèls, talye : $3',
 'svg-long-error' => 'Fichiér SVG envalido : $1',
-'show-big-image' => 'Émâge en rèsolucion ples hôta',
+'show-big-image' => 'Fichiér d’origina',
 'show-big-image-preview' => 'Talye de ceti apèrçu : $1.',
 'show-big-image-other' => '{{PLURAL:$2|Ôtra rèsolucion|Ôtres rèsolucions}} : $1.',
 'show-big-image-size' => '$1 × $2 pixèls',
index 6aa99a5..f8e60e6 100644 (file)
@@ -1555,6 +1555,7 @@ Dü skulst hoker fraage, di ferbürgen nöömer uunluke koon, am tu besnaakin, w
 'php-uploaddisabledtext' => 'Det huuchschüüren faan datein as uun PHP ei aktiwiaret.
 Luke di det iinstelang faan <code>file_uploads</code> uun.',
 'uploadscripted' => 'Uun detdiar datei stäänt HTML- of Scriptcode, an küd ütj fersen faan en browser ütjfeerd wurd.',
+'uploadinvalidxml' => "Det XML uun det huuchschüürd datei küd ei ''parset'' wurd.",
 'uploadvirus' => 'Uun detdiar datei as en wiirus! Details: $1',
 'uploadjava' => 'Detdiar as en ZIP-datei mä en CLASS-datei faan Java.
 Java-datein kön ei tuläät wurd, auer jo det seekerhaid uun fraag stel küd.',
@@ -3838,6 +3839,4 @@ Uk parser-funktjuunen liküs <code><nowiki>{{</nowiki>#language:…}}</code> an
 'expand_templates_generate_rawhtml' => 'Rä HTML uunwise',
 'expand_templates_preview' => 'Föörskau',
 
-# Unknown messages
-'uploadinvalidxml' => "Det XML uun det huuchschüürd datei küd ei ''parset'' wurd.",
 );
index ed3b248..9c74e8b 100644 (file)
@@ -321,7 +321,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Enviádeme ao meu enderezo unha copia das mensaxes de correo electrónico que envíe a outros usuarios',
 'tog-diffonly' => 'Non mostrar o contido da páxina debaixo das diferenzas entre edicións',
 'tog-showhiddencats' => 'Mostrar as categorías ocultas',
-'tog-noconvertlink' => 'Desactivar a conversión dos títulos de ligazón',
 'tog-norollbackdiff' => 'Omitir as diferenzas despois de levar a cabo unha reversión de edicións',
 'tog-useeditwarning' => 'Avisádeme cando deixe unha páxina de edición cos cambios sen gardar',
 'tog-prefershttps' => 'Utilizar unha conexión segura sempre que acceda ao sistema',
@@ -836,6 +835,9 @@ Por favor, agarde $1 antes de probar outra vez.',
 'suspicious-userlogout' => 'Rexeitouse a súa petición de saír do sistema porque semella que a enviou un navegador roto ou a caché dun proxy.',
 'createacct-another-realname-tip' => 'O nome real é opcional.
 Se escolle dalo utilizarase para atribuír ao usuario o seu traballo.',
+'pt-login' => 'Acceder ao sistema',
+'pt-createaccount' => 'Crear unha conta',
+'pt-userlogout' => 'Saír',
 
 # Email sending
 'php-mail-error-unknown' => 'Erro descoñecido na función mail() do PHP.',
@@ -866,7 +868,7 @@ Para completar o acceso, defina un novo contrasinal aquí:',
 'resetpass-temp-password' => 'Contrasinal temporal:',
 'resetpass-abort-generic' => 'Unha extensión cancelou a modificación do contrasinal.',
 'resetpass-expired' => 'O seu contrasinal caducou. Defina un novo contrasinal para acceder.',
-'resetpass-expired-soft' => 'O seu contrasinal caducou e debe restablecelo. Escolla un novo contrasinal ou prema «Cancelar» para restablecelo máis tarde.',
+'resetpass-expired-soft' => 'O seu contrasinal caducou e debe restablecelo. Escolla un novo contrasinal ou prema en "{{int:resetpass-submit-cancel}}" para restablecelo máis tarde.',
 
 # Special:PasswordReset
 'passwordreset' => 'Restablecer o contrasinal',
@@ -1207,7 +1209,7 @@ A razón que deu $3 foi ''$2''.",
 'page_last' => 'derradeira',
 'histlegend' => "Selección de diferenzas: Marque as versións que queira comparar e prema no botón ao final.<br />
 Lenda: '''({{int:cur}})''' = diferenza coa versión actual, '''({{int:last}})''' = diferenza coa versión precedente, '''{{int:minoreditletter}}''' = edición pequena.",
-'history-fieldset-title' => 'Navegar polo historial',
+'history-fieldset-title' => 'Explorar o historial',
 'history-show-deleted' => 'Borrados soamente',
 'histfirst' => 'as máis antigas',
 'histlast' => 'as máis novas',
@@ -1727,14 +1729,26 @@ Se escolle dalo utilizarase para atribuírlle o seu traballo.',
 'recentchanges-legend-heading' => "'''Lenda:'''",
 'recentchanges-legend-newpage' => '(véxase tamén a [[Special:NewPages|lista de páxinas novas]])',
 'recentchanges-legend-plusminus' => "(''±123'')",
-'rcnotefrom' => "A continuación móstranse os cambios feitos desde o '''$3''' ás '''$4''' (móstranse '''$1''' como máximo).",
-'rclistfrom' => 'Mostrar os cambios novos desde o $1',
+'rcnotefrom' => 'A continuación móstranse os cambios feitos desde o <strong>$3</strong> ás <strong>$4</strong> (móstranse <strong>$1</strong> como máximo).',
+'rclistfrom' => 'Mostrar os cambios novos desde o $3 ás $2',
 'rcshowhideminor' => '$1 as edicións pequenas',
+'rcshowhideminor-show' => 'Mostrar',
+'rcshowhideminor-hide' => 'Agochar',
 'rcshowhidebots' => '$1 os bots',
+'rcshowhidebots-show' => 'Mostrar',
+'rcshowhidebots-hide' => 'Agochar',
 'rcshowhideliu' => '$1 os usuarios rexistrados',
+'rcshowhideliu-show' => 'Mostrar',
+'rcshowhideliu-hide' => 'Agochar',
 'rcshowhideanons' => '$1 os usuarios anónimos',
+'rcshowhideanons-show' => 'Mostrar',
+'rcshowhideanons-hide' => 'Agochar',
 'rcshowhidepatr' => '$1 as edicións revisadas',
+'rcshowhidepatr-show' => 'Mostrar',
+'rcshowhidepatr-hide' => 'Agochar',
 'rcshowhidemine' => '$1 as edicións propias',
+'rcshowhidemine-show' => 'Mostrar',
+'rcshowhidemine-hide' => 'Agochar',
 'rclinks' => 'Mostrar os últimos $1 cambios nos últimos $2 días.<br />$3',
 'diff' => 'dif',
 'hist' => 'hist',
@@ -1865,6 +1879,8 @@ Debería contactar con alguén capaz de ver os datos de ficheiros borrados para
 'uploaddisabledtext' => 'A carga de ficheiros está desactivada.',
 'php-uploaddisabledtext' => 'As cargas de ficheiros PHP están desactivadas. Por favor, comprobe a característica file_uploads.',
 'uploadscripted' => 'Este ficheiro contén código HTML ou script que pode producir erros ao ser interpretado polo navegador.',
+'uploadscriptednamespace' => 'Este ficheiro SVG contén o espazo de nomes non permitido "$1"',
+'uploadinvalidxml' => 'Non se puido analizar o XML do ficheiro cargado.',
 'uploadvirus' => 'O ficheiro contén un virus! Detalles: $1',
 'uploadjava' => 'O ficheiro é un ZIP que contén un ficheiro .class de Java.
 Non están permitidas as cargas de ficheiros Java, dado que poden causar restricións de seguridade.',
@@ -2239,7 +2255,7 @@ As entradas <del>riscadas</del> xa foron resoltas.',
 'deadendpagestext' => 'Estas páxinas non ligan con ningunha outra páxina de {{SITENAME}}.',
 'protectedpages' => 'Páxinas protexidas',
 'protectedpages-indef' => 'Só as proteccións indefinidas',
-'protectedpages-summary' => 'Esta páxina lista páxinas existentes protexidas. Para obter unha lista de páxinas cuxa creación está prohibida, vexa [[{{#special:ProtectedTitles}}]].',
+'protectedpages-summary' => 'Esta páxina lista as páxinas existentes que están protexidas actualmente. Para obter unha lista de páxinas cuxa creación está prohibida, consulte [[{{#special:ProtectedTitles}}]].',
 'protectedpages-cascade' => 'Só as proteccións en serie',
 'protectedpages-noredirect' => 'Agochar as redireccións',
 'protectedpagesempty' => 'Actualmente non hai ningunha páxina protexida con eses parámetros.',
@@ -2252,7 +2268,7 @@ As entradas <del>riscadas</del> xa foron resoltas.',
 'protectedpages-unknown-timestamp' => 'Descoñecido',
 'protectedpages-unknown-performer' => 'Usuario descoñecido',
 'protectedtitles' => 'Títulos protexidos',
-'protectedtitles-summary' => 'Esta páxina lista títulos que están prohibidos para páxinas novas. Para obter unha lista de páxinas existentes protexidas, vexa [[{{#special:ProtectedPages}}]].',
+'protectedtitles-summary' => 'Esta páxina lista os títulos que están protexidos actualmente fronte á creación. Para obter unha lista de páxinas existentes protexidas, consulte [[{{#special:ProtectedPages}}]].',
 'protectedtitlesempty' => 'Actualmente non hai ningún título protexido con eses parámetros.',
 'listusers' => 'Lista de usuarios',
 'listusers-editsonly' => 'Mostrar só os usuarios con edicións',
@@ -2529,7 +2545,7 @@ Limitouse a eliminación destas páxinas para previr problemas de funcionamento
 'delete-warning-toobig' => 'Esta páxina conta cun historial de edicións longo, de máis {{PLURAL:$1|dunha revisión|de $1 revisións}}.
 Ao eliminala pódense provocar problemas de funcionamento nas operacións da base de datos de {{SITENAME}};
 proceda con coidado.',
-'deleting-backlinks-warning' => "'''Atención:''' Outras páxinas conteñen unha ligazón ou unha transclusión da páxina que está a piques de borrar.",
+'deleting-backlinks-warning' => "'''Atención:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Outras páxinas]] conteñen unha ligazón ou unha transclusión da páxina que está a piques de borrar.",
 
 # Rollback
 'rollback' => 'Reverter as edicións',
@@ -2706,8 +2722,10 @@ $1',
 'sp-contributions-blocked-notice-anon' => 'Este enderezo IP está bloqueado.
 Velaquí está a última entrada do rexistro de bloqueos, por se quere consultala:',
 'sp-contributions-search' => 'Busca de contribucións',
+'sp-contributions-suppresslog' => 'contribucións borradas do usuario',
 'sp-contributions-username' => 'Enderezo IP ou nome de usuario:',
 'sp-contributions-toponly' => 'Mostrar só as últimas revisións',
+'sp-contributions-newonly' => 'Mostrar só as edicións que crearon páxinas',
 'sp-contributions-submit' => 'Procurar',
 
 # What links here
@@ -3016,7 +3034,7 @@ $2',
 'thumbnail_image-type' => 'Tipo de imaxe non soportado',
 'thumbnail_gd-library' => 'Configuración da libraría GD incompleta: Falta a función $1',
 'thumbnail_image-missing' => 'Parece que falta o ficheiro: $1',
-'thumbnail_image-failure-limit' => 'Producíronse demasiados ($1 ou máis) intentos fallidos recentes de renderizar esta miniatura. Vólvao intentar máis tarde.',
+'thumbnail_image-failure-limit' => 'Producíronse demasiados ($1 ou máis) intentos fallidos recentes de renderizar esta miniatura. Inténteo de novo máis tarde.',
 
 # Special:Import
 'import' => 'Importar páxinas',
@@ -3974,7 +3992,7 @@ Tamén pode [[Special:EditWatchlist|empregar o editor normal]].',
 'version-ext-colheader-credits' => 'Autores',
 'version-license-title' => 'Licenza para $1',
 'version-license-not-found' => 'Non se atopou información detallada de licenza para esta extensión.',
-'version-credits-title' => 'Receñecemento para $1',
+'version-credits-title' => 'Recoñecemento para $1',
 'version-credits-not-found' => 'Non se atopou información detallada de recoñecemento para esta extensión.',
 'version-poweredby-credits' => "Este wiki está desenvolvido por '''[https://www.mediawiki.org/wiki/MediaWiki/gl MediaWiki]''', dereitos de autoría © 2001-$1 $2.",
 'version-poweredby-others' => 'outros',
@@ -4254,6 +4272,4 @@ De feito, expande case calquera cousa entre dúas chaves.',
 'expand_templates_generate_rawhtml' => 'Mostrar o HTML en bruto',
 'expand_templates_preview' => 'Vista previa',
 
-# Unknown messages
-'uploadinvalidxml' => 'Non se puido analizar o XML do ficheiro cargado.',
 );
index 84a3e21..5dc065b 100644 (file)
@@ -170,7 +170,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Schick mr Kopie vo de E-Mails, won i andere schick.',
 'tog-diffonly' => 'Numme Versionsunterschiid aazeige, ohni d Syte',
 'tog-showhiddencats' => 'Zeig di versteckte Kategorie',
-'tog-noconvertlink' => 'Konvertierig vum Titel deaktiviere',
 'tog-norollbackdiff' => 'Unterschid noch em Zrucksetze unterdrucke',
 'tog-useeditwarning' => 'Warn mi, wänn I ne Syte verloss mit Bearbeitige, wu nonig gspycheret sin',
 'tog-prefershttps' => 'Wänn aagmäldet, alliwyl e sicheri Verbindig bruuche',
@@ -1629,6 +1628,7 @@ Wänn Du die Datei einewäg wit uffelade, gang bitte zruck un ändere dr Name.
 'uploaddisabledtext' => 'S Uffelade vu Dateie isch deaktiviert.',
 'php-uploaddisabledtext' => 'S Uffelade vu PHP-Dateie isch deaktiviert wore. Bitte iberprief d file_uploads-Yystellig.',
 'uploadscripted' => 'In däre Datei git s HTML- oder Scriptcode, wu fälschligerwyys vun eme Webbrowser usgfiert chennt were.',
+'uploadinvalidxml' => 'S XML in dr uffegladene Datei het nit chenne parst wäre.',
 'uploadvirus' => 'In däre Datei het s e Virus! Detail: $1',
 'uploadjava' => 'Des isch e ZIP-Datei, wu s e CLASS-Datei vu Java din het.
 S Uffelade vu Java-Dateien isch nit gstattet, wel si s Umgoh vu Sicherheitsyyschränkige chennte megli mache.',
@@ -3799,6 +3799,4 @@ Sunscht chasch au s eifach Formular unte nutze. Dyy Kommentar wird, zämme mit D
 'expand_templates_generate_xml' => 'Zeig XML-Parser-Baum',
 'expand_templates_preview' => 'Vorschou',
 
-# Unknown messages
-'uploadinvalidxml' => 'S XML in dr uffegladene Datei het nit chenne parst wäre.',
 );
index c131377..25415ce 100644 (file)
@@ -188,7 +188,6 @@ $messages = array(
 'tog-ccmeonemails' => 'મે અન્યોને મોકલેલા ઇમેલની નકલ મને મોકલો',
 'tog-diffonly' => 'તફાવતની નીચે લેખ ન બતાવશો',
 'tog-showhiddencats' => 'છુપી શ્રેણીઓ દર્શાવો',
-'tog-noconvertlink' => 'Disable link title conversion',
 'tog-norollbackdiff' => 'રોલબેક કર્યા પછીના તફાવતો છુપાવો',
 'tog-useeditwarning' => 'સાચવ્યા વગર જો હું પૃષ્ઠ છોડું તો મને ચેતવણી આપો',
 'tog-prefershttps' => 'સભ્યનામથી પ્રવેશ કર્યો હોય ત્યારે સુરક્ષિત જોડાણ (https) જ વાપરો',
@@ -363,7 +362,7 @@ $messages = array(
 'postcomment' => 'નવો વિભાગ',
 'articlepage' => 'લેખનું પાનું જુઓ',
 'talk' => 'ચર્ચા',
-'views' => 'દેખાવ',
+'views' => 'દેખાવ',
 'toolbox' => 'સાધનો',
 'userpage' => 'સભ્યનું પાનું જુઓ',
 'projectpage' => 'પ્રકલ્પનું પાનું જુઓ',
@@ -434,7 +433,7 @@ $1',
 'viewsourceold' => 'સ્રોત જુઓ',
 'editlink' => 'ફેરફાર',
 'viewsourcelink' => 'સ્રોત જુઓ',
-'editsectionhint' => 'ફà«\87રફાર àª\95રà«\8b - àªªàª°àª¿àª\9aà«\8dàª\9bà«\87દ: $1',
+'editsectionhint' => 'પરિàª\9aà«\8dàª\9bà«\87દ àª«à«\87રફાર àª\95રà«\8b: $1',
 'toc' => 'અનુક્રમણિકા',
 'showtoc' => 'બતાવો',
 'hidetoc' => 'છુપાવો',
@@ -455,7 +454,7 @@ $1',
 'sort-ascending' => 'ચડતા ક્રમમાં ગોઠવો',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'લà«\87àª\96',
+'nstab-main' => 'પાનà«\81àª\82',
 'nstab-user' => 'સભ્ય પાનું',
 'nstab-media' => 'મિડીયા પાનું',
 'nstab-special' => 'ખાસ પાનું',
@@ -702,6 +701,9 @@ $2',
 'suspicious-userlogout' => 'લોગ આઉટ કરવાની તમારી વિનંતિ પૂરી ન કરી શકાઇ. એમ લાગે છે કે તેને તૃટિ પામેલ બ્રાઉઝર કે પ્રોક્સી દ્વારા મોકલાઈ હતી.',
 'createacct-another-realname-tip' => 'સાચું નામ મરજીયાત છે.
 જો તમે તે આપવાનું પસંદ કરશો, તો તેનો ઉપયોગ તમે કરેલ યોગદાનનું શ્રેય આપવા માટે થશે.',
+'pt-login' => 'પ્રવેશ કરો',
+'pt-createaccount' => 'ખાતું બનાવો',
+'pt-userlogout' => 'બહાર નીકળો',
 
 # Email sending
 'php-mail-error-unknown' => 'PHPની મેલ() કામગીરીમાં અજ્ઞાત ત્રુટિ',
@@ -710,8 +712,7 @@ $2',
 
 # Change password dialog
 'changepassword' => 'ગુપ્તસંજ્ઞા બદલો',
-'resetpass_announce' => 'તમે હંગામી ઇમેઇલ કોડ સાથે લોગ ઇન કર્યું.
-લોગીંગ પુરૂં કરવા માટે તમારે નવી ગુપ્ત સંજ્ઞા (પાસવર્ડ) આપવો પડશે:',
+'resetpass_announce' => 'પ્રવેશ પૂર્ણ કરવા માટે, તમારે નવો પાસવર્ડ ગોઠવવો જ પડશે.',
 'resetpass_text' => '<!-- અહીં ટેક્સટ ઉમેરો -->',
 'resetpass_header' => 'ખાતાની ગુપ્તસંજ્ઞા બદલો',
 'oldpassword' => 'જુની ગુપ્તસંજ્ઞા:',
@@ -1208,7 +1209,7 @@ $1",
 'shown-title' => 'પ્રતિ પાને $1 {{PLURAL:$1|પરિણામ|પરિણામો}} બતાવો',
 'viewprevnext' => 'જુઓ: ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "''' આ વિકિ પર  \"[[:\$1]]\" નામે પાનું પહેલેથી અસ્તિત્વમાં છે.'''",
-'searchmenu-new' => "'''આ વિકિ પર \"[[:\$1]]\" નામે પાનું બનાવો!'''",
+'searchmenu-new' => '<strong>આ વિકિ પર "[[:$1]]" પાનું બનાવો!</strong> {{PLURAL:$2|0=|તમારી શોધમાં મળેલ પાનું પણ જુઓ.|તમારી શોધમાં મળેલ પરિણામો પણ જુઓ.}}',
 'searchprofile-articles' => 'લેખનું પાનું',
 'searchprofile-project' => 'મદદ અને યોજના પાનું',
 'searchprofile-images' => 'દ્રશ્ય શ્રાવ્ય માધ્યમ',
@@ -1219,7 +1220,7 @@ $1",
 'searchprofile-images-tooltip' => 'ફાઇલ શોધો',
 'searchprofile-everything-tooltip' => 'બધે જ શોધો (ચર્ચાનાં પાના સહિત)',
 'searchprofile-advanced-tooltip' => 'સ્થાનીય નામસ્થળોમાં શોધો:',
-'search-result-size' => '$1 ({{PLURAL:$2|1 શબ્દ|$2 શબ્દો}})',
+'search-result-size' => '$1 ({{PLURAL:$2| શબ્દ|$2 શબ્દો}})',
 'search-result-category-size' => '{{PLURAL:$1|1 સભ્ય|$1 સભ્યો}} ({{PLURAL:$2|1 ઉપ શ્રેણી|$2 ઉપ શ્રેણીઓ}}, {{PLURAL:$3|1 ફાઇલ|$3 ફાઇલો}})',
 'search-result-score' => 'પ્રસ્તુતિ: $1%',
 'search-redirect' => '(અન્યત્ર પ્રસ્થાન $1)',
@@ -1543,14 +1544,26 @@ HTML નાકું ચકાસો',
 'recentchanges-label-unpatrolled' => 'આ ફેરફાર હજી ચકાસાયો નથી',
 'recentchanges-label-plusminus' => 'પાનાનું કદ આપેલા અંકો જેટલાં બાઈટ્સ જેટલું બદલ્યુ છે.',
 'recentchanges-legend-newpage' => '([[Special:NewPages|નવા પાનાઓની યાદી]] પણ જુઓ)',
-'rcnotefrom' => "નીચે '''$2'''થી થયેલાં '''$1''' ફેરફારો દર્શાવ્યાં છે.",
+'rcnotefrom' => 'નીચે <strong>$2</strong> થી ફેરફારો દર્શાવેલ છે (<strong>$1</strong> સુધી દર્શાવલે છે).',
 'rclistfrom' => '$1 બાદ થયેલા નવા ફેરફારો બતાવો',
 'rcshowhideminor' => 'નાના ફેરફારો $1',
+'rcshowhideminor-show' => 'બતાવો',
+'rcshowhideminor-hide' => 'છુપાવો',
 'rcshowhidebots' => 'બૉટો $1',
-'rcshowhideliu' => 'લૉગ ઇન થયેલાં સભ્યો $1',
+'rcshowhidebots-show' => 'બતાવો',
+'rcshowhidebots-hide' => 'છુપાવો',
+'rcshowhideliu' => '$1 નોંધણી કરેલ સભ્યો',
+'rcshowhideliu-show' => 'બતાવો',
+'rcshowhideliu-hide' => 'છુપાવો',
 'rcshowhideanons' => 'અનામી સભ્યો $1',
+'rcshowhideanons-show' => 'બતાવો',
+'rcshowhideanons-hide' => 'છુપાવો',
 'rcshowhidepatr' => '$1 ચોકીયાત ફેરફારો',
+'rcshowhidepatr-show' => 'બતાવો',
+'rcshowhidepatr-hide' => 'છુપાવો',
 'rcshowhidemine' => 'મારા ફેરફારો $1',
+'rcshowhidemine-show' => 'બતાવો',
+'rcshowhidemine-hide' => 'છુપાવો',
 'rclinks' => 'છેલ્લાં $2 દિવસમાં થયેલા છેલ્લાં $1 ફેરફારો દર્શાવો<br />$3',
 'diff' => 'ભેદ',
 'hist' => 'ઇતિહાસ',
@@ -2026,6 +2039,10 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'protectedpages-indef' => 'ફક્ત અનિશ્ચિત સુરક્ષા ધરાવતા પાના',
 'protectedpages-cascade' => 'માત્ર પગથિયામય સુરક્ષા વાળા પગ',
 'protectedpagesempty' => 'આ વિકલ્પો દ્વારા કોઈ પાના સુરક્ષિત કરાયા નથી.',
+'protectedpages-page' => 'પાનું',
+'protectedpages-reason' => 'કારણ',
+'protectedpages-unknown-timestamp' => 'અજ્ઞાત',
+'protectedpages-unknown-performer' => 'અજ્ઞાત સભ્ય',
 'protectedtitles' => 'સંરક્ષિત શીર્ષકો',
 'protectedtitlesempty' => 'આ પરિબળો દ્વારા કોઇ પણ શીર્ષકો સચવાયા નથી.',
 'listusers' => 'સભ્યોની યાદી',
@@ -2585,8 +2602,9 @@ $1',
 'change-blocklink' => 'પ્રતિબંધમાં ફેરફાર કરો',
 'contribslink' => 'યોગદાન',
 'emaillink' => 'ઈ-મેલ મોકલો',
-'autoblocker' => 'તમારા પર સ્વયંચાલિત રીતે રોક લગાવાઇ છે કેમકે તમારો IP હાલમાં "[[User:$1|$1]]" સભ્ય દ્વારા વપરાયો છે.
-તેનું કારણ આ છે : "$2"',
+'autoblocker' => 'તમારા પર સ્વયંચાલિત રીતે રોક લગાવાઇ છે કેમ કે તમારું IP સરનામું હાલમાં "[[User:$1|$1]]" સભ્ય દ્વારા વપરાયેલ છે.
+
+$1નાં પ્રતિબંધનું કારણ "$2" છે',
 'blocklogpage' => 'પ્રતિબંધ સૂચિ',
 'blocklog-showlog' => 'આ સભ્ય પર પહેલા રોક લગાવાઈ છે.
 રોકા લગાવાયેલા સભ્યોની યાદિ આ મુજબ છે',
@@ -2608,7 +2626,7 @@ $1',
 'range_block_disabled' => 'પ્રબંધકના સમૂહીક રોક લગાડવાનો અધિકાર નીષ્ક્રિય',
 'ipb_expiry_invalid' => 'સમાપ્તિનો સમય માન્ય નથી.',
 'ipb_expiry_temp' => 'સંતાડેલા સભ્યનામ પ્રતિબંધનો કાયમી જ હોવા જોઇએ.',
-'ipb_hide_invalid' => 'àª\86 àªªàª¾àª¨àª¾àª¨à«\87 àª\9bà«\81પાવવà«\8b àª¸àª\82ભવ àª¨àª¥à«\80 àª¤à«\87માàª\82 àª\98ણા àª¬àª§àª¾àª\82 àª«à«\87રફારà«\8b àª\9bà«\87',
+'ipb_hide_invalid' => 'àª\86 àª\96ાતાàª\82નà«\87 àª\9bà«\81પાવવાàª\82 àª\85સàª\95à«\8dષમ; àª¤à«\87માàª\82 {{PLURAL:$1|àª\8fàª\95 àª«à«\87રફાર|$1 àª«à«\87રફારà«\8b}} àª\9bà«\87.',
 'ipb_already_blocked' => ' "$1" પહેલેથી પ્રતિબંધિત છે',
 'ipb-needreblock' => '$1 પહેલેથી પ્રતિબંધિત છે.
 તમારે આ સેટીંગ બદલવી છે?',
@@ -2781,6 +2799,7 @@ $1',
 'allmessages-prefix' => 'ઉપસર્ગ દ્વારા અલગ તારવો',
 'allmessages-language' => 'ભાષા:',
 'allmessages-filter-submit' => 'કરો',
+'allmessages-filter-translate' => 'ભાષાંતર કરો',
 
 # Thumbnails
 'thumbnail-more' => 'વિસ્તૃત કરો',
@@ -2872,7 +2891,7 @@ $2',
 'tooltip-pt-preferences' => 'તમારી પસંદગીઓ',
 'tooltip-pt-watchlist' => 'તમે દેખરેખ રાખી રહ્યાં હોવ તેવા પાનાઓની યાદી',
 'tooltip-pt-mycontris' => 'તમારા યોગદાનની યાદી',
-'tooltip-pt-login' => 'àª\86પનà«\87 àª²à«\8bàª\97 àª\87ન કરવા ભલામણ કરવામાં આવે છે, જોકે તે આવશ્યક નથી',
+'tooltip-pt-login' => 'àª\86પનà«\87 àªªà«\8dરવà«\87શ કરવા ભલામણ કરવામાં આવે છે, જોકે તે આવશ્યક નથી',
 'tooltip-pt-logout' => 'બહાર નીકળો/લૉગ આઉટ કરો',
 'tooltip-ca-talk' => 'અનુક્રમણિકાનાં પાના વિષે ચર્ચા',
 'tooltip-ca-edit' => "આપ આ પાનામાં ફેરફાર કરી શકો છો, કાર્ય સુરક્ષિત કરતાં પહેલાં 'ઝલક' બટન ઉપર ક્લિક કરીને જોઇ લેશો",
@@ -2888,8 +2907,8 @@ $2',
 'tooltip-ca-unwatch' => 'આ પાનું તમારી ધ્યાનસૂચીમાંથી કાઢી નાખો',
 'tooltip-search' => '{{SITENAME}} શોધો',
 'tooltip-search-go' => 'આ ચોક્કસ જોડણી વાળુ પાનુ જો અસ્તિત્વમાં હોય તો તેના પર જાવ',
-'tooltip-search-fulltext' => 'àª\86 àª²àª\96ાણ àªµàª¾àª³àª¾ પાનાઓ શોધો',
-'tooltip-p-logo' => 'મુખપૃષ્ઠ',
+'tooltip-search-fulltext' => 'àª\86 àª²àª\96ાણ àª§àª°àª¾àªµàª¤àª¾àª\82 પાનાઓ શોધો',
+'tooltip-p-logo' => 'મુખપૃષ્ઠની મુલાકાત લો',
 'tooltip-n-mainpage' => 'મુખપૃષ્ઠ પર જાઓ',
 'tooltip-n-mainpage-description' => 'મુખ્ય પાના પર જાઓ',
 'tooltip-n-portal' => 'પરિયોજના વિષે, આપ શું કરી શકો અને વસ્તુઓ ક્યાં શોધશો',
@@ -2904,7 +2923,7 @@ $2',
 'tooltip-t-contributions' => 'આ સભ્યનાં યોગદાનોની યાદી જુઓ',
 'tooltip-t-emailuser' => 'આ સભ્યને ઇ-મેલ મોકલો',
 'tooltip-t-upload' => 'ફાઇલ ચડાવો',
-'tooltip-t-specialpages' => 'બધા àª\96ાસ àªªàª¾àª¨àª¾àª\93નà«\80 àª¸à«\82àª\9aિ',
+'tooltip-t-specialpages' => 'બધા àª\96ાસ àªªàª¾àª¨àª¾àª\82àª\93નà«\80 àª¯àª¾àª¦à«\80',
 'tooltip-t-print' => 'આ પાનાની છાપવા માટેની આવૃત્તિ',
 'tooltip-t-permalink' => 'પાનાનાં આ પુનરાવર્તનની સ્થાયી કડી',
 'tooltip-ca-nstab-main' => 'સૂચિ વાળું પાનુ જુઓ',
@@ -3599,6 +3618,10 @@ $5
 'imgmultigo' => 'જાઓ!',
 'imgmultigoto' => 'પાના  $1 પર જાવ',
 
+# Language selector for translatable SVGs
+'img-lang-default' => '(મૂળભુત ભાષા)',
+'img-lang-go' => 'જાઓ',
+
 # Table pager
 'ascending_abbrev' => 'ચડતો ક્ર્મ',
 'descending_abbrev' => 'ઉતરતો ક્ર્મ',
@@ -3679,7 +3702,14 @@ $5
 'version-hook-name' => 'ખૂંટાનું નામ્',
 'version-hook-subscribedby' => 'દ્વ્રારા લાભાન્વીત',
 'version-version' => '(આવૃત્તિ $1)',
-'version-license' => 'પરવાનો',
+'version-license' => 'મીડિઆવિકિ લાયસન્સ',
+'version-ext-license' => 'લાયસન્સ',
+'version-ext-colheader-version' => 'આવૃત્તિ',
+'version-ext-colheader-license' => 'લાયસન્સ',
+'version-ext-colheader-description' => 'વર્ણન',
+'version-ext-colheader-credits' => 'લેખકો',
+'version-license-title' => '$1 માટે લાયસન્સ',
+'version-credits-title' => '$1 માટે યશ',
 'version-poweredby-credits' => "આ વિકિ  '''[https://www.mediawiki.org/ MediaWiki]''' દ્વારા ચાલે છે, પ્રકાશનાધિકાર © 2001-$1 $2.",
 'version-poweredby-others' => 'અન્યો',
 'version-poweredby-translators' => 'ટ્રાન્સલેટવિકિ.નેટ ભાષાંતરકર્તાઓ',
@@ -3716,7 +3746,7 @@ $5
 'fileduplicatesearch-noresults' => ' "$1" નામ ધરાવતી કોઇ ફાઇલ ન મળી',
 
 # Special:SpecialPages
-'specialpages' => 'ખાસ પાનાં',
+'specialpages' => 'ખાસ પાનાં',
 'specialpages-note' => '* નિયમિત ખાસ પાનાં.
 * <span class="mw-specialpagerestricted">પ્રતિબંધિત ખાસ પાનાં.</span>',
 'specialpages-group-maintenance' => 'સમારકામ અહેવાલ',
index 29c6d92..5e49183 100644 (file)
@@ -89,30 +89,55 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Kahalalo i nā loulou:',
-'tog-hideminor' => 'E hūnā i nā ho‘opololei iki ma nā loli hou',
-'tog-editondblclick' => 'Ho‘opololei i nā ‘ao‘ao ma ke kōmi pālua (JavaScript)',
-'tog-rememberpassword' => 'Hoʻomanaʻo iaʻu ma kēia lolo uila (no ka palena nui o $1 {{PLURAL:$1|lā|mau lā}})',
-'tog-watchcreations' => 'Ho‘ohui i nā ‘ao‘ao i hana ai au i ka‘u papa nānā pono',
-'tog-watchdefault' => 'Ho‘ohui i nā ‘ao‘ao i ho‘opololei ai au i ka‘u papa nānā pono',
-'tog-watchmoves' => 'Ho‘ohui i nā ‘ao‘ao i ne‘e ai au i ka‘u papa nānā pono',
-'tog-watchdeletion' => 'Ho‘ohui i nā ‘ao‘ao i kāpae ai au i ka‘u papa nānā pono',
-'tog-previewontop' => 'Hō‘ike i ka nāmua mamua o ke kau ho‘opololei',
-'tog-previewonfirst' => 'Hō‘ike i ka nāmua ma ka ho‘ololi mua',
-'tog-enotifwatchlistpages' => 'Ke loli kekahi ‘ao‘ao ma ka‘u papa nānā pono, leka uila ia‘u',
-'tog-enotifusertalkpages' => 'Ke loli ka‘u ʻaoʻao kūkākūkā, leka uila ia‘u',
-'tog-enotifminoredits' => 'No nā ho‘opololei ‘ana, leka uila ia‘u',
-'tog-enotifrevealaddr' => 'Hō‘ike i ko‘u leka uila ma nā leka uila hō‘ike',
-'tog-shownumberswatching' => 'Hō‘ike i ka heluna o nā mea ho‘ohana e nānā ai',
-'tog-fancysig' => 'Nā kākau inoa kūlohelohe (‘a‘ole me ka loulou hana nona iho)',
-'tog-forceeditsummary' => 'Ke kāhuakomo au i kekahi ho‘ulu‘ulu mana‘o ‘ole, ha‘i mai iaʻu',
-'tog-watchlisthideown' => 'Hūnā i ko‘u mau ho‘ololi ma ka papa nānā pono',
-'tog-watchlisthidebots' => 'Hūnā i nā ho‘opololei ‘ana o nā lopako mai ka papa nānā pono',
-'tog-watchlisthideminor' => 'E hūnā i nā ho‘ololi iki ma ka papa nānā pono',
-'tog-ccmeonemails' => 'Hā‘awi mai i nā kope o nā leka uila i hā‘awi ai au i kekahi mau mea ho‘ohana.',
-'tog-showhiddencats' => 'Hō‘ike i nā mahele huna',
-
-'underline-always' => 'Mau',
+'tog-hideminor' => 'E hoʻohūnā i nā ho‘ololi iki ma nā loli hou',
+'tog-hidepatrolled' => 'E hoʻohūnā i nā loli kiaʻi kaʻahele ma nā loli hou',
+'tog-newpageshidepatrolled' => 'E hoʻohūnā i nā ʻaoʻao kiaʻi kaʻahele mai ka papahelu ʻaoʻao hou',
+'tog-extendwatchlist' => 'E hoʻākea i ka papakiaʻi no ka hōʻike ʻana i nā loli apau, ʻaʻole nā mea hanawale wale nō',
+'tog-usenewrc' => 'Nā loli hui mao ka ʻaoʻao ma loko o ka loli hou a me ka papakiaʻi',
+'tog-numberheadings' => 'E hikahelu i nā poʻo',
+'tog-showtoolbar' => 'E hōʻike i ka pahu hāmeʻa hoʻololi',
+'tog-editondblclick' => 'E ho‘ololi i nā ‘ao‘ao me ke kōmi pālua',
+'tog-editsectiononrightclick' => 'E hoʻokuʻu i ka hoʻololi mahele mao ka paʻina ʻākau ma nā poʻoinoa māhele',
+'tog-rememberpassword' => 'E hoʻomanaʻo iaʻu ma kēia lolo uila (no ka palena nui o $1 {{PLURAL:$1|lā|mau lā}})',
+'tog-watchcreations' => 'E ho‘ohui i nā ‘ao‘ao aʻu i hana ai a me nā waihona aʻu i hoʻouka ai i ka‘u papakiaʻi',
+'tog-watchdefault' => 'E ho‘ohui i nā ‘ao‘ao a me nā waihona aʻu e hoʻololi ai i ka‘u papakiaʻi',
+'tog-watchmoves' => 'E ho‘ohui i nā ‘ao‘ao a me nā waihona aʻu e ne‘e ai i ka‘u papakiaʻi',
+'tog-watchdeletion' => 'E ho‘ohui i nā ‘ao‘ao a me nā waihona aʻu e holoi ai i ka‘u papakiaʻi',
+'tog-minordefault' => 'E kaha i nā loli apau i ka loli iki mao ka paʻamau',
+'tog-previewontop' => 'E hō‘ike i ka nāmua mamua o ka pahu hoʻololi',
+'tog-previewonfirst' => 'E hō‘ike i ka nāmua ma ka ho‘ololi mua',
+'tog-enotifwatchlistpages' => 'E leka uila iaʻu i ka loli ʻana o kekahi waihona aiʻole kekahi ʻaoʻao ma kaʻu papakiaʻi',
+'tog-enotifusertalkpages' => 'E leka uila iaʻu i ka loli ʻana o kaʻu ʻaoʻao walaʻau',
+'tog-enotifminoredits' => 'E leka uila iaʻu no nā loli iki o nā ʻaoʻao a me nā waihona',
+'tog-enotifrevealaddr' => 'E hō‘ike i kaʻu wahinoho lekauila ma nā lekauila notikala',
+'tog-shownumberswatching' => 'E hō‘ike i ka helu o nā mea ho‘ohana e nānā nei',
+'tog-oldsig' => 'Pūlima hananei:',
+'tog-fancysig' => 'E hana i ka pūlima me he wikitext (me ʻole i ka loulou hanawale)',
+'tog-uselivepreview' => 'E hana i ka nāmua ʻānō (hoʻokolohua)',
+'tog-forceeditsummary' => 'E kono iaʻu i ka hoʻokomo ʻana i kekahi hōʻuluʻulu manaʻo hoʻololi hou',
+'tog-watchlisthideown' => 'E hoʻohūnā i ko‘u mau ho‘ololi mai ka papakiaʻi',
+'tog-watchlisthidebots' => 'E hoʻohūnā i nā loli o nā lopako mai ka papakiaʻi',
+'tog-watchlisthideminor' => 'E hoʻohūnā i nā loli iki mai ka papakiaʻi',
+'tog-watchlisthideliu' => 'E hoʻohūnā i nā loli e nā mea hoʻohana ʻeʻeia mai ka papakiaʻi',
+'tog-watchlisthideanons' => 'E hoʻohūnā i nā loli e nā mea hoʻohana inoaʻole mai ka papakiaʻi',
+'tog-watchlisthidepatrolled' => 'E hoʻohūnā i nā loli kiaʻi kaʻahele mai ka papakiaʻi',
+'tog-ccmeonemails' => 'E hoʻouna mai i nā kope o nā lekauila aʻu i hāʻawi ai i kekahi mau mea hoʻohana ʻē aʻe.',
+'tog-diffonly' => 'Mai hōʻike i nā mealoko ʻaoʻao ma lalo o ka ʻokoʻa',
+'tog-showhiddencats' => 'E hōʻike i nā māhele hūnā',
+'tog-norollbackdiff' => 'E waiho i ka ʻokoʻa ma hope o ka hana hoʻihoʻi',
+'tog-useeditwarning' => 'E aʻo mai iaʻu i kaʻu haʻalele ʻana i ka ʻaoʻao hoʻololi inā loaʻa i nā loli mālama ʻia ʻole',
+'tog-prefershttps' => 'E hana mau i ka hoʻokuʻi paʻa ma loko o ka ʻeʻe ʻana',
+
+'underline-always' => 'I nā manawa apau',
 'underline-never' => '‘A‘ole loa',
+'underline-default' => 'Paʻamau ʻike aiʻole pōlamu pūnaewele',
+
+# Font style option in Special:Preferences
+'editfont-style' => 'E hoʻololi i kahi kaila hua:',
+'editfont-default' => 'Pōlamu pūnaewele paʻamau',
+'editfont-monospace' => 'Hua pukakahi',
+'editfont-sansserif' => 'Hua Sanā-selifa',
+'editfont-serif' => 'Hua Selifa',
 
 # Dates
 'sunday' => 'Lāpule',
@@ -122,13 +147,13 @@ $messages = array(
 'thursday' => 'Pō‘ahā',
 'friday' => 'Pō‘alima',
 'saturday' => 'Pō‘aono',
-'sun' => 'Lāpule',
-'mon' => 'Pōʻakahi',
-'tue' => 'Pō‘alua',
-'wed' => 'Pō‘akolu',
-'thu' => 'Pō‘ahā',
-'fri' => 'Pō‘alima',
-'sat' => 'Pō‘aono',
+'sun' => 'LP',
+'mon' => 'P1',
+'tue' => 'P2',
+'wed' => 'P3',
+'thu' => 'P4',
+'fri' => 'P5',
+'sat' => 'P6',
 'january' => 'Ianuali',
 'february' => 'Pepeluali',
 'march' => 'Malaki',
@@ -156,7 +181,7 @@ $messages = array(
 'jan' => 'Ian',
 'feb' => 'Pep',
 'mar' => 'Mal',
-'apr' => 'ʻAp',
+'apr' => 'ʻApe',
 'may' => 'Mei',
 'jun' => 'Iun',
 'jul' => 'Iul',
@@ -165,40 +190,69 @@ $messages = array(
 'oct' => 'ʻOk',
 'nov' => 'Now',
 'dec' => 'Kek',
+'january-date' => '$1 Ianuali',
+'february-date' => '$1 Pepeluali',
+'march-date' => '$1 Malaki',
+'april-date' => '$1 ʻApelila',
+'may-date' => '$1 Mei',
+'june-date' => '$1 Iune',
+'july-date' => '$1 Iulai',
+'august-date' => '$1 ʻAukake',
+'september-date' => '$1 Kepakemapa',
+'october-date' => '$1 ʻOkakopa',
+'november-date' => '$1 Nowemapa',
+'december-date' => '$1 Kēkēmapa',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|Mahele|Nā mahele}}',
+'pagecategories' => '{{PLURAL:$1|Mahele| mau Māhele}}',
 'category_header' => 'Nā ʻaoʻao i loko o ka mahele "$1"',
-'subcategories' => 'Nā māhele lalo',
-'category-media-header' => 'Nā pāpaho i loko o ka mahele "$1"',
-'category-empty' => "''‘A‘ohe mo‘olelo a me pāpaho o kēia mahele i kēia manawa.''",
-'hidden-categories' => '{{PLURAL:$1|Mahele hūnā|Nā mahele hūnā}}',
-'hidden-category-category' => 'Nā mahele hūnā',
-'listingcontinuesabbrev' => '(ho‘omau ‘ia)',
-
-'about' => 'E pili ana',
-'newwindow' => '(wehe i loko o kekahi pukaaniani ʻē aʻe)',
+'subcategories' => 'Nā Māhele kūloko',
+'category-media-header' => 'Nā Pāpaho i loko o ka mahele "$1"',
+'category-empty' => "''ʻAʻohe ʻaoʻao a me pāpaho a kēia mahele i kēia manawa.''",
+'hidden-categories' => '{{PLURAL:$1|mahele hūnā|mau māhele hūnā}}',
+'hidden-category-category' => 'Nā māhele hūnā',
+'category-subcat-count' => '{{PLURAL:$2|Hoʻokahi mahele kūloko wale nō o kēia mahele.|Aia {{PLURAL:$1|i kēia mahele kūloko|$1 mau māhele kūloko}} i loko o kēia mahele, $2 ka huina.}}',
+'category-article-count' => '{{PLURAL:$2|Hoʻokahi ʻaoʻao wale nō o kēia mahele.|Aia {{PLURAL:$1|i kēia ʻaoʻao|$1 mau ʻaoʻao}} i loko o kēia mahele, $2 ka huina.}}',
+'category-file-count' => '{{PLURAL:$2|Hoʻokahi waihona wale nō o kēia mahele.|Aia {{PLURAL:$1|i kēia waihona|$1 mau waihona}} i loko o kēia mahele, $2 ka huina.}}',
+'listingcontinuesabbrev' => '(homaʻia)',
+'noindex-category' => 'Nā ʻAoʻao i hoʻopapakuhikuhi kikoʻī ʻia',
+
+'about' => 'No ia',
+'newwindow' => '(wehe ʻia i loko o kekahi pukaaniani hou)',
 'cancel' => 'Ho‘ōki',
-'moredotdotdot' => 'Hou...',
-'mypage' => 'Ko‘u ‘ao‘ao',
-'mytalk' => 'Ka‘u kūkākūkā',
-'anontalk' => 'Ke kūkākūkā no kēia IP',
-'navigation' => 'Ka hoʻokele ʻana',
+'moredotdotdot' => 'Nā mea ʻē aʻe...',
+'mypage' => 'Ka‘u ‘ao‘ao',
+'mytalk' => 'Ka‘u walaʻau',
+'anontalk' => 'Walaʻau no kēia IP',
+'navigation' => 'Kelena',
 'and' => '&#32;a me',
 
 # Cologne Blue skin
-'qbfind' => 'Loa‘a',
-'qbedit' => 'E ho‘ololi',
+'qbfind' => 'Loa‘a iā',
+'qbbrowse' => 'Kele',
+'qbedit' => 'Hoʻololi',
 'qbpageoptions' => 'Kēia ‘ao‘ao',
 'qbmyoptions' => 'Ka‘u mau ‘ao‘ao',
+'faq' => 'NNP',
+'faqpage' => 'Project:NNP',
 
 # Vector skin
-'vector-action-delete' => 'E holoi',
-'vector-action-move' => 'Neʻe',
-'vector-action-protect' => 'Hoʻomalu',
-'vector-view-edit' => 'E hoʻololi',
+'vector-action-addsection' => 'Hoʻohui kumuhana',
+'vector-action-delete' => 'Holoi',
+'vector-action-move' => 'E hoʻoneʻe',
+'vector-action-protect' => 'E hoʻomalu',
+'vector-action-undelete' => 'Holoiʻole',
+'vector-action-unprotect' => 'E hoʻololi i ka hoʻomalu',
+'vector-view-create' => 'Haku',
+'vector-view-edit' => 'Hoʻololi',
+'vector-view-history' => 'Nānā i ka mōʻaukala',
 'vector-view-view' => 'Heluhelu',
+'vector-view-viewsource' => 'Nānā i ke kumu',
+'actions' => 'Nā Hana',
+'namespaces' => 'Lewainoa',
+'variants' => 'Nā Lolina',
 
+'navigation-heading' => 'Papa kelena',
 'errorpagetitle' => 'Hewa',
 'returnto' => 'Ho‘i iā $1.',
 'tagline' => 'Mai {{SITENAME}}',
@@ -206,159 +260,258 @@ $messages = array(
 'search' => 'Huli',
 'searchbutton' => 'Huli',
 'go' => 'E huli',
-'searcharticle' => 'Hele',
-'history' => 'Mo‘olelo o ka ‘ao‘ao',
+'searcharticle' => 'E huli',
+'history' => 'Mōʻaukala ʻaoʻao',
 'history_short' => 'Mōʻaukala',
 'printableversion' => 'Mana paʻi pono',
-'permalink' => 'Ka loulou paʻa',
+'permalink' => 'Loulou paʻa',
 'print' => 'Pa‘i',
 'view' => 'Nānā',
-'edit' => 'E ho‘ololi',
-'create' => 'Hana',
-'editthispage' => 'E ho‘opololei i kēia ‘ao‘ao',
-'create-this-page' => 'Hana i keia ‘ao‘ao',
-'delete' => 'E kāpae',
-'deletethispage' => 'E kāpae i kēia mo‘olelo',
-'undelete_short' => 'Wehe-kāpae i {{PLURAL:$1|kekahi ho‘opololei|$1 ho‘opololei}}',
-'protect' => 'E ho‘omalu',
+'edit' => 'Hoʻololi',
+'create' => 'Haku',
+'editthispage' => 'E hoʻololi i kēia ‘ao‘ao',
+'create-this-page' => 'E haku i keia ‘ao‘ao',
+'delete' => 'Holoi',
+'deletethispage' => 'E holoi i kēia ʻaoʻao',
+'undeletethispage' => 'E holoiʻole i kēia ʻaoʻao',
+'undelete_short' => 'E holoiʻole i {{PLURAL:$1|hoʻokahi loli|$1 mau loli}}',
+'viewdeleted_short' => 'E ʻike i {{PLURAL:$1|hoʻokahi loli holoi|$1 mau loli holoi}}',
+'protect' => 'Hoʻomalu',
 'protect_change' => 'hoʻololi',
 'protectthispage' => 'E ho‘omalu i kēia ‘ao‘ao',
-'unprotect' => 'E wehe ho‘omalu',
+'unprotect' => 'E hoʻololi i ka ho‘omalu',
+'unprotectthispage' => 'E hoʻololi i ka hoʻomalu o kēia ʻaoʻao',
 'newpage' => '‘Ao‘ao hou',
 'talkpage' => 'Kūkākūkā i keia ‘ao‘ao',
-'talkpagelinktext' => 'Kūkākūkā',
+'talkpagelinktext' => 'Walaʻau',
 'specialpage' => '‘Ao‘ao kūikawā',
-'personaltools' => 'Nā mea hana ponoʻī',
+'personaltools' => 'Hāmeʻa ponoʻī',
 'postcomment' => 'Māhele hou',
-'talk' => 'Kūkākūkā',
-'views' => 'Nā nānaina',
-'toolbox' => 'Pahu mea hana',
-'userpage' => 'Nānā i ka ‘ao‘ao-mea ho‘ohana',
+'articlepage' => 'Nānā i ka ʻaoʻao mealoko',
+'talk' => 'walaʻau',
+'views' => 'Nānaina',
+'toolbox' => 'Hāmeʻa',
+'userpage' => 'Nānā i ka ‘ao‘ao mea ho‘ohana',
 'projectpage' => 'Nānā i ka ‘ao‘ao papahana',
-'imagepage' => 'Nānā i ka ‘ao‘ao pāpaho',
-'mediawikipage' => 'Nānā i ka ‘ao‘ao memo',
+'imagepage' => 'Nānā i ka ‘ao‘ao waihona',
+'mediawikipage' => 'Nānā i ka ‘ao‘ao pūlono',
 'templatepage' => 'Nānā i ka ‘ao‘ao anakuhi',
 'viewhelppage' => 'Nānā i ka ‘ao‘ao kōkua',
 'categorypage' => 'Nānā i ka ‘ao‘ao mahele',
 'viewtalkpage' => 'Nānā i ke kūkākūkā',
 'otherlanguages' => 'Ma nā leo ʻē aʻe',
-'redirectedfrom' => '(Hoʻoili mai $1)',
-'redirectpagesub' => '‘Ao‘ao e alaka‘i ai',
-'lastmodifiedat' => 'Ua hoʻololi ʻia kēia ʻaoʻao ma ka lā $1, i ka manawa $2.',
+'redirectedfrom' => '(Kia hou mai $1)',
+'redirectpagesub' => 'ʻAoʻao kia hou',
+'lastmodifiedat' => 'Ua kāloli ʻia kēia ʻaoʻao i ka lā $1, ma ka hola $2.',
+'viewcount' => 'Ua komo ʻia kēia ʻaoʻao i {{PLURAL:$1|hoʻokahi manawa|$1 mau manawa}}',
 'protectedpage' => '‘Ao‘ao ho‘omalu',
-'jumpto' => 'Lele i:',
-'jumptonavigation' => 'ka ho‘okele ‘ana',
+'jumpto' => 'Lele iā:',
+'jumptonavigation' => 'kelena',
 'jumptosearch' => 'huli',
+'view-pool-error' => 'E kala mai, ua hoʻoili nui ʻino nā pūnaewele i kēia manawa. Hoʻāʻo nā mea hoʻohana nui kā e ʻike i kēia ʻaoʻao. E ʻoluʻolu, e kali no kekahi mau minuke a hana hou. 
+
+$1',
+'pool-errorunknown' => 'Hewa ʻikeʻole',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
-'aboutsite' => 'E pili ana iā {{SITENAME}}',
-'aboutpage' => 'Project:E pili ana',
-'copyrightpage' => '{{ns:project}}:Palapala ho‘okuleana',
-'currentevents' => 'Ka nū hou',
-'currentevents-url' => 'Project:Ka nū hou',
-'disclaimers' => 'Palapala hoʻokuʻu kuleana',
-'disclaimerpage' => 'Project:Palapala hoʻokuʻu kuleana',
-'edithelp' => 'Kōkua me ka ho‘ololi ‘ana',
-'helppage' => 'Help:Papa kuhikuhi',
-'mainpage' => "Kahua pa'a",
-'mainpage-description' => 'Ka papa kinohi',
-'policy-url' => 'Project:Palapala',
-'portal' => 'Ka hui kaiaulu',
-'portal-url' => 'Project:Ka hui kaiaulu',
-'privacy' => 'Kulekele palekana ʻikepili pilikino',
-'privacypage' => 'Project:Palapala pilikino',
-
-'badaccess' => 'Hewa me ka ‘ae',
+'aboutsite' => 'No {{SITENAME}}',
+'aboutpage' => 'Project:No translatewiki.net',
+'copyrightpage' => '{{ns:project}}:Kūleana kope',
+'currentevents' => 'hou',
+'currentevents-url' => 'Project:hou',
+'disclaimers' => 'Nā Akahele',
+'disclaimerpage' => 'Project:Akahele Laulaha',
+'edithelp' => 'Kōkua ho‘ololi',
+'helppage' => 'Help:Papakuhikuhi',
+'mainpage' => 'Papa Kinohi',
+'mainpage-description' => 'Papa Kinohi',
+'policy-url' => 'Project:Kulekele',
+'portal' => 'Puka Kaiāulu',
+'portal-url' => 'Project:Puka Kaiāulu',
+'privacy' => 'Kulekele pilikino',
+'privacypage' => 'Project:Kulekele pilikino',
+
+'badaccess' => 'Hewa ‘aena',
 
 'ok' => 'Hiki nō',
 'retrievedfrom' => 'Kiʻi ʻia mai "$1"',
-'youhavenewmessages' => 'He $1 ($2) kāu.',
-'youhavenewmessagesmulti' => 'He mau memo kou ma $1',
-'editsection' => 'e ho‘ololi',
-'editold' => 'e ho‘ololi',
-'viewsourceold' => 'nānā i ke kumu kanawai',
+'youhavenewmessages' => '$1 {{PLURAL:$3|kāu}} ($2).',
+'youhavenewmessagesfromusers' => '$1 {{PLURAL:$4|kāu}} mai {{PLURAL:$3|kekahi mea hoʻohana ʻē aʻe|$3 mau mea hoʻohana}} ($2).',
+'youhavenewmessagesmanyusers' => '$1 kāu mai nā mea hoʻohana he nui ($2).',
+'newmessageslinkplural' => '{{PLURAl:$1|Hoʻokahi leka|999=He mau leka}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|loli|999=mau loli}}',
+'youhavenewmessagesmulti' => '$1 kāu',
+'editsection' => 'ho‘ololi',
+'editold' => 'ho‘ololi',
+'viewsourceold' => 'nānā i ke kumu',
 'editlink' => 'hoʻololi',
-'viewsourcelink' => 'nānā i ka molekumu',
+'viewsourcelink' => 'nānā i kkumu',
 'editsectionhint' => 'E hoʻololi i ka paukū: $1',
-'toc' => 'Papa kuhikuhi',
+'toc' => 'Nā Mealoko',
 'showtoc' => 'hō‘ike',
-'hidetoc' => 'hūnā',
-'thisisdeleted' => 'Nānā ai‘ole hō‘āla i $1?',
-'viewdeleted' => 'Nānā i $1?',
-'restorelink' => '{{PLURAL:$1|kekahi ho‘opololei kāpae|nā ho‘opololei kāpae $1}}',
-'site-rss-feed' => 'Hulu RSS o $1',
-'site-atom-feed' => 'Hulu Atom o $1',
-'page-rss-feed' => 'Hulu RSS o "$1"',
-'page-atom-feed' => 'Hulu Atom o "$1"',
-'red-link-title' => '$1 (ʻaʻole i kākau ʻia)',
+'hidetoc' => 'hoʻohūnā',
+'collapsible-collapse' => 'Hoʻoliʻi',
+'collapsible-expand' => 'Hoʻākea',
+'thisisdeleted' => 'Nānā ai‘ole hō‘āla iā $1?',
+'viewdeleted' => 'Nānā iā $1?',
+'restorelink' => '{{PLURAL:$1|kekahi loli holoi|$1 mau loli holoi}}',
+'feedlinks' => 'Hānaīke:',
+'site-rss-feed' => 'Hānaīke RSS o $1',
+'site-atom-feed' => 'Hānaīke Atom o $1',
+'page-rss-feed' => 'Hānaīke RSS o "$1"',
+'page-atom-feed' => 'Hānaīke Atom o "$1"',
+'red-link-title' => '$1 (haku ʻia ʻole)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'ʻAoʻao',
-'nstab-user' => 'Inoa mea ho‘ohana',
-'nstab-media' => 'Pāpaho',
-'nstab-special' => 'Papa nui',
-'nstab-project' => 'Papahana',
+'nstab-user' => 'ʻAoʻao mea ho‘ohana',
+'nstab-media' => 'ʻAoʻao Pāpaho',
+'nstab-special' => 'ʻAoʻao kūikawā',
+'nstab-project' => 'ʻAoʻao papahana',
 'nstab-image' => 'Waihona',
-'nstab-mediawiki' => 'Memo',
+'nstab-mediawiki' => 'Pūlono',
 'nstab-template' => 'Anakuhi',
 'nstab-help' => 'Kōkua',
 'nstab-category' => 'Mahele',
 
+# Main script and global functions
+'nosuchaction' => 'ʻAʻohe hana',
+'nosuchspecialpage' => 'ʻAʻohe ʻaoʻao kūikawā',
+
 # General errors
 'error' => 'Hewa',
+'databaseerror' => 'Hewa hōkeo ʻikepili',
+'databaseerror-query' => 'Nīnau: $1',
+'databaseerror-function' => 'Hana: $1',
+'databaseerror-error' => 'Hewa: $1',
+'laggedslavemode' => '<strong>E akahele:</strong> ʻAʻole loaʻa paha i ka ʻaoʻao na hoʻouka hou hou.',
 'readonly' => 'Laka ‘ia ka hōkeo ‘ikepili',
-'missingarticle-diff' => '(Loli hope: $1, $2)',
-'filedeleteerror' => '‘A‘ole hiki ke kāpae i ka waihona "$1".',
-'filenotfound' => '‘A‘ole hiki ke loa‘a waihona "$1".',
-'badtitle' => 'Inoa ‘ino',
-'viewsource' => 'E nānā i ka molekumu',
+'missing-article' => 'Loaʻa ʻole i ka hōkeo ʻikepili ke kikokikona o ka ʻaoʻao i pono e loaʻa ʻia i kapa ʻia ʻo "$1" $2.
+
+Hana ʻia kēia pilikia e ka hāhai ʻana o kekahi ʻokoʻa kahiko aiʻole i kekahi loulou mōʻaukala i kekahi ʻaoʻao i holoi ʻia.
+
+Inā ʻaʻole ka hana, ua loaʻa paha iā ʻoe i kekahi mū i loko o ka lako pōlamu.
+E ʻoluʻolu, e lono  kēia pilikia i kekahi [[Special:ListUsers/sysop|kahu]], mai poina i ka URL.',
+'missingarticle-rev' => '(kāmua#: $1)',
+'missingarticle-diff' => '(ʻOkoʻa: $1, $2)',
+'internalerror' => 'Hewa koloko',
+'internalerror_info' => 'Hewa koloko:$1',
+'fileappenderrorread' => 'ʻAʻole hiki ke heluhelu iā "$1" ma loko o ka pākuʻi ʻana.',
+'fileappenderror' => 'ʻAʻole hiki ke pākuʻi "$1" iā "$2".',
+'filecopyerror' => 'ʻAʻole hiki ke kope ka waihona "$1" iā "$2".',
+'filerenameerror' => 'ʻAʻole hiki ke hōʻinoa hou ka waihona "$1" iā "$2".',
+'filedeleteerror' => '‘A‘ole hiki ke holoi i ka waihona "$1".',
+'directorycreateerror' => 'ʻAʻole hiki ke haku ka papakuhi waihona "$1"',
+'filenotfound' => '‘A‘ole hiki ke loa‘a ka waihona "$1".',
+'fileexistserror' => 'ʻAʻole hiki ke kākau i ka waihona "$1": Aia no ia.',
+'badtitle' => 'Inoa ʻohe',
+'badtitletext' => 'ʻAʻohe paha, hakahaka paha aiʻole loulou hewa paha ka poʻoinoa ʻaoʻao.
+Loaʻa paha nā hua kikokikona e hiki ʻole ke hana i nā poʻoinoa.',
+'viewsource' => 'Nānā i ke kumu',
+'viewsource-title' => 'Nānā i ke kumu no $1',
 'cascadeprotected' => 'Ho‘omalu ‘ia kēia ‘ao‘ao mai e ho‘opololei ana, no ka mea, hoʻokomo pū ‘ia ‘oia ma aia {{PLURAL:$1|‘ao‘ao|nā ‘ao‘ao}} i lalo, ho‘omalu ‘ia me ka "e wailele ana" koho:
 $2',
-'ns-specialprotected' => '‘A‘ole hiki ke ho‘opololei i nā ‘ao‘ao kūikawā',
+'ns-specialprotected' => '‘A‘ole hiki ke ho‘ololi i nā ‘ao‘ao kūikawā',
+'exception-nologin' => 'ʻE‘e ʻole',
 
 # Login and logout pages
-'yourname' => "Inoa mea ho'ohana",
+'welcomeuser' => 'Welina mai e $1!',
+'yourname' => "Inoa mea ho'ohana:",
+'userlogin-yourname' => 'Inoa mea hoʻohana',
+'userlogin-yourname-ph' => 'E kikokiko i kāu inoa mea hoʻohana',
+'createacct-another-username-ph' => 'E kikokiko i ka inoa mea hoʻohana',
 'yourpassword' => 'ʻŌlelo hūnā:',
-'yourpasswordagain' => "Hua'ōlelo huna hou",
+'userlogin-yourpassword' => 'ʻŌlelo hūnā',
+'userlogin-yourpassword-ph' => 'Kikokiko i kāu ʻōlelo hūnā',
+'createacct-yourpassword-ph' => 'Kikokiko i kekahi ʻōlelo hūnā',
+'yourpasswordagain' => 'E kikokiko hou i ka ʻōlelo hūnā:',
+'createacct-yourpasswordagain' => 'E hōʻoia i ka ʻōlelo hūnā',
+'createacct-yourpasswordagain-ph' => 'E kikokiko hou i ka ʻōlelo hūnā',
 'remembermypassword' => 'Hoʻomanaʻo iaʻu ma kēia lolo uila (no ka palena nui o $1 {{PLURAL:$1|lā|mau lā}})',
+'userlogin-remembermypassword' => 'Hoʻomanaʻo iaʻu',
 'login' => 'ʻEʻe',
-'nav-login-createaccount' => 'ʻEʻe / E kāinoa',
-'loginprompt' => 'Pono ʻoe e hoʻā i nā makana (cookies) no ka ʻeʻe ʻana i {{SITENAME}}.',
-'userlogin' => 'ʻEʻe / E kāinoa',
+'nav-login-createaccount' => 'ʻEʻe / Kāinoa',
+'loginprompt' => 'Pono ʻoe e hoʻā i nā makana no ka ʻeʻe ʻana iā {{SITENAME}}.',
+'userlogin' => 'ʻEʻe / Kāinoa',
 'userloginnocreate' => 'ʻEʻe',
-'logout' => 'E haʻalele',
-'userlogout' => 'E haʻalele',
-'notloggedin' => 'Mai ‘e‘e',
+'logout' => 'Haʻalele',
+'userlogout' => 'Haʻalele',
+'notloggedin' => 'ʻE‘e ʻole',
+'userlogin-noaccount' => 'ʻAʻohe āu moʻokāki?',
+'userlogin-joinproject' => 'E komo mai iā {{SITENAME}}',
 'nologin' => "ʻAʻohe āu moʻokāki? '''$1'''.",
-'nologinlink' => 'E kāinoa',
-'createaccount' => 'E hana',
+'nologinlink' => 'E Kāinoa',
+'createaccount' => 'E Kāinoa',
 'gotaccount' => "He moʻokāki kāu? '''$1'''.",
 'gotaccountlink' => 'ʻEʻe',
-'createaccountmail' => 'no ka leka uila',
+'userlogin-resetlink' => 'Ua poina i kāu ʻike ʻeʻe?',
+'userlogin-resetpassword-link' => 'Ua poina i kāu ʻōlelo hūnā?',
+'helplogin-url' => 'Help:ʻEʻe',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Kōkua me ka ʻeʻe ʻana]]',
+'userlogin-createanother' => 'E kāinoa i kekahi moʻokāki ʻē aʻe',
+'createacct-join' => 'E kikokiko i kāu ʻike i lalo.',
+'createacct-another-join' => 'E kikokiko i ka ʻike o ka moʻokāki hou i lalo.',
+'createacct-emailrequired' => 'Wahinoho lekauila',
+'createacct-emailoptional' => 'Wahinoho lekauila (kāpae)',
+'createacct-email-ph' => 'E kikokiko i kāu wahinoho lekauila',
+'createacct-another-email-ph' => 'E kikokiko i ka wahinoho lekauila',
+'createaccountmail' => 'Hana i kekahi ʻōlelo hūnā ponokoho kūikawā a hoʻouna ia i ka wahinoho lekauila i kikokiko ʻia',
+'createacct-realname' => 'Inoa ʻoiaʻiʻo (kāpae)',
 'createaccountreason' => 'Kumu:',
+'createacct-reason' => 'Kumu',
+'createacct-reason-ph' => 'No ke aha mai ke kāinoa nei i kekahi moʻokāki ʻē aʻe',
+'createacct-imgcaptcha-ph' => 'E kikokiko i ke kikokikona  i luna',
+'createacct-submit' => 'Kāinoa',
+'createacct-another-submit' => 'Kāinoa hou',
 'badretype' => 'ʻAʻole like nā ʻōlelo hūnā āu i hoʻokomo ai',
-'userexists' => 'Lilo ka inoa mea ho‘ohana.
-E koho i kekahi inoa, ke ‘olu‘olu.',
+'userexists' => 'Ua kāinoa ʻia ka inoa mea ho‘ohana.
+E koho i kekahi inoa ʻē aʻe, ke ‘olu‘olu.',
 'loginerror' => 'Hewa ʻeʻe',
+'createacct-error' => 'Hewa kāinoa',
+'createaccounterror' => 'ʻAʻole hiki ke kāinoa: $1',
 'loginsuccesstitle' => 'ʻEʻe kūleʻa',
-'loginsuccess' => "'''ʻEʻe ʻia ʻoe, ʻo \"\$1\", iā {{SITENAME}}.'''",
-'nouserspecified' => 'Pono ʻoe e kāhuakomo i ka ʻōlelo ʻeʻe.',
+'loginsuccess' => '<strong>Ua ʻeʻe ʻo "$1" iā {{SITENAME}}.</strong>',
+'nouserspecified' => 'Pono ʻoe e kāhuakomo i ka inoa mea hoʻohana.',
 'wrongpassword' => 'Hewa ka ʻōlelo hūnā.
-E ʻoluʻolu, e kūlia hou.',
+E ʻoluʻolu, e hana hou.',
 'wrongpasswordempty' => 'Hakahaka ka ʻōlelo hūnā.
-E ʻoluʻolu, e kūlia hou.',
-'mailmypassword' => 'Leka uila i ka huaʻōlelo hūnā hou',
+E ʻoluʻolu, e hana hou.',
+'mailmypassword' => 'Kāinoa hou i ka ʻōlelo hūnā',
 'passwordremindertitle' => "He 'ōlelo hūnā kūikawā no {{SITENAME}}",
-'emailauthenticated' => 'Ua hō‘oia ‘ia kāu leka uila ma ka lā $2 i ka hola $3.',
-'emailconfirmlink' => 'E hō‘oia i kāu leka uila',
-'accountcreated' => 'Ua lilo ‘ia ka mea ho‘ohana',
-'accountcreatedtext' => 'Ua lilo ‘ia ka mea ho‘ohana no $1.',
-'loginlanguagelabel' => "Kou 'ōlelo: $1",
+'emailauthenticated' => 'Ua hō‘oia ‘ia kāu wahinoho lekauila ma ka lā $2 i ka hola $3.',
+'emailnotauthenticated' => 'ʻAʻole hōʻoia ʻia kāu wahinoho lekauila.
+Hoʻouna ʻole i kekahi lekauila no kēia mau helena.',
+'emailconfirmlink' => 'E hō‘oia i kāu wahinoho lekauila',
+'accountcreated' => 'Ua kāinoa',
+'accountcreatedtext' => 'Ua kāinoa ka moʻokāki no [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|walaʻau]])',
+'createaccount-title' => 'Kāinoa moʻokāki no {{SITENAME}}',
+'loginlanguagelabel' => 'ʻŌlelo: $1',
+'pt-login' => 'ʻEʻe',
+'pt-createaccount' => 'Kāinoa',
+'pt-userlogout' => 'Haʻalele',
 
 # Change password dialog
-'changepassword' => 'E loli i ka palapala hua‘ōlelo',
+'changepassword' => 'E hoʻololi i ka ʻōlelo hūnā',
+'oldpassword' => 'ʻŌlelo hūnā kahiko:',
 'newpassword' => 'ʻŌlelo hūnā hou:',
-'changepassword-success' => 'Ua loli ‘ia kāu hua‘ōlelo huna! E ‘e‘e iā‘oe...',
+'retypenew' => 'E kikokiko hou i ka ʻōlelo hūnā hou:',
+'resetpass_submit' => 'Kau i ka ʻōlelo hūnā a ʻeʻe',
+'changepassword-success' => 'Ua hoʻololi ‘ia kāu hua‘ōlelo huna!',
+'resetpass-submit-cancel' => 'Hoʻōki',
+'resetpass-temp-password' => 'ʻŌlelo hūnā kūikawā:',
+
+# Special:PasswordReset
+'passwordreset' => 'Kāinoa hou i ka ʻōlelo hūnā',
+'passwordreset-legend' => 'Kāinoa hou i ka ʻōlelo hūnā',
+'passwordreset-username' => "Inoa mea ho'ohana:",
+'passwordreset-email' => 'Wahinoho lekauila:',
+
+# Special:ChangeEmail
+'changeemail-oldemail' => 'Wahinoho lekauila hananei:',
+'changeemail-newemail' => 'Wahinoho lekauila hou:',
+'changeemail-none' => '(ʻaʻohe)',
+'changeemail-password' => 'Kāu ʻōlelo hūnā {{SITENAME}}:',
+'changeemail-cancel' => 'Hoʻōki',
 
 # Edit page toolbar
 'bold_sample' => 'Ho‘okā‘ele',
@@ -366,102 +519,184 @@ E ʻoluʻolu, e kūlia hou.',
 'italic_sample' => 'Ho‘ohiō',
 'italic_tip' => 'Ho‘ohiō',
 'link_sample' => 'Inoa loulou',
-'link_tip' => 'Loulou loko wahi',
+'link_tip' => 'Loulou kūloko',
+'extlink_sample' => 'http://www.example.com inoa loulou',
 'extlink_tip' => 'Loulou kūwaho (e ho‘omana‘o i ka poʻo pāʻālua http://)',
 'headline_sample' => 'Po‘o‘ōlelo',
+'headline_tip' => 'Poʻomanaʻo kau 2',
+'nowiki_sample' => 'Hoʻokomo i nā kikokikona huluʻole ma ʻaneʻi',
+'nowiki_tip' => 'Nānaʻole i ka hulu wiki',
+'image_tip' => 'Waihona kauloko',
 'media_tip' => 'Loulou waihona',
-'sig_tip' => 'Kou kākau inoa a me ka manawa',
-'hr_tip' => 'Laina ‘ilikai (e ho‘ohana pākiko)',
+'sig_tip' => 'Kau pūlima me ka manawa',
+'hr_tip' => 'Laina ‘ilikai (e hana pākiko)',
 
 # Edit pages
 'summary' => 'Hōʻuluʻulu manaʻo:',
 'subject' => 'Kumumanaʻo/poʻo laina:',
-'minoredit' => "He mea i ho'opololei iki 'ia",
-'watchthis' => 'E nānā pono i kēia mea',
-'savearticle' => 'E mālama i ka mea',
+'minoredit' => 'He hoʻololi iki kēia',
+'watchthis' => 'E kiaʻi i kēia ʻaoʻao',
+'savearticle' => 'E mālama i ka ʻaoʻao',
 'preview' => 'Nāmua',
 'showpreview' => "E hō'ike i ka nāmua",
-'showdiff' => "E hō'ike hou",
-'anoneditwarning' => "'''Ke aʻo ʻana:''' ʻAʻole ʻoe ʻeʻe.
-E hoʻopaʻa ʻia ana kou IP ma ko kēia ʻaoʻao mōʻaukala.",
-'blockedtitle' => 'Ua ke‘a ‘ia ka mea ho‘ohana',
+'showlivepreview' => 'Nāmua ʻānō',
+'showdiff' => "E hō'ike i nā loli",
+'anoneditwarning' => '<strong>E akahele:</strong> ʻAʻole ʻoe ʻeʻe nei.
+E hoʻopaʻa ʻia ana kāu IP ma ko kēia ʻaoʻao mōʻaukala hoʻololi.',
+'blockedtitle' => 'Ua pale ‘ia ka mea ho‘ohana',
 'blockednoreason' => '‘a‘ohe kumu',
 'loginreqlink' => 'ʻeʻe',
-'accmailtitle' => 'Ua ho‘ouna ‘ia ka hua‘ōlelo huna',
+'accmailtitle' => 'Ua ho‘ouna ‘ia ka ‘ōlelo hūnā',
 'newarticle' => '(Hou)',
-'anontalkpagetext' => "----''‘O kēia ka ʻaoʻao kūkākūkā no kekahi mea ho‘ohana me ka moʻokāki ʻole. No laila, pono mākou e ho‘ohana i ka wahi noho IP no ka hōʻoia ʻana iā ia.
-Hiki i kekahi mau mea hoʻohana ke hoʻokaʻana i kēia wahi noho IP.
-Inā he mea ho‘ohana ʻoe a ua haʻi ʻia kekahi manaʻo iā ʻoe, [[Special:UserLogin/signup|e hoʻokumu ʻia kekahi moʻokāki]] a i ʻole [[Special:UserLogin|e ʻeʻe]].''",
+'newarticletext' => 'Ua hāhai ʻoe i kekahi loulou i kekahi ʻaoʻao e haku ʻole.
+No ka haku ʻana i ka ʻaoʻao, kikokiko i loko o ka pahu i lalo (ʻike i ka [[{{MediaWiki:Helppage}}|ʻaoʻao kōkua]] no nā ʻike ʻē aʻe).
+Inā hewa kou hele ʻana, kāomi i ka pihi <strong>hoʻi</strong>.',
+'anontalkpagetext' => "----
+<em>ʻO kēia ka ʻaoʻao kūkākūkā no kekahi mea ho‘ohana me ka inoa ʻole.</em>
+No laila, pono mākou e ho‘ohana i ka IP no ka hōʻoia ʻana iā ia a hiki i kekahi mau mea hoʻohana ke hoʻokaʻana i kēia  IP.
+Inā he mea ho‘ohana inoa ʻole ʻoe a loaʻa kekahi mau manaʻo nāuʻole, e ʻoluʻolu [[Special:UserLogin/signup|e kāinoa]] a i ʻole [[Special:UserLogin|e ʻeʻe]].''",
 'noarticletext' => 'ʻAʻohe kikokikona a kēia ʻaoʻao.
 Hiki iā ʻoe ke [[Special:Search/{{PAGENAME}}|huli no kēia inoa ʻaoʻao]] i nā ʻaoʻao ʻē aʻe, <span class="plainlinks">[{{fullurl:SpecialLog|page={{FULLPAGENAMEE}}}} huli i nā moʻolelo pili], a i ʻole [{{fullurl:{{FULLPAGENAME}}|action=edit}} hoʻololi i kēia ʻaoʻao]</span>.',
-'previewnote' => "'''‘O keia ka nāmua;
-‘a‘ole i mālama ‘ia ka ho‘ololi!'''",
+'noarticletext-nopermission' => 'ʻAʻohe kikokikona a kēia ʻaoʻao.
+Hiki iā ʻoe ke [[Special:Search/{{PAGENAME}}|huli no kēia inoa ʻaoʻao]] i nā ʻaoʻao ʻē aʻe aiʻole <span class="plainlinks">[{{fullurl:SpecialLog|page={{FULLPAGENAMEE}}}} huli i nā moʻolelo pili]</span>, akā hiki ʻole iā ʻoe ke hoʻololi i kēia ʻaoʻao.',
+'previewnote' => '<strong>ʻO kēia ka nāmua wale nō.</strong>
+‘A‘ole mālama ‘ia nā ho‘ololi!',
+'continue-editing' => 'Kele i kahi hoʻololi',
 'editing' => 'Ke ho‘ololi nei iā $1',
-'editingsection' => 'Ke ho‘opololei nei iā $1 (mahele)',
+'creating' => 'Ke haku nei iā $1',
+'editingsection' => 'Hoʻololi nei iā $1 (mahele)',
 'editingcomment' => 'Ke ho‘ololi nei iā $1 (paukū hou)',
-'yourtext' => 'Ko‘u ‘ōlelo',
+'editconflict' => 'He pilikia hoʻololi: $1',
+'yourtext' => 'Kāu kikokikona',
+'storedversion' => 'Loihape waiho ʻia',
 'yourdiff' => 'Nā mea ‘oko‘a',
-'copyrightwarning' => "Hoʻokuʻu ʻia nā mea lūlū iā {{SITENAME}} ma lalo o ka $2 (no nā mea kikoʻī, kele iā $1).
-Inā ʻaʻole ʻoe makemake i ka hoʻololi ʻana kūnoa i kou kākau ʻana a ʻaʻole ʻoe makemake i ka hoʻomalele ʻana i kāu mau loli, inā mai kākau ma ʻaneʻi.<br />
-Ke hoʻohiki nei ʻoe iā kākou: nou i kākau i kēia kikokikona a i ʻole nou i kope i kēia kikokikona mai ke kūmole kūʻokoʻa.
-'''MAI KĀKAU I NĀ KIKOKIKONA PONOKOPE E NELE AI KA ʻAE!'''",
-'protectedpagewarning' => "'''A‘o ‘ana:  Ua laka ‘ia kēia ‘ao‘ao, pēlā, hiki i nā \"kahu\" ke ho‘opololei wale nō.'''",
+'copyrightwarning' => 'E ʻoluʻolu, hoʻokuʻu ʻia nā mea lūlū iā {{SITENAME}} ma lalo o ka laikini $2 (no nā mea kikoʻī, kele iā $1).
+Inā ʻaʻole ʻoe makemake i ka hoʻololi ʻana kūnoa o kou kākau ʻana a ʻaʻole ʻoe makemake i ka hoʻomalele ʻana i kāu mau loli, a laila mai kākau ma ʻaneʻi.<br />
+Ke hoʻohiki nei ʻoe iā kākou: nāu i kākau i kēia kikokikona aiʻole nau i kope i kēia kikokikona mai ke kūmole kūʻokoʻa.
+<strong>Mai waiho i nā kikokikona ponokope me ka ʻae ʻole!</strong>',
+'protectedpagewarning' => '<strong>E akahele:  Ua hoʻomalu ‘ia kēia ‘ao‘ao, pēlā, hiki i nā "kahu" ke ho‘ololi wale nō.</strong>
+Aia nā loli hanalohi i lalo no ka ʻikena:',
+'templatesused' => '{{PLURAL:$1|anakuhi|mau anakuhi}} e hana ʻia ma kēia ʻaoʻao:',
 'templatesusedpreview' => 'Hoʻohana ʻia kēia {{PLURAL:$1|anakuhi|mau anakuhi}} i kēia nāmua:',
 'template-protected' => '(ho‘omalu ‘ia)',
 'template-semiprotected' => '(hapa-ho‘omalu ‘ia)',
+'hiddencategories' => 'ʻO kēia ʻaoʻao he lālā o {{PLURAL:$1|1 mahele hūnā|$1 mau māhele hūnā}}:',
 'edittools' => '<!-- Eia ka ‘ōlelo e hō‘ike ‘ia malalo o nā palapala ho‘ololi ame nā palapala ho‘ohui. -->',
-'permissionserrorstext-withaction' => 'ʻAʻohe ou ʻae no $2, no {{PLURAL:$1|ia mea|no ia mau mea}}:',
+'permissionserrorstext-withaction' => 'ʻAʻohe āu ʻae no $2, no {{PLURAL:$1|kumu| mau kumu}}:',
+'recreate-moveddeleted-warn' => '<strong>E akahele: Ke haku nei ʻoe i kekahi ʻaoʻao i holoi ʻia.</strong>
+
+Pono ʻoe e noʻonoʻo e pili ana ka pono o ka hoʻomau ʻana o ka hoʻololi ʻana o kēia ʻaoʻao.
+Aia ka moʻolelo holoi a hoʻoneʻe no kēia ʻaoʻao ma ʻaneʻi:',
+'moveddeleted-notice' => 'Ua holoi ʻia kēia ʻaoʻao.
+Hoʻolako ʻia ka moʻolelo holoi a hoʻoneʻe no kēia ʻaoʻao i lalo no ke kūmole.',
+
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => '<strong>E akahele:</strong> Hoʻokela ʻia ka palena nui o ke anakuhi.
+Hoʻohui ʻole i kekahi mau anakuhi.',
+'post-expand-template-inclusion-category' => 'Nā ʻaoʻao me nā anakuhi e hoʻokela i ka palenanui',
+'post-expand-template-argument-warning' => '<strong>E akahele:</strong> Aia ma kēia ʻaoʻao i kekahi a ʻoi pilikia anakuhi e loaʻa i kekahi nui hoʻonui nunui loa.
+Ua waiho ʻia kēia mau pilikia.',
+'post-expand-template-argument-category' => 'Nā ʻAoʻao e loaʻa nā pilikia anakuhi i waiho ʻia',
 
 # "Undo" feature
-'undo-success' => 'Hiki iā ʻoe ke hoʻihoʻi mai i kēia loli ʻana.
-E ʻoluʻolu, e hōʻoia i ka hoʻokūkū ʻana i lalo, a laila, e mālama i nā loli i lalo no ka hoʻopau ʻana i ka hoʻihoʻi mai ʻana i ka loli.',
-'undo-summary' => 'Hoʻihoʻi mai i ke kāmua $1 na [[Special:Contributions/$2|$2]] ([[User talk:$2|kūkākūkā]])',
+'undo-success' => 'Hiki iā ʻoe ke hoʻihoʻi i kēia loli.
+E ʻoluʻolu, e hōʻoia i ka hoʻokūkū ʻana i lalo, a laila, e mālama i nā loli i lalo no ka hoʻopau ʻana o ka hoʻihoʻi o ka loli.',
+'undo-summary' => 'Hoʻihoʻi mai i ke kāmua $1 na [[Special:Contributions/$2|$2]] ([[User talk:$2|walaʻau]])',
 
 # History pages
+'viewpagelogs' => 'Nānā i nā moʻolelo no kēia ʻaoʻao',
 'currentrev' => 'Kāmua hou',
-'revisionasof' => 'Ka loli ʻana ma $1',
-'previousrevision' => '← Kāmua mua',
+'currentrev-asof' => 'Ke Kāmua houloa ma $1',
+'revisionasof' => 'Kāmua ʻia ma $1',
+'revision-info' => 'Kāmua ma $1 na $2',
+'previousrevision' => '← Kāmua kahiko',
 'nextrevision' => 'Kāmua hou →',
-'currentrevisionlink' => 'Kāmua hou',
-'cur' => 'hou',
-'last' => 'hope',
-'page_first' => 'mua',
-'page_last' => 'hope',
-'histfirst' => 'Kahiko loa',
-'histlast' => 'Hou loa',
-'historysize' => '({{PLURAL:$1|1 ‘ai|$1 ‘ai}})',
-'historyempty' => '(‘ole)',
+'currentrevisionlink' => 'Kāmua houloa',
+'cur' => 'okawā',
+'next' => 'hou aʻe',
+'last' => 'aku nei',
+'page_first' => 'mua loa',
+'page_last' => 'hope loa',
+'histlegend' => 'Koho ʻokoʻa: Kaha i nā pahu lekiō o nā kāmua no ka hoʻokūkū ʻana a kāomi ke kāhoʻi aiʻole ka pihi ma ka lalo.<br />
+Pahu hōʻailona: <strong>({{int:cur}})</strong> = ka ʻokoʻa me ke kāmua houloa, <strong>({{int:last}})</strong> = ka ʻokoʻa me ke kāmua i hana mua, <strong>{{int:minoreditletter}}</strong> = he hoʻololi iki ia.',
+'history-fieldset-title' => 'Mōʻaukaki Pūnaewele',
+'history-show-deleted' => 'Holoi wale nō',
+'histfirst' => 'kahiko loa',
+'histlast' => 'hou loa',
+'historysize' => '({{PLURAL:$1|1 ‘ai|$1 mau ‘ai}})',
+'historyempty' => '(ʻaʻohe)',
 
 # Revision feed
-'history-feed-item-nocomment' => '$1 ma $2',
+'history-feed-title' => 'Mōʻaukala kāmua',
+'history-feed-description' => 'Mōʻaukala kāmua no kēia ʻaoʻao ma ka wiki',
+'history-feed-item-nocomment' => '$1 ma $3 ma ka hola $4',
 
 # Revision deletion
-'rev-delundel' => 'hō‘ike/hūnā',
+'rev-delundel' => 'hoʻololi ka nānā ʻana',
+'revdelete-show-file-submit' => 'ʻAe',
 'revdelete-radio-same' => '(mai hoʻololi)',
 'revdelete-radio-set' => 'ʻAe',
 'revdelete-radio-unset' => 'ʻAʻole',
-'revdel-restore' => 'hoʻololi ka nānā ʻana',
+'revdelete-log' => 'Kumu:',
+'revdel-restore' => 'hoʻololi i ka nānā ʻana',
+'pagehist' => 'Mōʻaukala ʻaoʻao',
+'deletedhist' => 'Mōʻaukala holoi',
+'revdelete-otherreason' => 'Nā kumu ʻē aʻe',
+'revdelete-reasonotherlist' => 'Nā kumu ʻē aʻe',
+'revdelete-offender' => 'Mea kākau kāmua:',
+
+# History merging
+'mergehistory-from' => 'ʻAoʻao kūmole:',
+'mergehistory-into' => 'ʻAoʻao helewahi:',
+'mergehistory-reason' => 'Kumu:',
 
 # Merge log
-'revertmerge' => 'Mai hoʻokuʻi pū',
+'revertmerge' => 'Hoʻokuʻipū ʻole',
 
 # Diffs
+'history-title' => 'Mōʻaukala kāmua o "$1"',
 'lineno' => 'Laina $1:',
-'editundo' => 'hoʻihoʻi mai',
+'compareselectedversions' => 'Hoʻohālikelike i nā kāmua i koho ʻia',
+'editundo' => 'hoʻihoʻi',
+'diff-empty' => '(ʻaʻohe like ʻole)',
 
 # Search results
-'searchresults' => 'Nā hualoaʻa',
+'searchresults' => 'Nā Hualoaʻa',
 'searchresults-title' => 'Nā hualoaʻa no "$1"',
-'prevn' => '{{PLURAL:$1|$1}} ma mua',
-'nextn' => '{{PLURAL:$1|$1}} ma hope',
-'viewprevnext' => 'Nānā i nā ($1 {{int:pipe-separator}} $2) ($3)',
-'search-result-size' => '$1 ({{PLURAL:$2|1 huaʻōlelo|$2 huaʻōlelo}})',
-'search-section' => '(māhele $1)',
+'prevn' => '{{PLURAL:$1|$1}} mamua',
+'nextn' => '{{PLURAL:$1|$1}} hou aʻe',
+'prevn-title' => '$1 {{PLURAL:$1|hualoaʻa|mau hualoaʻa}} aku nei',
+'nextn-title' => '$1 {{PLURAL:$1|hualoaʻa|mau hualoaʻa}} hou aʻe',
+'shown-title' => 'Hōʻike $1 {{PLURAL:$1|hualoaʻa|mau hualoaʻa}} i kekahi ʻaoʻao',
+'viewprevnext' => 'Nānā i ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => '<strong>Aia kekahi ʻaoʻao i kapa ʻia o "[[:$1]]" ma kēia wiki.</strong> {{PLURAL:$2|0=|ʻIke hoʻi i na hualoaʻa huli ʻē aʻe i loaʻa ʻia.}}',
+'searchmenu-new' => '<strong>Haku i ka ʻaoʻao "[[:$1]]" ma kēia wiki!</strong> {{PLURAL:$2|0=|"ʻIke hoʻi i ka ʻaoʻao i loaʻa ʻia ma kou huli ʻana.|ʻIke hoʻi nā hualoaʻa huli i loaʻa ʻia.}}',
+'searchprofile-articles' => 'Nā ʻAoʻao mealoko',
+'searchprofile-project' => 'Nā ʻaoʻao Kōkua a me Papahana',
+'searchprofile-images' => 'Laupāpaho',
+'searchprofile-everything' => 'Nā mea apau',
+'searchprofile-advanced' => 'Kiʻelē',
+'searchprofile-articles-tooltip' => 'Huli i loko o $1',
+'searchprofile-project-tooltip' => 'Huli i loko o $1',
+'searchprofile-images-tooltip' => 'Huli no nā waihona',
+'searchprofile-everything-tooltip' => 'Huli i nā mea apau (nā walaʻau nō hoʻi)',
+'searchprofile-advanced-tooltip' => 'Huli iā lewainoa pilikino',
+'search-result-size' => '$1 ({{PLURAL:$2|1 huaʻōlelo|$2 mau huaʻōlelo}})',
+'search-result-category-size' => '{{PLURAL:$1|1 mea hoʻohana|$1 mau mea hoʻohana}} ({{PLURAL:$2|1 mahele kūloko|$2 mau māhele kūloko}}, {{PLURAL:$3|1 wahihona|$3 mau waihona}})',
+'search-redirect' => '(kia hou $1)',
+'search-section' => '(pauku $1)',
 'search-suggest' => 'ʻO kēia paha kou manaʻo: $1',
 'search-interwiki-caption' => 'Nā pāhana ʻē aʻe',
-'searchall' => 'apau',
+'search-interwiki-more' => '(hou aʻe)',
+'searchrelated' => 'na mea ʻālike',
+'searchall' => 'nā mea apau',
+'showingresultsheader' => '{{PLURAL:$5|<strong>$1</strong> hualoaʻa o <strong>$3</strong> mau hualoaʻa|<strong$1-$2</strong> mau hualoaʻa o <strong>$3</strong> mau hualoaʻa}} no <strong>$4</strong>',
+'search-nonefound' => 'ʻAʻohe hualoaʻa no kēia huli.',
 'powersearch-legend' => 'Hulina kūlana kiʻekiʻe',
 'powersearch-ns' => 'Huli i loko o nā wahi inoa:',
+'powersearch-toggleall' => 'Nā mea apau',
+'powersearch-togglenone' => 'ʻAʻohe',
+'search-external' => 'Huli kūwaho',
 
 # Preferences page
 'preferences' => 'Kaʻu makemake',
@@ -469,17 +704,28 @@ E ʻoluʻolu, e hōʻoia i ka hoʻokūkū ʻana i lalo, a laila, e mālama i nā
 'prefs-skin' => 'ʻIli',
 'skin-preview' => 'Nāmua',
 'datedefault' => 'ʻAʻohe makemake',
+'prefs-beta' => 'Helena Beta',
 'prefs-datetime' => 'Ka lā a me ka hola',
-'prefs-personal' => 'ʻAoʻao ʻike mea hoʻohana',
+'prefs-personal' => 'ʻAoʻao mea hoʻohana',
 'prefs-rc' => 'Nā loli hou',
-'prefs-watchlist' => 'Helu nānā',
-'prefs-watchlist-days' => 'Nā lā e hōʻike ana i ka helu nānā:',
-'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
+'prefs-watchlist' => 'Papakiaʻi',
+'prefs-watchlist-days' => 'Nā lā e hōʻike i ka papakiaʻi:',
+'prefs-watchlist-days-max' => 'He palenanui o $1 {{PLURAL:$1|lā|mau lā}}',
+'prefs-email' => 'Koho lekauila',
+'prefs-rendering' => 'Helena',
 'saveprefs' => 'Mālama',
+'restoreprefs' => 'Hōʻala i nā makemake paʻamau (apau)',
+'prefs-editing' => 'Hoʻololi',
+'rows' => 'Lālani:',
+'columns' => 'Koloma:',
 'searchresultshead' => 'Huli',
 'savedprefs' => 'Ua mālama ‘ia kāu makemake',
+'timezonelegend' => 'Kāʻei hola:',
+'localtime' => 'Hola kamaʻāina:',
+'servertime' => 'Hola pūnaewele:',
+'guesstimezone' => 'Piha mai ka pōlamu pūnaewele',
 'timezoneregion-africa' => 'ʻApelika',
-'timezoneregion-america' => 'Amelika',
+'timezoneregion-america' => 'ʻAmelika',
 'timezoneregion-antarctica' => 'ʻAneʻālika',
 'timezoneregion-arctic' => 'ʻĀlika',
 'timezoneregion-asia' => 'ʻĀkia',
@@ -488,356 +734,548 @@ E ʻoluʻolu, e hōʻoia i ka hoʻokūkū ʻana i lalo, a laila, e mālama i nā
 'timezoneregion-europe' => 'ʻEulopa',
 'timezoneregion-indian' => 'Moana ʻIniana',
 'timezoneregion-pacific' => 'Moana Pakipika',
+'prefs-searchoptions' => 'Huli',
+'prefs-namespaces' => 'Lewainoa',
 'default' => 'paʻamau',
-'youremail' => 'Leka uila:',
-'username' => "Inoa mea ho'ohana:",
-'yourrealname' => 'Inoa maoli:',
-'yourlanguage' => 'Kou ʻōlelo:',
-'yournick' => 'Inoa kapakapa:',
+'prefs-files' => 'Waihona',
+'youremail' => 'Lekauila:',
+'username' => '{{GENDER:$1|Inoa mea hoʻohana}}:',
+'uid' => '{{GENDER:$1|Mea hoʻohana}} ID:',
+'prefs-memberingroups' => '{{GENDER:$2|He lālā}} o {{PLURAL:$1|hui|mau hui}}:',
+'prefs-registration' => 'Hola kāinoa:',
+'yourrealname' => 'Inoa ʻoiaʻiʻo:',
+'yourlanguage' => 'Kāu ʻōlelo:',
+'yournick' => 'Pūlima hou:',
 'yourgender' => 'Keka:',
+'gender-unknown' => 'Kāpae',
 'gender-male' => 'Kāne',
 'gender-female' => 'Wahine',
-'email' => 'Leka uila',
-'prefs-help-email-required' => 'Koina ka leka uila.',
+'email' => 'Lekauila',
+'prefs-help-email' => 'Koi ʻole i ka wahinoho lekauila, akā pono ia nō ke kāinoa ʻana o ka ʻōlelo hūnā inā poina ʻoe i kāu ʻōlelo hūnā.',
+'prefs-help-email-others' => 'Hiki iā ʻoe ke koho i ka ʻae ʻana i nā mea ʻē aʻe e hoʻokaʻaʻike iā ʻoe mao ka lekauila mao kekahi loulou ma kāu ʻaoʻao mea hoʻohana aiʻole kāu ʻaoʻao walaʻau.
+ʻAʻole hōʻike ʻia kāu wahinoho lekauila i nā mea ʻē aʻe e hoʻokaʻaʻike iā ʻoe.',
+'prefs-help-email-required' => 'Koi i ka lekauila.',
+'prefs-signature' => 'Pūlima',
+'prefs-advancedediting' => 'Koho paʻamau',
+'prefs-editor' => 'Luna Hoʻoponopono:',
+'prefs-preview' => 'Nāmua',
 
 # User rights
 'userrights' => 'Ho‘oponopono ‘ana o nā kuleana',
+'userrights-groupsmember' => 'He lālā o:',
+'userrights-reason' => 'Kumu:',
 
 # Groups
-'group-sysop' => 'Nā kahu',
-'group-bureaucrat' => 'Nā kuhina',
-'group-all' => '(āpau)',
-
-'group-sysop-member' => 'Kahu',
-'group-bureaucrat-member' => 'Kuhina',
-
-'grouppage-sysop' => '{{ns:project}}:Nā kahu',
+'group' => 'Hui:',
+'group-user' => 'Mea hoʻohana',
+'group-bot' => 'Lopako',
+'group-sysop' => 'Nā Kahu',
+'group-bureaucrat' => 'Nā Kuhina',
+'group-all' => '(Nā mea apau)',
+
+'group-user-member' => '{{GENDER:$1|ka mea hoʻohana}}',
+'group-bot-member' => '{{GENDER:$1|ka lopako}}',
+'group-sysop-member' => '{{GENDER:$1|ke kahu}}',
+'group-bureaucrat-member' => '{{GENDER:$1|ke kuhina}}',
+
+'grouppage-user' => '{{ns:project}}:Mea hoʻohana',
+'grouppage-bot' => '{{ns:project}}:Lopako',
+'grouppage-sysop' => '{{ns:project}}:Nā Kahu',
+'grouppage-bureaucrat' => '{{ns:project}}:Nā Kuhina',
+
+# Rights
+'right-read' => 'Heluhelu i nā ʻaoʻao',
+'right-edit' => 'Hoʻololi i nā ʻaoʻao',
+'right-createpage' => 'Haku i nā ʻaoʻao (he kūkākūkā ʻole)',
+'right-createtalk' => 'Haku i ka ʻaoʻao kūkākūkā',
+'right-createaccount' => 'Kāinoa i nā moʻokāki hou',
+'right-minoredit' => 'Kaha i nā loli me he hoʻololi iki',
+'right-move' => 'Hoʻoneʻe i nā ʻaoʻao',
+'right-move-subpages' => 'Hoʻoneʻe i nā ʻaoʻao me nā ʻaoʻao lokoiho',
+'right-movefile' => 'Hoʻoneʻe i nā waihona',
+'right-upload' => 'Hoʻouka i nā waihona',
+'right-upload_by_url' => 'Hoʻouka i nā waihona mai kekahi URL',
+'right-delete' => 'Holoi i nā ʻaoʻao',
+'right-bigdelete' => 'Holoi i nā ʻaoʻao me he mōʻaukala nui',
+'right-browsearchive' => 'Huli i nā ʻaoʻao holoi',
+'right-undelete' => 'Holoi ʻole i kekahi ʻaoʻao',
+'right-block' => 'Pale i nā mea hoʻohana ʻē aʻe mai ka hoʻololi ʻana',
+'right-blockemail' => 'Pale i nā mea hoʻohana ʻē aʻe mai ka lekauila ʻana',
+'right-hideuser' => 'Pale i ka inoa mea hoʻohana, no laila ʻaʻole hōʻike i ka lehulehu',
+'right-unblockself' => 'Paleʻole i kāuiho',
+
+# Special:Log/newusers
+'newuserlogpage' => 'Moʻolelo haku mea hoʻohana',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-edit' => 'ka hoʻololi ʻana i kēia ʻaoʻao',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|loli|mau loli}}',
-'recentchanges' => 'Nā loli hou',
-'rcshowhideminor' => '$1 i nā ho‘opololei iki',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|mai kāu kipana aku nei}}',
+'enhancedrc-history' => 'mōʻaukala',
+'recentchanges' => 'Loli Hou',
+'recentchanges-legend' => 'Nā Koho loli hou',
+'recentchanges-feed-description' => 'Hāhai i nā loli houloa i ka wiki ma kēia hānaīke.',
+'recentchanges-label-newpage' => 'Ua haku kēia hoʻololi i kēia ʻaoʻao hou',
+'recentchanges-label-minor' => 'He hoʻololi iki kēia',
+'recentchanges-label-bot' => 'Ua hana ʻia kēia hoʻololi e kekahi pako',
+'recentchanges-label-unpatrolled' => 'ʻAʻole kiaʻi kaʻa ʻia kēia hoʻololi',
+'rcnotefrom' => 'Aia i lalo nā loli mai <strong>$2</strong> (hōʻike a <strong>$1</strong>)',
+'rclistfrom' => 'Hōʻike i nā loli hou mai ka hola $2, $3',
+'rcshowhideminor' => '$1 i nā ho‘ololi iki',
+'rcshowhideminor-show' => 'Hōʻike',
+'rcshowhideminor-hide' => 'Hoʻohūnā',
 'rcshowhidebots' => '$1 i nā lopako',
-'rcshowhideliu' => '$1 i nā mea hoʻohana i ʻeʻe ai',
-'rcshowhideanons' => '$1 i nā mea hoʻohana i nele ai ka inoa',
+'rcshowhidebots-show' => 'Hōʻike',
+'rcshowhidebots-hide' => 'Hoʻohūnā',
+'rcshowhideliu' => '$1 i nā mea hoʻohana i kāinoa ʻia',
+'rcshowhideliu-show' => 'Hōʻike',
+'rcshowhideliu-hide' => 'Hoʻohūnā',
+'rcshowhideanons' => '$1 i nā mea hoʻohana inoa ʻole',
+'rcshowhideanons-show' => 'Hōʻike',
+'rcshowhideanons-hide' => 'Hoʻohūnā',
+'rcshowhidepatr' => '$1 i nā hoʻololi kiaʻi kaʻahele',
+'rcshowhidepatr-show' => 'Hōʻike',
+'rcshowhidepatr-hide' => 'Hoʻohūnā',
 'rcshowhidemine' => '$1 i ka‘u mau hoʻololi',
-'diff' => '‘oko‘a',
-'hist' => 'loli',
-'hide' => 'hūnā',
-'show' => 'hō‘ike',
+'rcshowhidemine-show' => 'Hōʻike',
+'rcshowhidemine-hide' => 'Hoʻohūnā',
+'rclinks' => 'E hōʻike i nā loli $1 hou, mai $2 (mau) lā aku nei<br />$3',
+'diff' => 'ʻokoʻa',
+'hist' => 'mōkala',
+'hide' => 'Hoʻohūnā',
+'show' => 'Hō‘ike',
 'minoreditletter' => 'iki',
-'newpageletter' => 'hou',
-'boteditletter' => 'lopako',
-'rc-enhanced-expand' => 'Hō‘ike i nā ‘ikepili (me JavaScript)',
-'rc-enhanced-hide' => 'Hūnā i nā ‘ikepili',
+'newpageletter' => 'ʻAHou',
+'boteditletter' => 'pako',
+'rc-enhanced-expand' => 'Hō‘ike i nā kikoʻī',
+'rc-enhanced-hide' => 'Hoʻohūnā i nā kikoʻī',
 
 # Recent changes linked
 'recentchangeslinked' => 'Nā loli hou ʻālike',
+'recentchangeslinked-feed' => 'Nā loli hou ʻālike',
+'recentchangeslinked-toolbox' => 'Nā loli hou ʻālike',
+'recentchangeslinked-title' => 'Nā loli e ʻālike me "$1"',
+'recentchangeslinked-summary' => 'He papahelu o nā loli i hana wale i nā ʻaoʻao loulou ʻia e kekahi ʻaoʻao kikoʻī (aiʻole i nā lālā o kekahi mahele kikoʻī) kēia.
+<strong>Hoʻokāʻele</strong> nā ʻaoʻao ma [[Special:Watchlist|kāu papakiaʻi]].',
 'recentchangeslinked-page' => 'Inoa ʻaoʻao:',
+'recentchangeslinked-to' => 'Hōʻike i nā loli i nā ʻaoʻao e loulou ʻia ma kahi o ka ʻaoʻao i hāʻawi ʻia',
 
 # Upload
-'upload' => 'Hoʻouka i ka waihona',
+'upload' => 'Hoʻouka waihona',
 'uploadbtn' => 'Hoʻouka i ka waihona',
+'uploadnologin' => 'ʻE‘e ʻole',
+'uploaderror' => 'Hewa hoʻouka',
+'uploadlogpage' => 'Moʻolelo hoʻouka',
+'filename' => 'Inoa waihona',
 'filedesc' => 'Hōʻuluʻulu manaʻo',
 'fileuploadsummary' => 'Hōʻuluʻulu manaʻo:',
-'uploadedimage' => 'hoʻouka ʻia iā "[[$1]]"',
+'filesource' => 'Kumu:',
+'uploadedfiles' => 'Waihona hoʻouka ʻia',
+'savefile' => 'Waihona mālama',
+'uploadedimage' => 'ua hoʻouka iā "[[$1]]"',
+'upload-source' => 'Waihona kūmole',
+'sourcefilename' => 'Inoa waihona kūmole:',
+'sourceurl' => 'URL kūmole:',
+
+'license' => 'Laikini:',
+'license-header' => 'Laikini',
 
 # Special:ListFiles
 'listfiles_name' => 'Inoa',
 
 # File description page
 'file-anchor-link' => 'Waihona',
-'filehist' => 'Mo‘olelo o ka waihona',
-'filehist-current' => 'o kēia manawa',
-'filehist-datetime' => 'Manawa',
-'filehist-thumb' => 'Kiʻiliʻiliʻi',
+'filehist' => 'Mōʻaukala waihona',
+'filehist-help' => 'Kāomi ma ka lā/hola no ka nānā ʻana i ka waihona ma kēlā manawa.',
+'filehist-revert' => 'hoʻihoʻi',
+'filehist-current' => 'okamanawa',
+'filehist-datetime' => 'Lā/Hola',
+'filehist-thumb' => 'Kiʻiliʻi',
+'filehist-thumbtext' => 'Ke kiʻiliʻi no ka mana ma $1',
 'filehist-user' => 'Mea ho‘ohana',
-'filehist-dimensions' => 'Nā nui',
+'filehist-dimensions' => 'Nā Nui',
 'filehist-filesize' => 'Nui o ka waihona',
-'filehist-comment' => 'Manaʻo',
-'imagelinks' => 'Nā loulou faila',
+'filehist-comment' => 'Kaumanaʻo',
+'imagelinks' => 'Nā Hana waihona',
 'linkstoimage' => 'Loulou {{PLURAL:$1|kekahi ‘ao‘ao|kēia mau ‘ao‘ao $1}} i kēia waihona:',
+'nolinkstoimage' => 'ʻAʻohe ʻaoʻao e loulou i kēia waihona.',
+'sharedupload-desc-here' => 'ʻO kēia waihona mai $1 a hiki paha ke hana ʻia mai nā papahana ʻē aʻe.
+Aia i lalo ka hōʻike ʻano [mai ka ʻaoʻao hōʻike ʻano waihona $2].',
 
 # File deletion
 'filedelete-comment' => 'Kumu:',
 
 # Random page
-'randompage' => 'He akikala kaulele',
+'randompage' => 'ʻAtikala Kaulele',
 
 # Statistics
-'statistics' => 'Papa helu',
+'statistics' => 'ʻIkepilihelu',
 
-'brokenredirects-edit' => 'ho‘ololi',
-'brokenredirects-delete' => 'e kāpae',
+'brokenredirects-edit' => 'ho‘ololi',
+'brokenredirects-delete' => 'holoi',
 
 'withoutinterwiki-submit' => 'Hō‘ike',
 
 # Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|‘ai|‘ai}}',
+'nbytes' => '$1 {{PLURAL:$1|‘ai|mau ‘ai}}',
 'nlinks' => '$1 {{PLURAL:$1|loulou|loulou}}',
-'nmembers' => '$1 {{PLURAL:$1|lālā|lālā}}',
+'nmembers' => '$1 {{PLURAL:$1|lālā|mau lālā}}',
 'wantedcategories' => 'Nā māhele makemake',
+'prefixindex' => 'Nā ʻAoʻao apau me ka pākuʻina kau mua',
 'shortpages' => 'Nā ʻaoʻao pōkole',
 'longpages' => 'Nā ʻaoʻao lōʻihi',
-'newpages' => 'Nā ‘ao‘ao hou',
+'usercreated' => '{{GENDER:$3|Haku ʻia}} i ka lā $1 ma ka hola $2',
+'newpages' => 'Nā ‘Ao‘ao hou',
 'newpages-username' => "Inoa mea ho'ohana:",
 'ancientpages' => 'Nā ‘ao‘ao kahiko loa',
-'move' => 'E ho‘ololi i ka inoa',
+'move' => 'E hoʻoneʻe',
 'movethispage' => 'E hoʻoneʻe i kēia ʻaoʻao',
 'pager-newer-n' => '{{PLURAL:$1|1 hou aku|$1 hou aku}}',
-'pager-older-n' => '{{PLURAL:$1|1 kekahi iho|$1 kekahi iho}}',
+'pager-older-n' => '{{PLURAL:$1|1 aku nei|$1 aku nei}}',
 
 # Book sources
 'booksources' => 'Kumu puke',
+'booksources-search-legend' => 'Huli i nā kūmole  puke',
 'booksources-go' => 'E huli',
 
 # Special:Log
-'log' => 'Nā mo‘olelo',
-'all-logs-page' => 'Nā moʻolelo āpau',
+'log' => 'Nā Mo‘olelo',
+'all-logs-page' => 'Nā Moʻolelo lehulehu apau',
 
 # Special:AllPages
-'allpages' => 'Nā ‘ao‘ao loa apau',
+'allpages' => 'Nā ‘Ao‘ao apau',
 'alphaindexline' => '$1 i $2',
 'nextpage' => 'Mea aʻe ($1)',
 'prevpage' => 'Mea ma mua aʻe ($1)',
-'allarticles' => 'Nā mo‘olelo apau loa',
+'allarticles' => 'Nā ʻAoʻao apau',
 'allpagessubmit' => 'E huli',
 
 # Special:Categories
-'categories' => 'Nā mahele',
+'categories' => 'Nā hele',
 
 # Special:DeletedContributions
-'deletedcontributions' => 'Nā ha‘awina o ka inoa mea ho‘ohana i kāpae ‘ia ai',
-'deletedcontributions-title' => 'Nā ha‘awina o ka inoa mea ho‘ohana i kāpae ‘ia ai',
+'deletedcontributions' => 'Nā ha‘awina mea ho‘ohana i holoi ‘ia',
+'deletedcontributions-title' => 'Nā ha‘awina mea ho‘ohana i holoi ‘ia',
 
 # Special:LinkSearch
-'linksearch' => 'Loulou waho wahi',
+'linksearch' => 'Huli loulou kūwaho',
 'linksearch-ok' => 'Huli',
+'linksearch-line' => 'Loulou ʻia ʻo $1 mai $2',
 
 # Special:ListUsers
 'listusers-submit' => 'Hō‘ike',
 
 # Special:ListGroupRights
-'listgrouprights-members' => '(papa o nā lālā)',
+'listgrouprights-members' => '(papainoa o nā lālā)',
 
 # Email user
 'emailuser' => 'E leka uila i kēia mea ho‘ohana',
-'emailmessage' => 'Memo:',
+'emailmessage' => 'Pūlono:',
 
 # Watchlist
-'watchlist' => 'Kaʻu papa nānā pono',
-'mywatchlist' => 'Ka‘u papa nānā pono',
+'watchlist' => 'Kaʻu papakiaʻi',
+'mywatchlist' => 'Ka‘u papakiaʻi',
+'watchlistfor2' => 'No $1 $2',
 'removedwatchtext' => 'Wehe ʻia ʻo "[[:$1]]" mai [[Special:Watchlist|kāu papa nānā pono]].',
 'watch' => 'E kia‘i',
 'watchthispage' => 'E nānā pono i kēia mea',
-'unwatch' => 'E wehe ke kia‘i',
-'watchlist-details' => '{{PLURAL:$1|$1|$1}} a kāu papa nānā pono ʻaoʻao, me ke koe ʻana o nā ʻaoʻao kūkākūkā.',
-'wlshowlast' => 'Hōʻike $1 hola hope $2 lā hope $3',
+'unwatch' => 'Kiaʻi ʻole',
+'watchlist-details' => '{{PLURAL:$1|$1 ʻaoʻao|$1 mau ʻaoʻao}} a kāu papakiaʻi, me ʻole ke koe ʻana o nā ʻaoʻao walaʻau.',
+'wlshowlast' => 'Hōʻike $1 hola aku nei $2 lā aku nei $3',
+'watchlist-options' => 'Nā Koho papakiaʻi',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching' => 'Ke kia‘i nei...',
+'watching' => 'Kia‘i nei...',
 'unwatching' => 'Ke wehe nei i ke kiaʻi...',
 
 'changed' => 'ua loli ‘ia',
 
 # Delete
-'deletepage' => 'Kāpae ʻaoʻao',
-'actioncomplete' => 'Ua pau',
-'deletedtext' => 'Ua kāpae ʻia ʻo "$1".
-E ʻike iā $2 no ka papa o nā kāpae ʻana hou.',
-'dellogpage' => 'Mo‘olelo kāpae',
-'dellogpagetext' => 'He helu o nā mea i kāpae ʻia hou i lalo.',
-'deletionlog' => 'mo‘olelo kāpae',
+'deletepage' => 'Holoi ʻaoʻao',
+'actioncomplete' => 'Hana kūleʻa',
+'actionfailed' => 'Hana pohō',
+'deletedtext' => 'Ua holoi ʻia ʻo "$1".
+E ʻike iā $2 no ka papa o nā holoi hou.',
+'dellogpage' => 'Mo‘olelo holoi',
+'dellogpagetext' => 'He papahelu o nā holoi hou i lalo.',
+'deletionlog' => 'mo‘olelo holoi',
 'deletecomment' => 'Kumu:',
 'deleteotherreason' => 'Kumu ʻē aʻe/hoʻokomo',
 'deletereasonotherlist' => 'Kumu ʻē aʻe',
-'delete-edit-reasonlist' => 'Ho‘opololei i nā kumu no ke kāpae ‘ana',
+'delete-edit-reasonlist' => 'Hoʻololi i nā kumu holoi',
 
 # Rollback
-'rollbacklink' => 'ho‘i',
+'rollbacklink' => 'ho‘ihoʻi',
 
 # Protect
-'protectedarticle' => 'ua pale ʻia "[[$1]]"',
+'protectlogpage' => 'Moʻolelo palekana',
+'protectedarticle' => 'ua hoʻomalu iā "[[$1]]"',
 'prot_1movedto2' => 'Ua hoʻoneʻe ʻo [[$1]] iā [[$2]]',
 'protectcomment' => 'Kumu:',
-'protect-default' => 'ʻAe nā mea hoʻohana a pau',
-'protect-level-sysop' => 'Nā kahu wale nō',
+'protect-default' => 'ʻAe nā mea hoʻohana a pau',
+'protect-level-sysop' => 'Nā Kahu wale nō',
 'protect-cantedit' => 'ʻAʻole hiki iā ʻoe ke hoʻololi i nā kūlana māmalu o kēia ʻaoʻao, no ka mea, ʻaʻohe āu ʻae no ka hoʻololi ʻana.',
 'protect-expiry-options' => '1 hola:1 hour,1 lā:1 day,1 pule:1 week,2 pule:2 weeks,1 mahina:1 month,3 mahina:3 months,6 mahina:6 months,1 makahiki:1 year,pau ʻole:infinite',
 'restriction-type' => 'ʻAe ʻia:',
 
 # Restrictions (nouns)
-'restriction-edit' => 'E ho‘ololi',
-'restriction-move' => "E ho'ololi i ka inoa",
+'restriction-edit' => 'Hoʻololi',
+'restriction-move' => 'Hoʻoneʻe',
 
 # Undelete
 'undeletebtn' => 'Ho‘āla',
 'undeletelink' => 'nānā/ho‘āla',
+'undeleteviewlink' => 'hōʻike',
 'undelete-search-submit' => 'Huli',
 
 # Namespace form on various pages
-'namespace' => 'Wahi inoa',
+'namespace' => 'Lewainoa:',
+'invert' => 'Kuapo i ke koho',
 'blanknamespace' => '(‘ano nui)',
 
 # Contributions
-'contributions' => 'Nā ha‘awina o kēia mea ho‘ohana',
-'mycontris' => 'Koʻu mau haʻawina',
-'contribsub2' => 'No $1 ($2)',
-'uctop' => '(wēkiu)',
-'month' => 'Mai ka mahina (me mua):',
-'year' => 'Mai ka makahiki (me mua):',
-
-'sp-contributions-deleted' => 'Nā ha‘awina o ka inoa mea ho‘ohana i kāpae ‘ia ai',
-'sp-contributions-talk' => 'Kūkākūkā',
-'sp-contributions-userrights' => 'Ho‘oponopono ‘ana o nā kuleana',
+'contributions' => 'Nā haʻawina o ka {{GENDER:$1|mea hoʻohana}}',
+'contributions-title' => 'Nā Hāʻawina mea hoʻohana no $1',
+'mycontris' => 'Kaʻu mau haʻawina',
+'contribsub2' => 'No {{GENDER:$3|$1}} ($2)',
+'uctop' => '(okamanawa)',
+'month' => 'Mai ka mahina (mamua aku nei nō hoʻi):',
+'year' => 'Mai ka makahiki (mamua aku nei nō hoʻi):',
+
+'sp-contributions-newbies' => 'Hōʻike i nā hāʻawina o nā moʻokāki hou wale nō',
+'sp-contributions-blocklog' => 'moʻolelo hoʻopale',
+'sp-contributions-deleted' => 'nā ha‘awina o ka inoa mea ho‘ohana i holoi ‘ia',
+'sp-contributions-uploads' => 'nā hoʻouka',
+'sp-contributions-logs' => 'nā moʻolelo',
+'sp-contributions-talk' => 'walaʻau',
+'sp-contributions-userrights' => 'ka hoʻoponopono ʻana o nā kūleana mea hoʻohana',
 'sp-contributions-search' => 'Huli no nā haʻawina',
+'sp-contributions-username' => 'Wahinoho IP aiʻole inoa mea hoʻohana:',
+'sp-contributions-toponly' => 'Hōʻike wale nō i nā hoʻololi kāmua hou loa',
 'sp-contributions-submit' => 'Huli',
 
 # What links here
-'whatlinkshere' => 'Nā mea e loulou iho ai',
+'whatlinkshere' => 'He aha ka mea e loulou iho ai',
+'whatlinkshere-title' => 'Nā ʻAoʻao e loulou iā "$1"',
 'whatlinkshere-page' => '‘Ao‘ao:',
-'nolinkshere' => "‘A‘ole he ‘ao‘ao e loulou ai iā '''[[:$1]]'''.",
-'isredirect' => 'ʻaoʻao hoʻoili ʻana',
-'whatlinkshere-prev' => '{{PLURAL:$1|mua|mua $1}}',
-'whatlinkshere-next' => '{{PLURAL:$1|hope|hope $1}}',
+'linkshere' => 'Loulou kēia mau ʻaoʻao iā <strong>[[:$1]]</strong>:',
+'nolinkshere' => "ʻAʻohe ‘ao‘ao e loulou iā '''[[:$1]]'''.",
+'isredirect' => 'ʻaoʻao kia hou',
+'istemplate' => 'kumo',
+'isimage' => 'loulou waihona',
+'whatlinkshere-prev' => '{{PLURAL:$1|mua aku nei|$1 mua aku nei}}',
+'whatlinkshere-next' => '{{PLURAL:$1|hou aʻe|$1 hou aʻe}}',
 'whatlinkshere-links' => '← nā loulou',
+'whatlinkshere-hideredirs' => '$1 i nā kiahou',
+'whatlinkshere-hidetrans' => '$1 i nā kumo',
 'whatlinkshere-hidelinks' => '$1 i nā loulou',
+'whatlinkshere-hideimages' => '$1 i nā loulou waihona',
 'whatlinkshere-filters' => 'Kānana',
 
 # Block/unblock
-'blockip' => 'E ke‘a i kēia mea ho‘ohana',
+'blockip' => 'Pale i kēia mea ho‘ohana',
 'ipbexpiry' => 'Pau āhea:',
 'ipbreason' => 'Kumu:',
-'ipbsubmit' => 'E ke‘a i kēia mea ho‘ohana',
-'ipbother' => 'ʻĒ aʻe manawa:',
-'ipboptions' => '2 hola:2 hours,1 lā:1 day,3 lā:3 days,1 pule:1 week,2 pule:2 weeks,1 mahina:1 month,3 mahina:3 months,6 mahina:6 months,1 makahiki:1 year,pau ʻole:infinite',
-'badipaddress' => 'Mana ‘ole ka wahi noho IP',
+'ipbsubmit' => 'Pale i kēia mea ho‘ohana',
+'ipbother' => 'Manawa ʻē aʻe:',
+'ipboptions' => '2 mau hola:2 hours,1 lā:1 day,3 mau lā:3 days,1 pule:1 week,2 mau pule:2 weeks,1 mahina:1 month,3 mau mahina:3 months,6 mau mahina:6 months,1 makahiki:1 year,wā pau ʻole:infinite',
+'badipaddress' => 'Wahinoho IP hewa',
+'ipblocklist' => 'Nā Mea hoʻohana pale ʻia',
 'ipblocklist-submit' => 'Huli',
 'infiniteblock' => 'pau ʻole',
-'anononlyblock' => '‘A‘ohe i hō‘ike‘ia ka inoa wale nō',
-'blocklink' => 'e keʻa',
-'unblocklink' => 'mai pale',
-'change-blocklink' => 'hoʻololi ka palena',
-'contribslink' => 'nā ha‘awina',
+'anononlyblock' => 'nā inoaʻole wale nō',
+'blocklink' => 'hoʻopale',
+'unblocklink' => 'hoʻopale ʻole',
+'change-blocklink' => 'hoʻololi i ka palena',
+'contribslink' => 'ha‘awina',
+'blocklogpage' => 'Moʻolelo hoʻopale',
+'blocklogentry' => 'ua hoʻopale ʻia ʻo [[$1]] no ka manawa o $2 $3',
+'block-log-flags-nocreate' => 'ua hoʻopale ʻia ke kāinoa moʻokāki ʻana',
 
 # Move page
 'move-page-legend' => 'Hoʻoneʻe i ka ʻaoʻao',
 'movearticle' => 'E hoʻoneʻe i ka ʻaoʻao:',
 'newtitle' => 'I ka inoa hou:',
-'move-watch' => 'E nānā pono i kēia mea',
+'move-watch' => 'Kiaʻi i ka ʻaoʻao kumu a me ka ʻaoʻao māka',
 'movepagebtn' => 'Hoʻoneʻe i ka ʻaoʻao',
 'pagemovedsub' => 'Kūleʻa ka hoʻoneʻe ʻana',
 'movepage-moved' => '\'\'\'Ua hoʻoneʻe ʻia ʻo "$1" iā "$2"\'\'\'',
+'movelogpage' => 'Hoʻoneʻe i ka moʻolelo',
 'movereason' => 'Kumu:',
-'delete_and_move' => 'E kāpae a e ho‘ololi i ka inoa',
-'delete_and_move_confirm' => '‘Ae, e kāpae i ka ‘ao‘ao',
+'revertmove' => 'hoʻihoʻi',
+'delete_and_move' => 'Holoi a hoʻoneʻe',
+'delete_and_move_confirm' => '‘Ae, e holoi i ka ‘ao‘ao',
 
 # Export
+'export' => 'Kāpuka ʻaoʻao',
 'export-addcat' => 'Ho‘ohui',
 
 # Namespace 8 related
-'allmessages' => 'Nā kauoha o ke kahua',
+'allmessages' => 'Pūlono ʻōnaehana',
 'allmessagesname' => 'Inoa',
 'allmessagesdefault' => 'Kikokikona pa‘amau',
 'allmessagescurrent' => 'Kikokikona i kēia manawa',
 
 # Thumbnails
-'thumbnail-more' => 'ho‘onui',
+'thumbnail-more' => 'Ho‘onui',
+'thumbnail_error' => 'Loaʻa i ka hewa ka haku ʻana o ke kiʻiliʻi: $1',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'Kāu inoa mea ho‘ohana',
-'tooltip-pt-mytalk' => 'Kāu ‘aoʻao ʻōlelo',
-'tooltip-pt-preferences' => 'ka‘u makemake',
-'tooltip-pt-watchlist' => 'Ka papa o nā ʻaoʻao o kou nānā ʻana no nā loli',
+'tooltip-pt-userpage' => 'Kāu ʻaoʻao mea hoʻohana',
+'tooltip-pt-mytalk' => 'Kāu walaʻau',
+'tooltip-pt-preferences' => 'u makemake',
+'tooltip-pt-watchlist' => 'He papahelu o nā ʻaoʻao āu e kiaʻi nei no nā loli',
 'tooltip-pt-mycontris' => 'Kāu mau ha‘awina',
 'tooltip-pt-login' => 'Pai ‘ia ‘oe e ‘e‘e, akā, ‘a‘ole ia he koina',
-'tooltip-pt-logout' => 'E ha‘alele',
-'tooltip-ca-talk' => 'Kūkākūkā e pili ana i kēia ‘ao‘ao',
+'tooltip-pt-logout' => 'Ha‘alele',
+'tooltip-ca-talk' => 'Kūkākūkā e pili ana i ka ʻaoʻao mealoko',
 'tooltip-ca-edit' => 'Hiki iā ‘oe ke ho‘ololi i kēia ‘ao‘ao. Ma mua o ka mālama ʻia ʻana, e ho‘ohana i ke pihi nāmua, ke ‘olu‘olu.',
-'tooltip-ca-addsection' => 'Hoʻomaka i kekahi māhele hou',
-'tooltip-ca-viewsource' => 'Pale ʻia kēia ʻaoʻao.
-Hiki iā ʻoe ke ʻikena i kāna molekumu.',
-'tooltip-ca-history' => 'Ko kēia ʻaoʻao mau kāmua hope',
-'tooltip-ca-protect' => 'Ho‘omalu i keia ‘ao‘ao',
-'tooltip-ca-delete' => 'E kāpae i kēia mo‘olelo',
+'tooltip-ca-addsection' => 'Hoʻomaka i kekahi pauku hou',
+'tooltip-ca-viewsource' => 'Hoʻomalu ʻia kēia ʻaoʻao.
+Hiki iā ʻoe ke ʻike i kāna kūmole.',
+'tooltip-ca-history' => 'Nā kāmua mamua o kēia ʻaoʻao',
+'tooltip-ca-protect' => 'E ho‘omalu i keia ‘ao‘ao',
+'tooltip-ca-delete' => 'E holoi i kēia ʻaoʻao',
 'tooltip-ca-move' => 'E hoʻoneʻe i kēia ʻaoʻao',
-'tooltip-ca-watch' => 'E nānā pono i kēia mea',
+'tooltip-ca-watch' => 'Hoʻohui i kāu papakiʻai',
+'tooltip-ca-unwatch' => 'Hoʻowehe i kēia ʻaoʻao mai kāu papakiaʻi',
 'tooltip-search' => 'Huli iā {{SITENAME}}',
 'tooltip-search-go' => 'Kele i kekahi ʻaoʻao me kēia inoa inā hiki ke loaʻa',
 'tooltip-search-fulltext' => 'Huli i nā ʻaoʻao no kēia kikokikona',
 'tooltip-p-logo' => 'Kele i ka papa kinohi',
 'tooltip-n-mainpage' => 'Kele i ka papa kinohi',
 'tooltip-n-mainpage-description' => 'Kele i ka papa kinohi',
-'tooltip-n-portal' => 'E pili ana ka pāhana, nā hana hiki, nā wahi no ka loaʻa ʻana',
-'tooltip-n-currentevents' => 'ʻIke i nā nū hou',
+'tooltip-n-portal' => 'No ka papahana, nā hana hiki, nāhi no ka loaʻa ʻana',
+'tooltip-n-currentevents' => 'Loaʻa nā ʻike kūmole e pili ana i nā nūhou',
 'tooltip-n-recentchanges' => 'Nā loli hou ma ka wiki',
-'tooltip-n-randompage' => 'Hōʻike kekahi ʻaoʻao kaulele',
-'tooltip-n-help' => 'Ka wahi e kōkua ai iā ‘oe',
-'tooltip-t-whatlinkshere' => 'Nā ‘ao‘ao a pau i loulou mai ai',
+'tooltip-n-randompage' => 'Hoʻouka i kekahi ʻaoʻao kaulele',
+'tooltip-n-help' => 'Kahi e aʻo mai',
+'tooltip-t-whatlinkshere' => 'He papahelu o nā ʻaoʻao wiki apau e loulou i ʻaneʻi',
+'tooltip-t-recentchangeslinked' => 'Nā loli hou i nā ʻaoʻao i loulou ʻia mai kēia ʻaoʻao',
+'tooltip-feed-atom' => 'Hānaīke Atom no kēia ʻaoʻao',
+'tooltip-t-contributions' => 'He papahelu o nā hāʻawina o ka mea hoʻohana',
 'tooltip-t-emailuser' => 'Leka uila i kēia mea hoʻohana',
 'tooltip-t-upload' => 'Ho‘ouka i nā waihona',
-'tooltip-t-specialpages' => 'Papa inoa o nā ʻaoʻao nui apau',
+'tooltip-t-specialpages' => 'He papainoa o nā ʻaoʻao kūikawā apau',
 'tooltip-t-print' => 'Mana paʻi pono o kēia ʻaoʻao',
 'tooltip-t-permalink' => 'Loulou paʻa no kēia kāmua o ka ʻaoʻao',
-'tooltip-ca-nstab-special' => 'He papa nui kēia; ʻaʻole hiki iā ʻoe ke hoʻololi',
+'tooltip-ca-nstab-main' => 'Nānā i ka ʻaoʻao mealoko',
+'tooltip-ca-nstab-user' => 'Nānā i ka ʻaoʻao mea hoʻohana',
+'tooltip-ca-nstab-special' => 'He ʻaoʻao kūikawā kēia; ʻaʻole hiki iā ʻoe ke hoʻololi',
 'tooltip-ca-nstab-project' => 'Nānā i ka ‘ao‘ao papahana',
-'tooltip-ca-nstab-image' => 'Nānā i ka ʻaoʻao faila',
+'tooltip-ca-nstab-image' => 'Nānā i ka ʻaoʻao waihona',
+'tooltip-ca-nstab-template' => 'Nānā i ke anakuhi',
 'tooltip-ca-nstab-help' => 'Nānaina i ka ʻaoʻao kōkua',
-'tooltip-minoredit' => 'Wae i kēia hoʻopololei me he hoʻopololei iki',
-'tooltip-save' => 'Mālama i kāu ho‘opololei',
-'tooltip-watch' => 'E nānā pono i kēia mea',
+'tooltip-ca-nstab-category' => 'Nānā i ka ‘ao‘ao mahele',
+'tooltip-minoredit' => 'Kaha i kēia me he hoʻololi iki',
+'tooltip-save' => 'Mālama i kāu mau loli',
+'tooltip-preview' => 'E nāmua i kāu mau loli ma mua o ka mālama ʻana ke ʻoluʻolu!',
+'tooltip-diff' => 'Hōʻike i nā loli āu i hana ai i kēia kikokikona',
+'tooltip-compareselectedversions' => 'E ʻike i na ʻokoʻa ma waena o nā kāmua ʻelua i koho ʻia o kēia ʻaoʻao',
+'tooltip-watch' => 'Hoʻohui i kāu papakiʻai',
+'tooltip-rollback' => 'Hoʻihoʻi ʻo "Hoʻihoʻi" i nā hoʻololi i kēia ʻaoʻao o ka mea hāʻawi hopeloa i hoʻokahi kāomi',
+'tooltip-undo' => 'Hoʻihoʻi ʻo "Hōʻole" i kēia hoʻololi a wehe ia i ka ʻaoʻao hoʻololi i ke ʻano nāmua. ʻAe ia i ka hoʻohui ʻana i kekahi kumu i loko o ka hōʻuluʻulu manaʻo.',
+'tooltip-summary' => 'Kikokiko i kekahi hōʻuluʻulu manaʻo pōkole',
 
 # Browsing diffs
+'previousdiff' => '← Hoʻololi aku nei',
 'nextdiff' => 'Hoʻololi hou aʻe →',
 
 # Media information
-'file-info-size' => '$1 x $2 kiʻiʻuku, nui faila: $3, ʻano MIME: $4',
-'show-big-image' => 'Miomio piha',
+'file-info-size' => '$1 x $2 kiʻiʻuku, nui waihona: $3, ʻano MIME: $4',
+'file-nohires' => 'Loaʻa ʻole ka miomio aʻe.',
+'svg-long-desc' => 'Waihona SVG, $1 x $2 mau pikela, nui waihona: $3',
+'show-big-image' => 'Waihona kumu',
 
 # Special:NewFiles
 'ilsubmit' => 'Huli',
 
+# Bad image list
+'bad_image_list' => 'ʻO kēia ka hulu:
+
+Noʻonoʻo pono wale no i nā ʻikamu papahelu (nā laina e hoʻomaka ʻia me *).
+Pono ka loulou mua loa ma kekahi laina e loulou i kekahi waihona ʻino.
+Noʻonoʻo ʻia nā loulou heleiho ma kēlā laina like i nā kūʻē lula, he laʻana kēia, nā ʻaoʻao e loaʻa i ka waihona i loko o ka laina.',
+
+# Metadata
+'metadata' => 'ʻIkepiliMeta',
+'metadata-help' => 'Loaʻa i kēia waihona nā ʻike ʻē aʻe i hoʻohui ʻia paha mai kekahi pahupaʻakiʻi aiʻole kekahi mīkinikopekiʻi i hana ʻia no ka haku ʻana aiʻole ka hoʻokamepiuila ʻana o ia.
+Inā ua kāloli ʻia ka waihona mai kona ʻano kumu, hōʻike piha ʻole i kekahi o nā kikoʻī o ka waihona i kāloli ʻia.',
+'metadata-fields' => 'E hoʻokomo ʻia ana nā kula ʻikepiliMeta kiʻi i loko o kēia pūlono ma ka hōʻike ʻaoʻao kiʻi oiai ka hoʻoliʻi ʻana o ke pākaukau ʻikepiliMeta.
+Hoʻohuna paʻamau i nā mea ʻē aʻe
+* kahana lōkō
+* kaʻano
+* kalāholakumu
+* holahuʻena
+* heluf
+* kūlanawikiiso
+* loaaniani
+* meahana
+* kūleanakope
+* hōʻikeʻanokiʻi
+* lakikūgps
+* lonikūgps
+* kiʻekiʻegps',
+
 # 'all' in various places, this might be different for inflected languages
-'watchlistall2' => 'apau',
-'namespacesall' => 'apau',
-'monthsall' => 'āpau',
+'watchlistall2' => 'nā mea apau',
+'namespacesall' => 'nā mea apau',
+'monthsall' => 'nā mea apau',
 
 # action=purge
 'confirm_purge_button' => 'Hiki nō',
 
 # Multipage image navigation
-'imgmultipageprev' => '← mea ma mua aʻe',
-'imgmultipagenext' => 'mea aʻe →',
+'imgmultipageprev' => '← ʻaoʻao aku nei',
+'imgmultipagenext' => 'ʻaoʻao hou aʻe →',
 
 # Table pager
-'table_pager_next' => 'Mea aʻe',
-'table_pager_prev' => 'Mea ma mua aʻe',
+'table_pager_next' => 'ʻAoʻao hou aʻe',
+'table_pager_prev' => 'ʻAoʻao aku nei',
 
 # Auto-summaries
-'autosumm-replace' => "Ke pani nei i ka ‘ao‘ao me '$1'",
-'autoredircomment' => 'Ke alaka‘i nei hou i [[$1]]',
+'autosumm-replace' => "Ke pani nei i ka mealoko me '$1'",
+'autoredircomment' => 'Kiahou i ka ʻaoʻao iā [[$1]]',
 'autosumm-new' => "Ua hoʻokumu ʻia kekahi ʻaoʻao me '$1'",
 
 # Live preview
 'livepreview-loading' => 'Ke ho‘ouka nei…',
 
 # Watchlist editor
-'watchlistedit-normal-title' => 'E ho‘opololei i ka‘u papa nānā pono',
+'watchlistedit-normal-title' => 'Hoʻololi i ka papakiaʻi',
+
+# Watchlist editing tools
+'watchlisttools-view' => 'Nānā i nā loli ʻālike',
+'watchlisttools-edit' => 'Nānā a hoʻololi i ka papakiaʻi',
+'watchlisttools-raw' => 'Hoʻololi i ka papakiaʻi maka',
+
+# Core parser functions
+'duplicate-defaultsort' => '<strong>E akahele:</strong> Mauʻaʻe ke kī kaʻalike paʻamau "$2" i ke kī kaʻalike paʻamau "$1" mai ka wā mua.',
 
 # Special:Version
-'version-specialpages' => 'Nā ‘ao‘ao kūikawā',
+'version-specialpages' => 'Nā ‘Ao‘ao kūikawā',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch-submit' => 'Huli',
 
 # Special:SpecialPages
-'specialpages' => 'Nā ‘ao‘ao kūikawā',
+'specialpages' => 'Nā ‘Ao‘ao kūikawā',
+
+# External image whitelist
+'external_image_whitelist' => ' #Waiho i kēia laina<pre>
+#Kau i nā hapa haʻi maʻamau (nā hapa e kau ʻia ma waena o nā //) i lalo
+#Hoʻohālikelike ia mea me nā URL o nā kiʻi kūwaho (loulouhūnāloko)
+#Hōʻike ʻia ia mea e hoʻohālikelike me he mau kiʻi, inā ʻaʻole pēlā e hōʻike wale me he loulou no ke kiʻi wale nō
+#Mālama ʻia nā laina e hoʻomaka me ka # e like me nā kaumanaʻo
+#Kākau wale, mai hopohopo e pili ana nā ʻaui
+
+#Kau i nā hapa ligaka apau ma luna o kēia laina. Wahiho i kēia laina</pre>',
 
 # Special:Tags
-'tags-edit' => 'e hoʻololi',
+'tag-filter' => 'Kānana [[Special:Tags|lepili]]:',
+'tags-edit' => 'hoʻololi',
 
 # Special:ExpandTemplates
 'expand_templates_ok' => 'Hiki nō',
index 0501a60..ae8c6bf 100644 (file)
@@ -405,7 +405,6 @@ $messages = array(
 'tog-ccmeonemails' => 'לשלוח אליי העתקים של הודעות דואר אלקטרוני ששלחתי למשתמשים אחרים',
 'tog-diffonly' => 'ביטול הצגת תוכן הדף מתחת להשוואות הגרסאות',
 'tog-showhiddencats' => 'הצגת קטגוריות מוסתרות',
-'tog-noconvertlink' => 'ביטול המרת קישורים לכותרות',
 'tog-norollbackdiff' => 'השמטת ההבדלים בין הגרסאות לאחר ביצוע שחזור',
 'tog-useeditwarning' => 'הצגת אזהרה בעת עזיבת דף עריכה עם שינויים שטרם נשמרו',
 'tog-prefershttps' => 'תמיד להשתמש בתקשורת מאובטחת לאחר הכניסה לחשבון',
@@ -950,7 +949,7 @@ $2',
 'resetpass-temp-password' => 'סיסמה זמנית:',
 'resetpass-abort-generic' => 'שינוי הסיסמה בוטל על־ידי הרחבה.',
 'resetpass-expired' => 'סיסמתכם פקעה. אנא הגדירו סיסמה חדשה כדי להיכנס.',
-'resetpass-expired-soft' => 'סיסמתכם פקעה, ויש לאפס אותה. אנא בחרו סיסמה חדשה כעת, או לחצו על "ביטול" כדי לאפס אותה מאוחר יותר.',
+'resetpass-expired-soft' => 'סיסמתכם פקעה ויש לאפס אותה. אנא בחרו סיסמה חדשה כעת, או לחצו על "{{int:resetpass-submit-cancel}}" כדי לאפס אותה מאוחר יותר.',
 
 # Special:PasswordReset
 'passwordreset' => 'איפוס סיסמה',
@@ -1811,14 +1810,26 @@ $1",
 'recentchanges-legend-heading' => "'''מקרא:'''",
 'recentchanges-legend-newpage' => '(ראו גם [[Special:NewPages|רשימת דפים חדשים]])',
 'recentchanges-legend-plusminus' => "(''±123'')",
-'rcnotefrom' => 'להלן <b>$1</b> השינויים האחרונים שבוצעו החל מתאריך <b>$2</b>:',
-'rclistfrom' => 'הצגת שינויים חדשים החל מ־$1',
+'rcnotefrom' => 'להלן השינויים שבוצעו החל מ‏‏֫־<b>$2</b> (עד <b>$1</b> מוצגים).',
+'rclistfrom' => 'הצגת שינויים חדשים החל מ־$2, $3',
 'rcshowhideminor' => '$1 שינויים משניים',
+'rcshowhideminor-show' => 'הצגת',
+'rcshowhideminor-hide' => 'הסתרת',
 'rcshowhidebots' => '$1 בוטים',
+'rcshowhidebots-show' => 'הצגת',
+'rcshowhidebots-hide' => 'הסתרת',
 'rcshowhideliu' => '$1 משתמשים רשומים',
+'rcshowhideliu-show' => 'הצגת',
+'rcshowhideliu-hide' => 'הסתרת',
 'rcshowhideanons' => '$1 משתמשים אנונימיים',
+'rcshowhideanons-show' => 'הצגת',
+'rcshowhideanons-hide' => 'הסתרת',
 'rcshowhidepatr' => '$1 עריכות בדוקות',
+'rcshowhidepatr-show' => 'הצגת',
+'rcshowhidepatr-hide' => 'הסתרת',
 'rcshowhidemine' => '$1 עריכות שלי',
+'rcshowhidemine-show' => 'הצגת',
+'rcshowhidemine-hide' => 'הסתרת',
 'rclinks' => 'הצגת $1 שינויים אחרונים ב־$2 הימים האחרונים.<br /> $3',
 'diff' => 'הבדל',
 'hist' => 'היסטוריה',
@@ -1946,6 +1957,8 @@ $1",
 'uploaddisabledtext' => 'אפשרות העלאת הקבצים מבוטלת.',
 'php-uploaddisabledtext' => 'אפשרות העלאת הקבצים מבוטלת ברמת PHP. אנא בדקו את ההגדרה file_uploads.',
 'uploadscripted' => 'הקובץ כולל קוד סקריפט או HTML שעשוי להתפרש או להתבצע בטעות על ידי הדפדפן.',
+'uploadscriptednamespace' => "קובץ ה‏‏֫־SVG הזה כולל מרחב שם בלתי חוקי: '$1'",
+'uploadinvalidxml' => 'לא ניתן לפרש את ה־XML בקובץ שהועלה.',
 'uploadvirus' => 'הקובץ מכיל וירוס!
 פרטים:
 <div dir="ltr">$1</div>',
@@ -2519,7 +2532,7 @@ $1',
 'watchmethod-list' => 'בודק את העריכות האחרונות בדפים שברשימת המעקב',
 'watchlistcontains' => 'רשימת המעקב כוללת {{PLURAL:$1|דף אחד|$1 דפים}}.',
 'iteminvalidname' => 'בעיה עם $1, שם שגוי…',
-'wlnote2' => '×\9c×\94×\9c×\9f ×\94ש×\99× ×\95×\99×\99×\9d ×\94×\90×\97ר×\95× ×\99×\9d {{PLURAL:$1|×\91שע×\94 ×\94×\90×\97ר×\95× ×\94\91שעת×\99×\99×\9d ×\94×\90×\97ר×\95× ×\95ת|×\91â\80\8fâ\80\8fÖ«Ö¾<strong>$1</strong> ×\94שע×\95ת ×\94×\90×\97ר×\95× ×\95ת}}, ×¢×\93 $3, $2.',
+'wlnote2' => 'להלן השינויים האחרונים {{PLURAL:$1|בשעה האחרונה|בשעתיים האחרונות|ב‏‏־<strong>$1</strong> השעות האחרונות}}, עד $3, $2.',
 'wlshowlast' => '(הצגת $1 שעות אחרונות | $2 ימים אחרונים | $3)',
 'watchlist-options' => 'אפשרויות ברשימת המעקב',
 
@@ -2606,7 +2619,7 @@ $UNWATCHURL
 'delete-edit-reasonlist' => 'עריכת סיבות המחיקה',
 'delete-toobig' => 'דף זה כולל מעל {{PLURAL:$1|גרסה אחת|$1 גרסאות}} בהיסטוריית העריכות שלו. מחיקת דפים כאלה הוגבלה כדי למנוע פגיעה בביצועי האתר.',
 'delete-warning-toobig' => 'דף זה כולל מעל {{PLURAL:$1|גרסה אחת|$1 גרסאות}} בהיסטוריית העריכות שלו. מחיקה שלו עלולה להפריע לפעולות בבסיס הנתונים; אנא שקלו שנית את המחיקה.',
-'deleting-backlinks-warning' => "'''אזהרה:''' דפים אחרים מקשרים לדף שאתם עומדים למחוק או מכלילים אותו.",
+'deleting-backlinks-warning' => "'''אזהרה:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|דפים אחרים]] מקשרים לדף שאתם עומדים למחוק או מכלילים אותו.",
 
 # Rollback
 'rollback' => 'שחזור עריכות',
@@ -2780,8 +2793,10 @@ $1',
 'sp-contributions-blocked-notice-anon' => 'כתובת IP זו חסומה כרגע.
 הפעולה האחרונה ביומן החסימות מוצגת להלן:',
 'sp-contributions-search' => 'חיפוש תרומות',
+'sp-contributions-suppresslog' => 'תרומות משתמש מוסתרות',
 'sp-contributions-username' => 'שם משתמש או כתובת IP:',
 'sp-contributions-toponly' => 'הצגת עריכות שהן הגרסאות האחרונות בלבד',
+'sp-contributions-newonly' => 'הצגת עריכות שהן יצירות של דפים בלבד',
 'sp-contributions-submit' => 'חיפוש',
 
 # What links here
@@ -4397,6 +4412,4 @@ $5
 'expand_templates_generate_rawhtml' => 'הצגת HTML גולמי',
 'expand_templates_preview' => 'תצוגה מקדימה',
 
-# Unknown messages
-'uploadinvalidxml' => 'לא ניתן לפרש את ה־XML בקובץ שהועלה.',
 );
index 04d4b58..258b6aa 100644 (file)
@@ -473,7 +473,7 @@ $1',
 'editsectionhint' => 'अनुभाग सम्पादन: $1',
 'toc' => 'विषय सूची',
 'showtoc' => 'दिखाएँ',
-'hidetoc' => 'à¤\9bिपाएँ',
+'hidetoc' => 'à¤\9bà¥\81पाएँ',
 'collapsible-collapse' => 'छोटा करें',
 'collapsible-expand' => 'विस्तार करें',
 'thisisdeleted' => '$1 देखें या वापिस लाएँ?',
@@ -750,7 +750,7 @@ $2',
 
 # Change password dialog
 'changepassword' => 'कूटशब्द बदलें',
-'resetpass_announce' => 'लà¥\89à¤\97 à¤\87न à¤\95à¥\8b à¤ªà¥\82रा à¤\95रनà¥\87 à¤\95à¥\87 à¤²à¤¿à¤¯à¥\87 à¤\86पà¤\95à¥\8b à¤¯à¤¹à¤¾à¤\81 à¤\8fà¤\95 à¤¨à¤¯à¤¾ à¤\95à¥\82à¤\9fशबà¥\8dद à¤¦à¥\87ना à¤¹à¥\8bà¤\97ा:',
+'resetpass_announce' => 'लà¥\89à¤\97 à¤\87न à¤¸à¤®à¥\8dपà¥\82रà¥\8dण à¤\95रनà¥\87 à¤\95à¥\87 à¤²à¤¿à¤¯à¥\87 à¤\86पà¤\95à¥\8b à¤\8fà¤\95 à¤¨à¤¯à¤¾ à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤¦à¥\87ना à¤¹à¥\8bà¤\97ा।',
 'resetpass_text' => '<!-- पाठ यहाँ लिखें -->',
 'resetpass_header' => 'खाते का कूटशब्द बदलें',
 'oldpassword' => 'पुराना कूटशब्द:',
@@ -766,13 +766,13 @@ $2',
 'resetpass-submit-cancel' => 'रद्द करें',
 'resetpass-wrong-oldpass' => 'अवैध अस्थायी या वर्तमान कूटशब्द।
 संभव है कि या तो आपने पहले ही सफलतापूर्वक अपना कूटशब्द बदल लिया हो, या आपने एक नए अस्थायी कूटशब्द का अनुरोध किया हो।',
-'resetpass-recycled' => 'à¤\95à¥\83पया à¤\85पना à¤µà¤°à¥\8dतमान à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤\95à¥\87 à¤\85लावा à¤\95िसà¥\80 à¤\85नà¥\8dय à¤®à¥\87à¤\82 à¤°à¤¿à¤¸à¥\87à¤\9f करें।',
-'resetpass-temp-emailed' => 'à¤\86पनà¥\87 à¤\8fà¤\95 à¤\85सà¥\8dथायà¥\80 à¤\95à¥\8bड à¤\88मà¥\87ल à¤\95à¥\87 à¤¸à¤¾à¤¥ à¤²à¥\89à¤\97 à¤\87न à¤\95िया.
-लॉगिंग पूरा करने के लिए, आपको यहाँ एक नया पासवर्ड सेट करना होगा:',
+'resetpass-recycled' => 'रà¥\80सà¥\87à¤\9f à¤\95रनà¥\87 à¤\95à¥\87 à¤²à¤¿à¤\8f à¤¨à¤¯à¥\87 à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤®à¥\87à¤\82 à¤\95à¥\83पया à¤\85पनà¥\87 à¤µà¤°à¥\8dतमान à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤\95à¥\87 à¤\85लावा à¤\95िसà¥\80 à¤\85नà¥\8dय à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤\95ा à¤ªà¥\8dरयà¥\8bà¤\97 करें।',
+'resetpass-temp-emailed' => 'à¤\86पनà¥\87 à¤\8fà¤\95 à¤\85सà¥\8dथायà¥\80 à¤\88मà¥\87ल à¤\95ियà¥\87 à¤\97यà¥\87 à¤\95à¥\8bड à¤\95à¥\87 à¤¸à¤¾à¤¥ à¤²à¥\89à¤\97 à¤\87न à¤\95िया।
+लॉग इन सम्पूर्ण करने के लिए आपको यहाँ एक नया पासवर्ड सेट करना होगा:',
 'resetpass-temp-password' => 'अस्थायी कूटशब्द:',
 'resetpass-abort-generic' => 'कूटशब्द में बदलाव किसी एक्सटेंशन द्वारा रोक दिया गया है।',
-'resetpass-expired' => 'à¤\86पà¤\95à¥\87 à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤\95à¥\80 à¤¸à¤®à¤¯ à¤¸à¥\80मा à¤¸à¤®à¤¾à¤ªà¥\8dत à¤¹à¥\8b à¤\9aà¥\81à¤\95à¥\80 à¤¹à¥\88। à¤\95à¥\83पया à¤²à¥\89à¤\97इन करने के लिए एक नया पासवर्ड सेट करें।',
-'resetpass-expired-soft' => "à¤\86पà¤\95ा à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤¸à¤®à¤¾à¤ªà¥\8dत à¤¹à¥\8b à¤\97या à¤¹à¥\88, à¤\94र à¤°à¥\80सà¥\87à¤\9f à¤\95ियà¥\87 à¤\9cानà¥\87 à¤\95à¥\80 à¤\9cरà¥\82रत à¤¹à¥\88। à¤\95à¥\83पया à¤\85ब à¤\8fà¤\95 à¤¨à¤¯à¤¾ à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤\9aà¥\81नà¥\87à¤\82, à¤¯à¤¾ à¤¬à¤¾à¤¦ à¤®à¥\87à¤\82 à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रनà¥\87 à¤\95à¥\87 à¤²à¤¿à¤\8f ' à¤°à¤¦à¥\8dद à¤\95रà¥\87à¤\82 ' क्लिक करें।",
+'resetpass-expired' => 'à¤\86पà¤\95à¥\87 à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤\95à¥\80 à¤µà¥\88धता à¤\85वधि à¤¸à¤®à¤¾à¤ªà¥\8dत à¤¹à¥\8b à¤\9aà¥\81à¤\95à¥\80 à¤¹à¥\88। à¤\95à¥\83पया à¤²à¥\89à¤\97 इन करने के लिए एक नया पासवर्ड सेट करें।',
+'resetpass-expired-soft' => "à¤\86पà¤\95ा à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤\95à¥\80 à¤µà¥\88धता à¤\85वधि à¤¸à¤®à¤¾à¤ªà¥\8dत à¤¹à¥\8b à¤\97यà¥\80 à¤¹à¥\88, à¤\94र à¤\89सà¥\87 à¤°à¥\80सà¥\87à¤\9f à¤\95रनà¥\87 à¤\95à¥\80 à¤\9c़रà¥\82रत à¤¹à¥\88। à¤\95à¥\83पया à¤\8fà¤\95 à¤¨à¤¯à¤¾ à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤\9aà¥\81नà¥\87à¤\82, à¤¯à¤¾ à¤¬à¤¾à¤¦ à¤®à¥\87à¤\82 à¤°à¥\80सà¥\87à¤\9f à¤\95रनà¥\87 à¤\95à¥\87 à¤²à¤¿à¤\8f 'रदà¥\8dद à¤\95रà¥\87à¤\82' à¤ªà¤° क्लिक करें।",
 
 # Special:PasswordReset
 'passwordreset' => 'कूटशब्द रीसेट',
@@ -1084,8 +1084,8 @@ $2
 'undo-failure' => 'इस बीच अन्य बदलाव होने के कारण यह संपादन पूर्ववत करना संभव नहीं है।',
 'undo-norev' => 'यह बदलाव वापिस नहीं कर पाये हैं क्योंकि या तो इसे पहले से पलटा दिया गया है या फिर पृष्ठ हटा दिया गया है।',
 'undo-nochange' => 'ऐसा लगता है कि इस सम्पादन को पहले ही पूर्ववत कर दिया गया है।',
-'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|वारà¥\8dता]]) à¤¦à¥\8dवारा à¤\95िà¤\8f à¤¬à¤¦à¤²à¤¾à¤µ $1 à¤\95à¥\8b à¤ªà¥\82रà¥\8dववत à¤\95ियà¥\87',
-'undo-summary-username-hidden' => 'à¤\9bà¥\81पाà¤\8f à¤\97à¤\8f à¤¸à¤¦à¤¸à¥\8dय à¤¦à¥\8dवारा à¤\95ियà¥\87 à¤¸à¤\82शà¥\8bधन $1 को पूर्ववत किया',
+'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|वारà¥\8dता]]) à¤¦à¥\8dवारा à¤\95िà¤\8f à¤¬à¤¦à¤²à¤¾à¤µ $1 à¤\95à¥\8b à¤ªà¥\82रà¥\8dववत à¤\95िया',
+'undo-summary-username-hidden' => 'à¤\9bà¥\81पाà¤\8f à¤\97à¤\8f à¤¸à¤¦à¤¸à¥\8dय à¤¦à¥\8dवारा à¤\95ियà¥\87 à¤¬à¤¦à¤²à¤¾à¤µ $1 को पूर्ववत किया',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'खाता खोल नहीं सकते',
@@ -1133,7 +1133,7 @@ $2
 'rev-deleted-comment' => '(सम्पादन सारांश हटाया)',
 'rev-deleted-user' => '(सदस्यनाम हटाया)',
 'rev-deleted-event' => '(लॉग कार्य हटाया)',
-'rev-deleted-user-contribs' => 'संशोधन उपयोगकर्ता योगदान नष्ट',
+'rev-deleted-user-contribs' => '[सदस्यनाम अथवा आइ॰पी पता छुपाया गया - सम्पादन योगदानों में से छुपाया गया]',
 'rev-deleted-text-permission' => 'यह पृष्ठ अवतरण हटाया गया है।
 इसकी अधिक जानकारी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटाने की लॉग] में पाई जा सकती है।',
 'rev-deleted-text-unhide' => 'यह पृष्ठ अवतरण हटाया गया है।
@@ -1635,15 +1635,27 @@ HTML टैग की जाँच करें।',
 'rcnotefrom' => "नीचे '''$2''' के बाद से ('''$1''' तक) हुए बदलाव दर्शाए गये हैं।",
 'rclistfrom' => '$1 से नये बदलाव दिखाएँ',
 'rcshowhideminor' => 'छोटे बदलाव $1',
+'rcshowhideminor-show' => 'दिखाएँ',
+'rcshowhideminor-hide' => 'छुपाएँ',
 'rcshowhidebots' => 'बॉट $1',
+'rcshowhidebots-show' => 'दिखाएँ',
+'rcshowhidebots-hide' => 'छुपाएँ',
 'rcshowhideliu' => 'पंजीकृत सदस्य $1',
+'rcshowhideliu-show' => 'दिखाएँ',
+'rcshowhideliu-hide' => 'छुपाएँ',
 'rcshowhideanons' => 'आइ॰पी सदस्यों के बदलाव $1',
+'rcshowhideanons-show' => 'दिखाएँ',
+'rcshowhideanons-hide' => 'छुपाएँ',
 'rcshowhidepatr' => 'परीक्षित सम्पादन $1',
+'rcshowhidepatr-show' => 'दिखाएँ',
+'rcshowhidepatr-hide' => 'छुपाएँ',
 'rcshowhidemine' => 'मेरे बदलाव $1',
+'rcshowhidemine-show' => 'दिखाएँ',
+'rcshowhidemine-hide' => 'छुपाएँ',
 'rclinks' => 'पिछले $2 दिनों में हुए $1 बदलाव दिखाएँ<br />$3',
 'diff' => 'अंतर',
 'hist' => 'इतिहास',
-'hide' => 'à¤\9bिपाएँ',
+'hide' => 'à¤\9bà¥\81पाएँ',
 'show' => 'दिखाएँ',
 'minoreditletter' => 'छो',
 'newpageletter' => 'न',
@@ -1770,6 +1782,7 @@ HTML टैग की जाँच करें।',
 'php-uploaddisabledtext' => 'पी॰एच॰पी में फ़ाइल अपलोड बंद हैं।
 कृपया file_uploads जमाव की जाँच करें।',
 'uploadscripted' => 'इस फ़ाइल में एच॰टी॰एम॰एल या स्क्रिप्ट कोड है, जो वेब ब्राउज़र द्वारा गलत पढ़ा जा सकता है।',
+'uploadinvalidxml' => 'अपलोड की गई फ़ाइल में स्थित XML पार्स नहीं की जा सकी।',
 'uploadvirus' => 'इस फ़ाइल में व्हाईरस हैं! अधिक जानकारी: $1',
 'uploadjava' => 'यह फ़ाइल एक ज़िप फ़ाइल है जिसमें एक जावा .class फ़ाइल है।
 जावा फ़ाइलों को अपलोड करना वर्जित है, क्योंकि इनके कारण सुरक्षा बाधाएँ पार की जा सकती हैं।',
@@ -2145,13 +2158,16 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 'protectedpages-cascade' => 'केवल सोपानी सुरक्षा',
 'protectedpages-noredirect' => 'पुनर्निर्देश छुपाएँ',
 'protectedpagesempty' => 'इस समय इन नियमों द्वारा कोई पृष्ठ सुरक्षित नहीं हैं।',
-'protectedpages-timestamp' => 'à¤\9fाà¤\87म à¤®à¥\8bहर',
+'protectedpages-timestamp' => 'समय à¤®à¥\81हर',
 'protectedpages-page' => 'पृष्ठ',
-'protectedpages-expiry' => 'समाप्ति:',
-'protectedpages-performer' => 'à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता à¤\95à¥\80 à¤¸à¥\81रà¤\95à¥\8dषा',
-'protectedpages-params' => 'सà¤\82रà¤\95à¥\8dषण à¤ªà¥\88रामà¥\80à¤\9fरà¥\8dस',
+'protectedpages-expiry' => 'समाप्ति',
+'protectedpages-performer' => 'सà¥\81रà¤\95à¥\8dषित à¤\95रनà¥\87 à¤µà¤¾à¤²à¤¾ à¤¸à¤¦à¤¸à¥\8dय',
+'protectedpages-params' => 'सà¥\81रà¤\95à¥\8dषा à¤ªà¥\8dराà¤\9aल',
 'protectedpages-reason' => 'कारण',
+'protectedpages-unknown-timestamp' => 'अज्ञात',
+'protectedpages-unknown-performer' => 'अज्ञात सदस्य',
 'protectedtitles' => 'सुरक्षित शीर्षक',
+'protectedtitles-summary' => 'यह पृष्ठ उन पृष्ठ शीर्षकों की सूची देता है जिन्हें अभी बनाने से सुरक्षित किया गया है। सुरक्षित मौजूदा पृष्ठों की सूची देखने के लिए [[{{#special:ProtectedPages}}]] देखें।',
 'protectedtitlesempty' => 'इन नियमों द्वारा कोई भी शीर्षक सुरक्षित नहीं हैं।',
 'listusers' => 'सदस्यसूची',
 'listusers-editsonly' => 'केवल संपादन कर चुके सदस्य दिखाएँ',
@@ -2337,7 +2353,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 'watchmethod-list' => 'ध्यानसूची में दिये गये पृष्ठों में हाल में हुए बदलाव देख रहे हैं',
 'watchlistcontains' => 'आपकी ध्यानसूची में $1 {{PLURAL:$1|पृष्ठ}} हैं।',
 'iteminvalidname' => "'$1' के साथ समस्या, अवैध नाम...",
-'wlnote2' => '$2,$3 तक आखरी {{PLURAL:$1|घंटे|<strong>$1</strong>घंटों}} में बदलाव निम्नलिखित हैं।',
+'wlnote2' => '$2,$3 तक आखरी {{PLURAL:$1|घंटे|<strong>$1</strong> घंटों}} में बदलाव निम्नलिखित हैं।',
 'wlshowlast' => 'पिछले $1 घंटे $2 दिन $3 देखें',
 'watchlist-options' => 'ध्यानसूची विकल्प',
 
@@ -2427,6 +2443,7 @@ $UNWATCHURL
 'delete-warning-toobig' => 'इस पृष्ठ का संपादन इतिहास $1 से अधिक {{PLURAL:$1|अवतरण}} होने की वजह से बहुत बड़ा है।
 इसे हटाने से {{SITENAME}} के डाटाबेस की गतिविधियों में व्यवधान आ सकता है;
 कृपया सोच समझ कर आगे बढ़ें।',
+'deleting-backlinks-warning' => "'''चेतावनी:''' जो पृष्ठ आप हटाने जा रहे हैं उससे अन्य पृष्ठ जुड़ते हैं अथवा उसे ट्रांसक्लूड करते हैं।",
 
 # Rollback
 'rollback' => 'संपादन वापिस लें',
@@ -2466,6 +2483,7 @@ $2 द्वारा संपादित अन्तिम अवतरण 
 'prot_1movedto2' => '[[$1]] का नाम बदलकर [[$2]] कर दिया गया है',
 'protect-badnamespace-title' => 'सुरक्षाहीन नामस्थान',
 'protect-badnamespace-text' => 'इस नामस्थान में पृष्ठ सुरक्षित नहीं किये जा सकते हैं।',
+'protect-norestrictiontypes-text' => 'यह पृष्ठ सुरक्षित नहीं किया जा सकता क्योंकि कोई सुरक्षा प्रकार उपलब्ध नहीं हैं।',
 'protect-legend' => 'सुरक्षा निर्धारित करें',
 'protectcomment' => 'कारण:',
 'protectexpiry' => 'समाप्ति:',
@@ -2682,7 +2700,7 @@ $1',
 'blocklist-tempblocks' => 'अस्थाई अवरोध छिपाएं',
 'blocklist-addressblocks' => 'एकल आईपी अवरोध छिपाएं',
 'blocklist-rangeblocks' => 'श्रेणी ब्लॉक छुपाएँ',
-'blocklist-timestamp' => 'à¤\9fाà¤\87मसà¥\8dà¤\9fà¥\88मà¥\8dप',
+'blocklist-timestamp' => 'समय à¤®à¥\81हर',
 'blocklist-target' => 'लक्ष्य',
 'blocklist-expiry' => 'अवसान',
 'blocklist-by' => 'प्रशासक अवरुद्ध',
@@ -2744,7 +2762,8 @@ $1 को अवरोधित करने का कारण है: "$2"',
 कृपया आप अपने इंटरनेट सेवा प्रदान करने वाले से या तकनीकी सहायक से सम्पर्क करें अथवा उन्हें इस भयावह सुरक्षा समस्या के बारे में सूचित करें।',
 'sorbsreason' => '{{SITENAME}} द्वारा इस्तेमालमें लाये जाने वाले DNSBL में आपके आईपी एड्रेसको ओपन प्रॉक्सीमें दर्शाया गया हैं।',
 'sorbs_create_account_reason' => '{{SITENAME}} के DNSBL ने आपका आईपी एड्रेस ओपन प्रोक्सी करके सूचित किया हैं। आप खाता खोल नहीं सकतें।',
-'cant-see-hidden-user' => 'कठबोली छुपा उपयोगकर्ता देखना',
+'cant-see-hidden-user' => 'जिस सदस्य को आप अवरोधित करने की कोशिश कर रहे हैं उसे पहले ही अवरोधित कर के छुपाया जा चुका है।
+चूँकि आपके पास hideuser अधिकार नहीं है, आप इस सदस्य का अवरोधन ना देख सकते हैं और ना ही सम्पादित कर सकते हैं।',
 'ipbblocked' => 'आप अन्य प्रयोक्ताओं को अवरोधित या अनवरोधित नहीं कर सकते, क्योंकि आप स्वयं अवरोधित हैं',
 'ipbnounblockself' => 'आपको स्वयं को अनवरोधित करने की अनुमति नहीं है',
 
@@ -2808,7 +2827,7 @@ $1 को अवरोधित करने का कारण है: "$2"',
 
 इन मामलोंमे आपको स्वयं यह पृष्ठ जोडने पड़ सकते है ।",
 'movearticle' => 'पृष्ठ का नाम बदलें',
-'moveuserpage-warning' => 'चाल उपयोगकर्ता चेतावनी पृष्ठ',
+'moveuserpage-warning' => '<strong>चेतावनी:</strong> आप एक सदस्य पृष्ठ स्थानांतरित करने जा रहे हैं। कृपया ध्यान दें कि केवल पृष्ठ का नाम बदला जाएगा और सदस्यनाम <em>नहीं</em> बदलेगा।',
 'movenologintext' => 'लेख स्थानान्तरित करने के लिये आपका [[Special:UserLogin|लॉग इन]] किया होना आवश्यक हैं।',
 'movenotallowed' => 'आपको पृष्ठ स्थानांतरित करने की अनुमति नहीं है।',
 'movenotallowedfile' => 'आपको फ़ाइलें स्थानांतरित करने की अनुमति नहीं है।',
@@ -2862,7 +2881,8 @@ $1 को अवरोधित करने का कारण है: "$2"',
 नवीनतम लॉग प्रविष्टि संदर्भ के लिये नीचे दी है:",
 'move-over-sharedrepo' => '== फ़ाइल मौजूद है ==
 [[:$1]] एक साझे भंडार पर मौजूद है। इस नाम पर स्थानांतरण से नई फ़ाइल साझा फ़ाइल को ओवरराइड करेगी।',
-'file-exists-sharedrepo' => 'फ़ाइल रेपो साझा मौजूद',
+'file-exists-sharedrepo' => 'चयनित फ़ाइल नाम पहले ही एक साझा भण्डार में प्रयुक्त है।
+कृपया अन्य नाम चुनें।',
 
 # Export
 'export' => 'पन्नों का निर्यात करें',
@@ -3168,7 +3188,8 @@ $1',
 'nextdiff' => 'ताज़ा संपादन →',
 
 # Media information
-'mediawarning' => 'चेतावनी मीडिया',
+'mediawarning' => '<strong>चेतावनी:</strong> इस फ़ाइल प्रकार में हानिकारक कोड हो सकता है।
+संभव है कि इसे चलाने से आपका सिस्टम हैक हो जाये।',
 'imagemaxsize' => "छवि आकार सीमा:<br />''(संचिका वर्णन पन्नों के लिए)''",
 'thumbsize' => 'अंगूठानख आकार:',
 'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|पृष्ठ|पृष्ठ}}',
@@ -3876,8 +3897,16 @@ $5
 'version-hook-subscribedby' => 'ने सदस्यत्व लिया',
 'version-version' => '($1)',
 'version-license' => 'मीडियाविकि अनुज्ञापत्र',
+'version-ext-license' => 'लाइसेंस',
+'version-ext-colheader-name' => 'एक्सटेंशन',
+'version-ext-colheader-version' => 'संस्करण',
+'version-ext-colheader-license' => 'लाइसेंस',
 'version-ext-colheader-description' => 'विवरण',
 'version-ext-colheader-credits' => 'लेखक',
+'version-license-title' => '$1 के लिए लाइसेंस',
+'version-license-not-found' => 'इस एक्सटेंशन के लिए कोई विस्तृत लाइसेंस जानकारी नहीं पायी गयी।',
+'version-credits-title' => '$1 के लिए श्रेय',
+'version-credits-not-found' => 'इस एक्सटेंशन के लिए कोई विस्तृत श्रेय जानकारी नहीं पायी गयी।',
 'version-poweredby-credits' => "यह विकि  '''[https://www.mediawiki.org/ MediaWiki]''' द्वारा संचालित है, कॉपीराइट © 2001 - $1  $2 ।",
 'version-poweredby-others' => 'अन्य',
 'version-poweredby-translators' => 'translatewiki.net अनुवादक',
@@ -3887,6 +3916,8 @@ $5
 'version-entrypoints-header-url' => 'यू॰आर॰एल',
 
 # Special:Redirect
+'redirect-submit' => 'जायें',
+'redirect-lookup' => 'ढूँढें:',
 'redirect-user' => 'सदस्य आई॰डी',
 'redirect-revision' => 'पृष्ठ अवतरण संख्या',
 'redirect-file' => 'फ़ाइल नाम',
@@ -3943,7 +3974,10 @@ $5
 'tags-tag' => 'चिप्पी का नाम',
 'tags-display-header' => 'बदलाव सूचियों में प्रदर्शन',
 'tags-description-header' => 'अर्थ का पूरा वर्णन',
+'tags-active-header' => 'सक्रिय?',
 'tags-hitcount-header' => 'चिप्पी वाले बदलाव',
+'tags-active-yes' => 'हाँ',
+'tags-active-no' => 'नहीं',
 'tags-edit' => 'सम्पादन',
 'tags-hitcount' => '$1 {{PLURAL:$1|बदलाव|बदलाव}}',
 
@@ -3963,6 +3997,7 @@ $5
 'dberr-problems' => 'क्षमा करें! इस जालस्थल को कुछ तकनीकी परेशानियों का सामना करना पड़ रहा है।',
 'dberr-again' => 'कुछ मिनट रुकने के बाद फिर से चढ़ाएँ।',
 'dberr-info' => '(आँकड़ाकोष सेवक से संपर्क नहीं हो पा रहा:$1)',
+'dberr-info-hidden' => '(डाटाबेस सर्वर से संपर्क नहीं किया जा सका)',
 'dberr-usegoogle' => 'इस बीच आप गूगल से खोज करने की कोशिश कर सकते हैं।',
 'dberr-outofdate' => 'ध्यान दे, हो सकता है कि हमारी सामग्री से संबंधित उनकी सूची बासी हो।',
 'dberr-cachederror' => 'यह अनुरोधित पन्ने की संचित प्रति है, हो सकता है यह ताज़ी न हो।',
@@ -4094,6 +4129,16 @@ $5
 'duration-centuries' => '$1 {{PLURAL:$1|शताब्दी}}',
 'duration-millennia' => '$1 {{PLURAL:$1|सहस्राब्दी}}',
 
+# Limit report
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|सॅकेंड}}',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|सॅकेंड}}',
+'limitreport-postexpandincludesize' => 'विस्तार उपरांत विकिपाठ आकार',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|बाइट}}',
+'limitreport-templateargumentsize' => 'साँचा प्राचल आकार',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|बाइट}}',
+'limitreport-expansiondepth' => 'उच्चतम विस्तार गहराई',
+'limitreport-expensivefunctioncount' => 'महंगे पार्सर फंक्शनों की संख्या',
+
 # Special:ExpandTemplates
 'expandtemplates' => 'साँचा विस्तार',
 'expand_templates_intro' => 'यह विशेष पृष्ठ पाठ इनपुट लेता है और सभी साँचों को विस्तृत करता है।
@@ -4110,6 +4155,4 @@ $5
 'expand_templates_generate_xml' => 'XML का पार्स (parse) वृक्ष दर्शायें',
 'expand_templates_preview' => 'झलक',
 
-# Unknown messages
-'uploadinvalidxml' => 'अपलोड की गई फ़ाइल में स्थित XML पार्स नहीं की जा सकी।',
 );
index eb498f7..2b50fc5 100644 (file)
@@ -500,7 +500,7 @@ $messages = array(
 'searcharticle' => 'Kreni',
 'history' => 'Stare izmjene',
 'history_short' => 'Stare izmjene',
-'updatedmarker' => 'obnovljeno od zadnjeg posjeta',
+'updatedmarker' => 'obnovljeno od posljednjeg posjeta',
 'printableversion' => 'Inačica za ispis',
 'permalink' => 'Trajna poveznica',
 'print' => 'Ispiši',
@@ -540,7 +540,7 @@ $messages = array(
 'otherlanguages' => 'Drugi jezici',
 'redirectedfrom' => '(Preusmjereno s $1)',
 'redirectpagesub' => 'Preusmjeravanje',
-'lastmodifiedat' => 'Datum zadnje promjene na ovoj stranici: $2, $1',
+'lastmodifiedat' => 'Vrijeme i datum posljednje promjene na ovoj stranici: $2, $1',
 'viewcount' => 'Ova stranica je pogledana {{PLURAL:$1|$1 put|$1 puta}}.',
 'protectedpage' => 'Zaštićena stranica',
 'jumpto' => 'Skoči na:',
@@ -587,7 +587,7 @@ $1',
 'youhavenewmessagesfromusers' => 'Imate $1 {{PLURAL:$3||od $3 suradnika|od $3 suradnika}} ($2).',
 'youhavenewmessagesmanyusers' => 'Imate $1 od više suradnika ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|novu poruku|$1 nove poruke|$1 novih poruka}}',
-'newmessagesdifflinkplural' => '{{PLURAL:$1|zadnje uređivanje|zadnja $1 uređivanja|zadnjih $1 uređivanja}} na stranici za razgovor',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|posljednje uređivanje|posljednja $1 uređivanja|posljednjih $1 uređivanja}} na stranici za razgovor',
 'youhavenewmessagesmulti' => 'Imate nove poruke na $1',
 'editsection' => 'uredi',
 'editold' => 'uredi',
@@ -675,7 +675,9 @@ Nema obrazloženja ili poruke o pogrješci.',
 'badtitle' => 'Loš naslov',
 'badtitletext' => 'Navedeni naslov stranice nepravilan ili loše formirana interwiki poveznica.',
 'perfcached' => 'Sljedeći podaci su iz međuspremnika i možda nisu najsvježiji. Međuspremnik sadrži $1 {{PLURAL:$1|rezultat|rezultata}} pretraživanja.',
-'perfcachedts' => 'Sljedeći podaci su iz međuspremnika i zadnji puta su ažurirani u $1. Međuspremnik sadrži $4 {{PLURAL:$4|rezultat|rezultata}} pretraživanja.',
+'perfcachedts' => 'Sljedeći podaci su iz međuspremnika i posljednji puta su ažurirani u $1. Međuspremnik sadrži $4 {{PLURAL:$4|rezultat|rezultata}} pretraživanja.
+
+Više o ovoj [[Wikipedija:Posebne stranice|posebnoj stranici]] na [[Razgovor Wikipedija:Special:{{PAGENAME}}]].',
 'querypage-no-updates' => 'Osvježavanje ove stranice je trenutačno onemogućeno. Nove promjene neće biti vidljive.',
 'viewsource' => 'Vidi izvornik',
 'viewsource-title' => 'Vidi kôd stranice $1',
@@ -815,7 +817,7 @@ koristiti staru lozinku.',
 'blocked-mailpassword' => 'Vašoj IP adresi je blokirano uređivanje stranica, a da bi se spriječila nedopuštena radnja, mogućnost zahtijevanja nove lozinke je također onemogućena.',
 'eauthentsent' => 'Na navedenu adresu poslana je e-poruka s potvrdom.
 Prije nego što pošaljemo daljnje poruke, molimo Vas otvorite e-poruku i slijedite u njemu sadržana uputstva kako biste potvrdili da je adresa e-pošte zaista Vaša.',
-'throttled-mailpassword' => 'Već Vam je poslan e-mail za promjenu zaporke, u {{PLURAL:$1|zadnjih sat vremena|zadnja $1 sata|zadnjih $1 sati}}.
+'throttled-mailpassword' => 'Već Vam je poslan e-mail za promjenu zaporke, u {{PLURAL:$1|posljednjih sat vremena|posljednja $1 sata|posljednjih $1 sati}}.
 Da bi spriječili zloupotrebu, moguće je poslati samo jedan e-mail za promjenu zaporke {{PLURAL:$1|svakih sat vremena|svaka $1 sata|svakih $1 sati}}.',
 'mailerror' => 'Pogrješka pri slanju e-pošte: $1',
 'acct_creation_throttle_hit' => 'Posjetitelji ovog wikija koji rabe Vašu IP adresu napravili su {{PLURAL:$1|1 račun|$1 računa}} u posljednjem danu, što je najveći dopušteni broj u tom vremenskom razdoblju.
@@ -843,6 +845,9 @@ Molimo Vas pričekajte $1 prije nego što pokušate ponovno.',
 '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. 
 Ako ga navedete, bit će korišteno za pripisivanje Vaših doprinosa.',
+'pt-login' => 'Prijavi se',
+'pt-createaccount' => 'Otvori novi suradnički račun',
+'pt-userlogout' => 'odjavi se',
 
 # Email sending
 'php-mail-error-unknown' => 'Nepoznata pogrješka u funkciji PHP-poruke()',
@@ -1144,7 +1149,7 @@ Neki predlošci neće biti uključeni.',
 'converter-manual-rule-error' => 'Pronađena je pogrješka u pravilu ručnog prijevoda',
 
 # "Undo" feature
-'undo-success' => 'Izmjena je uklonjena (tekst u okviru ispod ne sadrži zadnju izmjenu). Molim sačuvajte stranicu (provjerite sažetak).',
+'undo-success' => 'Izmjena je uklonjena (tekst u okviru ispod ne sadrži posljednju izmjenu). Molim sačuvajte stranicu (provjerite sažetak).',
 'undo-failure' => 'Ova izmjena ne može biti uklonjena zbog postojanja međuinačica.',
 'undo-norev' => 'Izmjena nije mogla biti uklonjena jer ne postoji ili je obrisana.',
 'undo-summary' => 'Uklanjanje izmjene $1 što ju je unio/unijela [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]])',
@@ -1588,7 +1593,7 @@ Ne smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.',
 'right-viewmyprivateinfo' => 'Vidite svoje privatne podatke (npr. adresu e-pošte, stvarno ime)',
 'right-editmyprivateinfo' => 'Uredite svoje privatne podatke (npr. adresa e-pošte, stvarno ime)',
 'right-editmyoptions' => 'Uredite svoje postavke',
-'right-rollback' => 'Brzo uklanjanje izmjena zadnjeg suradnika na određenoj stranici',
+'right-rollback' => 'Brzo uklanjanje izmjena posljednjeg suradnika na određenoj stranici',
 'right-markbotedits' => 'Označavanje uklonjenih izmjena kao izmjenu bota',
 'right-noratelimit' => 'Bez vremenskog ograničenja uređivanja',
 'right-import' => 'Uvoženje stranica s drugih wikija',
@@ -1672,12 +1677,24 @@ Ne smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.',
 'rcnotefrom' => 'Slijede promjene od <b>$2</b> (prikazano ih je do <b>$1</b>).',
 'rclistfrom' => 'Prikaži nove promjene počevši od $1',
 'rcshowhideminor' => '$1 manje promjene',
+'rcshowhideminor-show' => 'prikaži',
+'rcshowhideminor-hide' => 'sakrij',
 'rcshowhidebots' => '$1 botove',
+'rcshowhidebots-show' => 'prikaži',
+'rcshowhidebots-hide' => 'sakrij',
 'rcshowhideliu' => '$1 prijavljene suradnike',
+'rcshowhideliu-show' => 'prikaži',
+'rcshowhideliu-hide' => 'sakrij',
 'rcshowhideanons' => '$1 neprijavljene suradnike',
+'rcshowhideanons-show' => 'prikaži',
+'rcshowhideanons-hide' => 'sakrij',
 'rcshowhidepatr' => '$1 provjerene promjene',
+'rcshowhidepatr-show' => 'prikaži',
+'rcshowhidepatr-hide' => 'sakrij',
 'rcshowhidemine' => '$1 moje promjene',
-'rclinks' => 'Prikaži zadnjih $1 promjena u zadnjih $2 dana; $3',
+'rcshowhidemine-show' => 'prikaži',
+'rcshowhidemine-hide' => 'sakrij',
+'rclinks' => 'Prikaži posljednjih $1 promjena {{PLURAL:$2|prethodni dan|u posljednja $2 dana|u posljednjih $2 dana}}<br />$3',
 'diff' => 'razl',
 'hist' => 'pov',
 'hide' => 'sakrij',
@@ -2233,7 +2250,7 @@ Podržani {{PLURAL:$2|protokol|protokoli}}: <code>$1</code> (default je http://
 
 # Special:ActiveUsers
 'activeusers' => 'Popis aktivnih suradnika',
-'activeusers-intro' => 'Ovo je popis suradnika koji su napravili neku aktivnost u {{PLURAL:$1|zadnji $1 dan|zadnja $1 dana|zadnjih $1 dana}}.',
+'activeusers-intro' => 'Ovo je popis suradnika koji su napravili neku aktivnost u {{PLURAL:$1|posljednji $1 dan|posljednja $1 dana|posljednjih $1 dana}}.',
 'activeusers-count' => '{{PLURAL:$1|nedavna $1 izmjena|nedavne $1 izmjene|nedavnih $1 izmjena}} u {{PLURAL:$3|posljednji $3 dan|posljednja $3 dana|posljednjih $3 dana}}',
 'activeusers-from' => 'Prikaži suradnike počevši od:',
 'activeusers-hidebots' => 'Sakrij botove',
@@ -2320,12 +2337,12 @@ Promjene na toj stranici i njenoj stranici za razgovor bit će prikazane na popi
 'notvisiblerev' => 'Izmjena je obrisana',
 'watchlist-details' => '{{PLURAL:$1|$1 stranica|$1 stranice|$1 stranica}} se nalazi na popisu praćenja, ne brojeći stranice za razgovor.',
 'wlheader-enotif' => 'Uključeno je izvješćivanje e-poštom.',
-'wlheader-showupdated' => "Stranice koje su promijenjene od Vašeg zadnjeg posjeta prikazane su '''podebljano'''",
+'wlheader-showupdated' => "Stranice koje su promijenjene od Vašeg posljednjeg posjeta prikazane su '''podebljano'''",
 'watchmethod-recent' => 'provjera nedavnih promjena praćenih stranica',
 'watchmethod-list' => 'provjera praćanih stranica za nedavne promjene',
 'watchlistcontains' => 'Vaš popis praćenja sadrži $1 {{PLURAL:$1|stranicu|stranice|stranica}}.',
 'iteminvalidname' => "Problem s izborom '$1', ime nije valjano...",
-'wlshowlast' => 'Prikaži zadnjih $1 sati $2 dana $3',
+'wlshowlast' => 'Prikaži posljednjih $1 sati $2 dana $3',
 'watchlist-options' => 'Izbornik popisa praćenja',
 
 # Displayed when you click the "watch" button and it is in the process of watching
@@ -2355,11 +2372,11 @@ $PAGEINTRO $NEWPAGE
 
 Sažetak urednika: $PAGESUMMARY $PAGEMINOREDIT
 
-Možete kontaktirati suradnika koji je zadnji uređivao stranicu:
+Možete kontaktirati suradnika koji je posljednji uređivao stranicu:
 mail: $PAGEEDITOR_EMAIL
 wiki: $PAGEEDITOR_WIKI
 
-Do Vašeg ponovnog posjeta stranici nećete dobivati nove obavijesti. Postavke za izvješćivanje možete resetirati za sve praćene stranice svog popisa praćenja.
+Do Vašeg ponovnog posjeta stranici nećete dobivati nove obavijesti. Postavke za izvješćivanje možete vratiti na prvotno zadane za sve praćene stranice svog popisa praćenja.
 
 Vaš sustav izvješćivanja {{SITENAME}}.
 
@@ -2423,10 +2440,10 @@ Sva vremena su prema poslužiteljevom vremenu.',
 
 Posljednju promjenu napravio je [[User:$3|$3]] ([[User talk:$3|Razgovor]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "Sažetak promjene je bio: \"''\$1''\".",
-'revertpage' => 'Uklonjena promjena suradnika $2, vraćeno na zadnju inačicu suradnika $1',
+'revertpage' => 'Uklonjena promjena suradnika $2, vraćeno na posljednju inačicu suradnika $1',
 'revertpage-nouser' => 'Vraćene izmjene suradnika (suradničko ime uklonjeno) na posljednju inačicu suradnika [[User:$1|$1]]',
 'rollback-success' => 'Uklonjeno uređivanje {{GENDER:$1|suradnika|suradnice}} $1
-vraćeno na zadnju inačicu {{GENDER:$2|suradnika|suradnice}} $2.',
+vraćeno na posljednju inačicu {{GENDER:$2|suradnika|suradnice}} $2.',
 
 # Edit tokens
 'sessionfailure-title' => 'Prekid sesije',
@@ -2511,7 +2528,7 @@ Baza se povremeno čisti od ovakvih stranica.',
 Ako želite vratiti određene izmjene, označite ih i kliknite '''''{{int:undeletebtn}}'''''.",
 'undeleterevisions' => '$1 {{PLURAL:$1|inačica je arhivirana|inačice su arhivirane|inačica je arhivirano}}',
 'undeletehistory' => 'Ako vratite izbrisanu stranicu, bit će vraćene i sve prijašnje promjene. Ako je u međuvremenu stvorena nova stranica s istim imenom, vraćena stranica bit će upisana kao prijašnja promjena sadašnje.',
-'undeleterevdel' => 'Vraćanje stranice neće biti izvršeno ako je rezultat toga djelomično brisanje zadnjeg uređivanja.
+'undeleterevdel' => 'Vraćanje stranice neće biti izvršeno ako je rezultat toga djelomično brisanje posljednjeg uređivanja.
 U takvim slučajevima morate isključiti ili otkriti najnovije obrisane promjene.',
 'undeletehistorynoadmin' => 'Ovaj je članak izbrisan. Razlog za brisanje prikazan je u donjem sažetku, zajedno s
 detaljima o suradnicima koji su uređivali ovu stranicu prije brisanja.
@@ -2572,7 +2589,7 @@ $1',
 'sp-contributions-newbies' => 'Prikaži samo doprinose novih suradnika',
 'sp-contributions-newbies-sub' => 'Za nove suradnike',
 'sp-contributions-newbies-title' => 'Doprinosi novih suradnika',
-'sp-contributions-blocklog' => 'Evidencija blokiranja',
+'sp-contributions-blocklog' => 'evidencija blokiranja',
 'sp-contributions-deleted' => 'obrisani suradnički doprinosi',
 'sp-contributions-uploads' => 'postavljene datoteke',
 'sp-contributions-logs' => 'evidencije',
@@ -3018,7 +3035,7 @@ Snimite je na svoje računalo i postavite je ovdje.',
 'tooltip-watchlistedit-raw-submit' => 'Osvježi popis praćenja',
 'tooltip-recreate' => 'Vrati stranicu unatoč tome što je obrisana',
 'tooltip-upload' => "Pokreni snimanje (''upload'')",
-'tooltip-rollback' => '"Ukloni" uklanja uređivanja zadnjeg suradnika na ovoj stranici.',
+'tooltip-rollback' => '"Ukloni" uklanja uređivanja posljednjeg suradnika na ovoj stranici.',
 'tooltip-undo' => '"Ukloni ovu izmjenu" uklanja ovu izmjenu i otvara okvir za uređivanje. Omogućava unošenje razloga u sažetak.',
 'tooltip-preferences-save' => 'Spremi postavke',
 'tooltip-summary' => 'Unesite kratki sažetak',
@@ -3038,7 +3055,7 @@ Snimite je na svoje računalo i postavite je ovdje.',
 'anonymous' => 'Neprijavljeni {{PLURAL:$1|suradnik|suradnici}} projekta {{SITENAME}}',
 'siteuser' => 'Suradnik $1 na projektu {{SITENAME}}',
 'anonuser' => '{{SITENAME}} anonimni suradnik $1',
-'lastmodifiedatby' => 'Ovu je stranicu zadnji put mijenjao dana $2, $1 suradnik $3.',
+'lastmodifiedatby' => 'Ovu je stranicu posljednji put {{GENDER:$4|mijenjao suradnik|mijenjala suradnica}} $3 dana $1 u $2.',
 'othercontribs' => 'Temelji se na doprinosu suradnika $1.',
 'others' => 'drugih',
 'siteusers' => '{{SITENAME}} {{PLURAL:$2|suradnik|suradnici}} $1',
@@ -3052,7 +3069,7 @@ Snimite je na svoje računalo i postavite je ovdje.',
 Razlog je vjerojatno vanjska poveznica koja se nalazi na crnom popisu.',
 'spamprotectionmatch' => 'Naš filtar spama reagirao je na sljedeći tekst: $1',
 'spambot_username' => 'MediaWiki zaštita od spama',
-'spam_reverting' => 'Vraćam na zadnju inačicu koja ne sadrži poveznice na $1',
+'spam_reverting' => 'Vraćam na posljednju inačicu koja ne sadrži poveznice na $1',
 'spam_blanking' => 'Sve inačice sadrže poveznice na $1, brišem cjelokupni sadržaj',
 'spam_deleting' => 'Sve inačice sadržale su poveznice na $1, brišem cjelokupni sadržaj',
 'simpleantispam-label' => "Anti-spam provjera.
@@ -3081,10 +3098,10 @@ Razlog je vjerojatno vanjska poveznica koja se nalazi na crnom popisu.',
 'pageinfo-firstuser' => 'Suradnik koji je stvorio stranicu',
 'pageinfo-firsttime' => 'Datum stvaranja stranice',
 'pageinfo-lastuser' => 'Posljednji urednik stranice',
-'pageinfo-lasttime' => 'Datum zadnjeg uređivanja',
+'pageinfo-lasttime' => 'Datum posljednjeg uređivanja',
 'pageinfo-edits' => 'Ukupan broj uređivanja',
 'pageinfo-authors' => 'Broj različitih autora',
-'pageinfo-recent-edits' => 'Broj uređivanja (u zadnjih $1)',
+'pageinfo-recent-edits' => 'Broj uređivanja (u posljednjih $1)',
 'pageinfo-recent-authors' => 'Broj različitih autora u gornjem razdoblju',
 'pageinfo-magic-words' => '{{PLURAL:$1|Magična riječ - varijabla|Magične riječi - varijable}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Postoji|Postoje|Postoji}} $1 {{PLURAL:$1|skrivena kategorija|skrivene kategorije|skrivenih kategorija}}',
@@ -3167,7 +3184,7 @@ Njegovim izvršavanjem mogli biste oštetiti svoj sustav.",
 # Special:NewFiles
 'newimages' => 'Galerija novih datoteka',
 'imagelisttext' => 'Ispod je popis {{PLURAL:$1|$1 slike|$1 slike|$1 slika}} složen $2.',
-'newimages-summary' => 'Ova posebna stranica pokazuje zadnje nedavno postavljene datoteke.',
+'newimages-summary' => 'Ova posebna stranica pokazuje posljednje nedavno postavljene datoteke.',
 'newimages-legend' => 'Filtar',
 'newimages-label' => 'Naziv datoteke (ili njen dio):',
 'showhidebots' => '($1 botova)',
@@ -3244,7 +3261,7 @@ Svaka sljedeća poveznica u istom retku je izuzetak, npr. kod stranica gdje se s
 'exif-primarychromaticities' => 'Kromaticitet primarnih boja',
 'exif-ycbcrcoefficients' => 'Matrični koeficijenti preobrazbe kolor prostora',
 'exif-referenceblackwhite' => 'Mjesto bijele i crne točke',
-'exif-datetime' => 'Datum zadnje promjene datoteke',
+'exif-datetime' => 'Datum posljednje promjene datoteke',
 'exif-imagedescription' => 'Ime slike',
 'exif-make' => 'Proizvođač kamere',
 'exif-model' => 'Model kamere',
@@ -3374,7 +3391,7 @@ Svaka sljedeća poveznica u istom retku je izuzetak, npr. kod stranica gdje se s
 'exif-serialnumber' => 'Serijski broj kamere',
 'exif-cameraownername' => 'Vlasnik kamere',
 'exif-label' => 'Oznaka',
-'exif-datetimemetadata' => 'Datum zadnje promjene metapodataka',
+'exif-datetimemetadata' => 'Datum posljednje promjene metapodataka',
 'exif-nickname' => 'Neformalni naziv slike',
 'exif-rating' => 'Ocjena (od 5)',
 'exif-rightscertificate' => 'Certifikat za upravljanje pravima',
@@ -3736,8 +3753,8 @@ Potvrdite namjeru vraćanja ovog članka.",
 'livepreview-error' => 'Spajanje nije uspjelo: $1 "$2". Pokušajte normalni pretpregled.',
 
 # Friendlier slave lag warnings
-'lag-warn-normal' => 'Moguće je da izmjene nastale zadnjih $1 {{PLURAL:$1|sekundu|sekundi}} neće biti vidljive na ovom popisu.',
-'lag-warn-high' => 'Zbog kašnjenja baze podataka, moguće je da promjene napravljene u zadnjih $1 {{PLURAL:$1|sekundu|sekunde|sekundi}} nisu prikazane u popisu.',
+'lag-warn-normal' => 'Moguće je da izmjene nastale posljednjih $1 {{PLURAL:$1|sekundu|sekundi}} neće biti vidljive na ovom popisu.',
+'lag-warn-high' => 'Zbog kašnjenja baze podataka, moguće je da promjene napravljene u posljednjih $1 {{PLURAL:$1|sekundu|sekunde|sekundi}} nisu prikazane u popisu.',
 
 # Watchlist editor
 'watchlistedit-numitems' => 'Vaš popis praćenja sadrži {{PLURAL:$1|1 stranicu|$1 stranica}}, bez stranica za razgovor.',
index 183f4e9..5c103e7 100644 (file)
@@ -191,7 +191,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Mi kopije e-mejlkow pósłać, kotrež druhim wužiwarjam pósćelu',
 'tog-diffonly' => 'Jenož rozdźěle pokazać (nic pak zbytny wobsah)',
 'tog-showhiddencats' => 'Schowane kategorije pokazać',
-'tog-noconvertlink' => 'Konwertowanje wotkazoweho titula znjemóžnić',
 'tog-norollbackdiff' => 'Rozdźěl po wróćostajenju zanjechać',
 'tog-useeditwarning' => 'Warnować, hdyž so wobdźěłowanska strona z njeskładowanymi změnami wopušća',
 'tog-prefershttps' => 'Po přizjewjenju přeco wěsty zwisk wužiwać',
@@ -715,7 +714,7 @@ Zo by přizjewjenje skónčił, dyrbiš tu nowe hesło postajić:',
 'resetpass-temp-password' => 'Nachwilne hesło:',
 'resetpass-abort-generic' => 'Měnjenje hesła je so přez rozšěrjenje přetorhnyło.',
 'resetpass-expired' => 'Twoje hesło je spadnyło. Prošu postaj nowe hesło za přizjewjenje.',
-'resetpass-expired-soft' => 'Twoje hesło je spadnyło a dyrbi so wróćo stajić. Prošu wubjer nětko druhe hesło abo klikń na "Přetorhnyć", zo by jo pozdźišo wróćo stajił.',
+'resetpass-expired-soft' => 'Twoje hesło je spadnyło a dyrbi so wróćo stajić. Prošu wubjer nětko druhe hesło abo klikń na "{{int:resetpass-submit-cancel}}", zo by jo pozdźišo wróćo stajił.',
 
 # Special:PasswordReset
 'passwordreset' => 'Hesło wróćo stajić',
@@ -1545,14 +1544,26 @@ Tuta informacija budźe zjawna.',
 'recentchanges-legend-heading' => "'''Legenda:'''",
 'recentchanges-legend-newpage' => '(hlej tež [[Special:NewPages|lisćinu nowych stronow]])',
 'recentchanges-legend-plusminus' => "(''±123'')",
-'rcnotefrom' => "Deleka so změny wot '''$2''' pokazuja (hač k '''$1''').",
+'rcnotefrom' => 'Deleka so změny wot <strong>$2</strong> pokazuja (hač k <strong>$1</strong>).',
 'rclistfrom' => 'Nowe změny pokazać, započinajo z $1',
 'rcshowhideminor' => 'snadne změny $1',
+'rcshowhideminor-show' => 'Pokazać',
+'rcshowhideminor-hide' => 'Schować',
 'rcshowhidebots' => 'Boćiki $1',
+'rcshowhidebots-show' => 'Pokazać',
+'rcshowhidebots-hide' => 'Schować',
 'rcshowhideliu' => 'Zregistrowani wužiwarjo $1',
+'rcshowhideliu-show' => 'Pokazać',
+'rcshowhideliu-hide' => 'Schować',
 'rcshowhideanons' => 'Anonymni wužiwarjo $1',
+'rcshowhideanons-show' => 'Pokazać',
+'rcshowhideanons-hide' => 'Schować',
 'rcshowhidepatr' => 'Dohladowane změny $1',
+'rcshowhidepatr-show' => 'Pokazać',
+'rcshowhidepatr-hide' => 'Schować',
 'rcshowhidemine' => 'moje změny $1',
+'rcshowhidemine-show' => 'Pokazać',
+'rcshowhidemine-hide' => 'Schować',
 'rclinks' => 'Poslednje $1 změnow poslednich $2 dnjow pokazać<br />$3',
 'diff' => 'rozdźěl',
 'hist' => 'wersije',
@@ -1678,6 +1689,8 @@ Jeli maš tutón wobraz z połnym rozeznaćom, nahraj tutón, hewak změń proš
 'uploaddisabledtext' => 'Nahraće datajow je znjemóžnjene.',
 'php-uploaddisabledtext' => 'Nahraća PHP-datajow su znjemóžnjene. Prošu skontroluj nastajenje file_uploads.',
 'uploadscripted' => 'Dataja wobsahuje HTML- abo skriptowy kod, kotryž móhł so mylnje přez wobhladowak wuwjesć.',
+'uploadscriptednamespace' => "Tuta SVG-dataja wobsahuje njedowoleny mjenowy rum '$1'",
+'uploadinvalidxml' => 'XML w nahratej dataji njeda so parsować.',
 'uploadvirus' => 'Dataja wirus wobsahuje! Podrobnosće: $1',
 'uploadjava' => 'Tuta dataja je ZIP-dataja, kotraž .class-dataju z Javy wobsahuje.
 Nahraće datajow Javy njeje dowolene, dokelž móhli wobeńdźenje wěstotnych wobmjezowanjow zmóžnić.',
@@ -2324,7 +2337,7 @@ Prošu potwjerdź, zo maš wotpohlad to činić, zo rozumiš sćěwki a zo to wo
 'delete-edit-reasonlist' => 'Přičiny za wušmórnjenje wobdźěłać',
 'delete-toobig' => 'Tuta strona ma z wjace hač $1 {{PLURAL:$1|wersiju|wersijomaj|wersijemi|wersijemi}} wulke wobdźěłanske stawizny. Wušmórnjenje tajkich stronow bu wobmjezowane, zo by připadne přetorhnjenje {{SITENAME}} wobešło.',
 'delete-warning-toobig' => 'Tuta strona ma z wjace hač $1 {{PLURAL:$1|wersiju|wersijomaj|wersijemi|wersijemi}} wulke wobdźěłanske stawizny. Wušmórnjenje móže operacije datoweje banki {{SITENAME}} přetorhnyć; pokročuj z kedźbliwosću.',
-'deleting-backlinks-warning' => "'''Warnowanje:''' Druhe strony wotkazuja k stronje abo strona je druhdźe zapřijata, kotruž chceš zhašeć.",
+'deleting-backlinks-warning' => "'''Warnowanje:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Druhe strony]] wotkazuja k stronje abo strona je druhdźe zapřijata, kotruž chceš zhašeć.",
 
 # Rollback
 'rollback' => 'Změny cofnyć',
@@ -2491,8 +2504,10 @@ $1',
 'sp-contributions-blocked-notice-anon' => 'Tuta IP-adresa je tuchwilu zablokowana.
 Najnowši zapisk w protokolu blokowanjow so deleka jako referenca podawa:',
 'sp-contributions-search' => 'Přinoški pytać',
+'sp-contributions-suppresslog' => 'potłóčene wužiwarske přinoški',
 'sp-contributions-username' => 'IP-adresa abo wužiwarske mjeno:',
 'sp-contributions-toponly' => 'Jenož wyše wersije pokazać',
+'sp-contributions-newonly' => 'Jenož změny pokazać, kotrež su wutworjenja stronow',
 'sp-contributions-submit' => 'OK',
 
 # What links here
@@ -3982,6 +3997,4 @@ Hewak móžeš slědowacy jednory formular wužiwać. Twój komentar přida so s
 'expand_templates_generate_rawhtml' => 'Hruby HTML pokazać',
 'expand_templates_preview' => 'Přehlad',
 
-# Unknown messages
-'uploadinvalidxml' => 'XML w nahratej dataji njeda so parsować.',
 );
index 8d18257..92c9040 100644 (file)
@@ -848,6 +848,9 @@ Várj $1, mielőtt újra próbálkozol.',
 'loginlanguagelabel' => 'Nyelv: $1',
 'suspicious-userlogout' => 'A kijelentkezési kérésed vissza lett utasítva, mert úgy tűnik, hogy egy hibás böngésző vagy gyorsítótárazó proxy küldte.',
 'createacct-another-realname-tip' => 'A valódi nevet nem kötelező megadni, de ha úgy döntesz, hogy megadod, azzal leszel feltüntetve a munkád szerzőjeként.',
+'pt-login' => 'Bejelentkezés',
+'pt-createaccount' => 'Fiók létrehozása',
+'pt-userlogout' => 'Kijelentkezés',
 
 # Email sending
 'php-mail-error-unknown' => 'Ismeretlen hiba a PHP mail() függvényében',
@@ -864,14 +867,20 @@ Várj $1, mielőtt újra próbálkozol.',
 'retypenew' => 'Új jelszó ismét:',
 'resetpass_submit' => 'Add meg a jelszót és jelentkezz be',
 'changepassword-success' => 'A jelszavad megváltoztatása sikeresen befejeződött!',
+'changepassword-throttled' => 'Túl sok hibás bejelentkezés.
+Várj $1, mielőtt újra próbálkozol.',
 'resetpass_forbidden' => 'A jelszavak nem változtathatók meg',
 'resetpass-no-info' => 'Be kell jelentkezned, hogy közvetlenül elérd ezt a lapot.',
 'resetpass-submit-loggedin' => 'Jelszó megváltoztatása',
 'resetpass-submit-cancel' => 'Mégse',
 'resetpass-wrong-oldpass' => 'Nem megfelelő ideiglenes vagy jelenlegi jelszó.
 Lehet, hogy már sikeresen megváltoztattad a jelszavad, vagy pedig időközben új ideiglenes jelszót kértél.',
+'resetpass-recycled' => 'Kérlek más jelszót adjál meg, mint a jelenlegi jelszavad.',
+'resetpass-temp-emailed' => 'Emailben kapott ideiglenes kóddal jelentkeztél be. A végleges bejelentkezéshez új jelszót kell beállítanod itt:',
 'resetpass-temp-password' => 'Ideiglenes jelszó:',
 'resetpass-abort-generic' => 'A jelszómódosítást megszakította egy kiterjesztés.',
+'resetpass-expired' => 'A jelszavad lejárt. Adjál meg egy új jelszót a bejelentkezéshez!',
+'resetpass-expired-soft' => 'A jelszavad lejárt, ezért újat kell beállítanod. Válassz most egy új jelszót, vagy kattints a {{int:resetpass-submit-cancel}} gombra, ha később akarod csak beállítani.',
 
 # Special:PasswordReset
 'passwordreset' => 'Jelszó törlése',
@@ -913,6 +922,17 @@ Ideiglenes jelszó: $2',
 'changeemail-password' => 'A {{SITENAME}} jelszavad:',
 'changeemail-submit' => 'E-mail cím megváltoztatása',
 'changeemail-cancel' => 'Mégse',
+'changeemail-throttled' => 'Túl sok hibás bejelentkezés.
+Várj $1, mielőtt újra próbálkozol.',
+
+# Special:ResetTokens
+'resettokens' => 'Tokenek törlése',
+'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-done' => 'Tokenek újragenerálva.',
+'resettokens-resetbutton' => 'Kijelőlt tokenek újragenerálása',
 
 # Edit page toolbar
 'bold_sample' => 'Félkövér szöveg',
@@ -1117,6 +1137,7 @@ Már létezik.',
 'content-not-allowed-here' => '"$1" tartalom nem engedélyezett a [[$2]] oldalon',
 'editwarning-warning' => 'A lap elhagyásával az összes itt végzett változtatás elveszhet.
 Ha be vagy jelentkezve letilthatod ezt a figyelmeztetést a beállításaid „{{int:prefs-editing}}” szakaszában.',
+'editpage-notsupportedcontentformat-title' => 'Nem támogatott tartalom formátum',
 
 # Content models
 'content-model-wikitext' => 'wikiszöveg',
@@ -1149,6 +1170,7 @@ Néhány sablon nem fog megjelenni.',
 'undo-success' => 'A szerkesztés visszavonható. Kérlek ellenőrizd alább a változásokat, hogy valóban ezt szeretnéd-e tenni, majd kattints a lap mentése gombra a visszavonás véglegesítéséhez.',
 'undo-failure' => 'A szerkesztést nem lehet automatikusan visszavonni vele ütköző későbbi szerkesztések miatt.',
 'undo-norev' => 'A szerkesztés nem állítható vissza, mert nem létezik vagy törölve lett.',
+'undo-nochange' => 'A szerkesztés már vissza lett állítva.',
 'undo-summary' => 'Visszavontam [[Special:Contributions/$2|$2]] ([[User talk:$2|vita]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]]) szerkesztését (oldid: $1)',
 
 # Account creation failure
@@ -1238,7 +1260,7 @@ A(z) {{SITENAME}} adminisztrátorai továbbra is meg tudják tekinteni az elrejt
 * Illetlen személyes információk
 *: ''otthoni cím, telefonszámok, társadalombiztosítási számok stb.''",
 'revdelete-legend' => 'Korlátozások megadása:',
-'revdelete-hide-text' => 'Változat szövegének elrejtése',
+'revdelete-hide-text' => 'Változat szövege',
 'revdelete-hide-image' => 'A fájl tartalmának elrejtése',
 'revdelete-hide-name' => 'Művelet és cél elrejtése',
 'revdelete-hide-comment' => 'Szerkesztési összefoglaló',
@@ -1583,6 +1605,8 @@ A műveletet nem lehet visszavonni.',
 'right-editusercssjs' => 'más felhasználók CSS és JS fájljainak szerkesztése',
 'right-editusercss' => 'más felhasználók CSS fájljainak szerkesztése',
 'right-edituserjs' => 'más felhasználók JS fájljainak szerkesztése',
+'right-editmyusercss' => 'A saját szerkesztői CSS-fájlok szerkesztése',
+'right-editmyuserjs' => 'Saját szerkesztői JavaScript-fájlok szerkesztése',
 'right-rollback' => 'a lap utolsó szerkesztésének gyors visszaállítása',
 'right-markbotedits' => 'visszaállított szerkesztések botként való jelölése',
 'right-noratelimit' => 'sebességkorlát figyelmen kívül hagyása',
@@ -1661,14 +1685,26 @@ A műveletet nem lehet visszavonni.',
 'recentchanges-label-plusminus' => 'Az oldal mérete ennyi bájttal módosult',
 'recentchanges-legend-heading' => 'Jelmagyarázat:',
 'recentchanges-legend-newpage' => '(lásd még: [[Special:NewPages|Új lapok]])',
-'rcnotefrom' => 'Alább a <b>$2</b> óta történt változtatások láthatóak (<b>$1</b> db).',
+'rcnotefrom' => 'Alább a <b>$2</b> óta történt változtatások láthatóak (legfeljebb <b>$1</b> db).',
 'rclistfrom' => '$1 után történt változtatások megtekintése',
 'rcshowhideminor' => 'apró szerkesztések $1',
+'rcshowhideminor-show' => 'megjelenítése',
+'rcshowhideminor-hide' => 'elrejtése',
 'rcshowhidebots' => 'botok szerkesztéseinek $1',
+'rcshowhidebots-show' => 'megjelenítése',
+'rcshowhidebots-hide' => 'elrejtése',
 'rcshowhideliu' => 'bejelentkezett szerkesztők szerkesztéseinek $1',
+'rcshowhideliu-show' => 'megjelenítése',
+'rcshowhideliu-hide' => 'elrejtése',
 'rcshowhideanons' => 'névtelen szerkesztések $1',
+'rcshowhideanons-show' => 'megjelenítése',
+'rcshowhideanons-hide' => 'elrejtése',
 'rcshowhidepatr' => 'ellenőrzött szerkesztések $1',
+'rcshowhidepatr-show' => 'megjelenítése',
+'rcshowhidepatr-hide' => 'elrejtése',
 'rcshowhidemine' => 'saját szerkesztések $1',
+'rcshowhidemine-show' => 'megjelenítése',
+'rcshowhidemine-hide' => 'elrejtése',
 'rclinks' => 'Az elmúlt $2 nap utolsó $1 változtatása legyen látható<br />$3',
 'diff' => 'eltér',
 'hist' => 'történet',
@@ -1954,6 +1990,7 @@ Ez a wiki publikus, így a biztonság miatt az img_auth.php ki van kapcsolva.',
 'listfiles_size' => 'Méret',
 'listfiles_description' => 'Leírás',
 'listfiles_count' => 'Változatok',
+'listfiles-latestversion' => 'Aktuális változat',
 'listfiles-latestversion-yes' => 'Igen',
 'listfiles-latestversion-no' => 'Nem',
 
@@ -2310,8 +2347,8 @@ Feladóként a [[Special:Preferences|beállításaid]]nál megadott e-mail-címe
 'watchnologin' => 'Nem vagy bejelentkezve',
 'watchnologintext' => 'Ahhoz, hogy figyelőlistád lehessen, [[Special:UserLogin|be kell lépned]].',
 'addwatch' => 'Hozzáadás a figyelőlistához',
-'addedwatchtext' => "A(z) „[[:$1]]” lapot hozzáadtam a [[Special:Watchlist|figyelőlistádhoz]].
-Ezután minden, a lapon vagy annak vitalapján történő változást ott fogsz látni, és a lap '''vastagon''' fog szerepelni a [[Special:RecentChanges|friss változtatások]] lapon, hogy könnyen észrevehető legyen.",
+'addedwatchtext' => 'A(z) „[[:$1]]” lapot hozzáadtam a [[Special:Watchlist|figyelőlistádhoz]].
+Ezután minden, a lapon vagy annak vitalapján történő változást ott fogsz látni.',
 'removewatch' => 'Eltávolítás a figyelőlistáról',
 'removedwatchtext' => 'A(z) „[[:$1]]” lapot eltávolítottam a [[Special:Watchlist|figyelőlistáról]].',
 'watch' => 'Lap figyelése',
@@ -2361,9 +2398,9 @@ A szerkesztő elérhetősége:
 e-mail küldése: $PAGEEDITOR_EMAIL
 wiki: $PAGEEDITOR_WIKI
 
-Amíg nem keresed fel az oldalt, addig nem érkeznek újabb értesítések az oldal változásaival kapcsolatban. A figyelőlistádon is beállíthatod, hogy újból kapj értesítéseket, az összes lap után.
+Amíg nem keresed fel az oldalt bejelentkezve, addig nem érkeznek újabb értesítések az oldal változásaival kapcsolatban. A figyelőlistádon is beállíthatod, hogy újból kapj értesítéseket, az összes lap után.
 
-             Baráti üdvözlettel: a(z) {{SITENAME}} értesítő rendszere
+Baráti üdvözlettel: a(z) {{SITENAME}} értesítő rendszere
 
 --
 Az e-mail értesítéseid módosításához keresd fel a 
@@ -2708,7 +2745,7 @@ Add meg a blokkolás okát is (például idézd a blokkolandó személy által v
 'range_block_disabled' => 'A rendszerfelelős tartományblokkolás létrehozási képessége letiltott.',
 'ipb_expiry_invalid' => 'Hibás lejárati dátum.',
 'ipb_expiry_temp' => 'A láthatatlan felhasználóinév-blokkok lehetnek állandóak.',
-'ipb_hide_invalid' => 'A felhasználói fiókot nem lehet elrejteni; lehet, hogy túl sok szerkesztése van.',
+'ipb_hide_invalid' => 'A felhasználói fiókot nem lehet elrejteni; több mint $1 szerkesztése van.',
 'ipb_already_blocked' => '"$1" már blokkolva',
 'ipb-needreblock' => '$1 már blokkolva van. Meg szeretnéd változtatni a beállításokat?',
 'ipb-otherblocks-header' => 'További {{PLURAL:$1|blokk|blokkok}}',
@@ -2931,7 +2968,7 @@ Mentsd el a számítógépedre, majd töltsd fel ide.',
 'importuploaderrortemp' => 'Az importálandó fájl feltöltése nem sikerült. Nem létezik ideiglenes mappa.',
 'import-parse-failure' => 'XML elemzési hiba importáláskor',
 'import-noarticle' => 'Nincs importálandó lap!',
-'import-nonewrevisions' => 'A korábban importált összes változat.',
+'import-nonewrevisions' => 'Nincs változat importálva (mindet korábban importálták vagy a hiba miatt program kihagyta).',
 'xml-error-string' => '$1 a(z) $2. sorban, $3. oszlopban ($4. bájt): $5',
 'import-upload' => 'XML-adatok feltöltése',
 'import-token-mismatch' => 'Elveszett a session adat, próbálkozz újra.',
@@ -3100,7 +3137,7 @@ Ez valószínűleg egy olyan link miatt van, ami egy feketelistán lévő oldalr
 'pageinfo-views' => 'Megtekintések száma',
 'pageinfo-watchers' => 'Figyelők száma',
 'pageinfo-few-watchers' => 'Kevesebb mint $1 szerkesztő figyeli',
-'pageinfo-redirects-name' => 'Átirányítások erre a lapra',
+'pageinfo-redirects-name' => 'Átirányítások száma erre a lapra',
 'pageinfo-subpages-name' => 'A lap allapjai',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|átirányítás}}; $3 {{PLURAL:$3|nem átirányítás}})',
 'pageinfo-firstuser' => 'A lap létrehozója',
@@ -3822,7 +3859,7 @@ minden egyes sor egy figyelt lap címe. Ha kész vagy, kattints a lista alatt ta
 'version-hook-name' => 'Hook neve',
 'version-hook-subscribedby' => 'Használja',
 'version-version' => '(verzió: $1)',
-'version-license' => 'Licenc',
+'version-license' => 'MediaWiki licenc',
 'version-poweredby-credits' => "Ez a wiki '''[https://www.mediawiki.org/ MediaWiki]''' szoftverrel működik, copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'mások',
 'version-poweredby-translators' => 'translatewiki.net fordítók',
@@ -3892,6 +3929,7 @@ A MediaWikit abban a reményben terjesztjük, hogy hasznos lesz, de GARANCIA NÉ
 'tags' => 'Érvényes módosítási címkék',
 'tag-filter' => '[[Special:Tags|Címke]]szűrő:',
 'tag-filter-submit' => 'Szűrő',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Címke|Címkék}}]]: $2)',
 'tags-title' => 'Címkék',
 'tags-intro' => 'Ez a lap azokat a címkéket és jelentéseiket tartalmazza, amikkel a szoftver megjelölhet egy szerkesztést.',
 'tags-tag' => 'Címke neve',
@@ -3947,14 +3985,14 @@ A MediaWikit abban a reményben terjesztjük, hogy hasznos lesz, de GARANCIA NÉ
 'logentry-delete-delete' => '$1 törölte a következő lapot: $3',
 'logentry-delete-restore' => '$1 helyreállította a következő lapot: $3',
 'logentry-delete-event' => '$1 megváltoztatta {{PLURAL:$5|egy napló bejegyzés|$5 napló bejegyzés}} láthatóságát a(z) $3 című lapon: $4',
-'logentry-delete-revision' => '$1 módosította a(z) $3 című lap {{PLURAL:$5|egy|$1}} lapváltozatának láthatóságát: $4',
-'logentry-delete-event-legacy' => '$1 módosította a(z) $3 című lap naplóbejegyzéseinek láthatóságát',
-'logentry-delete-revision-legacy' => '$1 módosította a(z) $3 című lap lapváltozatainak láthatóságát',
-'logentry-suppress-delete' => '$1 elrejtette a következő lapot: $3',
-'logentry-suppress-event' => '$1 rejtetten megváltoztatta {{PLURAL:$5|egy napló bejegyzés|$5 napló bejegyzés}} láthatóságát a(z) $3 című lapon: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|módosította}} a(z) $3 című lap {{PLURAL:$5|egy|$5}} lapváltozatának láthatóságát: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|módosította}} a(z) $3 című lap naplóbejegyzéseinek láthatóságát',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|módosította}} a(z) $3 című lap lapváltozatainak láthatóságát',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|elrejtette}} a következő lapot: $3',
+'logentry-suppress-event' => '$1 rejtetten {{GENDER:$2|megváltoztatta}} {{PLURAL:$5|egy|$5}} naplóbejegyzés láthatóságát a(z) $3 című lapon: $4',
 'logentry-suppress-revision' => '$1 rejtetten megváltoztatta {{PLURAL:$5|egy változat|$5 változat}} láthatóságát a(z) $3 című lapon: $4',
-'logentry-suppress-event-legacy' => '$1 rejtetten megváltoztatta napló bejegyzések láthatóságát a(z) $3 című lapon',
-'logentry-suppress-revision-legacy' => '$1 rejtetten megváltoztatta változatok láthatóságát a(z) $3 lapon',
+'logentry-suppress-event-legacy' => '$1 rejtetten {{GENDER:$2|megváltoztatta}} napló bejegyzések láthatóságát a(z) $3 című lapon',
+'logentry-suppress-revision-legacy' => '$1 rejtetten {{GENDER:$2|megváltoztatta}} változatok láthatóságát a(z) $3 lapon',
 'revdelete-content-hid' => 'tartalom elrejtve',
 'revdelete-summary-hid' => 'szerkesztési összefoglaló elrejtve',
 'revdelete-uname-hid' => 'szerkesztő elrejtve',
@@ -3967,13 +4005,13 @@ A MediaWikit abban a reményben terjesztjük, hogy hasznos lesz, de GARANCIA NÉ
 'logentry-move-move-noredirect' => '$1 átnevezte a(z) $3 lapot $4 lapra átirányítás nélkül',
 'logentry-move-move_redir' => '$1 átnevezte a(z) $3 lapot $4 lapra az átirányítást felülírva',
 'logentry-move-move_redir-noredirect' => '$1 átnevezte a(z) $3 lapot $4 lapra az átirányítást felülírva, átirányítás nélkül',
-'logentry-patrol-patrol' => '$1 a(z) $3 lap $4 változatát ellenőrzöttnek jelölte',
-'logentry-patrol-patrol-auto' => '$1 a(z) $3 lap $4 változatát automatikusan ellenőrzöttnek jelölte',
-'logentry-newusers-newusers' => '$1 felhasználói fiók létrehozva',
+'logentry-patrol-patrol' => '$1 a(z) $3 lap $4 változatát ellenőrzöttnek {{GENDER:$2|jelölte}}',
+'logentry-patrol-patrol-auto' => '$1 a(z) $3 lap $4 változatát automatikusan ellenőrzöttnek {{GENDER:$2|jelölte}}',
+'logentry-newusers-newusers' => '$1 felhasználói fiók {{GENDER:$2|létrehozva}}',
 'logentry-newusers-create' => '$1 felhasználói fiók létrehozva',
 'logentry-newusers-create2' => '$1 létrehozta $3 felhasználói fiókját',
 'logentry-newusers-byemail' => 'Szerkesztői lap $3 néven létrehozva $1 által, jelszó kiküldve emailben.',
-'logentry-newusers-autocreate' => '$1 fiók automatikusan létrehozva',
+'logentry-newusers-autocreate' => '$1 felhasználói fiók automatikusan létrehozva',
 'logentry-rights-rights' => '$1 megváltoztatta $3 csoporttagságát erről: $4 erre: $5',
 'logentry-rights-rights-legacy' => '$1 megváltoztatta $3 csoporttagságát',
 'logentry-rights-autopromote' => '$1 automatikusan előléptetve erről: $4 erre: $5',
@@ -4054,10 +4092,14 @@ A MediaWikit abban a reményben terjesztjük, hogy hasznos lesz, de GARANCIA NÉ
 # Image rotation
 'rotate-comment' => 'Elforgattam a képet $1 fokkal, az óramutató járásával megegyező irányban',
 
+# Limit report
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|bájt}}',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|bájt}}',
+
 # Special:ExpandTemplates
 'expandtemplates' => 'Sablonok kibontása',
 'expand_templates_intro' => 'Ez a speciális lap a bevitt szövegekben megkeresi a sablonokat és rekurzívan kibontja őket.
-Kibontja az elemző függvényeket (pl. <nowiki>{{</nowiki>#language:...}}), és a változókat (pl. <nowiki>{{</nowiki>CURRENTDAY}}) is – mindent, ami a kettős kapcsos zárójelek között van.',
+Kibontja a támogatott elemző függvényeket (pl. <code><nowiki>{{</nowiki>#language:...}}</code>), és a változókat (pl. <code><nowiki>{{</nowiki>CURRENTDAY}}</code>) is – mindent, ami a kettős kapcsos zárójelek között van.',
 'expand_templates_title' => 'Szöveg címe, például {{FULLPAGENAME}} sablonhoz:',
 'expand_templates_input' => 'Vizsgálandó szöveg',
 'expand_templates_output' => 'Eredmény',
index 45bce2a..de8beed 100644 (file)
@@ -301,7 +301,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Ցույց տալ էջ հսկող մասնակիցների թիվը',
 'tog-oldsig' => 'Ներկայիս ստորագրությունն է․',
 'tog-fancysig' => 'Ստորագրությունը վիքիտեքստի տեսքով (առանց ավտոմատ հղման)',
-'tog-uselivepreview' => 'Õ\95Õ£Õ¿Õ¡Õ£Õ¸Ö\80Õ®Õ¥Õ¬ Õ¸Ö\82Õ²Õ«Õ² Õ¶Õ¡Õ­Õ¡Õ¤Õ«Õ¿Õ¸Ö\82Õ´ (JavaScript) (Õ\93որձնական)',
+'tog-uselivepreview' => 'Õ\95Õ£Õ¿Õ¡Õ£Õ¸Ö\80Õ®Õ¥Õ¬ Õ¡Õ¶Õ´Õ«Õ»Õ¡Õ¯Õ¡Õ¶ Õ¶Õ¡Õ­Õ¡Õ¤Õ«Õ¿Õ¸Ö\82Õ´, Õ¡Õ¼Õ¡Õ¶Ö\81 Õ§Õ»Õ¨ Õ¾Õ¥Ö\80Õ¢Õ¥Õ¼Õ¶Õ¥Õ¬Õ¸Ö\82 (Ö\83որձնական)',
 'tog-forceeditsummary' => 'Նախազգուշացնել խմբագրման ամփոփումը դատարկ թողնելու դեպքում',
 'tog-watchlisthideown' => 'Թաքցնել իմ խմբագրումները հսկացանկից',
 'tog-watchlisthidebots' => 'Թաքցնել բոտերի խմբագրումները հսկացանկից',
@@ -317,7 +317,7 @@ $messages = array(
 
 'underline-always' => 'Միշտ',
 'underline-never' => 'Երբեք',
-'underline-default' => 'Օգտագործել զննարկիչի նախընտրությունները',
+'underline-default' => 'Դիտարկչի կամ թեմայի լռելյայն ոճով',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Խմբագրման շրջանի տառատեսակի ձևը.',
@@ -513,7 +513,7 @@ $1',
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{grammar:genitive|{{SITENAME}}}} մասին',
 'aboutpage' => 'Project:Էությունը',
-'copyright' => 'Ô¿Õ¡ÕµÖ\84Õ« Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö\82Õ©ÕµÕ¸Ö\82Õ¶Õ¨ Õ£Õ¿Õ¶Õ¾Õ¸Ö\82Õ´ Õ§ Â«$1» Õ¡Ö\80Õ¿Õ¸Õ¶Õ¡Õ£Ö\80Õ« Õ¿Õ¡Õ¯։',
+'copyright' => 'Ô¿Õ¡ÕµÖ\84Õ« Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö\82Õ©ÕµÕ¸Ö\82Õ¶Õ¨ Õ©Õ¸Õ²Õ¡Ö\80Õ¯Õ¾Õ¡Õ® Õ§ $1 Õ©Õ¸Ö\82ÕµÕ¬Õ¡Õ¿Ö\80Õ¡Õ£Ö\80Õ¸Õ¾, Õ¥Õ©Õ¥ Õ¡ÕµÕ¬ Õ¢Õ¡Õ¶ Õ¶Õ·Õ¾Õ¡Õ® Õ¹Õ§։',
 'copyrightpage' => '{{ns:project}}:Հեղինակային իրավունքներ',
 'currentevents' => 'Ընթացիկ իրադարձություններ',
 'currentevents-url' => 'Project:Ընթացիկ իրադարձություններ',
@@ -634,7 +634,7 @@ $1',
 'cannotdelete-title' => 'Հնարավոր չէ ջնջել $1 էջը',
 'badtitle' => 'Անընդունելի անվանում',
 'badtitletext' => 'Հարցված էջի անվանումը անընդունելի է, դատարկ է կամ սխալ միջ-լեզվական կամ ինտերվիքի անվանում է։ Հնարավոր է, որ այն պարունակում է անթույլատրելի սիմվոլներ։',
-'perfcached' => 'Õ\80Õ¥Õ¿Ö\87ÕµÕ¡Õ¬ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö\80Õ¨ Õ¾Õ¥Ö\80Ö\81Õ¾Õ¡Õ® Õ¥Õ¶ Ö\84Õ¥Õ·Õ«Ö\81 և հնարավոր է չարտացոլեն վերջին փոփոխությունները։ Առավելագույն {{PLURAL:$1|արդյունք|$1 արդյունք}} է հասանելի քեշում։',
+'perfcached' => 'Õ\8dÕ¿Õ¸Ö\80Ö\87 Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö\80Õ¨ ÕºÕ¡Õ°Õ¸Ö\82Õ½Õ¿Õ¡Õ¾Õ¸Ö\80Õ¾Õ¡Õ® Õ¥Õ¶ և հնարավոր է չարտացոլեն վերջին փոփոխությունները։ Առավելագույն {{PLURAL:$1|արդյունք|$1 արդյունք}} է հասանելի քեշում։',
 'perfcachedts' => 'Հետևյալ տվյալները վերցված են քեշից և վերջին անգամ թարմացվել են $1։ A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
 'querypage-no-updates' => 'Այս էջի փոփոխությունները ներկայումս արգելված են։ Այստեղի տվյալները այժմ չեն թարմացվի։',
 'viewsource' => 'Դիտել վիքիկոդը',
@@ -782,6 +782,9 @@ $2',
 'login-throttled' => 'Դուք կատարել եք չափից շատ մուտքի փորձ։
 Խնդրում ենք սպասել որոշ ժամանակ կրկին փորձելուց առաջ։',
 'loginlanguagelabel' => 'Լեզու՝ $1',
+'pt-login' => 'Մտնել',
+'pt-createaccount' => 'Ստեղծել մասնակցի հաշիվ',
+'pt-userlogout' => 'Դուրս գալ',
 
 # Email sending
 'php-mail-error-unknown' => 'Անհայտ սխալ PHP-ի mail() ֆունկցիայում',
@@ -1074,8 +1077,8 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 (նախ) = համեմատել նախորդ տարբերակի հետ,<br />'''չ''' = չնչին խմբագրում",
 'history-fieldset-title' => 'Դիտել պատմությունը',
 'history-show-deleted' => 'Միայն ջնջված',
-'histfirst' => 'Առաջին',
-'histlast' => 'Õ\8eÕ¥Ö\80Õ»Õ«Õ¶',
+'histfirst' => 'ամենահին',
+'histlast' => 'Õ¡Õ´Õ¥Õ¶Õ¡Õ©Õ¡Ö\80Õ´',
 'historysize' => '({{PLURAL:$1|1 բայթ|$1 բայթ}})',
 'historyempty' => '(դատարկ)',
 
@@ -1088,9 +1091,10 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 Փորձեք [[Special:Search|որոնել վիքիում]] նոր համանման էջեր։',
 
 # Revision deletion
-'rev-deleted-comment' => '(Õ´Õ¥Õ¯Õ¶Õ¡Õ¢Õ¡Õ¶Õ¸Ö\82Õ©ÕµÕ¸Ö\82Õ¶ը հեռացված է)',
+'rev-deleted-comment' => '(Õ­Õ´Õ¢Õ¡Õ£Ö\80Õ´Õ¡Õ¶ Õ¡Õ´Ö\83Õ¸Ö\83Õ¸Ö\82Õ´ը հեռացված է)',
 'rev-deleted-user' => '(մասնակցի անունը ջնջված է)',
 'rev-deleted-event' => '(գրությունը հեռացված է)',
+'rev-deleted-user-contribs' => '[մասնակցի անունը կամ ԱյՊի հասցեն հեռացված է, խմբագրումը թաքցված է ներդրումներից]',
 'rev-deleted-text-permission' => 'Էջի այս տարբերակը հեռացված է։
 Հնարավոր է մանրամասնություններ լինեն [{{fullurl:{{ns:special}}:Log/delete|page={{PAGENAMEE}}}} ջնջման տեղեկամատյանում]։',
 'rev-deleted-text-view' => "Էջի այս տարբերակը '''ջնջված''' է։
@@ -1122,13 +1126,15 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'revdelete-hide-user' => 'Թաքցնել հեղինակի մասնակցի անունը/IP',
 'revdelete-hide-restricted' => 'Թաքցնել տվյալները և՛ ադմինիստրատորներից, և՛ այլ մասնակիցներից',
 'revdelete-radio-same' => '(չի կարելի խմբագրել)',
-'revdelete-radio-set' => 'Ô±ÕµÕ¸',
-'revdelete-radio-unset' => 'Õ\88Õ¹',
+'revdelete-radio-set' => 'Ô¹Õ¡Ö\84Ö\81Õ¾Õ¡Õ®',
+'revdelete-radio-unset' => 'Õ\8fÕ¥Õ½Õ¡Õ¶Õ¥Õ¬Õ«',
 'revdelete-suppress' => 'Թաքցնել տվյալները ադմինիստրատորներից և մյուսներից նոյնպես',
 'revdelete-unsuppress' => 'Հանել սահմանափակումները վերականգնված տարբերակներից',
 'revdelete-log' => 'Պատճառ.',
 'revdelete-submit' => 'Կիրառել ընտրված {{PLURAL:$1|տարբերակի|տարբերակների}} վրա',
 'revdelete-success' => "'''Տարբերակի տեսանելիությունը բարեհաջող թարմացված է։'''",
+'revdelete-failure' => '<strong>Խմբագրման տեսանելիություն հնարավոր չէր փոփոխել՝</strong>
+$1',
 'logdelete-success' => "'''Իրադարձության տեսանելիությունը փոփոխված է։'''",
 'revdel-restore' => 'Փոխել տեսանելիությունը',
 'pagehist' => 'Էջի պատմություն',
@@ -1153,6 +1159,7 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'compareselectedversions' => 'Համեմատել ընտրած տարբերակները',
 'showhideselectedversions' => 'Ցուցադրել/թաքցնել ընտրված խմբագրումները',
 'editundo' => 'հետ շրջել',
+'diff-empty' => '(Տարբերություն չկա)',
 
 # Search results
 'searchresults' => 'Որոնման արդյունքներ',
@@ -1254,7 +1261,7 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'timezoneregion-indian' => 'Հնդկական Օվկիանոս',
 'timezoneregion-pacific' => 'Խաղաղ օվկիանոս',
 'allowemail' => 'Թույլատրել էլ-նամակներ մյուս մասնակիցներից',
-'prefs-searchoptions' => 'Õ\88Ö\80Õ¸Õ¶Õ´Õ¡Õ¶ Õ¨Õ¶Õ¿Ö\80Õ¡Õ¶Ö\84Õ¶Õ¥Ö\80',
+'prefs-searchoptions' => 'Õ\88Ö\80Õ¸Õ¶Õ¸Ö\82Õ´',
 'prefs-namespaces' => 'Անվանատարածք',
 'defaultns' => 'Հակառակ դեպքում, որոնել այս անվանատարծքներում․',
 'default' => 'լռությամբ',
@@ -1392,11 +1399,23 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'rcnotefrom' => "Ստորև բերված են փոփոխությունները սկսած՝ '''$2''' (մինչև՝ '''$1''')։",
 'rclistfrom' => 'Ցույց տալ նոր փոփոխությունները սկսած $1',
 'rcshowhideminor' => '$1 չնչին խմբագրումները',
+'rcshowhideminor-show' => 'Ցուցադրել',
+'rcshowhideminor-hide' => 'Թաքցնել',
 'rcshowhidebots' => '$1 բոտերին',
+'rcshowhidebots-show' => 'Ցուցադրել',
+'rcshowhidebots-hide' => 'Թաքցնել',
 'rcshowhideliu' => '$1 մուտք գործած մասնակիցներին',
+'rcshowhideliu-show' => 'Ցուցադրել',
+'rcshowhideliu-hide' => 'Թաքցնել',
 'rcshowhideanons' => '$1 անանուն մասնակիցներին',
+'rcshowhideanons-show' => 'Ցուցադրել',
+'rcshowhideanons-hide' => 'Թաքցնել',
 'rcshowhidepatr' => '$1 ստուգված խմբագրումները',
+'rcshowhidepatr-show' => 'Ցուցադրել',
+'rcshowhidepatr-hide' => 'Թաքցնել',
 'rcshowhidemine' => '$1 իմ խմբագրումները',
+'rcshowhidemine-show' => 'Ցուցադրել',
+'rcshowhidemine-hide' => 'Թաքցնել',
 'rclinks' => 'Ցույց տալ վերջին $1 փոփոխությունները վերջին $2 օրվա ընթացքում<br />$3',
 'diff' => 'տարբ',
 'hist' => 'պատմ',
@@ -1410,8 +1429,9 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'rc_categories_any' => 'Բոլոր',
 'rc-change-size-new' => '$1 {{PLURAL:$1|բայթ|բայթ}} փոփոխությունից հետո',
 'newsectionsummary' => '/* $1 */ Նոր բաժին',
-'rc-enhanced-expand' => 'Ցույց տալ մանրամասներ (պահանջում է JavaScript)',
+'rc-enhanced-expand' => 'Ցուցադրել մանրամասներ (պահանջում է ՋավաՍկրիպտ)',
 'rc-enhanced-hide' => 'Թաքցնել մանրամասները',
+'rc-old-title' => 'Ի սկզբանե ստեղծված էր որպես «$1»',
 
 # Recent changes linked
 'recentchangeslinked' => 'Կապված փոփոխություններ',
index 4213e01..451b541 100644 (file)
@@ -182,7 +182,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Inviar me copias del messages de e-mail que io invia a altere usatores',
 'tog-diffonly' => 'Non monstrar le contento del pagina sub le comparation de duo versiones',
 'tog-showhiddencats' => 'Monstrar categorias celate',
-'tog-noconvertlink' => 'Disactivar conversion de titulos de ligamines',
 'tog-norollbackdiff' => 'Omitter le diff post le execution de un revocation',
 'tog-useeditwarning' => 'Advertir me quando io quita un pagina de modification sin publicar le cambiamentos',
 'tog-prefershttps' => 'Sempre usar un connexion secur in session aperte',
@@ -730,7 +729,7 @@ Pro completar le accesso, tu debe definir un nove contrasigno hic:',
 'resetpass-temp-password' => 'Contrasigno temporari:',
 'resetpass-abort-generic' => 'Le cambio del contrasigno ha essite abortate per un extension.',
 'resetpass-expired' => 'Le contrasigno ha expirate. Per favor defini un nove contrasigno pro aperir session.',
-'resetpass-expired-soft' => 'Le contrasigno ha expirate e debe esser redefinite. Per favor elige un nove contrasigno ora, o clicca sur Cancellar pro redefinir lo plus tarde.',
+'resetpass-expired-soft' => 'Le contrasigno ha expirate e debe esser redefinite. Per favor elige un nove contrasigno ora, o clicca sur "{{int:resetpass-submit-cancel}}" pro redefinir lo plus tarde.',
 
 # Special:PasswordReset
 'passwordreset' => 'Reinitialisar contrasigno',
@@ -1606,11 +1605,23 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
 'rcnotefrom' => 'infra es le modificationes a partir de <b>$2</b> (usque a <b>$1</b>).',
 'rclistfrom' => 'Monstrar nove modificationes a partir de $1',
 'rcshowhideminor' => '$1 modificationes minor',
+'rcshowhideminor-show' => 'Monstrar',
+'rcshowhideminor-hide' => 'Celar',
 'rcshowhidebots' => '$1 bots',
+'rcshowhidebots-show' => 'Monstrar',
+'rcshowhidebots-hide' => 'Celar',
 'rcshowhideliu' => '$1 usatores registrate',
+'rcshowhideliu-show' => 'Monstrar',
+'rcshowhideliu-hide' => 'Celar',
 'rcshowhideanons' => '$1 usatores anonyme',
+'rcshowhideanons-show' => 'Monstrar',
+'rcshowhideanons-hide' => 'Celar',
 'rcshowhidepatr' => '$1 modificationes patruliate',
+'rcshowhidepatr-show' => 'Monstrar',
+'rcshowhidepatr-hide' => 'Celar',
 'rcshowhidemine' => '$1 mi modificationes',
+'rcshowhidemine-show' => 'Monstrar',
+'rcshowhidemine-hide' => 'Celar',
 'rclinks' => 'Monstrar le $1 ultime modificationes in le $2 ultime dies<br />$3',
 'diff' => 'diff',
 'hist' => 'hist',
@@ -1740,6 +1751,8 @@ Si tu vole totevia incargar iste file, per favor retorna e usa un nove nomine. [
 'uploaddisabledtext' => 'Le incargamento de files es disactivate.',
 'php-uploaddisabledtext' => 'Le incargamento de files PHP es disactivate. Per favor verifica le configuration file_uploads.',
 'uploadscripted' => 'Iste file contine codice de HTML o de script que pote esser interpretate erroneemente per un navigator del web.',
+'uploadscriptednamespace' => 'Iste file SVG contine un spatio de nomines invalide: "$1"',
+'uploadinvalidxml' => 'Le codice XML in le file incargate non pote esser interpretate.',
 'uploadvirus' => 'Le file contine un virus! Detalios: $1',
 'uploadjava' => 'Iste file es un archivo ZIP que contine un file .class de Java.
 Non es permittite incargar files Java, proque istes pote contornar le restrictiones de securitate.',
@@ -2464,10 +2477,10 @@ Ecce le configurationes actual del pagina '''$1''':",
 Ecce le configurationes actual del pagina '''$1''':",
 'protect-cascadeon' => 'Iste pagina es actualmente protegite proque illo es includite in le sequente {{PLURAL:$1|pagina, le qual|paginas, le quales}} ha activate le protection in cascada.
 Tu pote cambiar le nivello de protection de iste pagina, ma isto non cambiara le effecto del protection in cascada.',
-'protect-default' => 'Permitter tote le usatores',
-'protect-fallback' => 'Permitter solmente usatores con le permission de "$1"',
-'protect-level-autoconfirmed' => 'Permitter solmente usatores autoconfirmate',
-'protect-level-sysop' => 'Permitter solmente administratores',
+'protect-default' => 'Permitter tote le usatores',
+'protect-fallback' => 'Permitter solmente al usatores con le privilegio de "$1"',
+'protect-level-autoconfirmed' => 'Permitter solmente al usatores autoconfirmate',
+'protect-level-sysop' => 'Permitter solmente al administratores',
 'protect-summary-cascade' => 'in cascada',
 'protect-expiring' => 'expira le $1 (UTC)',
 'protect-expiring-local' => 'expira le $1',
@@ -2591,6 +2604,7 @@ Le ultime entrata del registro de blocadas es reproducite hic infra pro informat
 'sp-contributions-search' => 'Cercar contributiones',
 'sp-contributions-username' => 'Adresse IP o nomine de usator:',
 'sp-contributions-toponly' => 'Monstrar solmente le versiones recente',
+'sp-contributions-newonly' => 'Monstrar solmente le modificationes que es creationes de pagina',
 'sp-contributions-submit' => 'Cercar',
 
 # What links here
@@ -3093,7 +3107,7 @@ Le causa es probabilemente un ligamine verso un sito externe que es presente in
 '''NON''' completa isto!",
 
 # Info page
-'pageinfo-title' => 'Informationes pro "$1"',
+'pageinfo-title' => 'Information sur "$1"',
 'pageinfo-not-current' => 'Regrettabilemente, il es impossibile fornir iste information pro versiones ancian.',
 'pageinfo-header-basic' => 'Information de base',
 'pageinfo-header-edits' => 'Historia de modificationes',
@@ -4136,6 +4150,4 @@ De facto, illo expande quasi toto inter accolladas duple.',
 'expand_templates_generate_rawhtml' => 'Monstrar HTML brute',
 'expand_templates_preview' => 'Previsualisation',
 
-# Unknown messages
-'uploadinvalidxml' => 'Le codice XML in le file incargate non pote esser interpretate.',
 );
index 30c11cd..afe8e0f 100644 (file)
@@ -383,7 +383,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Kirimkan saya salinan surel yang saya kirimkan ke orang lain',
 'tog-diffonly' => 'Jangan tampilkan isi halaman di bawah perbedaan suntingan',
 'tog-showhiddencats' => 'Tampilkan kategori tersembunyi',
-'tog-noconvertlink' => 'Matikan konversi judul pranala',
 'tog-norollbackdiff' => 'Jangan tampilkan perbedaan setelah melakukan pengembalian',
 'tog-useeditwarning' => 'Ingatkan saya bila meninggalkan halaman penyuntingan sebelum menyimpan perubahan',
 'tog-prefershttps' => 'Selalu gunakan koneksi aman ketika masuk log',
@@ -1890,6 +1889,7 @@ Anda harus meminta bantuan seseorang dengan kemampuan untuk melihat data berkas
 'uploaddisabledtext' => 'Pemuatan berkas tidak diizinkan.',
 'php-uploaddisabledtext' => 'Pemuatan berkas dimatikan di PHP. Silakan cek pengaturan file_uploads.',
 'uploadscripted' => 'Berkas ini mengandung HTML atau kode yang dapat diinterpretasikan dengan keliru oleh penjelajah web.',
+'uploadinvalidxml' => 'XML dalam berkas yang diunggah tidak bisa diuraikan.',
 'uploadvirus' => 'Berkas tersebut mengandung virus! Rincian: $1',
 'uploadjava' => 'Berkas ini adalah berkas ZIP yang mengnadung berkas .class Java.
 Penggunggahan berkas Java tidak diperbolehkan karena dapat menyebabkan pengabaian batasan keamanan.',
@@ -4364,6 +4364,4 @@ Jika tidak, Anda dapat menggunakan formulir mudah di bawah ini. Komentar Anda ak
 'expand_templates_generate_rawhtml' => 'Tampilkan HTML mentah',
 'expand_templates_preview' => 'Pratayang',
 
-# Unknown messages
-'uploadinvalidxml' => 'XML dalam berkas yang diunggah tidak bisa diuraikan.',
 );
index bb04575..d37bbee 100644 (file)
@@ -170,7 +170,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Inviar me copies de e-mailes que yo invia por altri usatores',
 'tog-diffonly' => 'Ne monstrar li contenete de págine in infra del changes',
 'tog-showhiddencats' => 'Monstrar categories ne visibil',
-'tog-noconvertlink' => 'Desvalidar conversion de titul de catenun',
 'tog-norollbackdiff' => 'Omisser change pos de efectuar un rollback',
 'tog-useeditwarning' => 'Averti me, si yo abandona un págine con ínconservat changes',
 'tog-prefershttps' => 'Sempre usar un secur connection, si tui session es activ.',
index 47484ac..eb283d0 100644 (file)
@@ -226,7 +226,7 @@ $messages = array(
 'edit' => 'Urnosen',
 'create' => 'Agaramid',
 'editthispage' => 'Urnosen daytoy a panid',
-'create-this-page' => 'Aramidem daytoy a panid',
+'create-this-page' => 'Partuaten daytoy a panid',
 'delete' => 'Ikkaten',
 'deletethispage' => 'Ikkaten daytoy a panid',
 'undeletethispage' => 'Isubli ti pannakaikkat daytoy a panid',
@@ -589,6 +589,9 @@ Pangngaasi nga agurayka ti $1 sakbay a padasem manen.',
 'suspicious-userlogout' => 'Naiparit ti panagkiddawmo a rummuar ngamin ket kasla inpatulod ti nadadael a panagbasabasa wenno pannakaidulin a pannakbagi.',
 'createacct-another-realname-tip' => 'Saan a nasken ti pudno a nagan.
 No kayatmo nga ited, mausarto daytoy para iti panangited ti pammadayaw para kadagiti obrada.',
+'pt-login' => 'Sumrek',
+'pt-createaccount' => 'Agaramid ti pakabilangan',
+'pt-userlogout' => 'Rummuar',
 
 # Email sending
 'php-mail-error-unknown' => 'Di ammo a biddut ti surat ti PHP() nga annong.',
@@ -597,8 +600,7 @@ No kayatmo nga ited, mausarto daytoy para iti panangited ti pammadayaw para kada
 
 # Change password dialog
 'changepassword' => 'Baliwan ti kontrasenias',
-'resetpass_announce' => 'Simrekka a nagus-usar ti temporario a kodigo ti esurat.
-Tapno malpaska a makastrek, nasken a mangikabilka ti baro a kontrasenias ditoy:',
+'resetpass_announce' => 'Tapno malpas ti panagserrek, nasken a mangiyasentarka ti baro a kontrasenias.',
 'resetpass_header' => 'Sukatan ti kontrasenias ti pakabilangan',
 'oldpassword' => 'Daan a kontrasenias:',
 'newpassword' => 'Baro a kontrasenias:',
@@ -613,8 +615,13 @@ Pangngaasi nga aguray ti $1 sakbay a padasen manen.',
 'resetpass-submit-cancel' => 'Ukasen',
 'resetpass-wrong-oldpass' => 'Imbalido ti temporario wenno agdama a kontrasenias.
 Mabalin a nagballigi ti panagsukatmo ti kontrasenias wenno nagkiddaw ti baro a temporario a kontrasenias.',
+'resetpass-recycled' => 'Pangngaasi nga iyasentar manen ti kontrasenias iti sabali ngem ti agdama a kontraseniasmo.',
+'resetpass-temp-emailed' => 'Simrekka a nagusar ti temporario a naipatulod a kodigo.
+Tapno malpas ti panagserrek, nasken a mangiyasentarka ti baro a kontrasenias ditoy:',
 'resetpass-temp-password' => 'Temporario a kontrasenias:',
 'resetpass-abort-generic' => 'Ti panagsukat ti kontrasenias ket pinasardeng babaen ti maysa a pagpaatiddog.',
+'resetpass-expired' => 'Nagpason ti kontraseniasmo. Pangngaasi a mangiyasentar ti baro a kontrasenias tapno makastrek.',
+'resetpass-expired-soft' => 'Nagpason ti kontraseniasmo, ken nasken a maiyasentar manen. Pangngaasi nga agpili tattan ti baro a kontrasenias, wenno pinduten ti "{{int:resetpass-submit-cancel}}"  tapno maiyasentarto intono madamdama.',
 
 # Special:PasswordReset
 'passwordreset' => 'Iyasentar manen ti kontrasenias',
@@ -761,9 +768,9 @@ Mabalin a naiyalis wenno naikkat bayat idi kitkitaem ti panid.',
 'accmailtext' => "Ti pugto a napartuat a kontrasenias para kenni [[User talk:$1|$1]] ket naipatuloden idiay $2. Mabalin a masukatan idiay
 ''[[Special:ChangePassword|pagsukatan ti kontrasenias]]'' a panid no sumrekka.",
 'newarticle' => '(Baro)',
-'newarticletext' => "Nasurotmo ti maysa a silpo iti awan pay a panid. 
-Tapno mapartuat daytoy a panid, rugiamon ti agikur-it wenno agisurat iti pagsuratan a kahon dita baba (kitaen ti [[{{MediaWiki:Helppage}}|panid ti tulong]] para iti ad-adu pay a pakaammo). 
-No addaka ditoy babaen ti biddut, ipidutmo ti '''agsubli''' a buton ti pabasabasam tapno makasublika iti naggapuam a panid.",
+'newarticletext' => 'Nasurotmo ti silpo ti awan pay a panid. 
+Ti mangpartuat ti panid, rugiamon ti agmakinilia iti kahon dita baba (kitaen ti [[{{MediaWiki:Helppage}}|panid ti tulong]] para iti adu pay a pakaammo). 
+No addaka ditoy babaen ti biddut, pindutem ti buton ti <strong>agsubli</strong> ti pagbasabasam.',
 'anontalkpagetext' => "----
 ''Daytoy ti pakitungtungan a panid para iti di am-ammo nga agar-aramat a saan pay a nakaaramid ti pakabilangan, wenno saanna nga us-usaren.
 Dakami ket agusar kami ti numero nga IP a pagtaengan ti panangilasin dagiti lalaki/babai.
@@ -873,7 +880,7 @@ Mabalinmo ti agsubli ken urnosen ti adda a panid, wenno [[Special:UserLogin|sumr
 'sectioneditnotsupported-text' => 'Saan a nasuportaran ti panag-urnos ti paset iti daytoy a panid.',
 'permissionserrors' => 'Biddut ti pammalubos',
 'permissionserrorstext' => 'Awan ti pammalubosmo nga agaramid iti dayta, gapu ti sumaganad {{PLURAL:$1|a rason|a rasrason}}:',
-'permissionserrorstext-withaction' => 'Awan ti pammalubosmo nga $2, gapu ti sumaganad {{PLURAL:$1|a rason|rasrason}}:',
+'permissionserrorstext-withaction' => 'Awan ti pammalubosmo nga $2, gapu ti sumaganad a {{PLURAL:$1|rason|rasrason}}:',
 'recreate-moveddeleted-warn' => "'''Ballaag: Agparpartuatka manen ti dati a naikkat a panid'''
 
 Nasken a siguraduem no maikanatad nga ituloymo nga urnosen daytoy a panid.
@@ -960,8 +967,8 @@ Ti inted a rason babaen ni $3 ket ''$2''",
 'last' => 'naudi',
 'page_first' => 'umuna',
 'page_last' => 'naudi',
-'histlegend' => "Panagpili ti sabali: Markaan dagiti kahon ti radio dagiti panagbaliwan tapno maipada ken pesselen ti serrek wenno ti buton dita baba.<br />
-Sarita: '''({{int:cur}})''' = naggidiatan ti kinaudi a panagbaliw, '''({{int:last}})''' = naggidiatan ti sarsarunuen a panagbaliw , '''{{int:minoreditletter}}''' = bassit a panagbaliw.",
+'histlegend' => 'Panagpili ti diperensia: Markaan dagiti kahon ti radio kadagiti panagbaliw tapno maipada ken pinduten ti serrek wenno ti buton dita baba.<br />
+Leyenda: <strong>({{int:cur}})</strong> = naggidiatan ti kinaudi a panagbaliw, <strong>({{int:last}})</strong> = naggidiatan ti sarsarunuen a panagbaliw , <strong>{{int:minoreditletter}}</strong> = bassit a panagbaliw.',
 'history-fieldset-title' => 'Agbasabasa ti pakasaritaan',
 'history-show-deleted' => 'Naikkat laeng',
 'histfirst' => 'kadaanan',
@@ -1429,7 +1436,7 @@ Ti esurat a pagtaengam ket saan a maipakita kadagiti agar-aramat nga agkontak ke
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'basaen datoy a panid',
-'action-edit' => 'urnosen datoy a panid',
+'action-edit' => 'agurnos iti datoy a panid',
 'action-createpage' => 'agpartuat kadagiti panid',
 'action-createtalk' => 'agaramid kadagiti pagtungtungan a panid',
 'action-createaccount' => 'agpartuat ti pakabilangan daytoy nga agar-aramat',
@@ -1482,16 +1489,28 @@ Ti esurat a pagtaengam ket saan a maipakita kadagiti agar-aramat nga agkontak ke
 'recentchanges-label-bot' => 'Daytoy a panag-urnos ket inaramid babaen ti maysa a bot',
 'recentchanges-label-unpatrolled' => 'Daytoy a panag-urnos ket saan pay a napatruliaan',
 'recentchanges-label-plusminus' => 'Ti panagbaliw ti kadakkel ti panid babaen ti bilang dagiti byte',
-'recentchanges-legend-heading' => "'''Sarita:'''",
+'recentchanges-legend-heading' => "'''Leyenda:'''",
 'recentchanges-legend-newpage' => '(kitaen pay ti [[Special:NewPages|listaan ti baro a pampanid]])',
-'rcnotefrom' => "Dita baba ket dagiti sinukatan manipud idi '''$2''' (agingga iti '''$1''' a naipakita).",
+'rcnotefrom' => 'Dita baba ket dagiti sinukatan manipud idi strong>$2</strong> (agingga iti <strong>$1</strong> a naipakita).',
 'rclistfrom' => 'Ipakita dagiti kabarbaro a sinukatan a mangrugi manipud idi $1',
 'rcshowhideminor' => '$1 dagiti bassit a panag-urnos',
+'rcshowhideminor-show' => 'Ipakita',
+'rcshowhideminor-hide' => 'Ilemmeng',
 'rcshowhidebots' => '$1 dagiti bot',
+'rcshowhidebots-show' => 'Ipakita',
+'rcshowhidebots-hide' => 'Ilemmeng',
 'rcshowhideliu' => '$1 dagiti nakarehistro nga agar-aramat',
+'rcshowhideliu-show' => 'Ipakita',
+'rcshowhideliu-hide' => 'Ilemmeng',
 'rcshowhideanons' => '$1 dagiti di am-ammo nga agar-aramat',
+'rcshowhideanons-show' => 'Ipakita',
+'rcshowhideanons-hide' => 'Ilemmeng',
 'rcshowhidepatr' => '$1 dagiti napatrulian a panag-urnos',
+'rcshowhidepatr-show' => 'Ipakita',
+'rcshowhidepatr-hide' => 'Ilemmeng',
 'rcshowhidemine' => '$1 dagiti inurnosko',
+'rcshowhidemine-show' => 'Ipakita',
+'rcshowhidemine-hide' => 'Ilemmeng',
 'rclinks' => 'Ipakita dagiti naudi a $1 a sinukatan iti kallabes a $2 nga al-aldaw<br />$3',
 'diff' => 'sabali',
 'hist' => 'saritaan',
@@ -1626,6 +1645,8 @@ Nasken nga agdamagka ti addaan ti abilidad a mangkita ti nalapdan a datos ti pap
 'php-uploaddisabledtext' => 'Ti pinag-ipan ti papeles ket naiddep idiay PHP.
 Panngaasi a kitaem ti pannakaikabil ti pinag-ipan ti papeles.',
 'uploadscripted' => 'Daytoy a papeles ket adda nagyanna a HTML wenno panagsurat a kodigo a mabalin nga agpakamali ti panagbasa ti sapot a pagbasabasa.',
+'uploadscriptednamespace' => 'Daytoy a papeles ti SVG ket aglaon ti maysa a saan a mabalin a nagan ti espasio ti "$1"',
+'uploadinvalidxml' => 'Ti XML iti naikarga a papeles ket saan a maiwaswas.',
 'uploadvirus' => 'Addaan ti birus daytoy a papeles! Salaysay: $1',
 'uploadjava' => 'Daytoy a papeles ket ZIP a papeles nga adda nagyanna a Java .a kita ti papeles.
 Saan a mabalin ti pinag-ipan ti Java a papeles, ngamin ket palabsanda dagiti seguridad a pangrestrikto.',
@@ -1985,6 +2006,7 @@ Tattan ket naibaw-ing idiay [[$2]].',
 'deadendpagestext' => 'Dagitoy a pampanid ket saan a nakasilpo ti sabali a pampanid ditoy {{SITENAME}} .',
 'protectedpages' => 'Dagiti nasalakniban a panid',
 'protectedpages-indef' => 'Inggat ingana a salakniban laeng',
+'protectedpages-summary' => 'Daytoy a panid ket ilistana dagiti adda a panid nga agdama a nasalakniban. Para iti listaan dagiti titulo a nasalakniban manipud ti pannakapartuat, kitaen ti [[{{#special:ProtectedTitles}}]].',
 'protectedpages-cascade' => 'Dagiti sariap a salaknib laeng',
 'protectedpages-noredirect' => 'Ilemmeng dagiti baw-ing',
 'protectedpagesempty' => 'Awan ti pampanid nga agdama a nasalakniban babaen kadagitoy a parametro.',
@@ -1997,6 +2019,7 @@ Tattan ket naibaw-ing idiay [[$2]].',
 'protectedpages-unknown-timestamp' => 'Di ammo',
 'protectedpages-unknown-performer' => 'Di ammo nga agar-aramat',
 'protectedtitles' => 'Dagiti nasalakniban a titulo',
+'protectedtitles-summary' => 'Daytoy a panid ket ilistana dagiti titulo nga agdama a nasalakniban manipud ti pannakapartuat. Para iti listaan dagiti adda a panid a nasalakniban, kitaen ti [[{{#special:ProtectedPages}}]].',
 'protectedtitlesempty' => 'Awan dagiti titulo nga agdama a nasalakniban iti dagitoy a parametro.',
 'listusers' => 'Listaan dagiti agar-aramat',
 'listusers-editsonly' => 'Ipakita laeng dagiti agar-aramat nga adda inurnosda',
@@ -2271,7 +2294,7 @@ Ti panagikkat ti kastoy a pammpanid ket naparitan tapno mapawilan ti saan nga in
 'delete-warning-toobig' => 'Daytoy a panid ket adda ti dakkel unay a pakasaritaan ti panag-urnos, ti kaadu nga $1 {{PLURAL:$1|panagbaliw|dagiti panagbaliw}}.
 Ti panagikkat ket madisturbo ti panagpataray ti database ti {{SITNAME}};
 agal-aluadka a mangrugi.',
-'deleting-backlinks-warning' => "'''Ballaag:''' Dagiti dadduma a panid ket naisilpo wenno nailak-am manipud ti panid a gangani nga ikkatem.",
+'deleting-backlinks-warning' => "'''Ballaag:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Dagiti dadduma a panid]] ket naisilpo wenno nailak-am manipud ti panid a gangani nga ikkatem.",
 
 # Rollback
 'rollback' => 'Isubli dagiti panag-urnos',
@@ -2453,8 +2476,10 @@ Ti naudi a listaan ti pannakaserra ket adda dita baba tapno mausar a reperensia:
 'sp-contributions-blocked-notice-anon' => 'Daytoy nga IP a pagtaengan ket naserraan.
 Ti naudi a listaan ti pannakaserra ket adda dita baba tapno mausar a reperensia:',
 'sp-contributions-search' => 'Agsapul para kadagiti naar-aramid',
+'sp-contributions-suppresslog' => 'pasardengen dagiti kontribusion ti agar-aramat',
 'sp-contributions-username' => 'IP a pagtaengan wenno nagan ti agar-aramat:',
 'sp-contributions-toponly' => 'Ipakita laeng dagiti inurnos a kinaudian a panagbaliw',
+'sp-contributions-newonly' => 'Ipakita laeng dagiti inurnos a pannakapartuat ti pampanid',
 'sp-contributions-submit' => 'Biruken',
 
 # What links here
@@ -3738,7 +3763,7 @@ Naka-awatka koman ti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopia iti GNU Sapasap a
 
 # Special:SpecialPages
 'specialpages' => 'Espesial a pampanid',
-'specialpages-note-top' => 'Sarita',
+'specialpages-note-top' => 'Leyenda',
 'specialpages-note' => '* Kadawyan nga espesial a pampanid.
 * <span class="mw-specialpagerestricted">Nagawidan nga espesial a pampanid.</span>',
 'specialpages-group-maintenance' => 'Dagiti padamag ti panagtaripato',
@@ -3972,6 +3997,4 @@ Iti kinapudno, palawaenna amin dagiti adda ti doble a tukol.',
 'expand_templates_generate_rawhtml' => 'Ipakita ti naata a HTML',
 'expand_templates_preview' => 'Pamadasan',
 
-# Unknown messages
-'uploadinvalidxml' => 'Ti XML iti naikarga a papeles ket saan a maiwaswas.',
 );
index 04522fa..d74ed9d 100644 (file)
@@ -762,6 +762,7 @@ Vinsamlegast bíðið $1 áður en þú reynir aftur.',
 'loginlanguagelabel' => 'Tungumál: $1',
 'suspicious-userlogout' => 'Beiðni um útskráningu hafnað því hún var líklegast send frá biluðum vafra eða vefseli sem hefur vistað vefsíðuna í flýtiminni.',
 'createacct-another-realname-tip' => 'Alvöru nafn er valfrjálst. Ef þú kýst að gefa það upp, verður það notað til að gefa þér heiður af verkum þínum.',
+'pt-createaccount' => 'Stofna aðgang',
 
 # Email sending
 'php-mail-error-unknown' => 'Óþekkt villa í PHP mail() aðgerð.',
@@ -1621,11 +1622,23 @@ Tölvupóstfang þitt er ekki gefið upp þegar aðrir notendur hafa samband vi
 'rcnotefrom' => "Að neðan eru breytingar síðan '''$2''' (allt að '''$1''' sýndar).",
 'rclistfrom' => 'Sýna breytingar frá og með $1',
 'rcshowhideminor' => '$1 minniháttar breytingar',
+'rcshowhideminor-show' => 'Sýna',
+'rcshowhideminor-hide' => 'Fela',
 'rcshowhidebots' => '$1 vélmenni',
+'rcshowhidebots-show' => 'Sýna',
+'rcshowhidebots-hide' => 'Fela',
 'rcshowhideliu' => '$1 skráðir notendur',
+'rcshowhideliu-show' => 'Sýna',
+'rcshowhideliu-hide' => 'Fela',
 'rcshowhideanons' => '$1 óinnskráða notendur',
+'rcshowhideanons-show' => 'Sýna',
+'rcshowhideanons-hide' => 'Fela',
 'rcshowhidepatr' => '$1 vaktaðar breytingar',
+'rcshowhidepatr-show' => 'Sýna',
+'rcshowhidepatr-hide' => 'Fela',
 'rcshowhidemine' => '$1 mínar breytingar',
+'rcshowhidemine-show' => 'Sýna',
+'rcshowhidemine-hide' => 'Fela',
 'rclinks' => 'Sýna síðustu $1 breytingar síðustu $2 daga<br />$3',
 'diff' => 'breyting',
 'hist' => 'breytingaskrá',
@@ -3041,8 +3054,8 @@ Vinsamlegast reyndu aftur.',
 'spam_reverting' => 'Tek aftur síðustu breytingu sem inniheldur ekki tengil á $1',
 'spam_blanking' => 'Allar útgáfur innihéldu tengla á $1, tæmi síðuna',
 'spam_deleting' => 'Allar útgáfur innihéldu tengla á $1, eyði síðunni',
-'simpleantispam-label' => "Kæfuvörn.
-'''EKKI''' fylla þetta út!",
+'simpleantispam-label' => 'Kæfuvörn.
+<strong>EKKI</strong> fylla þetta út!',
 
 # Info page
 'pageinfo-title' => 'Upplýsingar um $1',
index aa3fc3c..f15b90f 100644 (file)
@@ -39,6 +39,7 @@
  * @author Kaganer
  * @author Klutzy
  * @author Marco 27
+ * @author Maria victoria
  * @author Martorell
  * @author Marzedu
  * @author McDutchie
@@ -332,7 +333,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Inviami una copia dei messaggi spediti agli altri utenti',
 'tog-diffonly' => 'Non visualizzare il contenuto della pagina dopo il confronto tra versioni',
 'tog-showhiddencats' => 'Mostra le categorie nascoste',
-'tog-noconvertlink' => 'Disattiva la conversione dei titoli dei link',
 'tog-norollbackdiff' => 'Non mostrare il confronto tra versioni dopo aver effettuato un rollback',
 'tog-useeditwarning' => 'Avvisa quando si esce da una pagina di modifica con modifiche non salvate',
 'tog-prefershttps' => "Usa sempre una connessione sicura quando si effettua l'accesso",
@@ -840,7 +840,7 @@ Attendi $1 e riprova in seguito.',
 
 # Change password dialog
 'changepassword' => 'Cambia password',
-'resetpass_announce' => 'Per completare la registrazione, è necessario impostare una nuova password.',
+'resetpass_announce' => "Per completare l'accesso, è necessario impostare una nuova password.",
 'resetpass_text' => '<!-- Aggiungere il testo qui -->',
 'resetpass_header' => "Cambia la password dell'account",
 'oldpassword' => 'Vecchia password:',
@@ -857,11 +857,11 @@ Attendi $1 e riprova in seguito.',
 'resetpass-wrong-oldpass' => 'Password temporanea o attuale non valida.
 La password potrebbe essere stata già cambiata, oppure potrebbe essere stata richiesta una nuova password temporanea.',
 'resetpass-recycled' => 'Si prega di reimpostare con una password diversa dalla password attuale.',
-'resetpass-temp-emailed' => "L'accesso è stato effettuato con un codice temporaneo, inviato via email. Per completare la registrazione, è necessario impostare una nuova password:",
+'resetpass-temp-emailed' => "L'accesso è stato effettuato con un codice temporaneo, inviato via email. Per completare la registrazione, è necessario impostare una nuova password qui:",
 'resetpass-temp-password' => 'Password temporanea:',
 'resetpass-abort-generic' => "La modifica della password è stata interrotta da un'estensione.",
 'resetpass-expired' => "La password è scaduta. Si prega di impostare una nuova password per effettuare l'accesso.",
-'resetpass-expired-soft' => 'La tua password è scaduta e deve essere reimpostata. Si prega di scegliere una nuova password o fare clic su annulla per reimpostarla successivamente.',
+'resetpass-expired-soft' => 'La tua password è scaduta e deve essere reimpostata. Si prega di scegliere una nuova password o fare clic su "{{int:resetpass-submit-cancel}}" per reimpostarla successivamente.',
 
 # Special:PasswordReset
 'passwordreset' => 'Reimposta password',
@@ -899,15 +899,15 @@ Password temporanea: $2',
 'passwordreset-emailerror-capture' => "È stata generata una email di reimpostazione della password, riportata di seguito. L'invio {{GENDER:$2|all'utente}} non è riuscito: $1",
 
 # Special:ChangeEmail
-'changeemail' => "Modifica l'indirizzo e-mail",
-'changeemail-header' => "Modifica l'indirizzo e-mail dell'account",
-'changeemail-text' => 'Completa questo modulo per cambiare il tuo indirizzo e-mail. Sarà necessario inserire la password per confermare la modifica.',
+'changeemail' => 'Modifica indirizzo email',
+'changeemail-header' => "Modifica l'indirizzo email dell'account",
+'changeemail-text' => 'Completa questo modulo per cambiare il tuo indirizzo email. Sarà necessario inserire la password per confermare la modifica.',
 'changeemail-no-info' => "Devi aver effettuato l'accesso per accedere a questa pagina direttamente.",
-'changeemail-oldemail' => 'Indirizzo e-mail attuale:',
-'changeemail-newemail' => 'Nuovo indirizzo e-mail:',
+'changeemail-oldemail' => 'Indirizzo email attuale:',
+'changeemail-newemail' => 'Nuovo indirizzo email:',
 'changeemail-none' => '(nessuno)',
 'changeemail-password' => 'La password su {{SITENAME}}:',
-'changeemail-submit' => 'Modifica e-mail',
+'changeemail-submit' => 'Modifica email',
 'changeemail-cancel' => 'Annulla',
 'changeemail-throttled' => 'Sono stati effettuati troppi tentativi di accesso.
 Attendi $1 e riprova in seguito.',
@@ -1413,8 +1413,8 @@ I dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{
 'prefs-watchlist-token' => 'Token osservati speciali:',
 'prefs-misc' => 'Varie',
 'prefs-resetpass' => 'Cambia password',
-'prefs-changeemail' => 'Modifica e-mail',
-'prefs-setemail' => 'Imposta un indirizzo e-mail',
+'prefs-changeemail' => 'Modifica email',
+'prefs-setemail' => 'Imposta un indirizzo email',
 'prefs-email' => 'Opzioni email',
 'prefs-rendering' => 'Aspetto',
 'saveprefs' => 'Salva le preferenze',
@@ -1482,10 +1482,10 @@ Il software utilizza questo valore per rivolgersi a te e menzionarti agli altri
 Questa informazione sarà pubblica.",
 'email' => 'Indirizzo email',
 'prefs-help-realname' => "L'indicazione del proprio nome vero è opzionale; se si sceglie di inserirlo, verrà utilizzato per attribuire la paternità dei contenuti inviati.",
-'prefs-help-email' => "L'inserimento del proprio indirizzo e-mail è facoltativo, ma permette di ricevere la propria password qualora venisse dimenticata.",
+'prefs-help-email' => "L'inserimento del proprio indirizzo email è facoltativo, ma permette di ricevere la propria password qualora venisse dimenticata.",
 'prefs-help-email-others' => 'Puoi anche scegliere di lasciare che gli altri ti contattino via posta elettronica con un collegamento dalla tua pagina utente o di discussione.
 Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
-'prefs-help-email-required' => 'Indirizzo e-mail obbligatorio.',
+'prefs-help-email-required' => "L'indirizzo email è obbligatorio.",
 'prefs-info' => 'Informazioni di base',
 'prefs-i18n' => 'Internazionalizzazione',
 'prefs-signature' => 'Firma',
@@ -1694,14 +1694,26 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
 'recentchanges-legend-heading' => "'''Legenda:'''",
 'recentchanges-legend-newpage' => "(vedi anche [[Special:NewPages|l'elenco delle nuove pagine]])",
 'recentchanges-legend-plusminus' => "(''±123'')",
-'rcnotefrom' => "Di seguito sono elencate le modifiche apportate a partire da '''$2''' (fino a '''$1''').",
+'rcnotefrom' => 'Di seguito sono elencate le modifiche apportate a partire da <strong>$2</strong> (mostrate fino a <strong>$1</strong>).',
 'rclistfrom' => 'Mostra le modifiche apportate a partire da $1',
 'rcshowhideminor' => '$1 le modifiche minori',
+'rcshowhideminor-show' => 'Mostra',
+'rcshowhideminor-hide' => 'Nascondi',
 'rcshowhidebots' => '$1 i bot',
+'rcshowhidebots-show' => 'Mostra',
+'rcshowhidebots-hide' => 'Nascondi',
 'rcshowhideliu' => '$1 gli utenti registrati',
+'rcshowhideliu-show' => 'Mostra',
+'rcshowhideliu-hide' => 'Nascondi',
 'rcshowhideanons' => '$1 gli utenti anonimi',
+'rcshowhideanons-show' => 'Mostra',
+'rcshowhideanons-hide' => 'Nascondi',
 'rcshowhidepatr' => '$1 le modifiche verificate',
+'rcshowhidepatr-show' => 'Mostra',
+'rcshowhidepatr-hide' => 'Nascondi',
 'rcshowhidemine' => '$1 le mie modifiche',
+'rcshowhidemine-show' => 'Mostra',
+'rcshowhidemine-hide' => 'Nascondi',
 'rclinks' => 'Mostra le $1 modifiche più recenti apportate negli ultimi $2 giorni<br />$3',
 'diff' => 'diff',
 'hist' => 'cron',
@@ -1818,6 +1830,8 @@ Se si dispone dell'immagine nella risoluzione originale, si prega di caricarla.
 '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.',
+'uploadscriptednamespace' => "Questo file SVG contiene un namespace '$1' non consentito",
+'uploadinvalidxml' => 'Il codice XML nel file caricato non può essere elaborato.',
 'uploadvirus' => 'Questo file contiene un virus! Dettagli: $1',
 'uploadjava' => "Questo file è un file ZIP che contiene un file .class Java.
 Carica i file Java non è consentito, perché possono causare l'aggiramento delle restrizioni di sicurezza.",
@@ -2189,6 +2203,7 @@ I redirect <del>cancellati</del> sono stati corretti.',
 'protectedpages-timestamp' => 'Data e ora',
 'protectedpages-page' => 'Pagina',
 'protectedpages-expiry' => 'Scadenza',
+'protectedpages-performer' => "Protetta dall'utente",
 'protectedpages-params' => 'Parametri di protezione',
 'protectedpages-reason' => 'Motivo',
 'protectedpages-unknown-timestamp' => 'Sconosciuto',
@@ -2466,7 +2481,7 @@ Consultare il log delle $2 per un elenco delle pagine cancellate di recente.',
 'delete-edit-reasonlist' => 'Modifica i motivi di cancellazione',
 'delete-toobig' => 'La cronologia di questa pagina è molto lunga (oltre $1 {{PLURAL:$1|revisione|revisioni}}). La sua cancellazione è stata limitata per evitare di creare accidentalmente dei problemi di funzionamento al database di {{SITENAME}}.',
 'delete-warning-toobig' => 'La cronologia di questa pagina è molto lunga (oltre $1 {{PLURAL:$1|revisione|revisioni}}). La sua cancellazione può creare dei problemi di funzionamento al database di {{SITENAME}}; procedere con cautela.',
-'deleting-backlinks-warning' => "'''Attenzione:''' altre pagine contengono collegamenti o inclusioni alla pagina che stai per cancellare.",
+'deleting-backlinks-warning' => "'''Attenzione:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|altre pagine]] contengono collegamenti o inclusioni alla pagina che stai per cancellare.",
 
 # Rollback
 'rollback' => 'Annulla le modifiche',
@@ -2635,8 +2650,10 @@ $1',
 'sp-contributions-blocked-notice' => "Questo utente è attualmente bloccato. L'ultimo elemento del registro dei blocchi è riportato di seguito per informazione:",
 'sp-contributions-blocked-notice-anon' => "Questo indirizzo IP è attualmente bloccato. Di seguito è riportato l'ultimo elemento del registro dei blocchi:",
 'sp-contributions-search' => 'Ricerca contributi',
+'sp-contributions-suppresslog' => 'contributi utente soppressi',
 'sp-contributions-username' => 'Indirizzo IP o nome utente:',
 'sp-contributions-toponly' => 'Mostra solo i contributi che sono le ultime revisioni per la pagina',
+'sp-contributions-newonly' => 'Visualizza solo le modifiche che sono creazioni di pagina',
 'sp-contributions-submit' => 'Ricerca',
 
 # What links here
@@ -3068,6 +3085,7 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 'tooltip-undo' => '"Annulla" permette di annullare questa modifica e apre il modulo di modifica in modalità di anteprima. Permette di inserire una motivazione nell\'oggetto della modifica.',
 'tooltip-preferences-save' => 'Salva le preferenze',
 'tooltip-summary' => 'Inserire una breve sintesi',
+'interlanguage-link-title' => '$1 - $2',
 
 # Stylesheets
 'common.css' => '/* Gli stili CSS inseriti qui si applicano a tutte le skin */',
@@ -4171,6 +4189,4 @@ vale a dire praticamente tutto ciò che si trova tra doppie parentesi graffe.',
 'expand_templates_generate_rawhtml' => 'Mostra HTML',
 'expand_templates_preview' => 'Anteprima',
 
-# Unknown messages
-'uploadinvalidxml' => 'Il codice XML nel file caricato non può essere elaborato.',
 );
index 4782f9f..e4d0064 100644 (file)
@@ -48,6 +48,7 @@
  * @author Reedy
  * @author Schu
  * @author Shirayuki
+ * @author Sonicarts
  * @author Suisui
  * @author VZP10224
  * @author Vigorous action
@@ -406,7 +407,6 @@ $messages = array(
 'tog-ccmeonemails' => '他の利用者に送信したメールの控えを自分にも送信',
 'tog-diffonly' => '差分の下にページ内容を表示しない',
 'tog-showhiddencats' => '隠しカテゴリを表示',
-'tog-noconvertlink' => 'リンクタイトル変換を無効にする',
 'tog-norollbackdiff' => '巻き戻し後の差分を表示しない',
 'tog-useeditwarning' => '変更を保存せずに編集画面から離れようとしたら警告',
 'tog-prefershttps' => 'ログインする際、常に SSL (https) 接続を使用する',
@@ -958,7 +958,7 @@ $1待ってから再度試してください。',
 'resetpass-temp-password' => '仮パスワード:',
 'resetpass-abort-generic' => '拡張機能により、パスワードの変更は取り消されました。',
 'resetpass-expired' => 'パスワードの有効期限が切れました。ログインするには新しいパスワードを設定してください。',
-'resetpass-expired-soft' => 'ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\81®æ\9c\89å\8a¹æ\9c\9fé\99\90ã\81\8cå\88\87ã\82\8cã\81\9fã\81\9fã\82\81ã\80\81å\86\8d設å®\9aã\81\99ã\82\8bå¿\85è¦\81ã\81\8cã\81\82ã\82\8aã\81¾ã\81\99ã\80\82æ\96°ã\81\97ã\81\84ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82\92ä»\8aã\81\99ã\81\90設å®\9aã\81\99ã\82\8bã\81\8bã\80\81ã\81¾ã\81\9fã\81¯ã\82­ã\83£ã\83³ã\82»ã\83«をクリックしてあとで再設定してください。',
+'resetpass-expired-soft' => 'ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\81®æ\9c\89å\8a¹æ\9c\9fé\99\90ã\81\8cå\88\87ã\82\8cã\81\9fã\81\9fã\82\81ã\80\81å\86\8d設å®\9aã\81\99ã\82\8bå¿\85è¦\81ã\81\8cã\81\82ã\82\8aã\81¾ã\81\99ã\80\82æ\96°ã\81\97ã\81\84ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82\92ä»\8aã\81\99ã\81\90設å®\9aã\81\99ã\82\8bã\81\8bã\80\81ã\81¾ã\81\9fã\81¯ã\80\8c{{int:resetpass-submit-cancel}}ã\80\8dをクリックしてあとで再設定してください。',
 
 # Special:PasswordReset
 'passwordreset' => 'パスワードの再設定',
@@ -1509,7 +1509,7 @@ $1',
 'searchrelated' => '関連',
 'searchall' => 'すべて',
 'showingresults' => '<strong>$2</strong> 件目以降の最大 {{PLURAL:$1|<strong>$1</strong> 件の結果}}を表示しています。',
-'showingresultsinrange' => '<strong>$2</strong> 件目以降の最大 {{PLURAL:$1|<strong>$1</strong> 件の結果}}を表示しています。',
+'showingresultsinrange' => '<strong>$2</strong> 件目から<strong>$3</strong> 件目までの範囲内で最大 {{PLURAL:$1|<strong>$1</strong> 件の結果}}を表示しています。',
 'showingresultsnum' => '<strong>$2</strong> 件目以降の {{PLURAL:$3|<strong>$3</strong> 件の結果}}を表示しています。',
 'showingresultsheader' => '「<strong>$4</strong>」の検索結果 {{PLURAL:$5|<strong>$3</strong> 件中の <strong>$1</strong> 件目|<strong>$3</strong> 件中の <strong>$1</strong> 件目から <strong>$2</strong> 件目}}',
 'search-nonefound' => '問い合わせに合致する検索結果はありませんでした。',
@@ -1837,13 +1837,25 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'recentchanges-legend-newpage' => '([[Special:NewPages|新しいページ一覧]]も参照)',
 'recentchanges-legend-plusminus' => '(<em>±123</em>)',
 'rcnotefrom' => '以下は<strong>$2</strong>以降の更新です (最大 <strong>$1</strong> 件)。',
-'rclistfrom' => '$1以降の更新を表示する',
+'rclistfrom' => '$2 $3以降の更新を表示する',
 'rcshowhideminor' => '細部の編集を$1',
+'rcshowhideminor-show' => '表示',
+'rcshowhideminor-hide' => '非表示',
 'rcshowhidebots' => 'ボットを$1',
+'rcshowhidebots-show' => '表示',
+'rcshowhidebots-hide' => '非表示',
 'rcshowhideliu' => '登録利用者を$1',
+'rcshowhideliu-show' => '表示',
+'rcshowhideliu-hide' => '非表示',
 'rcshowhideanons' => '匿名利用者を$1',
+'rcshowhideanons-show' => '表示',
+'rcshowhideanons-hide' => '非表示',
 'rcshowhidepatr' => '巡回された編集を$1',
+'rcshowhidepatr-show' => '表示',
+'rcshowhidepatr-hide' => '非表示',
 'rcshowhidemine' => '自分の編集を$1',
+'rcshowhidemine-show' => '表示',
+'rcshowhidemine-hide' => '非表示',
 'rclinks' => '最近 $2 日間の更新を最大 $1 件表示<br />$3',
 'diff' => '差分',
 'hist' => '履歴',
@@ -1981,6 +1993,8 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'php-uploaddisabledtext' => 'ファイルのアップロードがPHPで無効化されています。
 file_uploadsの設定を確認してください。',
 'uploadscripted' => 'このファイルは、ウェブブラウザーが誤って解釈してしまうおそれがあるHTMLまたはスクリプトコードを含んでいます。',
+'uploadscriptednamespace' => 'この SVG ファイルは無効な名前空間「$1」を含んでいます',
+'uploadinvalidxml' => 'アップロードされたファイルに含まれる XML が構文解析できませんでした。',
 'uploadvirus' => 'このファイルはウイルスを含んでいます!
 詳細: $1',
 'uploadjava' => 'このファイルは、Javaの.classファイルを含むZIPファイルです。
@@ -2365,8 +2379,11 @@ contenttype/subtypeの形式で入力してください (例: <code>image/jpeg</
 'protectedpages-timestamp' => '日時',
 'protectedpages-page' => 'ページ',
 'protectedpages-expiry' => '有効期限',
+'protectedpages-performer' => '保護の実行者',
+'protectedpages-params' => '保護のパラメーター',
 'protectedpages-reason' => '理由',
 'protectedpages-unknown-timestamp' => '不明',
+'protectedpages-unknown-performer' => '不明な利用者',
 'protectedtitles' => '作成保護されているページ名',
 'protectedtitles-summary' => 'このページでは、現時点で新規作成が禁止されているページ名を列挙します。保護されている既存のページの一覧は、[[{{#special:ProtectedPages}}]] を参照してください。',
 'protectedtitlesempty' => 'これらの引数で現在保護されているページはありません。',
@@ -2647,7 +2664,7 @@ $UNWATCHURL
 'delete-warning-toobig' => 'このページには、 $1版を超える編集履歴があります。
 削除すると、{{SITENAME}}のデータベース処理に大きな負荷がかかります。
 十分に注意してください。',
-'deleting-backlinks-warning' => "'''警告:''' 削除しようとしているページは、他のページからリンクまたは参照読み込みされています。",
+'deleting-backlinks-warning' => "'''警告:''' 削除しようとしているページは、[[Special:WhatLinksHere/{{FULLPAGENAME}}|他のページ]]からリンクまたは参照読み込みされています。",
 
 # Rollback
 'rollback' => '編集を巻き戻し',
@@ -2830,8 +2847,10 @@ $1',
 'sp-contributions-blocked-notice-anon' => 'このIPアドレスは現在ブロックされています。
 参考のために最近のブロック記録項目を以下に表示します:',
 'sp-contributions-search' => '投稿の検索',
+'sp-contributions-suppresslog' => '利用者の秘匿された投稿',
 'sp-contributions-username' => 'IPアドレスまたは利用者名:',
 'sp-contributions-toponly' => '最新版の編集のみを表示',
+'sp-contributions-newonly' => 'ページ作成を伴う編集のみを表示',
 'sp-contributions-submit' => '検索',
 
 # What links here
@@ -3185,7 +3204,7 @@ $2',
 一時フォルダーがありません。',
 'import-parse-failure' => 'XML取り込みの構文解析に失敗しました',
 'import-noarticle' => '取り込むページがありません!',
-'import-nonewrevisions' => 'すべての版は以前に取り込み済みです。',
+'import-nonewrevisions' => '版のインポートはされませんでした(すべての版が以前に取り込み済みだったか、エラーにより飛ばされたため)。',
 'xml-error-string' => '$1、$2 行の $3 文字目 ($4バイト目): $5',
 'import-upload' => 'XMLデータをアップロード',
 'import-token-mismatch' => 'セッションデータを損失しました。
@@ -4360,13 +4379,13 @@ MediaWikiは、有用であることを期待して配布されていますが
 'dberr-cachederror' => 'これは要求されたページをキャッシュした複製であり、古くなっている可能性があります。',
 
 # HTML forms
-'htmlform-invalid-input' => '入力に何らかの問題があります',
+'htmlform-invalid-input' => '入力に何らかの問題があります',
 'htmlform-select-badoption' => '指定した値は有効な選択肢ではありません。',
 'htmlform-int-invalid' => '指定した値は整数ではありません。',
 'htmlform-float-invalid' => '指定した値は数値ではありません。',
-'htmlform-int-toolow' => '指定した値は、最小値 $1 より小さい値です',
-'htmlform-int-toohigh' => '指定した値は、最大値 $1 を超えています',
-'htmlform-required' => 'この値は必須です',
+'htmlform-int-toolow' => '指定した値は、最小値 $1 より小さい値です',
+'htmlform-int-toohigh' => '指定した値は、最大値 $1 を超えています',
+'htmlform-required' => 'この値は必須です',
 'htmlform-submit' => '送信',
 'htmlform-reset' => '変更を取り消す',
 'htmlform-selectorother-other' => 'その他',
@@ -4524,6 +4543,4 @@ MediaWikiは、有用であることを期待して配布されていますが
 'expand_templates_generate_rawhtml' => 'HTML ソースを表示',
 'expand_templates_preview' => 'プレビュー',
 
-# Unknown messages
-'uploadinvalidxml' => 'アップロードされたファイルに含まれる XML が構文解析できませんでした。',
 );
index 670622c..f0a7f2e 100644 (file)
@@ -19,6 +19,7 @@
  * @author Malafaya
  * @author Nemo bis
  * @author Nodar Kherkheulidze
+ * @author Otogi
  * @author Reedy
  * @author Sopho
  * @author Temuri rajavi
@@ -205,7 +206,6 @@ $messages = array(
 'tog-ccmeonemails' => 'გამომიგზავნე ელფოსტების ასლები, რომლებსაც მე სხვა მომხმარებლებს ვუგზავნი',
 'tog-diffonly' => 'დამალე გვერდის შიგთავსი ცვლილების ქვევით',
 'tog-showhiddencats' => 'დამალული კატეგორიების ჩვენება',
-'tog-noconvertlink' => 'სათაურის გარდაქმნის ბმულის გამორთვა',
 'tog-norollbackdiff' => 'გაუქმებისას გამოტოვეთ ცვლილებათა განსხვავება',
 'tog-useeditwarning' => 'გამაფრთხილე, როდესაც დავტოვებ რედაქტირებად გვერდს, დაუმახსოვრებელი ცვლილებებით',
 'tog-prefershttps' => 'უსაფრთხო კავშირის მუდამ გამოყენება ავტორიზაციის შემდეგ',
@@ -940,7 +940,7 @@ $2
 ზედა ტექსტური ველი შეიცავს გვერდის შიგთავსს მისი ამჟამინდელი სახით.
 თქვენი ცვლილებები ნაჩვენებია ქვედა ტექსტურ ველში.
 თქვენ მოგიწევთ თქვენი ცვლილებების შერწყმა არსებულ ტექსტთან.
-'''მხოლოდ''' ზედა ველში არსებული ტექსტი იქნება შენახული, როდესაც \"{{int:savearticle}}\" დააჭერთ.",
+'''მხოლოდ''' ზედა ველში არსებული ტექსტი იქნება შენახული, როდესაც „{{int:savearticle}}“ დააჭერთ.",
 'yourtext' => 'თქვენი ტექსტი',
 'storedversion' => 'შენახული ვერსია',
 'nonunicodebrowser' => "'''გაფრთხილება: თქვენი ბრაუზერი უნიკოდთან თავსებადი არ არის. ჩვენ ვცდილობთ ამ პრობლემის გადაჭრას, რათა თქვენ შეძლოთ უსაფრთხოდ შეიტანოთ ცვლილებები გვერდებზე: არა-ASCII ნიშნები რედაქტირების ფანჯარაში გამოჩნდება როგორც ჰექსადეციმალური კოდები.'''",
@@ -1215,7 +1215,7 @@ $1",
 
 # Search results
 'searchresults' => 'ძიების შედეგები',
-'searchresults-title' => 'ძიების შედეგები "$1"',
+'searchresults-title' => 'ძიების შედეგები „$1“',
 'toomanymatches' => 'ნაპოვნია ძალიან ბევრი შესაბამისობა, ეცადეთ სხვა მოთხოვნა',
 'titlematches' => 'სტატიის სათაური შეესაბამება',
 'textmatches' => 'გვერდის ტექსტი შესაბამისია',
@@ -4061,11 +4061,18 @@ MediaWiki ვრცელდება იმ იმედით, რომ ი
 'rotate-comment' => 'სურათი მოტრიალებულია $1 {{PLURAL:$1|გრადუსით|გრადუსით}} საათის ისრის მიმართულებით',
 
 # Limit report
+'limitreport-title' => 'მონაცემების პროფილური ანალიზატორი:',
+'limitreport-cputime' => 'პროცესორის დროის გამოყენება',
 'limitreport-cputime-value' => '$1 {{PLURAL:$1|წამი}}',
 'limitreport-walltime' => 'რეალურ დროში გამოყენება',
 'limitreport-walltime-value' => '$1 {{PLURAL:$1|წამი}}',
+'limitreport-ppvisitednodes' => 'პრეპროცესორის მიერ მონახულებადი კვანძების რაოდენობა',
+'limitreport-postexpandincludesize' => 'ღია ჩართვების ზომა',
 'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|ბაიტი}}',
+'limitreport-templateargumentsize' => 'თარგის არგუმენტის ზომა',
 'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|ბაიტი}}',
+'limitreport-expansiondepth' => 'გაფართოების უდიდესი სიღრმე',
+'limitreport-expensivefunctioncount' => 'ანალიზატორის „ძვირი“ ფუნქციის რაოდენობა',
 
 # Special:ExpandTemplates
 'expandtemplates' => 'გაშლილი თარგები',
index 50561cc..52a07eb 100644 (file)
@@ -1550,6 +1550,7 @@ Ilaq ad ssutereḍ i yiwen aterras ma yezmer ad yessenqed aɣmis n ufaylu agi ye
 'uploaddisabledtext' => 'Azen n ifuyla yettwakkes deg wiki agi.',
 'php-uploaddisabledtext' => 'Taktert n ifuyla tensa deg PHP. Selken taxtiṛit n tawila  file_uploads.',
 'uploadscripted' => 'Afaylu-yagi yesɛa angal n HTML/script i yexdem agula deg browser/explorateur.',
+'uploadinvalidxml' => 'XML deg ufaylu yekteren ur d-yetwesleḍ ara.',
 'uploadvirus' => 'Afaylu-nni yesɛa anfafad asenselkim (virus)! Ẓer kter: $1',
 'uploadjava' => 'Wagi d afaylu ZIP yesɛan afaylu Java .class.
 Azdam n ifuyla Java ur yesɛa ara turagt, acku zemren ad zizdewen ikyafen n taɣellist.',
@@ -3868,6 +3869,4 @@ Yetexddem aderrec n akkw ayen yella yesegrer s <nowiki>'''{{ }}'''</nowiki>.",
 'expand_templates_generate_rawhtml' => 'Beqqeḍ HTML aneṣli',
 'expand_templates_preview' => 'Azaraskan',
 
-# Unknown messages
-'uploadinvalidxml' => 'XML deg ufaylu yekteren ur d-yetwesleḍ ara.',
 );
index 555af82..119719e 100644 (file)
@@ -388,18 +388,18 @@ $messages = array(
 'tog-fancysig' => 'Қолтаңбаны уикимәтін ретінде қарастыру (автоматты сілтеме қойылмайды)',
 'tog-uselivepreview' => 'Тура қарап шығуды қолдану (сынақтық)',
 'tog-forceeditsummary' => 'Өңдеменің қысқаша мазмұндамасы бос қалғанда маған ескерт',
-'tog-watchlisthideown' => 'Өңдемелерімді бақылау тізімінен жасыр',
-'tog-watchlisthidebots' => 'Бот өңдемелерін бақылау тізімінен жасыр',
+'tog-watchlisthideown' => 'Өңдемелерімді бақылау тізімінен жасыру',
+'tog-watchlisthidebots' => 'Бот өңдемелерін бақылау тізімінен жасыру',
 'tog-watchlisthideminor' => 'Шағын өңдемелерді бақылау тізімінде көрсетпеу',
 'tog-watchlisthideliu' => 'Бақылау тізіміндегі қатысушылардың өңдеулерін көрсетпеу',
 'tog-watchlisthideanons' => 'Бақылау тізіміндегі жасырын қатысушылардың өңдеулерін көрсетпеу',
 'tog-watchlisthidepatrolled' => 'Бақылау тізімінде тексерілген өңдеулерді көрсетпеу',
 'tog-ccmeonemails' => 'Басқа қатысушыға жіберген хатымның көшірмесін маған да жөнелт',
-'tog-diffonly' => 'Ð\90йÑ\8bÑ\80ма Ð°Ñ\81Ñ\82Ñ\8bнда Ð±ÐµÑ\82 Ð¼Ð°Ò\93лұмаÑ\82Ñ\8bн ÐºÓ©Ñ\80Ñ\81еÑ\82пе',
+'tog-diffonly' => 'Ð\9dÒ±Ñ\81Ò\9bалаÑ\80 Ð°Ð¹Ñ\8bÑ\80маÑ\88Ñ\8bлÑ\8bÒ\9bÑ\82аÑ\80Ñ\8bнÑ\8bÒ£ Ð°Ñ\81Ñ\82Ñ\8bнда Ð±ÐµÑ\82 Ð¼Ð°Ò\93лұмаÑ\82Ñ\8bн ÐºÓ©Ñ\80Ñ\81еÑ\82пеÑ\83',
 'tog-showhiddencats' => 'Жасырын санаттарды көрсету',
-'tog-noconvertlink' => 'Сілтеме атауларын ауыстырма',
 'tog-norollbackdiff' => 'Шегіндіруден кейін нұсқалардың айырмашылығын көрсетпеу',
 'tog-useeditwarning' => 'Өңдемесі сақталмаған парақшадан шығар кезде ескерту',
+'tog-prefershttps' => 'Кірген кезде қауіпсіз байлануды әрқашан қолдану',
 
 'underline-always' => 'Әрқашан',
 'underline-never' => 'Ешқашан',
@@ -1433,6 +1433,7 @@ $1",
 'yourrealname' => 'Нақты атыңыз:',
 'yourlanguage' => 'Тіліңіз:',
 'yourvariant' => 'Жазба тілінің нұсқалары:',
+'prefs-help-variant' => 'Қалаған нұсқаңыз немесе орфография бұл уикидің контент беттерінде көрсетіледі.',
 'yournick' => 'Жаңа қолтаңбаңыз:',
 'prefs-help-signature' => 'Талқылау беттерінде хабарыңыздан кейін "<nowiki>~~~~</nowiki>" белгісін қалдырсаңыз, бұл қолтаңбаңызбен сол кездегі датаға ауыстырылады.',
 'badsig' => 'Қам қолтаңбаңыз жарамсыз; HTML белгішелерін тексеріңіз.',
@@ -1448,6 +1449,8 @@ $1",
 'prefs-help-realname' => 'Нақты атыңыз міндетті емес.
 Егер бұны жетістіруді таңдасаңыз, бұл түзетуіңіздің ауторлығын анықтау үшін қолданылады.',
 'prefs-help-email' => 'Электронды поштаңыздың мекенжайын көрсету міндетті емес, бірақ құпия сөзіңізді ұмытқан жағдайда керек болады.',
+'prefs-help-email-others' => 'Кейде қатысушы немесе талқылау бетіңізге е-пошта мекенжайы сілтемесін көрсету арқылы басқалармен байланыса аласыз.
+Е-пошта мекенжайыныңыз басқа қатысушылар сізбен байланысқан кезде көрсетілмейді',
 'prefs-help-email-required' => 'Е-пошта мекенжайы керек.',
 'prefs-info' => 'Негізгі мәлімет',
 'prefs-i18n' => 'Тіл туралы мәлімет',
@@ -1465,6 +1468,7 @@ $1",
 'prefs-displaysearchoptions' => 'Көрсету бапталымдары',
 'prefs-displaywatchlist' => 'Көрсету бапталымдары',
 'prefs-diffs' => 'Айырмашылықтар',
+'prefs-help-prefershttps' => 'Бұл баптауды келесі кіргеніңізде әсерін көре аласыз.',
 
 # User preference: email validation using jQuery
 'email-address-validity-invalid' => 'Жарамсыз электронды пошта мекен-жайын енгізіңіз',
@@ -1652,11 +1656,16 @@ $1",
 'rcnotefrom' => "Төменде '''$2''' кезінен бергі ('''$1''' жеткенше дейін) өзгерістер көрсетіледі.",
 'rclistfrom' => '$1 кезінен бергі жаңа өзгерістерді көрсет.',
 'rcshowhideminor' => 'Шағын өңдемелерді $1',
+'rcshowhideminor-hide' => 'жасыру',
 'rcshowhidebots' => 'Боттарды $1',
+'rcshowhidebots-show' => 'көрсету',
 'rcshowhideliu' => 'Тіркелгендерді $1',
+'rcshowhideliu-hide' => 'жасыру',
 'rcshowhideanons' => 'Кірмегендерді $1',
+'rcshowhideanons-hide' => 'жасыру',
 'rcshowhidepatr' => 'Зерттелген өңдемелерді $1',
 'rcshowhidemine' => 'Өңдемелерімді $1',
+'rcshowhidemine-hide' => 'жасыру',
 'rclinks' => 'Соңғы $2 күнде болған, соңғы $1 өзгерісті көрсет<br />$3',
 'diff' => 'айырм.',
 'hist' => 'тарихы',
@@ -2946,7 +2955,7 @@ $2',
 
 # Skin names
 'skinname-cologneblue' => 'Көк зеңгірлігі (cologneblue)',
-'skinname-monobook' => 'Ð\94аÑ\80а кітап (monobook)',
+'skinname-monobook' => 'Ð\96еке кітап (monobook)',
 'skinname-modern' => 'Заманауи (modern)',
 
 # Patrolling
@@ -3536,7 +3545,7 @@ $5
 'iranian-calendar-m9' => 'азар',
 'iranian-calendar-m10' => 'ди',
 'iranian-calendar-m11' => 'бемін',
-'iranian-calendar-m12' => 'аспанд',
+'iranian-calendar-m12' => 'аспанд (Иран күнтізбесі)',
 
 # Hebrew month names
 'hebrew-calendar-m1' => 'тішри',
@@ -3546,7 +3555,7 @@ $5
 'hebrew-calendar-m5' => 'шыбат',
 'hebrew-calendar-m6' => 'адар',
 'hebrew-calendar-m6a' => 'адар',
-'hebrew-calendar-m6b' => 'уадар',
+'hebrew-calendar-m6b' => 'Адар II (иврит күнтізбесі)',
 'hebrew-calendar-m7' => 'нисан',
 'hebrew-calendar-m8' => 'аяр',
 'hebrew-calendar-m9' => 'сиуан',
index e6329fc..b9358f0 100644 (file)
@@ -660,6 +660,7 @@ $2',
 'invalidtitle-unknownnamespace' => 'ចំណងជើងមិនត្រឹមត្រូវដែលមានលំហឈ្មោះមិនស្គាល់លេខ $1 និងអត្ថបទ "$2"',
 'exception-nologin' => 'មិនទាន់កត់ឈ្មោះចូលទេ',
 'exception-nologin-text' => 'សូម[[Special:Userlogin|lកត់ឈ្មោះចូល]]ដើម្បីចូលអានទំព័រឬធ្វើសកម្មភាពនេះ។',
+'exception-nologin-text-manual' => 'សូម $1 ដើម្បីអាចចូលមើលទំព័រនេះឬធ្វើសកម្មភាពអ្វីមួយ។',
 
 # Virus scanner
 'virus-badscanner' => "ការ​កំណត់​រចនា​សម្ព័ន្ធ​មិន​ល្អ​៖ កម្មវិធី​ស្កេន​មេរោគមិន​ស្គាល់​៖ ''$1''",
@@ -710,6 +711,8 @@ $2',
 'userlogin-resetpassword-link' => 'អ្នកភ្លេចពាក្យសម្ងាត់ហើយ?',
 'helplogin-url' => 'Help:ការកត់ឈ្មោះចូល',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|ជំនួយក្នុងការកត់ឈ្មោះចូល]]',
+'userlogin-loggedin' => 'អ្នកបានកត់ឈ្មោះចូលជា {{GENDER:$1|$1}} ហើយ។
+ប្រើសំណុំបែបបទខាងក្រោមដើម្បីកត់ឈ្មោះចូលជាអ្នកប្រើប្រាស់ផ្សេងម្នាក់ទៀត។',
 'userlogin-createanother' => 'បង្កើតគណនីមួយទៀត',
 'createacct-join' => 'បំពេញព័ត៌មានរបស់អ្នកខាងក្រោម។',
 'createacct-another-join' => 'បញ្ចូលព័ត៌មានគណនីថ្មីខាងក្រោម។',
@@ -818,6 +821,9 @@ $2',
 'login-abort-generic' => 'អ្នកចុះឈ្មោះចូលមិនបានសម្រេចទេ។ ការចុះឈ្មោះចូលត្រូវបានបោះបង់។',
 'loginlanguagelabel' => 'ភាសា៖ $1',
 'createacct-another-realname-tip' => 'អ្នកអាចផ្ដល់ឈ្មោះពិតរបស់អ្នកក៏បានមិនផ្ដល់ក៏បាន។ បើអ្នកផ្ដល់ឱ្យ វានឹងត្រូវបានប្រើប្រាស់់ដើម្បីបញ្ជាក់ភាពជាម្ចាស់​លើការរួមចំណែក​នានា​របស់អ្នក។',
+'pt-login' => 'កត់ឈ្មោះចូល',
+'pt-createaccount' => 'បង្កើតគណនី',
+'pt-userlogout' => 'កត់ឈ្មោះចេញ',
 
 # Email sending
 'php-mail-error-unknown' => 'កំហុសមិនស្គាល់នៅក្នុងអនុគមន៍ mail() របស់ PHP',
@@ -826,9 +832,7 @@ $2',
 
 # Change password dialog
 'changepassword' => 'ប្តូរពាក្យសម្ងាត់',
-'resetpass_announce' => 'អ្នកបានកត់ឈ្មោះចូលដោយ​អក្សរកូដ​បណ្តោះអាសន្ន​មួយដែលយើងខ្ញុំបានអ៊ីមែលទៅឱ្យ​។
-
-ដើម្បី​បញ្ចប់​ការកត់ឈ្មោះចូល អ្នកត្រូវតែ​កំណត់​ពាក្យសម្ងាត់ថ្មី​មួយនៅទីនេះ៖',
+'resetpass_announce' => 'ដើម្បី​បញ្ចប់​ការកត់ឈ្មោះចូល អ្នកត្រូវតែ​កំណត់​ពាក្យសម្ងាត់ថ្មី​មួយ។',
 'resetpass_text' => '<!-- បន្ថែមឃ្លានៅទីនេះ -->',
 'resetpass_header' => 'ប្ដូរ​ពាក្យសម្ងាត់​គណនី',
 'oldpassword' => 'ពាក្យសម្ងាត់ចាស់៖',
@@ -836,6 +840,8 @@ $2',
 'retypenew' => 'សូមវាយពាក្យសម្ងាត់ថ្មី​ម្តងទៀត៖',
 'resetpass_submit' => 'ដាក់ប្រើពាក្យសម្ងាត់និង​កត់ឈ្មោះចូល',
 'changepassword-success' => 'ពាក្យសម្ងាត់របស់អ្នកត្រូវបានផ្លាស់ប្តូរបានសំរេចហើយ!',
+'changepassword-throttled' => 'អ្នកបានព្យាយាមកត់ឈ្មោះចូលជាប់ៗគ្នាច្រើនដងពេកហើយ។​
+សូមរង់ចាំរយៈពេល$1 មុនពេលសាកល្បងម្ដងទៀត។',
 'resetpass_forbidden' => 'ពាក្យសម្ងាត់មិនអាចផ្លាស់ប្តូរបានទេ',
 'resetpass-no-info' => 'អ្នក​ចាំបាច់​ត្រូវតែ​កត់ឈ្មោះចូល ដើម្បី​ចូលទៅកាន់​ទំព័រ​នេះ​ដោយផ្ទាល់​។',
 'resetpass-submit-loggedin' => 'ប្តូរពាក្យសម្ងាត់',
@@ -843,7 +849,12 @@ $2',
 'resetpass-wrong-oldpass' => 'ពាក្យ​សម្ងាត់​បណ្ដោះ​អាសន្ន​ ឬ​បច្ចុប្បន្នមិន​ត្រឹមត្រូវ​។
 
 អ្នក​​ប្រហែល​ជា​បាន​ផ្លាស់​ប្ដូរ​ពាក្យសម្ងាត់​រួចហើយ ឬ​បានស្នើ​សុំ​ពាក្យ​សម្ងាត់​​បណ្ដោះ​អាសន្ន​​ថ្មី​មួយ​ហើយ។',
+'resetpass-recycled' => 'សូមកំណត់ពាក្យសម្ងាត់ថ្មីរបស់អ្នក ដែលខុសពីពាក្យសម្ងាត់បច្ចុប្បន្នរបស់អ្នក។',
+'resetpass-temp-emailed' => 'អ្នកបានកត់ឈ្មោះចូលដោយប្រើលេខកូដបណ្ដោះអាសន្នផ្ញើតាមអ៊ីមែល។
+ដើម្បីបញ្ចប់ការកត់ឈ្មោះចូល អ្នកចាំបាច់ត្រូវតែកំណត់ពាក្យសម្ងាត់ថ្មីនៅទីនេះ៖',
 'resetpass-temp-password' => 'ពាក្យសម្ងាត់បណ្តោះអាសន្ន:',
+'resetpass-expired' => 'ពាក្យសម្ងាត់របស់អ្នកហួសសុពលភាពហើយ។ សូមកំណត់ពាក្យសម្ងាត់ថ្មីដើម្បីកត់ឈ្មោះចូល។',
+'resetpass-expired-soft' => 'ពាក្យសម្ងាត់របស់អ្នកហួសសុពលភាពហើយ ហើយអ្នកត្រូវតែកំណត់វាឡើងវិញ។ សូមជ្រើសរើសពាក្យសម្ងាត់ថ្មីឥឡូវនេះ ឬចុចបោះបង់ដើម្បីកំណត់វានៅពេលក្រោយ។',
 
 # Special:PasswordReset
 'passwordreset' => 'កំណត់​ពាក្យសម្ងាត់​សាឡើងវិញ',
@@ -893,6 +904,8 @@ $2
 'changeemail-password' => 'ពាក្យសំងាត់{{SITENAME}}របស់អ្នក:',
 'changeemail-submit' => 'ផ្លាស់ប្ដូរអ៊ីមែល',
 'changeemail-cancel' => 'បោះបង់',
+'changeemail-throttled' => 'អ្នកបានព្យាយាមកត់ឈ្មោះចូលច្រើនដងពេកហើយ។​
+សូមរង់ចាំរយៈពេល$1 មុនពេលសាកល្បងម្ដងទៀត។',
 
 # Edit page toolbar
 'bold_sample' => 'អក្សរដិត',
@@ -1111,7 +1124,7 @@ $2
 'invalid-content-data' => 'ខ្លឹមសារទិន្នន័យគ្មានសុពលភាព',
 'content-not-allowed-here' => 'មិនអនុញ្ញាតិអោយសរសេរខ្លឹមសារ"$1" នៅលើទំព័រ [[$2]] ទេ។',
 'editwarning-warning' => 'ចាកចេញពីទំព័រនេះ នឹងធ្វើឲ្យអ្នកបាត់បង់កំណែប្រែដែលអ្នកបានធ្វើ។
-ប្រសិនបើអ្នកបាន​កត់ឈ្មោះចូលរួចហើយ អ្នកអាច​បិទ​បម្រាម​នេះ​នៅ​ក្នុងផ្នែក​ "កែប្រែ" នៃ​ចំណង់ចំណូល​ចិត្ត​របស់​អ្នក​។',
+ប្រសិនបើអ្នកបាន​កត់ឈ្មោះចូលរួចហើយ អ្នកអាច​បិទ​បម្រាម​នេះ​នៅ​ក្នុងផ្នែក​ "{{int:prefs-editing}}" នៃ​ចំណង់ចំណូល​ចិត្ត​របស់​អ្នក​។',
 
 # Content models
 'content-model-wikitext' => 'អត្ថបទវិគី',
@@ -1665,11 +1678,23 @@ $1",
 'rcnotefrom' => "ខាងក្រោមនេះជាបន្លាស់ប្ដូរនានាគិតចាប់តាំងពី '''$2''' (បង្ហាញអតិបរមាចំនួន '''$1''')។",
 'rclistfrom' => 'បង្ហាញបន្លាស់ប្ដូរថ្មីៗចាប់តាំងពី $1',
 'rcshowhideminor' => '$1កំណែប្រែ​តិចតួច',
+'rcshowhideminor-show' => 'បង្ហាញ​',
+'rcshowhideminor-hide' => 'លាក់',
 'rcshowhidebots' => '$1រូបយន្ត',
+'rcshowhidebots-show' => 'បង្ហាញ​',
+'rcshowhidebots-hide' => 'លាក់',
 'rcshowhideliu' => '$1អ្នកប្រើប្រាស់ដែលបានចុះឈ្មោះរួច',
+'rcshowhideliu-show' => 'បង្ហាញ',
+'rcshowhideliu-hide' => 'លាក់',
 'rcshowhideanons' => '$1អ្នកប្រើប្រាស់អនាមិក',
+'rcshowhideanons-show' => 'បង្ហាញ',
+'rcshowhideanons-hide' => 'លាក់',
 'rcshowhidepatr' => '$1កំណែប្រែដែលបានល្បាត',
+'rcshowhidepatr-show' => 'បង្ហាញ',
+'rcshowhidepatr-hide' => 'លាក់',
 'rcshowhidemine' => '$1កំណែប្រែរបស់ខ្ញុំ',
+'rcshowhidemine-show' => 'បង្ហាញ',
+'rcshowhidemine-hide' => 'លាក់',
 'rclinks' => 'បង្ហាញបន្លាស់ប្ដូរ$1ចុងក្រោយធ្វើឡើងក្នុងរយៈពេល$2ថ្ងៃចុងក្រោយ<br />$3',
 'diff' => 'ប្រៀបធៀប',
 'hist' => 'ប្រវត្តិ',
@@ -2119,9 +2144,20 @@ $1',
 'deadendpagestext' => 'ទំព័រដូចតទៅនេះមិនតភ្ជាប់ទៅទំព័រដទៃទៀតក្នុង {{SITENAME}} ទេ។',
 'protectedpages' => 'ទំព័រដែលត្រូវបានការពារ',
 'protectedpages-indef' => 'សំរាប់តែការការពារដែលមិនកំណត់ប៉ុណ្ណោះ',
+'protectedpages-summary' => 'ទំព័រនេះរាយបញ្ជីទំព័រដែលកំពុងត្រូវបានការពារ។ សម្រាប់បញ្ជីចំណងជើងទាំងឡាយដែលស្ថិននៅក្រោមការការពារមិនអោយបង្កើត សូមមើលនៅ [[{{#special:ProtectedTitles}}]]។',
 'protectedpages-cascade' => 'សំរាប់ការការពារជាថ្នាក់ប៉ុណ្ណោះ​',
+'protectedpages-noredirect' => 'លាក់ការបញ្ជូនបន្ត',
 'protectedpagesempty' => '​មិន​មាន​ទំព័រ​ណា​ដែល​ត្រូវបាន​ការពារ ជាមួយប៉ារ៉ាម៉ែត​ទាំងនេះទេ។',
+'protectedpages-timestamp' => 'ត្រាពេលវេលា',
+'protectedpages-page' => 'ទំព័រ',
+'protectedpages-expiry' => 'ផុតកំណត់',
+'protectedpages-performer' => 'អ្នកប្រើប្រាស់កំពុងការពារ',
+'protectedpages-params' => 'ប៉ារ៉ាម៉ែត្រនៃការការពារ',
+'protectedpages-reason' => 'មូល​ហេតុ',
+'protectedpages-unknown-timestamp' => 'មិនស្គាល់',
+'protectedpages-unknown-performer' => 'អ្នកប្រើប្រាស់មិនស្គាល់',
 'protectedtitles' => 'ចំណងជើងត្រូវបានការពារ',
+'protectedtitles-summary' => 'ទំព័រនេះរាយបញ្ជីចំណងជើងទាំងឡាយដែលស្ថិននៅក្រោមការការពារមិនអោយបង្កើត។ សម្រាប់បញ្ជីទំព័រដែលកំពុងត្រូវបានការពារ សូមមើលនៅ [[{{#special:ProtectedPages}}]]។',
 'protectedtitlesempty' => 'មិន​មាន​ចំណងជើង​ណា​ដែល​ត្រូវ​បាន​ការពារ​ជាមួយនឹង​ប៉ារ៉ាម៉ែត​ទាំងនេះ​ទេ​នាពេលថ្មីៗនេះ។',
 'listusers' => 'បញ្ជីអ្នកប្រើប្រាស់',
 'listusers-editsonly' => 'បង្ហាញតែអ្នកប្រើប្រាស់ដែលបានកែប្រែអត្ថបទប៉ុណ្ណោះ',
@@ -2812,6 +2848,7 @@ $1',
 'exportall' => 'នាំចេញទំព័រទាំងអស់',
 'exportnohistory' => "----
 '''សម្គាល់​:''' ការ​នាំ​ចេញ​នូវ​ប្រវត្តិ​នៃ​ទំព័រ​តាម​រយៈ​សំនុំ​បែប​បទ​នេះ​ មិនត្រូវ​បានអនុញ្ញាត​ដោយ​មូល​ហេតុ​ប៉ះ​ពាល់​ដល់​គុណភាព​ដំឡើរ​ការ​។",
+'exportlistauthors' => 'រួមបញ្ចូលបញ្ជីពេញលេញនៃអ្នករួមចំណែកសម្រាប់ទំព័រនីមួយៗ',
 'export-submit' => 'នាំចេញ',
 'export-addcattext' => 'បន្ថែមទំព័រនានាពីចំណាត់ថ្នាក់ក្រុម៖',
 'export-addcat' => 'បន្ថែម',
@@ -2834,13 +2871,17 @@ $1',
 'allmessages-prefix' => 'តម្រង​តាម​បុព្វបទ​៖',
 'allmessages-language' => 'ភាសា៖',
 'allmessages-filter-submit' => 'ទៅ',
+'allmessages-filter-translate' => 'បកប្រែ',
 
 # Thumbnails
 'thumbnail-more' => 'ពង្រីក',
 'filemissing' => 'ឯកសារបាត់បង់',
 'thumbnail_error' => 'កំហុស​បង្កើត​កូនរូបភាព៖ $1',
+'thumbnail_error_remote' => 'សារប្រាប់បញ្ហាបានពី $1: $2',
 'djvu_page_error' => 'ទំព័រ DjVu ក្រៅដែនកំណត់',
 'djvu_no_xml' => 'មិនអាចនាំយក XML សម្រាប់ឯកសារ DjVu',
+'thumbnail-temp-create' => 'មិនអាចបង្កើតឯកសារកូនរូបភាពបណ្ដោះអាសន្ន',
+'thumbnail-dest-create' => 'មិនអាចរក្សាទុកកូនរូបភាពនៅទីតាំងគោលដៅបានទេ',
 'thumbnail_invalid_params' => 'តួលេខ កូនទំព័រ គ្មានសុពលភាព',
 'thumbnail_dest_directory' => 'មិនអាចបង្កើតថតឯកសារតាមគោលដៅបានទេ',
 'thumbnail_image-type' => 'មិនស្គាល់ប្រើជាមួយឯកសារប្រភេទនេះទេ',
@@ -3711,6 +3752,7 @@ $5
 'logentry-newusers-newusers' => 'គណនីអ្នកប្រើប្រាស់ $1 {{GENDER:$2|ត្រូវបានបង្កើត}}',
 'logentry-newusers-create' => 'គណនីអ្នកប្រើប្រាស់ $1 {{GENDER:$2|ត្រូវបានបង្កើត}}',
 'logentry-newusers-create2' => 'គណនីអ្នកប្រើប្រាស់ $3 {{GENDER:$2|ត្រូវបានបង្កើត}} ដោយ $1',
+'logentry-newusers-byemail' => 'គណនីអ្នកប្រើប្រាស់ $3 ត្រូវបាន {{GENDER:$2|បង្កើត}} ដោយ $1 ហើយពាក្យសម្ងាត់ត្រូវបានផ្ញើរតាមអ៊ីមែល',
 'logentry-newusers-autocreate' => 'គណនីអ្នកប្រើប្រាស់ $1 {{GENDER:$2|ត្រូវបានបង្កើត}} ដោយស្វ័យប្រវត្តិ',
 'logentry-rights-rights' => '$1 {{GENDER:$2|បានផ្លាស់ប្ដូរ}}សមាជិកភាពរបស់ $3 ពី $4 ទៅជា $5',
 'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|បានផ្លាស់ប្ដូរ}}សមាជិកភាពរបស់ $3',
@@ -3723,6 +3765,9 @@ $5
 'feedback-cancel' => 'បោះបង់​',
 'feedback-submit' => 'ដាក់ស្នើមតិយោបល់',
 'feedback-adding' => 'កំពុងបន្ថែមមតិយោបល់ទៅលើទំព័រ...',
+'feedback-error1' => 'បញ្ហា៖ លទ្ធផលមិនស្គាល់ពី API',
+'feedback-error2' => 'បញ្ហា៖ កែប្រែមិនបានសម្រេច',
+'feedback-error3' => 'បញ្ហា៖ គ្មានចម្លើយតបពី API',
 'feedback-thanks' => 'សូមអរគុណ! មតិយោបល់របស់អ្នកត្រូវបានដាក់ផ្សាយនៅលើទំព័រ "[$2 $1]"។',
 'feedback-close' => 'រួចរាល់',
 
@@ -3769,6 +3814,12 @@ $5
 'duration-centuries' => '$1 {{PLURAL:$1|សតវត្សរ៍|សតវត្សរ៍}}',
 'duration-millennia' => '$1 {{PLURAL:$1|សហសវត្សរ៍|សហសវត្សរ៍}}',
 
+# Limit report
+'limitreport-cputime' => 'រយៈពេលប្រើប្រាស់ CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|វិនាទី|វិនាទី}}',
+'limitreport-walltime' => 'រយៈពេលប្រើប្រាស់ពិតប្រាកដ',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|វិនាទី|វិនាទី}}',
+
 # Special:ExpandTemplates
 'expandtemplates' => 'ពង្រីកទំព័រគំរូ',
 'expand_templates_input' => 'សរសេរឃ្លា',
index 9b4826d..9eb76f8 100644 (file)
@@ -399,7 +399,6 @@ $messages = array(
 'tog-ccmeonemails' => '이메일을 보낼 때 내 이메일로 복사본을 보내기',
 'tog-diffonly' => '편집 차이를 비교할 때 문서 내용을 보지 않기',
 'tog-showhiddencats' => '숨은 분류 보이기',
-'tog-noconvertlink' => '링크 제목 변환을 비활성화',
 'tog-norollbackdiff' => '되돌리기 후 차이를 보지 않기',
 'tog-useeditwarning' => '바꾼 내용을 저장하지 않고 편집 페이지를 벗어날 때 알림',
 'tog-prefershttps' => '로그인할 때 항상 보안 연결 사용',
@@ -913,6 +912,9 @@ $1 기다렸다가 다시 시도하세요.',
 'suspicious-userlogout' => '브라우저에 이상이 있거나 캐싱 프록시에서 로그아웃을 요청했기 때문에 로그아웃이 거부되었습니다.',
 'createacct-another-realname-tip' => '실명은 선택 사항입니다.
 실명을 입력하면 문서 기여에 사용자의 이름이 들어가게 됩니다.',
+'pt-login' => '로그인',
+'pt-createaccount' => '계정 만들기',
+'pt-userlogout' => '로그아웃',
 
 # Email sending
 'php-mail-error-unknown' => 'PHP의 mail() 함수에서 알 수 없는 오류가 발생했습니다.',
@@ -921,8 +923,7 @@ $1 기다렸다가 다시 시도하세요.',
 
 # Change password dialog
 'changepassword' => '비밀번호 바꾸기',
-'resetpass_announce' => '이메일로 받은 임시 비밀번호로 로그인했습니다.
-로그인을 마치려면 새 비밀번호를 여기에서 설정해야 합니다:',
+'resetpass_announce' => '로그인을 마치려면 새 비밀번호를 여기에서 설정해야 합니다:',
 'resetpass_text' => '<!-- 여기에 텍스트를 추가하세요 -->',
 'resetpass_header' => '비밀번호 바꾸기',
 'oldpassword' => '이전 비밀번호:',
@@ -938,8 +939,13 @@ $1 뒤에 다시 시도하세요.',
 'resetpass-submit-cancel' => '취소',
 'resetpass-wrong-oldpass' => '비밀번호가 잘못되었거나 현재의 비밀번호와 같습니다.
 이미 비밀번호를 성공적으로 바꾸었거나 새 임시 비밀번호를 요청했을 수 있습니다.',
+'resetpass-recycled' => '현재 비밀번호와 다른 비밀번호로 재설정해주세요.',
+'resetpass-temp-emailed' => '임시 이메일 코드로 로그인되어 있습니다.
+로그인을 마치려면 여기서 새로운 비밀번호를 설정해야 합니다:',
 'resetpass-temp-password' => '임시 비밀번호:',
 'resetpass-abort-generic' => '비밀번호 바꾸기가 확장 기능에 의해 중단되었습니다.',
+'resetpass-expired' => '비밀번호가 만료되었습니다. 로그인하려면 새로운 비밀번호를 설정해야 합니다.',
+'resetpass-expired-soft' => '비밀번호가 만료되어 재설정해야 합니다. 지금 새로운 비밀번호를 선택하거나, "{{int:resetpass-submit-cancel}}"를 클릭하고 나중에 재설정해주세요.',
 
 # Special:PasswordReset
 'passwordreset' => '비밀번호 재설정',
@@ -1808,14 +1814,26 @@ HTML 태그를 확인하세요.',
 'recentchanges-legend-heading' => "'''범례:'''",
 'recentchanges-legend-newpage' => '([[Special:NewPages|새 문서 목록]]도 보세요)',
 'recentchanges-legend-plusminus' => "(''±123'')",
-'rcnotefrom' => "다음은 '''$2'''에서부터 바뀐 문서 '''$1'''개입니다.",
+'rcnotefrom' => '다음은 <strong>$2</strong>에서부터 바뀐 문서 <strong>$1</strong>개입니다.',
 'rclistfrom' => '$1 이래로 새로 바뀐 문서 보기',
 'rcshowhideminor' => '사소한 편집을 $1',
+'rcshowhideminor-show' => '보이기',
+'rcshowhideminor-hide' => '숨기기',
 'rcshowhidebots' => '봇을 $1',
+'rcshowhidebots-show' => '보이기',
+'rcshowhidebots-hide' => '숨기기',
 'rcshowhideliu' => '등록된 사용자를 $1',
+'rcshowhideliu-show' => '보이기',
+'rcshowhideliu-hide' => '숨기기',
 'rcshowhideanons' => '익명 사용자를 $1',
+'rcshowhideanons-show' => '보이기',
+'rcshowhideanons-hide' => '숨기기',
 'rcshowhidepatr' => '순찰된 편집을 $1',
+'rcshowhidepatr-show' => '보이기',
+'rcshowhidepatr-hide' => '숨기기',
 'rcshowhidemine' => '내 편집을 $1',
+'rcshowhidemine-show' => '보이기',
+'rcshowhidemine-hide' => '숨기기',
 'rclinks' => '최근 $2일간의 $1개 바뀐 문서 보기<br />$3',
 'diff' => '비교',
 'hist' => '역사',
@@ -1947,6 +1965,8 @@ $2 {{PLURAL:$3|형식만 사용할 수 있습니다}}.',
 'uploaddisabledtext' => '파일 올리기 기능이 비활성화되어 있습니다.',
 'php-uploaddisabledtext' => 'PHP 파일 올리기가 비활성화되었습니다. 파일 올리기 설정을 확인하십시오.',
 'uploadscripted' => '이 파일에는 HTML이나 다른 스크립트 코드가 포함되어 있어, 웹 브라우저에서 오류를 일으킬 수 있습니다.',
+'uploadscriptednamespace' => "이 SVG 파일은 사용할 수 없는 이름공간 '$1'을 포함하고 있습니다.",
+'uploadinvalidxml' => '업로드된 파일의 XML의 구문을 분석할 수 없습니다.',
 'uploadvirus' => '파일이 바이러스를 포함하고 있습니다!
 자세한 설명: $1',
 'uploadjava' => '이 ZIP 파일은 자바의 .class 파일을 포함하고 있습니다.
@@ -2796,8 +2816,10 @@ $1',
 'sp-contributions-blocked-notice-anon' => '이 IP 주소는 현재 차단되어 있습니다.
 차단 기록은 다음과 같습니다:',
 'sp-contributions-search' => '기여 검색',
+'sp-contributions-suppresslog' => '삭제된 사용자 기여',
 'sp-contributions-username' => 'IP 주소 또는 사용자 이름:',
 'sp-contributions-toponly' => '최신판만 보기',
+'sp-contributions-newonly' => '새 글인 기여만 보기',
 'sp-contributions-submit' => '검색',
 'sp-contributions-explain' => '',
 
@@ -4366,6 +4388,4 @@ $5
 'expand_templates_generate_rawhtml' => '원본 HTML 보이기',
 'expand_templates_preview' => '미리 보기',
 
-# Unknown messages
-'uploadinvalidxml' => '업로드된 파일의 XML의 구문을 분석할 수 없습니다.',
 );
index 6856c0f..9875b6b 100644 (file)
@@ -544,6 +544,7 @@ $2',
 'userlogin-resetpassword-link' => 'Паролну джибериу',
 'helplogin-url' => 'Help:Кириу',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Системагъа кириуде болушлукъ]]',
+'userlogin-createanother' => 'Башха аккаунт къурау',
 'createacct-join' => 'Билгилеринги тюбюрекде джаз.',
 'createacct-emailrequired' => 'Электрон почтаны адреси',
 'createacct-emailoptional' => 'Электрон почтаны адреси (амалсыз тюлдю)',
@@ -556,6 +557,7 @@ $2',
 'createacct-captcha' => 'Къоркъуусузлукъну тинтиу',
 'createacct-imgcaptcha-ph' => 'Башыракъда кёрюннген текстни джаз',
 'createacct-submit' => 'Тергеу джазыуну къура',
+'createacct-another-submit' => 'Энтда бир аккаунт къурау',
 'createacct-benefit-heading' => '{{SITENAME}} сизнича адамла бла къуралгъанды.',
 'createacct-benefit-body1' => '{{PLURAL:$1|тюрлениу}}',
 'createacct-benefit-body2' => '{{PLURAL:$1|бет}}',
@@ -620,6 +622,9 @@ $2',
 'login-abort-generic' => 'Системагъа кириу джетишимсиз болду',
 'loginlanguagelabel' => 'Тил: $1',
 'suspicious-userlogout' => 'Терс браузер неда кэш этиучу прокси берген соруугъа ушагъаны ючюн, Сизни чыгъаргъа сорууугъуз алынмагъанды.',
+'pt-login' => 'Кириу',
+'pt-createaccount' => 'Аккаунт къурау',
+'pt-userlogout' => 'Чыгъыу',
 
 # Email sending
 'php-mail-error-unknown' => "PHP's mail() функцияда белгили болмагъан халат",
index 4523832..00895b4 100644 (file)
@@ -248,7 +248,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Scheck mer en Kopie, wann ich en <i lang="en">e-mail</i> an ene andere Metmaacher scheck',
 'tog-diffonly' => 'Zeich beim Versione Verjliche nur de Ungerscheide aan (ävver pack nit noch de janze Sigg dodronger)',
 'tog-showhiddencats' => 'Donn de verstoche Saachjroppe aanzeije',
-'tog-noconvertlink' => 'Don de Tittele nit ömwandelle',
 'tog-norollbackdiff' => 'Donn noh „{{int:Rollback}}“ de Ungerscheide nit aanzeije',
 'tog-useeditwarning' => 'Donn mesch warne, wann esch vun en Sigg fott jonn, ih dat esch all ming Änderunge avjeschpeischert hann.',
 'tog-prefershttps' => 'Jangk emmer övver en verschlößelte Verbendong bei Enlogge',
@@ -674,7 +673,7 @@ Wann De wells, künnts De Ding [[Special:Preferences|Enschtällonge aanpaße]].'
 'userlogin-resetpassword-link' => 'Paßwoot verjäße?',
 'helplogin-url' => 'Help:Övver et Enlogge',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hölp bem Enlogge]]',
-'userlogin-loggedin' => 'Do bes ald als {{GENDER:$1|dä Metmaacher|de Metmaacherėn|dä Metmaacher|de Metmaacherėn|däMetmaacher}} [[User:$1]] enjelogg. Met heh dämm Fommolaa kanns De jäz ävver onger enem andere Nahme enlogge.',
+'userlogin-loggedin' => 'Do bes ald als {{GENDER:$1|dä Metmaacher|de Metmaacherėn|dä Metmaacher|de Metmaacherėn|däMetmaacher}} [[User:$1|$1]] enjelogg. Met heh dämm Fommolaa kanns De jäz ävver onger enem andere Nahme enlogge.',
 'userlogin-createanother' => 'Donn ene zohsäzlejje Zohjang aanlääje',
 'createacct-join' => 'Jiv Ding Daate en:',
 'createacct-another-join' => 'Maach de nüüdeje Aanjaabe för dä neue Zohjaang.',
@@ -833,7 +832,7 @@ Do häs Der enzwesche e neu Zweschepaßwood jehollt.',
 'resetpass-temp-password' => 'Zweschepasswood:',
 'resetpass-abort-generic' => 'E Zohsazprojramm häd_et nit zohjelohße, et Paßwoot ze ändere.',
 'resetpass-expired' => 'Di Paßwood es afjeloufe. Donn jetz e neu Passwoot för et Enlogg faßlääje.',
-'resetpass-expired-soft' => 'Ding Paßwood es afjeloufe u moß neu jesaz wääde. Bes esu jood_un donn e neu Paßwoot ußsöhke, udder donn op {{int:cancel}} jonn, öm et schpääder ze säze.',
+'resetpass-expired-soft' => 'Ding Paßwood es afjeloufe un moß neu jesaz wääde. Bes esu jood_un donn e neu Paßwoot ußsöhke, udder jangk op {{int:resetpass-submit-cancel}}, öm et schpääder ze säze.',
 
 # Special:PasswordReset
 'passwordreset' => 'Et Paßwoot zeröck säze',
@@ -1748,11 +1747,23 @@ Do kann Der [[Special:ResetTokens|ene neue Schlößel maache lohße]], wann nü
 'rcnotefrom' => 'Hee {{PLURAL:$1|es ein|sin bes op <strong>$1</strong>|es keine}} fun de Änderunge zick dem <strong>$3</strong> öm <strong>$4</strong> Uhr opjelėß.',
 'rclistfrom' => 'Zeich de Änderunge vum $1 aan',
 'rcshowhideminor' => '$1 klein Mini-Änderunge',
+'rcshowhideminor-show' => 'Zeisch',
+'rcshowhideminor-hide' => 'Verschteihsch',
 'rcshowhidebots' => '$1 de Bots ehr Änderunge',
+'rcshowhidebots-show' => 'Zeisch',
+'rcshowhidebots-hide' => 'Verschteihsch',
 'rcshowhideliu' => 'De aanjemeldte Metmaacher ehr Änderunge: $1',
+'rcshowhideliu-show' => 'Zeisch',
+'rcshowhideliu-hide' => 'Verschteihsch',
 'rcshowhideanons' => '$1 de namenlose Metmaacher ehr Änderunge',
+'rcshowhideanons-show' => 'Zeisch',
+'rcshowhideanons-hide' => 'Verschteihsch',
 'rcshowhidepatr' => '$1 de nohjeluurte Änderunge',
+'rcshowhidepatr-show' => 'Zeisch',
+'rcshowhidepatr-hide' => 'Verschteihsch',
 'rcshowhidemine' => '$1 ming eije Änderunge',
+'rcshowhidemine-show' => 'Zeisch',
+'rcshowhidemine-hide' => 'Verschteihsch',
 'rclinks' => 'Zeich de letzte {{int:pipe-separator}}$1{{int:pipe-separator}} Änderunge us de letzte {{int:pipe-separator}}$2{{int:pipe-separator}} Däch, un dun {{int:pipe-separator}}$3',
 'diff' => 'Ungerscheid',
 'hist' => 'Versione',
@@ -1894,6 +1905,8 @@ wann De se noch han wells.',
 'php-uploaddisabledtext' => 'Et Dateie Huhlade es en PHP affjeschalldt.
 Bes esu joot un donn noh de Enshtellung <i lang="en">file_uploads</i> loore.',
 'uploadscripted' => 'En dä Datei es HTML dren oder Code vun enem Skripp, dä künnt Dinge Brauser en do verkihrte Hals krije un usführe.',
+'uploadscriptednamespace' => 'De aanjejovve <i lang="en" xml:lang="en">SVG</i>-Dattei benöds dä verbodde Nahme-Roum „$1“',
+'uploadinvalidxml' => 'Dat <i lang="en" xml:lang="en">XML</i> en dä huh jelaade Dattei kunnt wohr nit en Oodenong beim Ongersöhke.',
 'uploadvirus' => 'Esu ene Dress:
 <br />
 En dä Datei stich e Kompjutervirus!
@@ -2204,7 +2217,7 @@ All de Sigge em Wiki, och Klaafsigge, Ömleitunge, un esu jet',
 'statistics-views-peredit' => 'Sigge affjeroofe, pro Änderung',
 'statistics-users' => '[[Special:ListUsers|Metmaacher]] aajemelldt',
 'statistics-users-active' => 'Aktive Metmaacher',
-'statistics-users-active-desc' => 'Metmaacher, die {{PLURAL:$1|hück un jesterre|en de läzte $1 Dääsh|hück}} jät jemaat han.',
+'statistics-users-active-desc' => 'Aktiv sin Metmaacher, di {{PLURAL:$1|hück un jesterre|en de läzte $1 Dääsch|hück}} jät jemaat han.',
 'statistics-mostpopular' => 'De miets affjeroofe Sigge',
 
 'pageswithprop' => 'Sigge med en beschtemmpte Eijeschaff',
@@ -2769,8 +2782,10 @@ $1',
 'sp-contributions-blocked-notice-anon' => 'Heh di <i lang="en">IP</i>-Address es em Momang jesperrt.
 De neuste Sperr ier Enndraach em Logbooch es:',
 'sp-contributions-search' => 'Söök noh Metmaacher ier Beidräg',
+'sp-contributions-suppresslog' => 'verschtoche Beidrääch',
 'sp-contributions-username' => 'Metmaachername odder IP-Address:',
 'sp-contributions-toponly' => 'Bloß neuste Versione zeije',
+'sp-contributions-newonly' => 'Blohß neu aanjelaate Sigge zeije.',
 'sp-contributions-submit' => 'Söhke',
 
 # What links here
@@ -4420,6 +4435,4 @@ Derbei jehüüere enschtalleete Paaserfunxjuhne, alsu esu jät wi
 'expand_templates_generate_rawhtml' => 'Donn de Röh HTML Ußjaav aanzeije',
 'expand_templates_preview' => 'Vör-Aansich',
 
-# Unknown messages
-'uploadinvalidxml' => 'Dat <i lang="en" xml:lang="en">XML</i> en dä huh jelaade Dattei kunnt wohr nit en Oodenong beim Ongersöhke.',
 );
index 82907f0..ed1b127 100644 (file)
@@ -234,7 +234,7 @@ $messages = array(
 'editfont-serif' => 'Tipografía serif',
 
 # Dates
-'sunday' => 'Alkhad',
+'sunday' => 'Alad',
 'monday' => 'Lunes',
 'tuesday' => 'Martes',
 'wednesday' => 'Miércoles',
@@ -305,9 +305,9 @@ $messages = array(
 'category-empty' => "''Esta kategoría oy día, no contiene ni hojas ni dosyas de multimedya''",
 'hidden-categories' => '{{PLURAL:$1|Kategoría escondida|Kategorías escondidas}}',
 'hidden-category-category' => 'Katēggorías escondidas',
-'category-subcat-count' => '{{PLURAL:$2|Esta katēggoría contiene sólo una baxo-katēggoría:|Esta katēggoría contiene {{PLURAL:$1|esta baxo-katēggoría aquí abaxo|$1 baxo-katēggorías aquí abaxo}}, de un total de $2 baxo-katēggorías:}}',
+'category-subcat-count' => '{{PLURAL:$2|Esta kategoría contiene sólo la su-kategoría venidera.|Esta kategoría contiene {{PLURAL:$1|la su-kategoría venidera|$1 su-kategorías venideras}}, de un total de $2 su-kategorías.}}',
 'category-subcat-count-limited' => 'Esta katēggoría contiene {{PLURAL:$1|la baxo-katēggoría venidera|$1 baxo-katēggorías venideras}}.',
-'category-article-count' => '{{PLURAL:$2|Esta katēggoría contiene sólo la hoja venidera.|{{PLURAL:$1|La hoja venidera apartiene|Las $1 hojas venideras apartienen}} a esta katēggoría, de un total de $2.}}',
+'category-article-count' => '{{PLURAL:$2|Esta kategoría contiene sólo la hoja venidera.|{{PLURAL:$1|La hoja venidera apartiene|Las $1 hojas venideras apartienen}} a esta kategoría, de un total de $2.}}',
 'category-article-count-limited' => '{{PLURAL:$1|La hoja venidera apartiene|Las $1 hojas venideras apartienen}} a esta katēggoría.',
 'category-file-count' => '{{PLURAL:$2|Esta katēggoría contiene sólo la dosya venidera.|{{PLURAL:$1|La dosya venidera apartiene|Las $1 dosyas venideras apartienen}} a esta katēggoría, de un total de $2.}}',
 'category-file-count-limited' => '{{PLURAL:$1|La dosya venidera apartiene|Las $1 dosyas venideras apartienen}} a esta katēggoría.',
@@ -684,8 +684,8 @@ Kontrasenya temporal: $2',
 'showpreview' => 'Echar una ojada',
 'showlivepreview' => 'Previsteo bivo',
 'showdiff' => 'Amostrar los trocamientos',
-'anoneditwarning' => "'''Noticia:''' La sesyón no empeçó con un cuento de usuario.
-Tu adresso de IP va ser enrejjistrado en la istoria de la hoja.",
+'anoneditwarning' => '<strong>Aviso:</strong> No entrates a tu cuento.
+Tu adresso de IP se va a enrejistrar en la istoria de trocamientos de la hoja.',
 'summary-preview' => 'Previsualización del resumen:',
 'blockedtitle' => 'El usador está blokeado',
 'blockednoreason' => 'La razόn no se diό',
@@ -781,7 +781,7 @@ Leyenda: (act) = diferencias con la versión actual,
 
 # Revision deletion
 'rev-deleted-user' => '(se kito el nombre de usuario)',
-'rev-delundel' => 'mostra/esconde',
+'rev-delundel' => 'amostrar/esconder',
 'rev-showdeleted' => 'mostra',
 'revdelete-show-file-submit' => 'Si',
 'revdelete-hide-image' => 'Eskonder el kontenido de archivo',
@@ -949,43 +949,43 @@ Leyenda: (act) = diferencias con la versión actual,
 'nchanges' => '$1 {{PLURAL:$1|trocamiento|trocamientos}}',
 'enhancedrc-history' => 'istoria',
 'recentchanges' => 'Trocamientos freskos',
-'recentchanges-legend' => 'Opciones encima de los trocamientos frescos',
+'recentchanges-legend' => 'Escojimientos de los trocamientos freskos',
 'recentchanges-summary' => 'Perseguid en esta hoja, los trocamientos de alcabo realizados en la Viki.',
 'recentchanges-feed-description' => 'Perseguir los trocamientos más nuevos en el viki en este feed.',
 'recentchanges-label-newpage' => 'Este trocamiento crió una mueva hoja',
-'recentchanges-label-minor' => 'Esta es un trocamiento chiquitico',
-'recentchanges-label-bot' => 'Este trokamiento fue echo por un bot',
-'recentchanges-label-unpatrolled' => 'Este trocamiento no está akavidado',
+'recentchanges-label-minor' => 'Esto es un trocamiento chiquitico',
+'recentchanges-label-bot' => 'Este trocamiento era hecho por la parte de un bot',
+'recentchanges-label-unpatrolled' => 'Este trocamiento no fue patrullado daínda',
 'recentchanges-legend-plusminus' => "(''±123'')",
 'rcnotefrom' => "Debasho se amostran los trokamientos desde '''$2''' (amostrados fina <b>$1</b>)",
-'rclistfrom' => 'Mostra los trocamientos nuevos empeçando desde $1',
+'rclistfrom' => 'Amostrar los trocamientos muevos empeçando el $1',
 'rcshowhideminor' => '$1 trocamientos chiquiticos',
 'rcshowhidebots' => '$1 botes',
 'rcshowhideliu' => '$1 usadores enrejistrados',
 'rcshowhideanons' => '$1 usadores anónimos',
 'rcshowhidepatr' => '$1 trocamientos akavidados',
 'rcshowhidemine' => '$1 mis trocamientos',
-'rclinks' => 'Ver los dal cavo $1 trocamientos en los dal cavo $2 días.<br />$3',
+'rclinks' => 'Ver los $1 trocamientos dalcavo en los $2 días dalcavo<br />$3',
 'diff' => 'dif',
 'hist' => 'ist',
 'hide' => 'Esconder',
 'show' => 'Amostrar',
 'minoreditletter' => 'ch',
-'newpageletter' => 'N',
+'newpageletter' => 'M',
 'boteditletter' => 'b',
 'rc_categories_any' => 'Kualkyer',
-'rc-enhanced-expand' => 'Amostrar los detalyos',
-'rc-enhanced-hide' => 'Guarda los detalyos',
+'rc-enhanced-expand' => 'Amostrar los detalios',
+'rc-enhanced-hide' => 'Esconder los detalios',
 
 # Recent changes linked
-'recentchangeslinked' => 'Trocamientos conectados',
+'recentchangeslinked' => 'Trocamientos atados',
 'recentchangeslinked-feed' => 'Trocamientos conectados',
 'recentchangeslinked-toolbox' => 'Trocamientos atados',
-'recentchangeslinked-title' => 'Los trocamientos relacionados con "$1"',
+'recentchangeslinked-title' => 'Los trocamientos atados a "$1"',
 'recentchangeslinked-summary' => "Esto es una lista de trocamientos dalcavo en las hojas atadas de una hoja partikolara (u en los miembros de una kategoría partikolara).
 Las hojas en tu [[Special:Watchlist|lista de acavidamiento]] son '''reforçadas'''.",
-'recentchangeslinked-page' => 'Nombre de la hoja',
-'recentchangeslinked-to' => 'Amostra los trocamientos freskos en lugar de la hoja indicada',
+'recentchangeslinked-page' => 'Nombre de la hoja:',
+'recentchangeslinked-to' => 'Al lugar de la hoja indikada, amostra los trocamientos en las hojas atadas a esta hoja',
 
 # Upload
 'upload' => 'Suvir una dosya',
@@ -1247,7 +1247,7 @@ A continuación se mostran las opciones actuales de la hoja '''$1''':",
 
 # Namespace form on various pages
 'namespace' => 'Espacio de nombres:',
-'invert' => 'Invertir selección',
+'invert' => 'Aboltar escojimiento',
 'blanknamespace' => '(Prencipal)',
 
 # Contributions
@@ -1385,7 +1385,7 @@ Puedes ver su manadero',
 'tooltip-ca-delete' => 'Efassar esta hoja',
 'tooltip-ca-move' => 'Taşirea esta hoja (troca el nombre desta hoja)',
 'tooltip-ca-watch' => 'Ajusta esta hoja a tu lista de acavidamientos',
-'tooltip-ca-unwatch' => 'Quita esta hoja de tu lista de escojidos',
+'tooltip-ca-unwatch' => 'Quita esta hoja de tu lista de acavidamientos',
 'tooltip-search' => 'Buxca en {{SITENAME}}',
 'tooltip-search-go' => 'Vate a la hoja con este nombre egzakto, si egziste.',
 'tooltip-search-fulltext' => 'Buxca este teksto en las hojas',
@@ -1401,14 +1401,14 @@ Puedes ver su manadero',
 'tooltip-t-recentchangeslinked' => 'Los trocamientos dalcavo en las hojas atadas a la ésta',
 'tooltip-feed-rss' => 'Sindicación RSS de esta hoja',
 'tooltip-feed-atom' => 'Canal Atomo parâ esta hoja',
-'tooltip-t-contributions' => 'Ver la lista de ajustamientos de este usuario',
+'tooltip-t-contributions' => 'Lista de kontribüsyón (ajustamientos) deste usador',
 'tooltip-t-emailuser' => 'A este usuario, mándale una letra electrόnica (ímey)',
 'tooltip-t-upload' => 'Suve dosyas',
 'tooltip-t-specialpages' => 'Lista de todas las hojas especiales',
 'tooltip-t-print' => 'La forma apropiada parâ imprimir esta hoja',
 'tooltip-t-permalink' => 'Atamiento permanente (fikso) a este enderechamiento de la hoja',
 'tooltip-ca-nstab-main' => 'Ve el artíkolo',
-'tooltip-ca-nstab-user' => 'Ver la pajina de usuario',
+'tooltip-ca-nstab-user' => 'Ver la hoja del usador',
 'tooltip-ca-nstab-special' => 'Esta es una hoja especial, la hoja ya no se puede trocar',
 'tooltip-ca-nstab-project' => 'Ver la hoja del prodjekto',
 'tooltip-ca-nstab-image' => 'Ver la hoja de la dosya',
@@ -1479,7 +1479,8 @@ Los atamientos venideros que están en la misma liña se konsidheran como ekseps
 
 # Metadata
 'metadata' => 'Metadados',
-'metadata-help' => 'Esta dosya contiene mas información (metadatos), probablemente ajustada por la kamera dizhital, el eskáner o la proǵrama kullaneado para criarlo o dizhitalizarlo. Si la dosya fue trocada de su estado orizhinal, puede aver pèryido algunos detalyos.',
+'metadata-help' => 'Esta dosya contiene información ajustada (metadados), que la ajustó puede ser la kamerá dijital u el eskáner en cavso si se kulaneó parâ criar u dijitalizar la dosya. 
+Si la dosya fue trocada, algunos detalios pueden amostrar no la dosya trocada, ma la dosya orijinal.',
 'metadata-expand' => 'Mostra los detalyos ekstendidos',
 'metadata-collapse' => 'Esconder los detalyos ekstendidos',
 'metadata-fields' => 'Los campos de metadatos que se listan en este messaje se van a amostrar en la hoja de la deskripsión de la foto daínda cuando la tabla de metadatos está cerrada.
index 99e63d7..22e0fa8 100644 (file)
@@ -222,7 +222,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Schéck mir eng Kopie vun de Mailen, déi ech anere Benotzer schécken.',
 'tog-diffonly' => "Weis bei Versiounsvergläicher just d'Ënnerscheeder an net déi ganz Säit",
 'tog-showhiddencats' => 'Verstoppt Kategorië weisen',
-'tog-noconvertlink' => 'Ëmwandlung vum Titel desaktivéieren',
 'tog-norollbackdiff' => 'Ënnerscheed nom Zrécksetzen ënnerdrécken',
 'tog-useeditwarning' => "Mech warne wann ech d'Ännerung vun enger Säit verloossen, ouni Ännerunge gespäichert ze hunn",
 'tog-prefershttps' => 'Ëmmer eng sécher Verbindung benotze wann ageloggt',
@@ -758,9 +757,11 @@ Waart w.e.g. $1 ier Dir et nach eng Kéier probéiert.',
 'resetpass-wrong-oldpass' => 'Net valabelt temporäert oder aktuellt Passwuert.
 Vläicht hutt Dir Äert Passwuert scho geännert oder en neit temporäert Passwuert ugefrot.',
 'resetpass-recycled' => 'Ännert Äert Passwuert w.e.g. op een anert Passwuert wéi Äert aktuellt Passwuert.',
+'resetpass-temp-emailed' => "Dir hutt Iech mat engem temporären E-Mail-Code ageloggt. Fir d'Aloggen ofzeschléisse musst Dir hei en neit Passwuert astellen:",
 'resetpass-temp-password' => 'Temporäert Passwuert:',
 'resetpass-abort-generic' => "D'Ännere vum Passwuert gouf duerch eng Erweiderung ofgebrach.",
 'resetpass-expired' => 'Äert Passwuert ass ofgelaf. Gitt w.e.g. en neit Passwuert u fir Iech anzeloggen.',
+'resetpass-expired-soft' => 'Äert Passwuert ass ofgelaf a muss zeréckgesat. Sicht w.e.g. elo en neit Passwuert eraus oder klickt  "{{int:resetpass-submit-cancel}}" fir et spéider zeréckzesetzen.',
 
 # Special:PasswordReset
 'passwordreset' => 'Passwuert zrécksetzen',
@@ -1606,11 +1607,23 @@ Dës Informatioun ass ëffentlech.",
 'rcnotefrom' => "Ugewise ginn d'Ännerunge vum '''$2''' un (maximal '''$1''' Ännerunge gi gewisen).",
 'rclistfrom' => 'Nei Ännerunge vu(n) $1 u weisen',
 'rcshowhideminor' => 'Kleng Ännerunge $1',
+'rcshowhideminor-show' => 'Weisen',
+'rcshowhideminor-hide' => 'Verstoppen',
 'rcshowhidebots' => 'Botte $1',
+'rcshowhidebots-show' => 'Weisen',
+'rcshowhidebots-hide' => 'Verstoppen',
 'rcshowhideliu' => 'Ugemellt Benotzer $1',
+'rcshowhideliu-show' => 'Weisen',
+'rcshowhideliu-hide' => 'Verstoppen',
 'rcshowhideanons' => 'Anonym Benotzer $1',
+'rcshowhideanons-show' => 'Weisen',
+'rcshowhideanons-hide' => 'Verstoppen',
 'rcshowhidepatr' => 'iwwerwaacht Ännerunge $1',
+'rcshowhidepatr-show' => 'Weisen',
+'rcshowhidepatr-hide' => 'Verstoppen',
 'rcshowhidemine' => 'Meng Ännerunge $1',
+'rcshowhidemine-show' => 'Weisen',
+'rcshowhidemine-hide' => 'Verstoppen',
 'rclinks' => 'Déi lescht $1 Ännerunge vun de leschten $2 Deeg weisen.<br />$3',
 'diff' => 'Ënnerscheed',
 'hist' => 'Versiounen',
@@ -1737,6 +1750,8 @@ Wann Dir dëse Fichier trotzdeem eropluede wëllt da gitt w.e.g. zréck a luet d
 'uploaddisabledtext' => "D'Eropluede vu Fichieren ass ausgeschalt.",
 'php-uploaddisabledtext' => "D'Eropluede vu Fichieren ass am PHP desaktivéiert. Kuckt w.e.g. d'Astellung ''file_uploads'' no.",
 'uploadscripted' => 'An dësem Fichier ass HTML- oder Scriptcode, dee vun engem Webbrowser falsch interpretéiert kéint ginn.',
+'uploadscriptednamespace' => 'An dësem SVG-Fichier ass en illegalen Nummraum "$1"',
+'uploadinvalidxml' => 'Den XML am eropgelueden Fichier konnt net verschafft ginn.',
 'uploadvirus' => 'An dësem Fichier ass ee Virus! Detailer: $1',
 'uploadjava' => "An dësem ZIP-Fichier ass e JAVA CLASS-Fichier dran.
 D'Eropluede vu JAVA-Fichieren ass net erlaabt, well si d'Ëmgoe vu Sécherheetsmoossnamen erméigleche kënnen.",
@@ -2080,6 +2095,7 @@ An all Rei sti Linken zur éischter an zweeter Viruleedung, souwéi d\'Zil vun d
 'mostrevisions' => 'Säite mat de meeschte Versiounen',
 'prefixindex' => 'All Säite mat Prefix',
 'prefixindex-namespace' => 'All Säite mat Prefix (Nummraum $1)',
+'prefixindex-strip' => 'Prefix an der Lëscht ewechhuelen',
 'shortpages' => 'Kuerz Säiten',
 'longpages' => 'Laang Säiten',
 'deadendpages' => 'Sakgaasse-Säiten',
@@ -2093,6 +2109,7 @@ An all Rei sti Linken zur éischter an zweeter Viruleedung, souwéi d\'Zil vun d
 'protectedpages-timestamp' => 'Zäitstempel',
 'protectedpages-page' => 'Säit',
 'protectedpages-expiry' => 'Spär bis',
+'protectedpages-performer' => 'Spär duerch de Benotzer',
 'protectedpages-params' => 'Parameter vun der Spär',
 'protectedpages-reason' => 'Grond',
 'protectedpages-unknown-timestamp' => 'Onbekannt',
@@ -2552,6 +2569,7 @@ $1',
 'sp-contributions-search' => 'No Kontributioune sichen',
 'sp-contributions-username' => 'IP-Adress oder Benotzernumm:',
 'sp-contributions-toponly' => 'Nëmmen Ännerunge weisen déi déi lescht Versioun sinn',
+'sp-contributions-newonly' => 'Nëmmen Ännerunge weisen déi Säiten uleeën',
 'sp-contributions-submit' => 'Sichen',
 
 # What links here
@@ -4040,6 +4058,4 @@ Faktesch alles wat tëscht duebelen Accolade steet gëtt ausgewäert.',
 'expand_templates_generate_rawhtml' => 'HTML-Format weisen',
 'expand_templates_preview' => 'Kucken ouni ofzespäicheren',
 
-# Unknown messages
-'uploadinvalidxml' => 'Den XML am eropgelueden Fichier konnt net verschafft ginn.',
 );
index 0e6e2e8..845c41d 100644 (file)
@@ -146,12 +146,12 @@ $messages = array(
 'dec' => 'дек',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|1=Категори|Категорияр}}',
+'pagecategories' => '{{PLURAL:$1|1=Категория|Категорияр}}',
 'category_header' => '«$1» категориядин ччинар',
 'subcategories' => 'агъакатегорияр',
 'category-media-header' => '"$1" категориядин медиа',
 'category-empty' => "''Алай чӀава и категория ичӀи я.\"",
-'hidden-categories' => '{{PLURAL:$1|1=Чуьнуьхай категори|Чуьнуьхай категорияр}}',
+'hidden-categories' => '{{PLURAL:$1|1=Чуьнуьхай категория|Чуьнуьхай категорияр}}',
 'hidden-category-category' => 'Чуьнуьхай категорияр',
 'category-subcat-count' => '{{PLURAL:$2|И категорияда анжах гуьгъуьна авай подкатегория ава.|$2-кай {{PLURAL:$1|1=агъакатегория|$1 агъакатегорияр}} къалурнава }}',
 'category-subcat-count-limited' => 'И категорияда {{PLURAL:$1|1=агъакатегория|$1 агъакатегорияр}} ава.',
@@ -737,7 +737,7 @@ $messages = array(
 'hide' => 'Чуьнуьхун',
 'show' => 'Къалурун',
 'minoreditletter' => 'гъ',
-'newpageletter' => 'ЦI',
+'newpageletter' => 'Цl',
 'boteditletter' => 'б',
 'rc_categories_any' => 'ГЬар са',
 'rc-enhanced-expand' => 'Куьлуь-шуьлуьяр къалурун (JavaScript герекзава)',
@@ -816,7 +816,7 @@ $messages = array(
 'filehist-user' => 'Уртах',
 'filehist-dimensions' => 'Кьадарар',
 'filehist-filesize' => 'Файлдин кьадар',
-'filehist-comment' => 'Ð\9aÑ\8aейд',
+'filehist-comment' => 'Ð\92еÑ\80евиÑ\80д',
 'filehist-missing' => 'Файл авачиз я',
 'imagelinks' => 'Файл кардик кутун',
 'linkstoimage' => 'Къведай {{PLURAL:$1 | ччин | $1 ччинар}} гьа и файлдиз элячlзава',
@@ -866,7 +866,7 @@ $messages = array(
 'withoutinterwiki-submit' => 'Къалурун',
 
 # Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|баjт|баjтар}}',
+'nbytes' => '$1 {{PLURAL:$1|1=байт|байтар}}',
 'nmembers' => '$1 {{PLURAL:$1|1=уьзви|уьзвияр}}',
 'lonelypages' => 'Eтим xъувун',
 'prefixindex' => 'Префикс галай вири ччинар',
index 4bd2353..4b75b6e 100644 (file)
@@ -1071,6 +1071,7 @@ $2',
 'copyuploaddisabled' => 'سوار کردن وا یو آر ال د کار نئ.',
 'uploadfromurl-queued' => 'سوارکرد تو ها د گئ.',
 'uploaddisabledtext' => 'سوار کرد فایلیا د کار نئ.',
+'uploadinvalidxml' => 'ایکس ام الی که سوار بیه نبوئه نوتیج با.',
 'upload-source' => 'سرچشمه فایل',
 'sourcefilename' => 'سرچشمه نوم جانیا:',
 'sourceurl' => 'سرچشمه يو آر ال:',
@@ -1714,6 +1715,4 @@ $2',
 # Special:ExpandTemplates
 'expand_templates_remove_comments' => 'جا وه جا بیئن ویر و باوریا',
 
-# Unknown messages
-'uploadinvalidxml' => 'ایکس ام الی که سوار بیه نبوئه نوتیج با.',
 );
index 1dc64c6..549b006 100644 (file)
@@ -25,6 +25,7 @@
  * @author Pdxx
  * @author Perkunas
  * @author Pėstininkas
+ * @author Reedy
  * @author Siggis
  * @author Tomasdd
  * @author Urhixidur
@@ -716,6 +717,9 @@ Palaukite prieš bandant vėl.',
 'login-abort-generic' => 'Jūsų prisijungimas buvo nesėkmingas - Nutraukta',
 'loginlanguagelabel' => 'Kalba: $1',
 'suspicious-userlogout' => 'Jūsų prašymas atsijungti buvo atmestas, nes, atrodo, jį klaidingai išsiuntė naršyklė arba spartinantysis tarpinis serveris.',
+'pt-login' => 'Prisijungti',
+'pt-createaccount' => 'Sukurti paskyrą',
+'pt-userlogout' => 'Atsijungti',
 
 # Email sending
 'php-mail-error-unknown' => 'Nežinoma klaida PHP mail() funkcijoje',
@@ -1523,11 +1527,23 @@ teisės",
 'rcnotefrom' => "Žemiau yra pakeitimai pradedant '''$2''' (rodoma iki '''$1''' pakeitimų).",
 'rclistfrom' => 'Rodyti naujus pakeitimus pradedant $1',
 'rcshowhideminor' => '$1 smulkius keitimus',
+'rcshowhideminor-show' => 'Rodyti',
+'rcshowhideminor-hide' => 'Slėpti',
 'rcshowhidebots' => '$1 robotus',
+'rcshowhidebots-show' => 'Rodyti',
+'rcshowhidebots-hide' => 'Slėpti',
 'rcshowhideliu' => '$1 prisijungusius naudotojus',
+'rcshowhideliu-show' => 'Rodyti',
+'rcshowhideliu-hide' => 'Slėpti',
 'rcshowhideanons' => '$1 anoniminius naudotojus',
+'rcshowhideanons-show' => 'Rodyti',
+'rcshowhideanons-hide' => 'Slėpti',
 'rcshowhidepatr' => '$1 patikrintus keitimus',
+'rcshowhidepatr-show' => 'Rodyti',
+'rcshowhidepatr-hide' => 'Slėpti',
 'rcshowhidemine' => '$1 mano keitimus',
+'rcshowhidemine-show' => 'Rodyti',
+'rcshowhidemine-hide' => 'Slėpti',
 'rclinks' => 'Rodyti paskutinius $1 pakeitimų per paskutiniąsias $2 dienų<br />$3',
 'diff' => 'skirt',
 'hist' => 'ist',
@@ -1651,6 +1667,7 @@ Jei visvien norite įkelti savo failą, prašome eiti atgal ir įkelti šį fail
 'php-uploaddisabledtext' => "Failų įkėlimai uždrausti PHP nustatymuose.
 Patikrinkite ''file_uploads'' nustatą.",
 'uploadscripted' => 'Šis failas turi HTML arba programinį kodą, kuris gali būti klaidingai suprastas interneto naršyklės.',
+'uploadscriptednamespace' => "Šis SVG failas turi neteisėtą vietą vardui '$1'",
 'uploadvirus' => 'Šiame faile yra virusas! Smulkiau: $1',
 'uploadjava' => 'Failas yra ZIP failas, kuriame yra Java .class failas.
 Įkelti Java failus neleidžiama, nes jie gali padėti apeiti saugumo apribojimus.',
@@ -1977,6 +1994,9 @@ Kiekvienoje eilutėje yra nuorodos į pirmąjį ir antrąjį peradresavimą, tai
 'protectedpages-indef' => 'Tik neapibrėžtos apsaugos',
 'protectedpages-cascade' => 'Tik pakopinė apsauga',
 'protectedpagesempty' => 'Šiuo metu nėra apsaugotas joks failas su šiais parametrais.',
+'protectedpages-page' => 'Puslapis',
+'protectedpages-expiry' => 'Galioja iki',
+'protectedpages-reason' => 'Priežastis',
 'protectedtitles' => 'Apsaugoti pavadinimai',
 'protectedtitlesempty' => 'Šiuo metu nėra jokių pavadinimų apsaugotų šiais parametrais.',
 'listusers' => 'Naudotojų sąrašas',
index c099059..b1c0ca7 100644 (file)
@@ -187,7 +187,6 @@ $messages = array(
 'tog-ccmeonemails' => '凡所遺書,請存副本。',
 'tog-diffonly' => '異下無示頁',
 'tog-showhiddencats' => '示隱類',
-'tog-noconvertlink' => '非轉鍵題',
 'tog-norollbackdiff' => '轉後略異',
 'tog-useeditwarning' => '離而未存,示吾',
 
index 012ddd9..95d1c2a 100644 (file)
@@ -765,6 +765,9 @@ Andraso $1 alohan'ny mamerina.",
 'suspicious-userlogout' => "Ny fangataham-pialanao dia tsy nekena satria ohatry ny nalfan'ny mpizahan-tsehatra simba izy na kasy ny proxy.",
 'createacct-another-realname-tip' => "Azo tsy atsofoka ny tena anarana.
 Raha misafidy ny hanome azy ianao, ho ampiasaina amin'ny fanehoana ny anjara asan'ilay mpikambana ilay izy.",
+'pt-login' => 'Hiditra',
+'pt-createaccount' => 'Hamorona kaonty',
+'pt-userlogout' => 'Hivoaka',
 
 # Email sending
 'php-mail-error-unknown' => "Hadisoana tsy fantatra tao amin'ny tao mial() an'i PHP.",
@@ -1623,11 +1626,23 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
 'rcnotefrom' => "Ity eto ambany ity ny lisitry ny vao niova manomboka ny <b>$2</b> (hatramin'ny <b>$1</b> no miseho).",
 'rclistfrom' => 'Asehoy izay vao niova manomboka ny $1',
 'rcshowhideminor' => '$1 ny fanovàna kely',
+'rcshowhideminor-show' => 'Haneho',
+'rcshowhideminor-hide' => 'Hanafina',
 'rcshowhidebots' => '$1 ny mpikambana rôbô',
+'rcshowhidebots-show' => 'Haneho',
+'rcshowhidebots-hide' => 'Hanafina',
 'rcshowhideliu' => '$1 ny mpikambana nisoratra anarana',
+'rcshowhideliu-show' => 'Haneho',
+'rcshowhideliu-hide' => 'Hanadina',
 'rcshowhideanons' => '$1 ny mpikambana tsy nisoratra anarana',
+'rcshowhideanons-show' => 'Haneho',
+'rcshowhideanons-hide' => 'Hanafina',
 'rcshowhidepatr' => '$1 ny fanovana voaambina',
+'rcshowhidepatr-show' => 'Haneho',
+'rcshowhidepatr-hide' => 'Hanafina',
 'rcshowhidemine' => '$1 ny fanovàko',
+'rcshowhidemine-show' => 'Haneho',
+'rcshowhidemine-hide' => 'Hanafina',
 'rclinks' => "Asehoy ny $1 niova farany tato anatin'ny $2 andro<br />$3",
 'diff' => 'Fampitahana',
 'hist' => 'tant.',
@@ -1754,6 +1769,7 @@ Raha mbola te-hampiditra io rakitra io foana ianao, miverena any aoriana ary mam
 Marino ny option configuration file_uploads.",
 'uploadscripted' => "
 Misy kialo HTML na fango script mety tsy ho hain'ny navigateur sasany haseho ity rakitra ity.",
+'uploadinvalidxml' => "Tsy afaka vakiana ny XML tao anatin'ilay rakitra nafaranao.",
 'uploadvirus' => 'Misy viriosy io rakitra io! Toy izao ny antsipirihany: $1',
 'uploadjava' => 'Ny rakitra dia rakitra ZIP ahitana rakitra .class Java.
 Voarara ny mandefa rakitra Java satria mety hahavaky ny fepetra mikasika ny antoka ireo rakitra ireo.',
@@ -3699,6 +3715,4 @@ Azonao atao ihany koa ny [[Special:EditWatchlist/raw|manova ilay lisitra amin'ny
 'api-error-uploaddisabled' => "Tsy alefa eto amin'ity wiki ity ny fandefasan-drakita.",
 'api-error-verification-error' => 'Mety tapaka ity rakitra ity, na diso tovan-drakitra.',
 
-# Unknown messages
-'uploadinvalidxml' => "Tsy afaka vakiana ny XML tao anatin'ilay rakitra nafaranao.",
 );
index bb67543..98895db 100644 (file)
@@ -390,7 +390,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Испраќај ми мои примероци од писмата што ги праќам на другите корисници',
 'tog-diffonly' => 'Не ја покажувај содржината на страницата под разликите',
 'tog-showhiddencats' => 'Прикажи скриени категории',
-'tog-noconvertlink' => 'Оневозможи претворање на наслов на врска',
 'tog-norollbackdiff' => 'Изостави ја разликата по извршено отповикување',
 'tog-useeditwarning' => 'Предупреди ме кога сакам да напуштам страница за уредување без да ги имам зачувано промените',
 'tog-prefershttps' => 'Секогаш најавувај ме преку безбедна врска',
@@ -746,7 +745,7 @@ $2',
 'customjsprotected' => 'Немате дозвола да ја менувате оваа страница со JavaScript  бидејќи содржи туѓи лични нагодувања.',
 'mycustomcssprotected' => 'Немате дозвола да ја уредувате оваа каскадна стилска страница (CSS).',
 'mycustomjsprotected' => 'Немате дозвола да ја уредувате оваа страница со JavaScript.',
-'myprivateinfoprotected' => 'Ð\9dемаÑ\82е Ð´Ð¾Ð·Ð²Ð¾Ð»Ð° Ð´Ð° Ð³Ð¸ Ñ\83Ñ\80едÑ\83ваÑ\82е Ð²Ð°Ñ\88иÑ\82е Ð¿Ñ\80иваÑ\82ни информации.',
+'myprivateinfoprotected' => 'Ð\9dемаÑ\82е Ð´Ð¾Ð·Ð²Ð¾Ð»Ð° Ð´Ð° Ð³Ð¸ Ñ\83Ñ\80едÑ\83ваÑ\82е Ð²Ð°Ñ\88иÑ\82е Ð»Ð¸Ñ\87ни информации.',
 'mypreferencesprotected' => 'Немате дозвола да ги уредувате вашите нагодувања.',
 'ns-specialprotected' => 'Специјални страници не може да се уредуваат.',
 'titleprotected' => "Овој наслов од страна на [[User:$1|$1]] е заштитен и не може да се создаде.
@@ -938,7 +937,7 @@ $2',
 'resetpass-temp-password' => 'Привремена лозинка:',
 'resetpass-abort-generic' => 'Смената на лозинката е откажана од додаток.',
 'resetpass-expired' => 'Лозинката ви е истечена. Задајте нова лозинка за да се најавите.',
-'resetpass-expired-soft' => 'Ð\9bозинкаÑ\82а Ð²Ð¸ Ðµ Ð¸Ñ\81Ñ\82еÑ\87ена Ð¸ Ñ\9cе Ð¼Ð¾Ñ\80а Ð´Ð° Ð·Ð°Ð´Ð°Ð´ÐµÑ\82е Ð½Ð¾Ð²Ð°. Ð\98збеÑ\80еÑ\82е Ð»Ð¾Ð·Ð¸Ð½ÐºÐ° Ñ\81ега, Ð¸Ð»Ð¸ Ð¿Ð°Ðº Ð¾Ñ\82кажеÑ\82е Ð³Ð¾ за да ја зададете подоцна.',
+'resetpass-expired-soft' => 'Ð\9bозинкаÑ\82а Ð²Ð¸ Ðµ Ð¸Ñ\81Ñ\82еÑ\87ена Ð¸ Ñ\9cе Ð¼Ð¾Ñ\80а Ð´Ð° Ð·Ð°Ð´Ð°Ð´ÐµÑ\82е Ð½Ð¾Ð²Ð°. Ð\9eдбеÑ\80еÑ\82е Ð½Ð¾Ð²Ð° Ñ\81ега, Ð¸Ð»Ð¸ Ð¿Ð°Ðº Ñ\81Ñ\82иÑ\81неÑ\82е Ð½Ð° â\80\9e{{int:resetpass-submit-cancel}}â\80\9c за да ја зададете подоцна.',
 
 # Special:PasswordReset
 'passwordreset' => 'Менување на лозинка',
@@ -994,7 +993,7 @@ $2
 
 # Special:ResetTokens
 'resettokens' => 'Врати одново шифри',
-'resettokens-text' => 'Ð\9cожеÑ\82е Ñ\88иÑ\84Ñ\80иÑ\82е Ð´Ð° Ð³Ð¸ Ð²Ñ\80аÑ\82иÑ\82е Ð¾Ð´Ð½Ð¾Ð²Ð¾ Ñ\88Ñ\82о Ð¾Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ñ\83ва Ð¿Ñ\80иÑ\81Ñ\82ап Ð´Ð¾ Ð¸Ð·Ð²ÐµÑ\81ни Ð¿Ñ\80иваÑ\82ни податоци што се однесуваат на вашата овдешна сметка.
+'resettokens-text' => 'Ð\9cожеÑ\82е Ñ\88иÑ\84Ñ\80иÑ\82е Ð´Ð° Ð³Ð¸ Ð²Ñ\80аÑ\82иÑ\82е Ð¾Ð´Ð½Ð¾Ð²Ð¾ Ñ\88Ñ\82о Ð¾Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ñ\83ва Ð¿Ñ\80иÑ\81Ñ\82ап Ð´Ð¾ Ð¸Ð·Ð²ÐµÑ\81ни Ð»Ð¸Ñ\87ни податоци што се однесуваат на вашата овдешна сметка.
 
 Ова треба да се направи ако по грешка сте споделиле нешто со некого или ако сметката ви е изложена на опасност.',
 'resettokens-no-tokens' => 'Нема шифри за враќање.',
@@ -1697,7 +1696,7 @@ $1",
 'right-browsearchive' => 'Пребарување на избришани страници',
 'right-undelete' => 'Обновување избришана страница',
 'right-suppressrevision' => 'Прегледување и враќање на ревизии скриени од администратори',
-'right-suppressionlog' => 'Ð\93ледаÑ\9aе Ð½Ð° Ð¿Ñ\80иваÑ\82ни дневници',
+'right-suppressionlog' => 'Ð\93ледаÑ\9aе Ð½Ð° Ð»Ð¸Ñ\87ни дневници',
 'right-block' => 'Оневозможување на останати корисници да уредуваат',
 'right-blockemail' => 'Оневозможување корисници да праќаат е-пошта',
 'right-hideuser' => 'Блокирање корисници, сокривање од јавноста',
@@ -1715,8 +1714,8 @@ $1",
 'right-editmyuserjs' => 'Уредување на сопствени кориснички податотеки со JavaScript',
 'right-viewmywatchlist' => 'Преглед на вашиот список на набљудувања',
 'right-editmywatchlist' => 'Уредување на вашиот список на набљудувања. Извесни дејства сепак ќе ставаат страници во списокот и без да го имате ова право.',
-'right-viewmyprivateinfo' => 'Ð\9fÑ\80еглед Ð½Ð° Ñ\81опÑ\81Ñ\82вениÑ\82е Ð¿Ñ\80иваÑ\82ни податоци (на пр. е-пошта, вистинско име и презиме)',
-'right-editmyprivateinfo' => 'УÑ\80едÑ\83ваÑ\9aе Ð½Ð° Ñ\81опÑ\81Ñ\82вениÑ\82е Ð¿Ñ\80иваÑ\82ни податоци (на пр. е-пошта, вистинско име и презиме)',
+'right-viewmyprivateinfo' => 'Ð\9fÑ\80еглед Ð½Ð° Ñ\81опÑ\81Ñ\82вениÑ\82е Ð»Ð¸Ñ\87ни податоци (на пр. е-пошта, вистинско име и презиме)',
+'right-editmyprivateinfo' => 'УÑ\80едÑ\83ваÑ\9aе Ð½Ð° Ñ\81опÑ\81Ñ\82вениÑ\82е Ð»Ð¸Ñ\87ни податоци (на пр. е-пошта, вистинско име и презиме)',
 'right-editmyoptions' => 'Уредување на вашите нагодувања',
 'right-rollback' => 'Брзо отповикување на уредувањата на последниот корисник што уредувал одредена страница',
 'right-markbotedits' => 'Означување на вратени уредувања како ботовски уредувања',
@@ -1765,7 +1764,7 @@ $1",
 'action-browsearchive' => 'барање на избришани страници',
 'action-undelete' => 'обнови ја оваа страница',
 'action-suppressrevision' => 'прегледај ја и обнови ја оваа скриена ревизија',
-'action-suppressionlog' => 'преглед на овој приватен дневник',
+'action-suppressionlog' => 'преглед на овој li;en дневник',
 'action-block' => 'оневозможи го овој корисник да уредува',
 'action-protect' => 'измени го степенот на заштита на оваа страница',
 'action-rollback' => 'брзо отповикување на измени направени од последниот уредник на страницата',
@@ -1781,8 +1780,8 @@ $1",
 'action-sendemail' => 'испраќање на е-пошта',
 'action-editmywatchlist' => 'уредување на вашиот список на набљудувања',
 'action-viewmywatchlist' => 'преглед на вашиот список на набљудувања',
-'action-viewmyprivateinfo' => 'пÑ\80еглед Ð½Ð° Ð²Ð°Ñ\88иÑ\82е Ð¿Ñ\80иваÑ\82ни податоци',
-'action-editmyprivateinfo' => 'Ñ\83Ñ\80едÑ\83ваÑ\9aе Ð½Ð° Ð²Ð°Ñ\88иÑ\82е Ð¿Ñ\80иваÑ\82ни податоци',
+'action-viewmyprivateinfo' => 'пÑ\80еглед Ð½Ð° Ð²Ð°Ñ\88иÑ\82е Ð»Ð¸Ñ\87ни податоци',
+'action-editmyprivateinfo' => 'Ñ\83Ñ\80едÑ\83ваÑ\9aе Ð½Ð° Ð²Ð°Ñ\88иÑ\82е Ð»Ð¸Ñ\87ни податоци',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|промена|промени}}',
@@ -1801,14 +1800,26 @@ $1",
 'recentchanges-legend-heading' => "'''Легенда:'''",
 'recentchanges-legend-newpage' => '(погл. и [[Special:NewPages|списокот на нови страници]])',
 'recentchanges-legend-plusminus' => "(''±123'')",
-'rcnotefrom' => 'Ð\9fодолÑ\83 Ñ\81е Ð¿Ñ\80омениÑ\82е Ð¾Ð´ <b>$2</b> (се прикажуваат до <b>$1</b>).',
+'rcnotefrom' => 'Ð\9fодолÑ\83 Ñ\81е Ð¿Ñ\80омениÑ\82е Ð½Ð°Ð¿Ñ\80авени Ð¾Ð´ <strong>$2</strong> Ð½Ð°Ð²Ð°Ð¼Ñ\83 (се прикажуваат до <b>$1</b>).',
 'rclistfrom' => 'Прикажи нови промени почнувајќи од $1',
 'rcshowhideminor' => '$1 ситни промени',
+'rcshowhideminor-show' => 'Прикажи',
+'rcshowhideminor-hide' => 'Скриј',
 'rcshowhidebots' => '$1 ботови',
+'rcshowhidebots-show' => 'Прикажи',
+'rcshowhidebots-hide' => 'Скриј',
 'rcshowhideliu' => '$1 најавени корисници',
+'rcshowhideliu-show' => 'Прикажи',
+'rcshowhideliu-hide' => 'Скриј',
 'rcshowhideanons' => '$1 анонимни корисници',
+'rcshowhideanons-show' => 'Прикажи',
+'rcshowhideanons-hide' => 'Скриј',
 'rcshowhidepatr' => '$1 проверени уредувања',
+'rcshowhidepatr-show' => 'Прикажи',
+'rcshowhidepatr-hide' => 'Скриј',
 'rcshowhidemine' => '$1 мои уредувања',
+'rcshowhidemine-show' => 'Прикажи',
+'rcshowhidemine-hide' => 'Скриј',
 'rclinks' => 'Прикажи скорешни $1 промени во последните $2 дена<br />$3',
 'diff' => 'разл',
 'hist' => 'истор',
@@ -1940,6 +1951,8 @@ $1",
 'php-uploaddisabledtext' => 'Подигањето на податотеки е оневозможено во PHP. 
 Проверете го нагодувањето file_uploads.',
 'uploadscripted' => 'Податотеката содржи HTML-код или сценарио што може погрешно да се протолкува во прелистувачот.',
+'uploadscriptednamespace' => 'Овааа SVG-податотека го содржи недопуштениот именски простор „$1“',
+'uploadinvalidxml' => 'Не можев да го расчленам XML-от што се наоѓа во подигнатата податотека.',
 'uploadvirus' => 'Оваа податотека содржи вирус! Повеќе подробности: $1',
 'uploadjava' => 'Податотеката е од типот ZIP што содржи податотека со наставка .class за Java.
 Подигањето на податотеки за Java не е дозволено, бидејќи со нив можат да се заобиколуваат безбедносните ограничувања.',
@@ -2066,7 +2079,7 @@ $1',
 'img-auth-isdir' => 'Се обидувате да пристапите до именикот „$1“.
 Допуштен е само податотечен пристап.',
 'img-auth-streaming' => 'Емитување „$1“.',
-'img-auth-public' => 'ФÑ\83нкÑ\86иÑ\98аÑ\82а Ð½Ð° img_auth.php Ñ\81лÑ\83жи Ð·Ð° Ð¸Ð·Ð»ÐµÐ· Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82еки Ð¾Ð´ Ð¿Ñ\80иваÑ\82ни викија.
+'img-auth-public' => 'ФÑ\83нкÑ\86иÑ\98аÑ\82а Ð½Ð° img_auth.php Ñ\81лÑ\83жи Ð·Ð° Ð¸Ð·Ð»ÐµÐ· Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82еки Ð¾Ð´ Ð»Ð¸Ñ\87ни викија.
 Ова вики е нагодено како јавно вики.
 Од причини на оптимална сигурност, img_auth.php е оневозможен.',
 'img-auth-noread' => 'Корисникот нема пристап за читање на „$1“.',
@@ -2608,7 +2621,7 @@ $UNWATCHURL
 'delete-warning-toobig' => 'Оваа страница има долга историја на уредување, преку $1 {{PLURAL:$1|ревизија|ревизии}}.
 Бришењето може да предизвика проблеми при работењето на базата на податоци на {{SITENAME}};
 продолжете доколку сте сигруни дека треба тоа да го сторите.',
-'deleting-backlinks-warning' => "'''Предупредување:''' До страницата што сакате да ја избришете водат други страници или се превметнуваат во неа.",
+'deleting-backlinks-warning' => "'''Предупредување:''' До страницата што сакате да ја избришете водат [[Special:WhatLinksHere/{{FULLPAGENAME}}|други страници]] или пак се превметнуваат во неа.",
 
 # Rollback
 'rollback' => 'Отповикај промени',
@@ -2790,8 +2803,10 @@ $1',
 'sp-contributions-blocked-notice-anon' => 'Оваа IP-адреса е моментално блокирана.
 Подолу е наведен најновиот дневнички запис на блокирање:',
 'sp-contributions-search' => 'Пребарување на придонеси',
+'sp-contributions-suppresslog' => 'притаени придонеси на корисникот',
 'sp-contributions-username' => 'IP-адреса или корисничко име:',
 'sp-contributions-toponly' => 'Прикажувај само последни ревизии',
+'sp-contributions-newonly' => 'Прикажувај само новосоздадени страници',
 'sp-contributions-submit' => 'Пребарај',
 
 # What links here
@@ -2929,7 +2944,7 @@ $1',
 'ip_range_toolarge' => 'Не се дозволени опсежни блокирања поголеми од /$1.',
 'proxyblocker' => 'Блокер на застапници (proxy)',
 'proxyblockreason' => 'Вашата IP-адреса е блокирана бидејќи претставува отворен застапник (proxy).
-Ве молиме контактирајте со вашиот доставувач на Интернет услуги или техничката поддршка и информирајте ги за овој сериозен безбедносен проблем.',
+Ве молиме контактирајте со вашиот семрежен услужник и или техничката поддршка и информирајте ги за овој сериозен безбедносен проблем.',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'Вашата IP-адреса е запишана како отворен застапник (proxy) во DNSBL кој го користи {{SITENAME}}..',
 'sorbs_create_account_reason' => 'Вашата IP-адреса е наведена како отворен застапникот (proxy) во DNSBL користена од {{SITENAME}}.
@@ -3398,13 +3413,13 @@ $1',
 'file-info' => 'големина: $1, MIME-тип: $2',
 'file-info-size' => '$1 × $2 пиксели, големина: $3, MIME-тип: $4',
 'file-info-size-pages' => '$1 × $2 пиксели, големина: $3, MIME-тип: $4, $5 {{PLURAL:$5|страница|страници}}',
-'file-nohires' => 'Не е достапна поголема резолуција.',
+'file-nohires' => 'Нема верзија со поголема разложеност.',
 'svg-long-desc' => 'SVG податотека, номинално $1 × $2 пиксели, големина: $3',
 'svg-long-desc-animated' => 'Анимирана SVG-податотека, номинално: $1 × $2 пиксели, големина: $3',
 'svg-long-error' => 'Неважечка SVG-податотека: $1',
 'show-big-image' => 'Изворна податотека',
 'show-big-image-preview' => 'Големина на овој преглед: $1.',
-'show-big-image-other' => '{{PLURAL:$2|Ð\94Ñ\80Ñ\83га Ñ\80езолÑ\83Ñ\86иÑ\98а|Ð\94Ñ\80Ñ\83ги Ñ\80езолÑ\83Ñ\86ии}}: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Ð\94Ñ\80Ñ\83га Ñ\80азложеноÑ\81Ñ\82\94Ñ\80Ñ\83ги Ñ\80азложеноÑ\81Ñ\82и}}: $1.',
 'show-big-image-size' => '$1 × $2 пиксели',
 'file-info-gif-looped' => 'кружно',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|кадар|кадри}}',
@@ -3412,7 +3427,7 @@ $1',
 'file-info-png-repeat' => 'пуштено {{PLURAL:$1|еднаш|$1 пати}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|кадар|кадри}}',
 'file-no-thumb-animation' => "'''Напомена: Поради технички ограничувања, минијатурите на оваа податотека нема да се анимираат.'''",
-'file-no-thumb-animation-gif' => "'''Ð\9dапомена: Ð\9fоÑ\80ади Ñ\82еÑ\85ниÑ\87ки Ð¾Ð³Ñ\80аниÑ\87Ñ\83ваÑ\9aа, Ð¼Ð¸Ð½Ð¸Ñ\98аÑ\82Ñ\83Ñ\80иÑ\82е Ð½Ð° GIF-Ñ\81лики Ñ\81о Ð²Ð¸Ñ\81ока Ñ\80езолÑ\83Ñ\86иÑ\98а како оваа нема да се анимираат.'''",
+'file-no-thumb-animation-gif' => "'''Ð\9dапомена: Ð\9fоÑ\80ади Ñ\82еÑ\85ниÑ\87ки Ð¾Ð³Ñ\80аниÑ\87Ñ\83ваÑ\9aа, Ð¼Ð¸Ð½Ð¸Ñ\98аÑ\82Ñ\83Ñ\80иÑ\82е Ð½Ð° GIF-Ñ\81лики Ñ\81о Ð²Ð¸Ñ\81ока Ñ\80азложеноÑ\81Ñ\82 како оваа нема да се анимираат.'''",
 
 # Special:NewFiles
 'newimages' => 'Галерија на нови податотеки',
@@ -3537,8 +3552,8 @@ Variants for Chinese language
 'exif-planarconfiguration' => 'Распоред на податоците',
 'exif-ycbcrsubsampling' => 'Однос на величината на Y спрема C',
 'exif-ycbcrpositioning' => 'Положби на Y и C',
-'exif-xresolution' => 'ХоÑ\80изонÑ\82ална Ñ\80езолÑ\83Ñ\86иÑ\98а',
-'exif-yresolution' => 'Ð\92еÑ\80Ñ\82икална Ñ\80езолÑ\83Ñ\86иÑ\98а',
+'exif-xresolution' => 'ХоÑ\80изонÑ\82ална Ñ\80азложеноÑ\81Ñ\82',
+'exif-yresolution' => 'Ð\92еÑ\80Ñ\82икална Ñ\80азложеноÑ\81Ñ\82',
 'exif-stripoffsets' => 'Положба на податоците',
 'exif-rowsperstrip' => 'Број на редови по блок',
 'exif-stripbytecounts' => 'Бајти по набиен блок',
@@ -3589,9 +3604,9 @@ Variants for Chinese language
 'exif-focallength-format' => '$1 мм',
 'exif-subjectarea' => 'Положба и површина на објектот',
 'exif-flashenergy' => 'Енергија на блицот',
-'exif-focalplanexresolution' => 'РезолÑ\83Ñ\86иÑ\98а Ð½Ð° Ñ\84окÑ\83Ñ\81наÑ\82а Ñ\80амнина  X',
-'exif-focalplaneyresolution' => 'РезолÑ\83Ñ\86иÑ\98а Ð½Ð° Ñ\84окÑ\83Ñ\81ната рамнина Y',
-'exif-focalplaneresolutionunit' => 'Ð\95диниÑ\86а Ð·Ð° Ñ\80езолÑ\83Ñ\86иÑ\98а Ð½Ð° Ñ\84окÑ\83Ñ\81ната рамнина',
+'exif-focalplanexresolution' => 'РазложеноÑ\81Ñ\82 Ð½Ð° Ð¶Ð°Ñ\80иÑ\88наÑ\82а Ñ\80амнина X',
+'exif-focalplaneyresolution' => 'РазложеноÑ\81Ñ\82 Ð½Ð° Ð¶Ð°Ñ\80иÑ\88ната рамнина Y',
+'exif-focalplaneresolutionunit' => 'Ð\95диниÑ\86а Ð·Ð° Ñ\80азложеноÑ\81Ñ\82 Ð½Ð° Ð¶Ð°Ñ\80иÑ\88ната рамнина',
 'exif-subjectlocation' => 'Положба на субјектот',
 'exif-exposureindex' => 'Индекс на експозицијата',
 'exif-sensingmethod' => 'Метод на сензорот',
@@ -4196,7 +4211,7 @@ $5
 'version' => 'Верзија',
 'version-extensions' => 'Воспоставени додатоци',
 'version-specialpages' => 'Специјални страници',
-'version-parserhooks' => 'Ð\9fаÑ\80Ñ\81еÑ\80Ñ\81ки куки',
+'version-parserhooks' => 'РаÑ\81Ñ\87ленÑ\83ваÑ\87ки куки',
 'version-variables' => 'Променливи',
 'version-antispam' => 'Спречување на спам',
 'version-skins' => 'Рува',
@@ -4204,8 +4219,8 @@ $5
 'version-other' => 'Друго',
 'version-mediahandlers' => 'Ракувачи со мултимедијални содржини',
 'version-hooks' => 'Куки',
-'version-parser-extensiontags' => 'Ознаки за парсерски додатоци',
-'version-parser-function-hooks' => 'Куки на парсерските функции',
+'version-parser-extensiontags' => 'Ознаки за расчленувачки додатоци',
+'version-parser-function-hooks' => 'Куки на расчленувачки функции',
 'version-hook-name' => 'Име на кука',
 'version-hook-subscribedby' => 'Претплатено од',
 'version-version' => '(Верзија $1)',
@@ -4465,7 +4480,7 @@ $5
 'rotate-comment' => 'Сликата е завртена за $1 {{PLURAL:$1|степен|степени}} вдесно',
 
 # Limit report
-'limitreport-title' => 'Профилни парсерски податоци:',
+'limitreport-title' => 'Профилни расчленувачки податоци:',
 'limitreport-cputime' => 'Употреба на обработувачко време',
 'limitreport-cputime-value' => '{{PLURAL:$1|една секунда|$1 секунди}}',
 'limitreport-walltime' => 'Употреба на вистинско време',
@@ -4477,12 +4492,12 @@ $5
 'limitreport-templateargumentsize' => 'Големина на аргументот во шаблонот',
 'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|бајт|бајти}}',
 'limitreport-expansiondepth' => 'Најголема длабочина на проширувањето',
-'limitreport-expensivefunctioncount' => 'Бр. на сложени парсерски функции',
+'limitreport-expensivefunctioncount' => 'Бр. на сложени расчленувачки функции',
 
 # Special:ExpandTemplates
 'expandtemplates' => 'Прошири шаблони',
 'expand_templates_intro' => 'Оваа специјална страница зема еден текст и рекурзивно ги проширува сите шаблони во него.
-Исто така проширува и парсерски функции како
+Исто така проширува и расчленувачки функции како
 <code><nowiki>{{</nowiki>#language:…}}</code> и променливи како
 <code><nowiki>{{</nowiki>CURRENTDAY}}</code>.
 Всушност, го проширува сето она што стои во двојни аглести загради.',
@@ -4498,6 +4513,4 @@ $5
 'expand_templates_generate_rawhtml' => 'Прикажувај сиров HTML',
 'expand_templates_preview' => 'Преглед',
 
-# Unknown messages
-'uploadinvalidxml' => 'Не можев да го расчленам XML-от што се наоѓа во подигнатата податотека.',
 );
index 69cffc7..9fd819f 100644 (file)
@@ -383,7 +383,7 @@ $messages = array(
 'tog-uselivepreview' => 'തത്സമയ പ്രിവ്യൂ ഉപയോഗപ്പെടുത്തുക (പരീക്ഷണാടിസ്ഥാനം)',
 'tog-forceeditsummary' => 'തിരുത്തുകളുടെ ചുരുക്കം നൽകിയില്ലെങ്കിൽ എന്നെ ഓർമ്മിപ്പിക്കുക',
 'tog-watchlisthideown' => 'ഞാൻ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽനിന്ന് എന്റെ തിരുത്തുകൾ മറയ്ക്കുക',
-'tog-watchlisthidebots' => 'à´\9eാൻ à´¶àµ\8dà´°à´¦àµ\8dധിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´¤à´¾à´³àµ\81à´\95à´³àµ\81à´\9fàµ\86 à´ªà´\9fàµ\8dà´\9fà´¿à´\95യിൽനിനàµ\8dà´¨àµ\8d à´¯à´¨àµ\8dà´¤àµ\8dà´°à´\99àµ\8dà´\99ൾ à´µà´°àµ\81à´¤àµ\8dതിയ à´¤à´¿à´°àµ\81à´¤àµ\8dതലàµ\81à´\95ൾ à´®à´±à´¯àµ\8dà´\95àµ\8dà´\95àµ\81à´\95',
+'tog-watchlisthidebots' => 'ഞാൻ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽനിന്ന് യന്ത്രങ്ങൾ വരുത്തിയ തിരുത്തുകൾ മറയ്ക്കുക',
 'tog-watchlisthideminor' => 'ഞാൻ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽനിന്ന് ചെറുതിരുത്തുകൾ മറയ്ക്കുക',
 'tog-watchlisthideliu' => 'ഞാൻ ശ്രദ്ധിക്കുന്ന താളുകളിലെ മാറ്റങ്ങളിൽ നിന്നും ലോഗിൻ ചെയ്തിട്ടുള്ളവരുടെ തിരുത്തുകൾ മറയ്ക്കുക',
 'tog-watchlisthideanons' => 'ഞാൻ ശ്രദ്ധിക്കുന്ന താളുകളിലെ മാറ്റങ്ങളിൽ നിന്നും അജ്ഞാത ഉപയോക്താക്കളുടെ തിരുത്തുകൾ മറയ്ക്കുക',
@@ -799,7 +799,7 @@ $2',
 'gotaccount' => "താങ്കൾക്ക് അംഗത്വമുണ്ടോ? '''$1'''.",
 'gotaccountlink' => 'പ്രവേശിക്കുക',
 'userlogin-resetlink' => 'താങ്കളുടെ ലോഗിൻ വിവരങ്ങൾ മറന്നു പോയോ?',
-'userlogin-resetpassword-link' => 'താà´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 രഹസ്യവാക്ക് മറന്നോ?',
+'userlogin-resetpassword-link' => 'താà´\99àµ\8dà´\95ൾ രഹസ്യവാക്ക് മറന്നോ?',
 'helplogin-url' => 'Help:പ്രവേശനം',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|പ്രവേശന സഹായം]]',
 'userlogin-loggedin' => 'താങ്കൾ ഇപ്പോൾ തന്നെ {{GENDER:$1|$1}} ആയി പ്രവേശിച്ചിരിക്കുന്നു.
@@ -919,7 +919,7 @@ $2',
 'resetpass-temp-password' => 'താത്കാലിക രഹസ്യവാക്ക്:',
 'resetpass-abort-generic' => 'രഹസ്യവാക്ക് മാറ്റുന്നത് ഒരു അനുബന്ധം തടഞ്ഞിരിക്കുന്നു.',
 'resetpass-expired' => 'താങ്കളുടെ രഹസ്യവാക്ക് കാലഹരണപ്പെട്ടിരിക്കുന്നു. പ്രവേശിക്കാനായി പുതിയ രഹസ്യവാക്ക് സജ്ജമാക്കുക.',
-'resetpass-expired-soft' => 'താങ്കളുടെ രഹസ്യവാക്ക് കാലഹരണപ്പെട്ടിരിക്കുന്നതിനാൽ പുനഃസജ്ജീകരിക്കേണ്ടതുണ്ട്. ഇപ്പോൾ തന്നെ പുതിയ രഹസ്യവാക്ക് തിരഞ്ഞെടുക്കുക അല്ലെങ്കിൽ പിന്നീട് പുനഃസജ്ജീകരിക്കാനായി റദ്ദാക്കുക ഞെക്കുക.',
+'resetpass-expired-soft' => 'താങ്കളുടെ രഹസ്യവാക്ക് കാലഹരണപ്പെട്ടിരിക്കുന്നതിനാൽ പുനഃസജ്ജീകരിക്കേണ്ടതുണ്ട്. ഇപ്പോൾ തന്നെ പുതിയ രഹസ്യവാക്ക് തിരഞ്ഞെടുക്കുക അല്ലെങ്കിൽ പിന്നീട് പുനഃസജ്ജീകരിക്കാനായി "{{int:resetpass-submit-cancel}}" ഞെക്കുക.',
 
 # Special:PasswordReset
 'passwordreset' => 'രഹസ്യവാക്ക് പുനഃക്രമീകരിക്കുക',
@@ -1755,14 +1755,26 @@ $1",
 'recentchanges-label-plusminus' => 'താളിന്റെ വലിപ്പം ഇത്രയും ബൈറ്റുകൾ മാറിയിരിക്കുന്നു',
 'recentchanges-legend-heading' => "'''സൂചന:'''",
 'recentchanges-legend-newpage' => '([[Special:NewPages|പുതിയ താളുകളുടെ പട്ടികയും]] കാണുക)',
-'rcnotefrom' => '<b>$2</b> മുതലുള്ള മാറ്റങ്ങൾ (<b>$1</b> എണ്ണം വരെ കാണാം).',
+'rcnotefrom' => '<strong>$2</strong> മുതലുള്ള മാറ്റങ്ങൾ (<strong>$1</strong> എണ്ണം വരെ കാണാം).',
 'rclistfrom' => '$1 മുതലുള്ള മാറ്റങ്ങൾ പ്രദർശിപ്പിക്കുക',
 'rcshowhideminor' => 'ചെറുതിരുത്തലുകൾ $1',
+'rcshowhideminor-show' => 'പ്രദർശിപ്പിക്കുക',
+'rcshowhideminor-hide' => 'മറയ്ക്കുക',
 'rcshowhidebots' => 'യന്ത്രങ്ങളെ $1',
+'rcshowhidebots-show' => 'പ്രദർശിപ്പിക്കുക',
+'rcshowhidebots-hide' => 'മറയ്ക്കുക',
 'rcshowhideliu' => 'അംഗത്വമെടുത്തിട്ടുള്ളവരെ $1',
+'rcshowhideliu-show' => 'പ്രദർശിപ്പിക്കുക',
+'rcshowhideliu-hide' => 'മറയ്ക്കുക',
 'rcshowhideanons' => 'അജ്ഞാത ഉപയോക്താക്കളെ $1',
+'rcshowhideanons-show' => 'പ്രദർശിപ്പിക്കുക',
+'rcshowhideanons-hide' => 'മറയ്ക്കുക',
 'rcshowhidepatr' => 'റോന്തു ചുറ്റിയ മാറ്റങ്ങൾ $1',
+'rcshowhidepatr-show' => 'പ്രദർശിപ്പിക്കുക',
+'rcshowhidepatr-hide' => 'മറയ്ക്കുക',
 'rcshowhidemine' => 'എന്റെ തിരുത്തലുകൾ $1',
+'rcshowhidemine-show' => 'പ്രദർശിപ്പിക്കുക',
+'rcshowhidemine-hide' => 'മറയ്ക്കുക',
 'rclinks' => 'കഴിഞ്ഞ $2 ദിവസങ്ങൾക്കുള്ളിലുണ്ടായ $1 മാറ്റങ്ങൾ പ്രദർശിപ്പിക്കുക<br />$3',
 'diff' => 'മാറ്റം',
 'hist' => 'നാൾവഴി',
@@ -1892,6 +1904,8 @@ $2 {{PLURAL:$3|തരത്തിലുള്ള പ്രമാണം|തരങ
 'php-uploaddisabledtext' => 'പി.എച്ച്.പി.യിൽ പ്രമാണ അപ്‌‌ലോഡുകൾ സാദ്ധ്യമല്ലാതാക്കിയിരിക്കുന്നു.
 ദയവായി file_uploads ക്രമീകരണങ്ങൾ പരിശോധിക്കുക.',
 'uploadscripted' => 'ഈ പ്രമാണത്തിൽ വെബ് ബ്രൗസർ തെറ്റായി വ്യാഖ്യാനിച്ചേക്കാവുന്ന എച്ച്.റ്റി.എം.എൽ. അല്ലെങ്കിൽ സ്ക്രിപ്റ്റ് കോഡ് ഉണ്ട്.',
+'uploadscriptednamespace' => 'ഈ എസ്.വി.ജി. പ്രമാണത്തിൽ ഉപയോഗിക്കാൻ പാടില്ലാത്ത നാമമേഖലയായ "$1" ഉണ്ട്',
+'uploadinvalidxml' => 'അപ്‌ലോഡ് ചെയ്ത പ്രമാണത്തിലെ എക്സ്.എം.എൽ. പാഴ്സ് ചെയ്യാൻ കഴിയില്ല.',
 'uploadvirus' => 'പ്രമാണത്തിൽ വൈറസുണ്ട്! വിശദാംശങ്ങൾ: $1',
 'uploadjava' => 'ഇത്, ജാവ .class പ്രമാണങ്ങൾ അടക്കം ചെയ്തിട്ടുള്ള ഒരു സിപ് (ZIP) പ്രമാണം ആണ്.
 സുരക്ഷാതടയലുകൾ മറികടക്കാൻ കഴിയുമെന്ന കാരണത്താൽ ജാവ പ്രമാണങ്ങൾ അപ്‌ലോഡ് ചെയ്യുന്നത് അനുവദിച്ചിട്ടില്ല.',
@@ -2245,6 +2259,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'deadendpagestext' => 'താഴെക്കാണുന്ന താളുകളിൽനിന്ന് {{SITENAME}} സം‌രംഭത്തിലെ മറ്റൊരു താളിലേയ്ക്കും കണ്ണി ചേർത്തിട്ടില്ല.',
 'protectedpages' => 'സംരക്ഷിക്കപ്പെട്ടിരിക്കുന്ന താളുകൾ',
 'protectedpages-indef' => 'അനന്തകാലത്തേയ്ക്ക് സംരക്ഷിക്കപ്പെട്ടവ മാത്രം',
+'protectedpages-summary' => 'സംരക്ഷിക്കപ്പെട്ടിട്ടുള്ളതും എന്നാൽ നിലവിലുള്ളതുമായ താളുകളുടെ പട്ടിക ഈ താളിൽ കാണാം. സൃഷ്ടിക്കുന്നതിൽ നിന്നും സംരക്ഷിക്കപ്പെട്ടിട്ടുള്ള തലക്കെട്ടുകൾക്കായി [[{{#special:ProtectedTitles}}]] കാണുക.',
 'protectedpages-cascade' => 'നിർഝരിത സംരക്ഷണങ്ങൾ മാത്രം',
 'protectedpages-noredirect' => 'തിരിച്ചുവിടലുകൾ മറയ്ക്കുക',
 'protectedpagesempty' => 'ഈ ചരങ്ങൾ ഉപയോഗിച്ചു താളുകൾ ഒന്നും തന്നെ സം‌രക്ഷിക്കപ്പെട്ടിട്ടില്ല.',
@@ -2257,6 +2272,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'protectedpages-unknown-timestamp' => 'അജ്ഞാതം',
 'protectedpages-unknown-performer' => 'അജ്ഞാത ഉപയോക്താവ്',
 'protectedtitles' => 'സംരക്ഷിക്കപ്പെട്ടിരിക്കുന്ന തലക്കെട്ടുകൾ',
+'protectedtitles-summary' => 'സൃഷ്ടിക്കുന്നതിൽ നിന്നും സംരക്ഷിക്കപ്പെട്ടിട്ടുള്ള താളുകളുടെ പട്ടിക ഇവിടെ കാണാം. സംരക്ഷിക്കപ്പെട്ടിട്ടുള്ളതും എന്നാൽ നിലവിലുള്ളതുമായ താളുകൾക്കായി [[{{#special:ProtectedPages}}]] കാണുക.',
 'protectedtitlesempty' => 'ഈ ചരങ്ങൾ ഉപയോഗിച്ചു തലക്കെട്ടുകൾ ഒന്നും തന്നെ സം‌രക്ഷിക്കപ്പെട്ടിട്ടില്ല.',
 'listusers' => 'ഉപയോക്താക്കളുടെ പട്ടിക',
 'listusers-editsonly' => 'തിരുത്തലുകൾ ചെയ്തിട്ടുള്ള ഉപയോക്താക്കളെ മാത്രം കാണിക്കുക',
@@ -2530,7 +2546,7 @@ $UNWATCHURL
 'delete-edit-reasonlist' => 'മായ്ക്കലിന്റെ കാരണം തിരുത്തുക',
 'delete-toobig' => 'ഈ താളിനു വളരെ വിപുലമായ തിരുത്തൽ ചരിത്രമുണ്ട്. $1 മേൽ {{PLURAL:$1|പതിപ്പുണ്ട്|പതിപ്പുകളുണ്ട്}}. ഇത്തരം താളുകൾ മായ്ക്കുന്നതു {{SITENAME}} സം‌രംഭത്തിന്റെ നിലനില്പ്പിനെ തന്നെ ബാധിക്കുമെന്നതിനാൽ ഈ താൾ മായ്ക്കുന്നതിനുള്ള അവകാശം പരിമിതപ്പെടുത്തിയിരിക്കുന്നു.',
 'delete-warning-toobig' => 'ഈ താളിനു വളരെ വിപുലമായ തിരുത്തൽ ചരിത്രമുണ്ട്. അതായത്, ഇതിനു് $1 മേൽ {{PLURAL:$1|പതിപ്പുണ്ട്|പതിപ്പുകളുണ്ട്}}. ഇത്തരം താളുകൾ മായ്ക്കുന്നതു {{SITENAME}} സം‌രംഭത്തിന്റെ ഡാറ്റാബേസ് ഓപ്പറേഷനെ ബാധിച്ചേക്കാം. അതിനാൽ വളരെ ശ്രദ്ധാപൂർവ്വം തുടർനടപടികളിലേക്കു നീങ്ങുക.',
-'deleting-backlinks-warning' => "'''മുന്നറിയിപ്പ്:''' മറ്റു താളുകളിൽ നിന്നും താളിലേയ്ക്കുള്ള കണ്ണികൾ അല്ലെങ്കിൽ ഉൾപ്പെടുത്തിയിട്ടുള്ള താളുകൾ താങ്കൾ മായ്ക്കാൻ പോവുകയാണ്.",
+'deleting-backlinks-warning' => "'''മുന്നറിയിപ്പ്:''' മറ്റു താളുകളിൽ നിന്നും [[Special:WhatLinksHere/{{FULLPAGENAME}}|താളിലേയ്ക്കുള്ള കണ്ണികൾ]] അല്ലെങ്കിൽ ഉൾപ്പെടുത്തിയിട്ടുള്ള താളുകൾ താങ്കൾ മായ്ക്കാൻ പോവുകയാണ്.",
 
 # Rollback
 'rollback' => 'തിരുത്തലുകൾ റോൾബാക്ക് ചെയ്യുക',
@@ -2705,8 +2721,10 @@ $1',
 'sp-contributions-blocked-notice-anon' => 'ഈ ഐ.പി. വിലാസം ഇപ്പോൾ തടയപ്പെട്ടിരിക്കുകയാണ്.
 അവലംബമായി തടയൽ രേഖയുടെ പുതിയഭാഗം താഴെ കൊടുത്തിരിക്കുന്നു:',
 'sp-contributions-search' => 'ചെയ്ത സേവനങ്ങൾ',
+'sp-contributions-suppresslog' => 'ഒതുക്കപ്പെട്ട ഉപയോക്തൃസംഭാവനകൾ',
 'sp-contributions-username' => 'ഐ.പി. വിലാസം അഥവാ ഉപയോക്തൃനാമം:',
 'sp-contributions-toponly' => 'ഒടുവിലത്തെ നാൾപ്പതിപ്പുകൾ മാത്രം പ്രദർശിപ്പിക്കുക',
+'sp-contributions-newonly' => 'താൾ സൃഷ്ടിക്കാനുള്ള തിരുത്തുകൾ മാത്രം പ്രദർശിപ്പിക്കുക',
 'sp-contributions-submit' => 'തിരയൂ',
 
 # What links here
@@ -4240,6 +4258,4 @@ $5
 'expand_templates_generate_rawhtml' => 'അസംസ്കൃത എച്ച്.റ്റി.എം.എൽ. പ്രദർശിപ്പിക്കുക',
 'expand_templates_preview' => 'എങ്ങനെയുണ്ടെന്നു കാണുക',
 
-# Unknown messages
-'uploadinvalidxml' => 'അപ്‌ലോഡ് ചെയ്ത പ്രമാണത്തിലെ എക്സ്.എം.എൽ. പാഴ്സ് ചെയ്യാൻ കഴിയില്ല.',
 );
index 78288b5..de8c093 100644 (file)
@@ -7,10 +7,12 @@
  * @ingroup Language
  * @file
  *
+ * @author Boldbdd
  * @author Chinneeb
  * @author E.shijir
  * @author Kaganer
  * @author Meno25
+ * @author Mongol
  * @author MongolWiki
  * @author Wisdom
  * @author Zorigt
@@ -82,6 +84,8 @@ $messages = array(
 'tog-diffonly' => 'Өөрчлөлтөөс доогуурх хуудсын агуулгыг үзүүлэхгүй байх',
 'tog-showhiddencats' => 'Нуугдсан ангиллуудыг үзүүлэх',
 'tog-norollbackdiff' => 'Буцаасны дараа өөрчлөлтийг орхигдуулах',
+'tog-useeditwarning' => 'Засварын хуудсаа хадгалалгүй гарах үед сануул',
+'tog-prefershttps' => 'Нэвтэрсэн үедээ үргэлж найдвартай сүлжээ хэрэглэнэ үү',
 
 'underline-always' => 'Байнга',
 'underline-never' => 'Хэзээ ч үгүй',
@@ -160,15 +164,17 @@ $messages = array(
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Анги|Ангилал}}',
-'category_header' => '"$1" Ð°Ð½Ð³Ð¸Ð¹Ð½ Ð±Ò¯Ñ\80Ñ\8dлдÑ\8dÑ\85үүн',
+'category_header' => '"$1" Ð°Ð½Ð³Ð¸Ð»Ð°Ð» Ð´Ð°Ñ\85Ñ\8c Ñ\85Ñ\83Ñ\83даÑ\81нÑ\83Ñ\83д',
 'subcategories' => 'Ангийн бүлэг',
 'category-media-header' => '"$1" ангийн файл',
 'category-empty' => "''Одоогийн байдлаар энэ ангилалд хуудас, медиа файл байхгүй байна.''",
 'hidden-categories' => '{{PLURAL:$1|Нуугдсан ангилал|Нуугдсан ангиллууд}}',
 'hidden-category-category' => 'Нуугдсан ангиллууд',
-'category-subcat-count' => '{{PLURAL:$2|ЭнÑ\8d Ð±Ò¯Ð»Ñ\8dг Ð·Ó©Ð²Ñ\85өн Ð´Ð°Ñ\80ааÑ\85 Ð´Ñ\8dд Ð±Ò¯Ð»Ñ\8dгÑ\82Ñ\8dй.|ЭнÑ\8d Ð±Ò¯Ð»Ñ\8dг Ð½Ð¸Ð¹Ñ\82 $2 -ооÑ\81 {{PLURAL:$1| Ð±Ò¯Ð»Ñ\8dгÑ\82Ñ\8dй.|$1 Ð±Ò¯Ð»Ð³Ò¯Ò¯Ð´Ñ\82Ñ\8dй.}}}}',
+'category-subcat-count' => '{{PLURAL:$2|ЭнÑ\8d Ð°Ð½Ð³Ð¸Ð»Ð°Ð»Ð´ Ð´Ð°Ñ\80ааÑ\85 Ð´Ñ\8dд Ð°Ð½Ð³Ð¸Ð»Ð°Ð» Ð» Ð±Ð°Ð¹Ð½Ð°.|ЭнÑ\8d Ð°Ð½Ð³Ð¸Ð»Ð°Ð»Ð´ Ð½Ð¸Ð¹Ñ\82 $2-Ñ\81 Ð´Ð°Ñ\80ааÑ\85 $1 Ð´Ñ\8dд Ð°Ð½Ð³Ð¸Ð»Ð°Ð» Ð±Ð°Ð¹Ð½Ð°.}}',
 'category-subcat-count-limited' => 'Энэ ангилалд {{PLURAL:$1| дэд ангилал|$1-н дэд ангилалууд}} байна.',
-'category-article-count' => '{{PLURAL:$2|Энд нэг хуудас байна.|Энд $2 хуудас байна. Үүнээс $1 доор харагдаж байна.}}',
+'category-article-count' => '{{PLURAL:$2|Энд нэг хуудас байна.|Энэ ангид $2 хуудас байна.}}
+
+{{PLURAL:$2|Энэ ангилалд дараах хуудас л байна.|Энэ ангилалд нийт $2-с дараах $1 хуудас байна.}}',
 'category-article-count-limited' => 'Энэ ангилалд дараах {{PLURAL:$1|хуудас|$1 хуудаснууд}} байна.',
 'category-file-count' => '{{PLURAL:$2|Энэ ангилалд дараах файл л байна.|Энэ ангилалд нийт $2-с дараах $1 файл байна.}}',
 'category-file-count-limited' => 'Энэ ангилалд дараах {{PLURAL:$1|файл|$1 файлнууд}} байна.',
@@ -207,7 +213,7 @@ $messages = array(
 'vector-action-unprotect' => 'Хамгаалалтаа солих',
 'vector-view-create' => 'Үүсгэх',
 'vector-view-edit' => 'Засварлах',
-'vector-view-history' => 'ТүүÑ\85ийг Ò¯Ð·Ñ\8dх',
+'vector-view-history' => 'Ð\97аÑ\81ваÑ\80Ñ\8bн Ñ\82Ò¯Ò¯х',
 'vector-view-view' => 'Унших',
 'vector-view-viewsource' => 'Кодыг харах',
 'actions' => 'Үйлдлүүд',
@@ -221,8 +227,8 @@ $messages = array(
 'help' => 'Тусламж',
 'search' => 'Хайлт',
 'searchbutton' => 'Хайх',
-'go' => 'Явах',
-'searcharticle' => 'Явах',
+'go' => 'Үзэх',
+'searcharticle' => 'Үзэх',
 'history' => 'Хуудасны түүх',
 'history_short' => 'Түүх',
 'updatedmarker' => 'сүүлд зочилсноос хойш шинэчлэгдсэн',
@@ -236,6 +242,7 @@ $messages = array(
 'create-this-page' => 'Энэ хуудсыг үүсгэх',
 'delete' => 'Устгах',
 'deletethispage' => 'Энэ хуудсыг устга',
+'undeletethispage' => 'Энэ хуудсыг бүү устга',
 'undelete_short' => 'Устгагдсан {{PLURAL:$1|нэг засварыг|$1 засваруудыг}} сэргээх',
 'viewdeleted_short' => '{{PLURAL:$1|арилгасан засварыг|арилгасан $1 засваруудыг}} харах',
 'protect' => 'Хамгаалах',
@@ -264,7 +271,7 @@ $messages = array(
 'otherlanguages' => 'Өөр хэлээр',
 'redirectedfrom' => '($1-с чиглүүлэгдэв)',
 'redirectpagesub' => 'Хуудсыг чиглүүлэх',
-'lastmodifiedat' => 'Энэ хуудсыг хамгийн сүүлд өөрчилсөн нь $2, $1.',
+'lastmodifiedat' => 'Энэ хуудас хамгийн сүүлд $1-ы $2-д өөрчлөгдсөн.',
 'viewcount' => 'Энэ хуудсанд {{PLURAL:$1|ганцхан удаа|$1 удаа}} хандсан байна.',
 'protectedpage' => 'Хамгаалагдсан хуудас',
 'jumpto' => 'Шууд очих:',
@@ -286,7 +293,7 @@ $1',
 'copyrightpage' => '{{ns:project}}:Зохиогчийн эрх',
 'currentevents' => 'Сүүлийн үеийн мэдээ',
 'currentevents-url' => 'Project:Сүүлийн үеийн мэдээ',
-'disclaimers' => 'ТаÑ\82галзлÑ\83Ñ\83д',
+'disclaimers' => 'ТаÑ\82галзал',
 'disclaimerpage' => 'Project:Ерөнхий татгалзал',
 'edithelp' => 'Засвар хийх тухай тусламж',
 'helppage' => 'Help:Агуулга',
@@ -295,7 +302,7 @@ $1',
 'policy-url' => 'Project:Бодлого баримтлал',
 'portal' => 'Бүлгэмийн портал',
 'portal-url' => 'Project:Бүлгэмийн портал',
-'privacy' => 'Ð¥Ñ\83вийн Ð¼Ñ\8dдÑ\8dÑ\8dллийн Ñ\82алааÑ\80Ñ\85 Ð±Ð°Ñ\80имÑ\82лал',
+'privacy' => 'Ð\9dÑ\83Ñ\83Ñ\86лалÑ\8bн Ð±Ð¾Ð´Ð»Ð¾Ð³Ð¾',
 'privacypage' => 'Project:Хувийн мэдээллийн талаарх баримтлал',
 
 'badaccess' => 'Зөвшөөрлийн алдаа',
@@ -308,12 +315,12 @@ $1',
 'ok' => 'OK',
 'pagetitle' => '$1 - {{SITENAME}}',
 'retrievedfrom' => '"$1" хуудаснаас авсан',
-'youhavenewmessages' => 'Таньд $1 ($2) байна.',
+'youhavenewmessages' => '{{PLURAL:$3|Танд}} $1 ($2) байна.',
 'youhavenewmessagesfromusers' => 'Танд {{PLURAL:$3|өөр нэгэн хэрэглэгчээс |$3 хэрэглэгчээс}} $1 ирсэн байна ($2).',
-'youhavenewmessagesmanyusers' => 'Танд ($2) Ð¾Ð»Ð¾Ð½ Ñ\85Ñ\8dÑ\80Ñ\8dглÑ\8dгÑ\87идÑ\8dÑ\8dÑ\81 $1.',
+'youhavenewmessagesmanyusers' => 'Танд ($2) олон хэрэглэгчдээс $1.',
 'newmessageslinkplural' => '{{PLURAL:$1|шинэ зурвас}}',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|сүүлд хийгдсэн өөрчлөлт}}',
-'youhavenewmessagesmulti' => 'Таньд $1 дээр шинэ мессеж ирсэн байна',
+'youhavenewmessagesmulti' => 'Танд $1 дээр шинэ зурвас ирсэн байна',
 'editsection' => 'засварлах',
 'editold' => 'засварлах',
 'viewsourceold' => 'кодыг харах',
@@ -321,10 +328,10 @@ $1',
 'viewsourcelink' => 'кодыг харах',
 'editsectionhint' => 'Хэсгийг засварлах: $1',
 'toc' => 'Агуулга',
-'showtoc' => 'үзүүлэх',
-'hidetoc' => 'нуух',
-'collapsible-collapse' => 'Буулгах',
-'collapsible-expand' => 'ТÑ\8dлэх',
+'showtoc' => 'дэлгэх',
+'hidetoc' => 'хумих',
+'collapsible-collapse' => 'хумих',
+'collapsible-expand' => 'дÑ\8dлгэх',
 'thisisdeleted' => '$1-г харах эсвэл сэргээх үү?',
 'viewdeleted' => '$1-г харах уу?',
 'restorelink' => '{{PLURAL:$1|арилгасан засвар|арилгасан $1 засварууд}}',
@@ -336,7 +343,7 @@ $1',
 'page-rss-feed' => '"$1"-н RSS фийд',
 'page-atom-feed' => '"$1"-н Atom фийд',
 'feed-atom' => 'Атом',
-'red-link-title' => '$1 (хуудас бичигдээгүй байна)',
+'red-link-title' => '$1 (ийм хуудас байхгүй)',
 'sort-descending' => 'Буурахаар эрэмбэлэх',
 'sort-ascending' => 'Өсөхөөр эрэмбэлэх',
 
@@ -350,7 +357,7 @@ $1',
 'nstab-mediawiki' => 'Мэдэгдэл',
 'nstab-template' => 'Загвар',
 'nstab-help' => 'Тусламж',
-'nstab-category' => 'Анги',
+'nstab-category' => 'Ангилал',
 
 # Main script and global functions
 'nosuchaction' => 'Тийм үйлдэл байхгүй байна',
@@ -365,6 +372,8 @@ $1',
 # General errors
 'error' => 'Aлдаа',
 'databaseerror' => 'Өгөгдлийн сангийн алдаа',
+'databaseerror-function' => 'Функц: $1',
+'databaseerror-error' => 'Алдаа: $1',
 'laggedslavemode' => 'Анхаар: Энэ хуудас нь хамгийн сүүлийн өөрчлөлтүүдийг хамруулаагүй байж болно.',
 'readonly' => 'Мэдээллийн сан түгжигдсэн байна',
 'enterlockreason' => 'Түгжих болсон шалтгаан болон хэзээ уг түгжээ нь тайлагдах тухай оруулна уу.',
@@ -398,7 +407,7 @@ $1',
 'cannotdelete-title' => '"$1" хуудсыг устгаж чадсангүй',
 'delete-hook-aborted' => 'Хүк устгалыг зогсоолоо.
 Шалтгаан өгөгдсөнгүй.',
-'badtitle' => 'Ð\91олоÑ\85гүй Ð³Ð°Ñ\80Ñ\87иг',
+'badtitle' => 'Ð¥Ò¯Ñ\87ингүй Ñ\85Ñ\83Ñ\83даÑ\81нÑ\8b Ð½Ñ\8dÑ\80 Ð±Ð°Ð¹Ð½Ð°',
 'badtitletext' => 'Оруулсан хуудасны нэр тань хүчингүй, хоосон, эсвэл буруу холбосон интер-хэл буюу интер-викигийн нэр байна. Нэрэнд хэрэглэгдэж болохгүй тэмдэгт орсон байж болзошгүй.',
 'perfcached' => 'Дараах тоо баримт нь нөөц хуулбар учраас хуучирсан мэдээлэлтэй байж магадгүй. Дээд тал нь {{PLURAL:$1|нэг илэрц|$1 илэрцүүд}} нөөцөд бэлэн байна.',
 'perfcachedts' => 'Дараах тоо баримт нь нөөц хуулбар учраас хуучирсан мэдээлэлтэй байж магадгүй. Дээд тал нь {{PLURAL:$1|нэг илэрц|$1 илэрцүүд}} нөөцөд бэлэн байна.',
@@ -419,6 +428,8 @@ $2',
 'namespaceprotected' => "Таньд '''$1''' нэрний зай дахь хуудсуудыг засварлах зөвшөөрөл байхгүй байна.",
 'customcssprotected' => 'Энэхүү CSS хуудас өөр хэрэглэгчийн хувийн тохиргоог агуулдаг тул та засварлах эрхгүй.',
 'customjsprotected' => 'Энэхүү JavaScript хуудас өөр хэрэглэгчийн хувийн тохиргоог агуулдаг тул та засварлах эрхгүй.',
+'mycustomjsprotected' => 'Танд энэхүү ЖаваСкрипт хуудсыг засварлах эрх байхгүй байна.',
+'myprivateinfoprotected' => 'Танд хувийн мэдээллээ засварлах эрх байхгүй байна.',
 'ns-specialprotected' => 'Тусгай хуудсуудыг засварлах боломжгүй.',
 'titleprotected' => "[[User:$1|$1]] нь энэ хуудсыг үүсгэх явдыг хорьжээ.
 Шалтгаан нь: ''$2''.",
@@ -455,6 +466,7 @@ $2',
 'createacct-yourpasswordagain' => 'Нууц үгээ баталгаажуулна уу',
 'createacct-yourpasswordagain-ph' => 'Нууц үгээ дахиж оруулна уу',
 'remembermypassword' => 'Энэ компьютер дээрх миний нэвтрэлтийг сана (хамгийн дээд талдаа $1 {{PLURAL:$1|өдрийн|өдрийн}} туршид)',
+'userlogin-signwithsecure' => 'Хамгаалалттай сүлжээ хэрэглэнэ үү',
 'yourdomainname' => 'Таны домэйн:',
 'password-change-forbidden' => 'Та энэ вики дээрх нууц үгээ сольж болохгүй.',
 'externaldberror' => 'Нэг бол гадны баталгаажуулах мэдээллийн сангийн алдаа гарсан, эсвэл та өөрийн гадны бүртгэлээ шинэчлэх эрхгүй байна.',
@@ -466,8 +478,9 @@ $2',
 'logout' => 'Гарах',
 'userlogout' => 'Гарах',
 'notloggedin' => 'Нэвтрээгүй байна',
+'userlogin-noaccount' => 'Бүртгүүлж амжаагүй юу?',
 'userlogin-joinproject' => '{{SITENAME}}-д бүртгүүлэх',
-'nologin' => "Бүртгэлгүй юу? '''$1'''.",
+'nologin' => "Бүртгүүлж амжаагүй юу? '''$1'''.",
 'nologinlink' => 'Бүртгүүлэх',
 'createaccount' => 'Бүртгүүлэх',
 'gotaccount' => "Та бүртгэлтэй юу? '''$1'''",
@@ -481,11 +494,17 @@ $2',
 'userlogin-createanother' => 'Өөр бүртгэл үүсгэх',
 'createacct-join' => 'Мэдээллээ оруулна уу.',
 'createacct-another-join' => 'Шинэ бүртгэлийн мэдээллээ оруулна уу.',
+'createacct-emailrequired' => 'Цахим шуудангийн хаяг',
+'createacct-email-ph' => 'Цахим шуудангийн хаягаа оруулна уу',
+'createacct-another-email-ph' => 'Цахим шуудангийн хаяг оруулна уу',
 'createaccountmail' => 'Мэйлээр илгээх',
 'createacct-realname' => 'Жинхэнэ нэр (хоосон орхиж болно)',
 'createaccountreason' => 'Шалтгаан:',
 'createacct-reason' => 'Шалтгаан',
 'createacct-reason-ph' => 'Өөр бүртгэл үүсгэх шалтгаан',
+'createacct-captcha' => 'Аюулгүй байдлын хяналт',
+'createacct-imgcaptcha-ph' => 'Дээр харагдаж буй бичвэрийг оруулна уу',
+'createacct-submit' => 'Бүртгүүлэх',
 'createacct-benefit-heading' => '{{SITENAME}}-г тан шиг хүмүүс хийж байна.',
 'createacct-benefit-body1' => '{{PLURAL:$1|засвар}}',
 'createacct-benefit-body2' => '{{PLURAL:$1|хуудас}}',
@@ -493,6 +512,7 @@ $2',
 'userexists' => 'Хэрэглэгчийн нэр ашиглагдаж байна.
 Өөр нэрээр нэвтэрнэ үү.',
 'loginerror' => 'Нэвтрэхэд алдаа гарлаа',
+'createacct-error' => 'Бүртгүүлэхэд гарсан алдаа',
 'createaccounterror' => 'Бүртгэлийг үүсгэж чадсангүй: $1',
 'nocookiesnew' => 'Таны хэрэглэгчийн бүртгэл үүсгэгдсэн боловч нэвтрээгүй байна.
 {{SITENAME}}-д холбогдоход күүкиг хэрэглэдэг.
@@ -530,15 +550,15 @@ $2',
 'passwordsent' => '"$1"-н бүртгүүлсэн мэйл хаяг руу шинэ нууц үг илгээгдлээ.
 Мэйлээ авсныхаа дараа дахин нэвтрээрэй.',
 'blocked-mailpassword' => 'Таны IP хаягаас засвар хийх эрхийг түгжсэн байгаа тул буруугаар ашиглахаас сэргийлэх үүднээс нууц үгийг сэргээхийг зөвшөөрөхгүй.',
-'eauthentsent' => 'Баталгаажуулах мэйл бүртгүүлсэн мэйл хаяг руу илгээгдлээ.
-Өөрийнхөө бүртгэлийг баталгаажуулахын тулд, өөр ямар нэг мэйл таны мэйл хаяг руу явуулагдахын өмнө тухай бүрийнхээ мэйл дэх зааврыг дагана уу.',
+'eauthentsent' => 'Баталгаажуулах мэйл бүртгүүлсэн цахим шуудангийн хаяг руу илгээгдлээ.
+Өөрийнхөө бүртгэлийг баталгаажуулахын тулд өөр ямар нэг цахим шуудан таны цахим шуудангийн хаяг руу илгээгдэхээс өмнө, цахим шуудан дахь зааврыг даган баталгаажуулна уу.',
 'throttled-mailpassword' => 'Сүүлийн {{PLURAL:$1|1 цагт|$1 цагт}} нууц үгийг сануулах мэйлийг явуулсан байгаа.
 Буруугаар ашиглахаас сэргийлэх үүднээс {{PLURAL:$1|цагт|$1 цагт}} нэг л сануулах мэйлийг явуулах боломжтой.',
 'mailerror' => 'Мэйл илгээхэд алдаа гарлаа: $1',
 'acct_creation_throttle_hit' => 'Сүүлийн өдөрт таны IP хаягийг ашиглан хүмүүс энэ викид тухайн хугацаа дахь шинэ бүртгэлийн дээд хязгаар болох {{PLURAL:$1|1 бүртгэл|$1 бүртгэл}} үүсгэжээ.
 Ийнхүү энэ IP хаягийг ашигласан хүмүүс одоогийн байдлаар дахин бүртгэл үүсгэх боломжгүй байна.',
-'emailauthenticated' => 'Таны мэйл хаяг $2-ний $3 цагт баталгаажлаа.',
-'emailnotauthenticated' => 'Таны мэйл хаяг баталгаажаагүй байна.
+'emailauthenticated' => 'Таны цахим шуудангийн хаяг $2-ы/ий $3 цагт баталгаажлаа.',
+'emailnotauthenticated' => 'Таны цахим шуудангийн хаяг хараахан баталгаажаагүй байна.
 Иймд доорх функцуудын алинд нь ч мэйл илгээгдэхгүй.',
 'noemailprefs' => 'Эдгээр функцуудыг ашиглахад мэйл хаягаа өгөх хэрэгтэй.',
 'emailconfirmlink' => 'Мэйл хаягаа баталгаажуулах',
@@ -555,14 +575,20 @@ $2',
 Хэрэв буруугаар бүртгүүлсэн бол энэ мэдэгдлийг үл ойшоож болно.',
 'usernamehasherror' => 'Хэрэглэгчийн нэрэнд хаш тэмдэгт орж болохгүй',
 'login-throttled' => 'Та хэт олон удаа нэвтрэх гэж оролдсон байна.
-Хүлээж байгаад дахин оролдого уу.',
+$1 хүлээж байгаад дахин оролдоно уу.',
 'login-abort-generic' => 'Та нэвтэрч чадсангүй',
 'loginlanguagelabel' => 'Хэл: $1',
 'suspicious-userlogout' => 'Таны гарах хүсэлт нь эвдэрхий хөтөч буюу кэшлэгч проксигоор явуулсан мэт харагдаж байгаа тул зөвшөөрсөнгүй.',
+'createacct-another-realname-tip' => 'Жинхэнэ нэрээ заавал оруулах албагүй.
+Оруулбал таны хийсэн бүтээлийг түүгээр хаяглана.',
+'pt-login' => 'Нэвтрэх',
+'pt-createaccount' => 'Бүртгүүлэх',
+'pt-userlogout' => 'Гарах',
 
 # Email sending
 'php-mail-error-unknown' => "PHP's mail() функцэд үл танигдах алдаа гарлаа.",
 'user-mail-no-addy' => 'Цахин шуудангийн хаягийг оруулалгүйгээр шуудан явуулахыг оролдлоо.',
+'user-mail-no-body' => 'Хоосон аль эсвэл хэт богино цахим шуудан илгээх гэж оролдлоо.',
 
 # Change password dialog
 'changepassword' => 'Нууц үгээ солих',
@@ -574,7 +600,9 @@ $2',
 'newpassword' => 'Шинэ нууц үг:',
 'retypenew' => 'Шинэ нууц үгээ дахин оруулах:',
 'resetpass_submit' => 'Нууц үгээ тогтоож нэвтрэх',
-'changepassword-success' => 'Таны нууц үг амжилттай солигдлоо! Та одоо нэвтэрч байна...',
+'changepassword-success' => 'Таны нууц үг амжилттай солигдлоо!',
+'changepassword-throttled' => 'Та хэт олон удаа нэвтрэх гэж оролдсон байна.
+$1 хүлээж байгаад дахин оролдоно уу.',
 'resetpass_forbidden' => 'Нууц үг өөрчлөх боломжгүй',
 'resetpass-no-info' => 'Энэ хуудсыг шууд үзэхийн тулд нэвтэрч орсон байх шаардлагатай.',
 'resetpass-submit-loggedin' => 'Нууц үгээ солих',
@@ -582,6 +610,7 @@ $2',
 'resetpass-wrong-oldpass' => 'Хүчингүй түр зуурын эсвэл одоогийн нууц үг байна.
 Та аль хэдийнээ нууц үгээ сольсон эсвэл түр зуурын нууц үг хүссэн байна.',
 'resetpass-temp-password' => 'Түр зуурын нууц үг:',
+'resetpass-expired' => 'Нууц үгийн хугацаа дууссан байна. Шинэ нууц үг оруулж нэвтрэнэ үү.',
 
 # Special:PasswordReset
 'passwordreset' => 'Нууц үгийг сэргээх',
@@ -637,7 +666,7 @@ $2
 'link_tip' => 'Дотоод холбоос',
 'extlink_sample' => 'http://www.example.com холбоосны нэр',
 'extlink_tip' => 'Гадны холбоос (эхэнд нь http:// бичихээ мартуузай)',
-'headline_sample' => 'Ð\93аÑ\80Ñ\87игийн Ñ\82екÑ\81Ñ\82',
+'headline_sample' => 'Гарчгийн текст',
 'headline_tip' => '2-р түвшний гарчиг',
 'nowiki_sample' => 'Энд хэлбэршүүлээгүй текстээ оруулна уу',
 'nowiki_tip' => 'Вики форматыг хэрэглэхгүй байх',
@@ -873,15 +902,15 @@ $3-н тодорхойлсон шалтгаан нь ''$2''",
 'previousrevision' => '←Хуучны засвар',
 'nextrevision' => 'Дараагийн засвар→',
 'currentrevisionlink' => 'Одоогийн засвар',
-'cur' => 'одоогийн',
+'cur' => 'одоо',
 'next' => 'дараагийн',
 'last' => 'сүүлийн',
 'page_first' => 'эхний',
 'page_last' => 'сүүлийн',
-'histlegend' => 'Өөрчлөлтүүдийг сонгох: харьцуулж үзэхийн тулд хувилбаруудын өмнөх хайрцагыг сонгож нэг бол "enter" товчлуурыг, эсвэл доорх товчлуурыг дараарай.<br />
-Тэмдэг: (одоогийн) = одоогийн засвартай харьцуулах
-(сүүлчийн) = өмнөх засвартай харьцуулах, Б = бага зэргийн засвар',
-'history-fieldset-title' => 'Түүх сөхөе',
+'histlegend' => 'Радио товчлууруудыг сонгож дарсаны дараа enter товчлуурыг, эсвэл хуудасны доод талд байгаа товчлуур дээр дарж засваруудыг хооронд нь харьцуулна уу.<br />
+
+Тайлбар: <strong>({{int:cur}})</strong> = одоогийн хувилбартай харьцуулах, <strong>({{int:last}})</strong> = өмнөх хувилбартай нь харьцуулах, <strong>{{int:minoreditletter}}</strong> = бага хэмжээний засвар',
+'history-fieldset-title' => 'Түүх сөхье',
 'history-show-deleted' => 'Зөвхөн устгагдсаныг',
 'histfirst' => 'хамгийн эхэнд',
 'histlast' => 'хамгийн шинэ',
@@ -1028,8 +1057,8 @@ $1",
 'difference-title-multipage' => '"$1", "$2" хоёр хуудасны ялгаа',
 'difference-multipage' => '(Хуудсууд хоорондын ялгаа)',
 'lineno' => '$1-р мөр:',
-'compareselectedversions' => 'Сонгосон хувилбаруудыг харьцуулах',
-'showhideselectedversions' => 'СонгоÑ\81он Ñ\85Ñ\83вилбаÑ\80Ñ\83Ñ\83дÑ\8bг Ò¯Ð·Ò¯Ò¯Ð»Ñ\8dÑ\85/нÑ\83Ñ\83х',
+'compareselectedversions' => 'Сонгосон хоёр хувилбарыг харьцуулах',
+'showhideselectedversions' => 'Ð\9eлон Ñ\85Ñ\83вилбаÑ\80Ñ\8bг Ñ\85аÑ\80Ñ\83Ñ\83лаÑ\85/болих',
 'editundo' => 'цуцлах',
 'diff-multi-manyusers' => '($2 гаруй {{PLURAL:$2|хэрэглэгчийн}} {{PLURAL:$1|дундын нэг засварыг|дундын $1 засварыг}} үзүүлсэнгүй)',
 
@@ -1352,20 +1381,23 @@ $1 тэмдэгтээс богино байх ёстой.',
 # Recent changes
 'nchanges' => '$1 өөрчлөлт',
 'recentchanges' => 'Сүүлийн өөрчлөлтүүд',
-'recentchanges-legend' => 'Сүүлийн өөрчлөлтүүдийн сонголтууд',
+'recentchanges-legend' => 'Сар өдөр, шинж төрлөөр шүүх хүснэгт',
 'recentchanges-summary' => 'Энэхүү хуудсанд викид хийсэн хамгийн сүүлийн өөрчлөлтүүдийг үзүүлж байна.',
 'recentchanges-feed-description' => 'Вики дахь хамгийн сүүлийн өөрчлөлтүүдийг хянах.',
-'recentchanges-label-newpage' => 'ЭнÑ\8d Ð·Ð°Ñ\81ваÑ\80 Ñ\88инÑ\8d Ñ\85Ñ\83Ñ\83дÑ\81Ñ\8bг Ò¯Ò¯Ñ\81гÑ\8dсэн байна',
-'recentchanges-label-minor' => 'ЭнÑ\8d Ð½Ñ\8c Ð±Ð°Ð³Ð° Ð·Ñ\8dÑ\80гийн Ð·Ð°Ñ\81ваÑ\80 Ð±Ð°Ð¹Ð½Ð°',
-'recentchanges-label-bot' => 'ЭнÑ\8d Ð·Ð°Ñ\81ваÑ\80Ñ\8bг Ð±Ð¾Ñ\82 Ð³Ò¯Ð¹Ñ\86Ñ\8dÑ\82гÑ\8dÑ\81Ñ\8dн Ð±Ð°Ð¹Ð½Ð°',
+'recentchanges-label-newpage' => 'ШинÑ\8d Ñ\85Ñ\83Ñ\83даÑ\81 Ò¯Ò¯Ñ\81сэн байна',
+'recentchanges-label-minor' => 'Ð\91ага Ð·Ñ\8dÑ\80гийн Ð·Ð°Ñ\81ваÑ\80',
+'recentchanges-label-bot' => 'РобоÑ\82 Ð³Ò¯Ð¹Ñ\86Ñ\8dÑ\82гÑ\8dÑ\81Ñ\8dн Ð·Ð°Ñ\81ваÑ\80',
 'recentchanges-label-unpatrolled' => 'Энэ засварыг одоогийн байдлаар манаагүй байна',
-'recentchanges-legend-newpage' => '([[Special:NewPages|Шинэ хуудсуудын жагсаалтыг]] бас үзнэ үү.',
+'recentchanges-label-plusminus' => 'Өөрчлөгдсөн байт хэмжээ',
+'recentchanges-legend-newpage' => '([[Special:NewPages|жагсааж харах]])',
 'rcnotefrom' => "Доорх нь '''$2'''-с хойших өөрчлөлтүүд ('''$1''' хүртэлхийг харуулав) юм.",
 'rclistfrom' => '$1-с хойших шинэ засваруудыг үзүүлэх',
 'rcshowhideminor' => 'Бага зэргийн засваруудыг $1',
 'rcshowhidebots' => 'Роботуудыг $1',
 'rcshowhideliu' => 'Нийт $1 бүртгэгдсэн хэрэглэгчид',
 'rcshowhideanons' => 'Бүртгэлгүй хэрэглэгчдийг $1',
+'rcshowhideanons-show' => 'үзүүлэх',
+'rcshowhideanons-hide' => 'нуух',
 'rcshowhidepatr' => 'Хянагдаж буй засваруудыг $1',
 'rcshowhidemine' => 'Миний засваруудыг $1',
 'rclinks' => 'Сүүлийн $2 өдрийн турших $1 засварыг үзүүлэх<br />$3',
@@ -1829,6 +1861,7 @@ URL нь зөв болон сайт ажиллагаатай байгаа эсэ
 'protectedpages-indef' => 'Зөвхөн хугацаагүй хамгаалалтууд',
 'protectedpages-cascade' => 'Зөвхөн давхар хамгаалалтууд',
 'protectedpagesempty' => 'Эдгээр параметрээр хамгаалагдсан хуудас байхгүй байна.',
+'protectedpages-page' => 'Хуудас',
 'protectedtitles' => 'Хамгаалагдсан гарчигууд',
 'protectedtitlesempty' => 'Эдгээр параметрээр хамгаалагдсан гарчиг байхгүй байна.',
 'listusers' => 'Хэрэглэгчдийн жагсаалт',
@@ -1855,7 +1888,7 @@ URL нь зөв болон сайт ажиллагаатай байгаа эсэ
 # Book sources
 'booksources' => 'Номон эх сурвалжууд',
 'booksources-search-legend' => 'Номын эх сурвалж хайх',
-'booksources-go' => 'Явах',
+'booksources-go' => 'Үзэх',
 'booksources-text' => 'Доорх нь шинэ, хуучин ном зардаг өөр сайт руу очих холбоосуудын жагсаалт бөгөөд таны хайж буй номнуудын тухай дэлгэрэнгүй мэдээлэл байх магадлалтай:',
 'booksources-invalid-isbn' => 'Өгөгдсөн ISBN хүчингүй юм шиг байна; эх сурвалжаас зөв хуулсан эсэхээ шалгана уу.',
 
@@ -1888,7 +1921,7 @@ URL нь зөв болон сайт ажиллагаатай байгаа эсэ
 'cachedspecial-refresh-now' => 'Саяханы хуудсыг харах',
 
 # Special:Categories
-'categories' => 'Анги',
+'categories' => 'Ангиллууд',
 'categoriespagetext' => 'Дараах {{PLURAL:$1|ангилалд|ангиллуудад}} хуудас эсвэл медиа файл агуулагдаж байна.
 [[Special:UnusedCategories|Хэрэглэгдэхгүй байгаа]] ангиллуудыг энд харуулсангүй.
 [[Special:WantedCategories|Хэрэгтэй ангиллууд]] гэдгийг харна уу.',
@@ -1904,7 +1937,7 @@ URL нь зөв болон сайт ажиллагаатай байгаа эсэ
 # Special:LinkSearch
 'linksearch' => 'Гадаад холбоос хайлт',
 'linksearch-pat' => 'Хэв маягийг хайх:',
-'linksearch-ns' => 'Ð\9dÑ\8dÑ\80ний Ð·Ð°Ð¹:',
+'linksearch-ns' => 'Ð¥Ñ\83Ñ\83дÑ\81Ñ\8bн Ñ\82Ó©Ñ\80өл:',
 'linksearch-ok' => 'Хайх',
 'linksearch-text' => '"*.wikipedia.org" зэрэг орлуулагч тэмдэгт хэрэглэх боломжтой.<br />
 Дор хаяж дээд түвшиний домайн хэрэгтэй байна, жишээ нь "*.org".<br />
@@ -1923,7 +1956,7 @@ URL нь зөв болон сайт ажиллагаатай байгаа эсэ
 'activeusers-intro' => 'Энэ нь сүүлийн $1 {{PLURAL:$1|өдөрт|өдөрт}} ямар нэг байдлаар үйлдэл хийсэн хэрэглэгчдийн жагсаалт юм.',
 'activeusers-count' => 'Сүүлийн {{PLURAL:$3|нэг өдөрт|$3 өдөрт}} $1 {{PLURAL:$1|засвар|засвар}}',
 'activeusers-from' => 'Хамгийн эхэлж харуулах хэрэглэгч:',
-'activeusers-hidebots' => 'Ботуудыг нуух',
+'activeusers-hidebots' => 'роботуудыг нуух',
 'activeusers-hidesysops' => 'Администраторуудыг нуух',
 'activeusers-noresult' => 'Хэрэглэгч олдсонгүй.',
 
@@ -2241,8 +2274,8 @@ $1',
 'contribsub2' => 'Хэрэглэгч: {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Энэ шалгуурт тохирох өөрчилсөн зүйлүүд олдсонгүй.',
 'uctop' => '(одоох)',
-'month' => 'Дараах сараас (өмнөх засварууд нь ч орно):',
-'year' => 'Ð\94аÑ\80ааÑ\85 Ð¶Ð¸Ð»Ñ\8dÑ\8dÑ\81 ï¼\88өмнөÑ\85 Ð·Ð°Ñ\81ваÑ\80Ñ\83Ñ\83д Ð½Ñ\8c Ñ\87 Ð¾Ñ\80ноï¼\89:',
+'month' => 'Дараах сараас урагш:',
+'year' => 'Ð\90Ñ\80Ñ\8bн Ð¾Ð½:',
 
 'sp-contributions-newbies' => 'Зөвхөн шинэ бүртгэлүүдийн хувь нэмрийг харуулах',
 'sp-contributions-newbies-sub' => 'Шинээр бүртгүүлсэн хэрэглэгчид',
@@ -2258,6 +2291,7 @@ $1',
 'sp-contributions-blocked-notice-anon' => 'Энэхүү IP хаягыг одоогоор түгжигдсэн байна.
 Лавлагааны зориулалтаар түгжээний лог дээрх хамгийн сүүлийн нэмэлтийг доор оруулав:',
 'sp-contributions-search' => 'Хувь нэмрийг хайх',
+'sp-contributions-suppresslog' => 'Хориглосон хэрэглэгчийн оролцоо',
 'sp-contributions-username' => 'IP хаяг эсвэл хэрэглэгчийн нэр:',
 'sp-contributions-toponly' => 'Хамгийн сүүлийн засваруудыг л үзүүлэх',
 'sp-contributions-submit' => 'Хайх',
@@ -2356,7 +2390,7 @@ $1',
 'blocklink' => 'түгжих',
 'unblocklink' => 'түгжээг тайлах',
 'change-blocklink' => 'түгжээг өөрчлөх',
-'contribslink' => 'хувь нэмэр',
+'contribslink' => 'оруулсан хувь нэмэр',
 'emaillink' => 'цахим шуудан явуулах',
 'autoblocker' => 'Автоматаар түгжигдлээ. Учир нь таны IP хаягийг "[[User:$1|$1]]" нь хэрэглэж байжээ. "$1"-г түгжих болсон шалтгаан нь: "\'\'\'$2\'\'\'"',
 'blocklogpage' => 'Түгжээний лог',
@@ -2625,9 +2659,9 @@ $1',
 'tooltip-ca-watch' => 'Энэ хуудсыг хянах жагсаалтандаа нэмэх',
 'tooltip-ca-unwatch' => 'Энэ хуудсыг өөрийн хянаж буй хуудсуудын жагсаалтаас хасах',
 'tooltip-search' => '{{SITENAME}}-с хайх',
-'tooltip-search-go' => 'Яг Ð¸Ð¹Ð¼ Ð½Ñ\8dÑ\80Ñ\82Ñ\8dй Ñ\85Ñ\83Ñ\83даÑ\81 Ð±Ð°Ð¹Ð³Ð°Ð° Ð±Ð¾Ð» Ñ\82үүн Ñ\80Ò¯Ò¯ Ñ\8fваÑ\85',
+'tooltip-search-go' => 'Ð\98йм Ð½Ñ\8dÑ\80Ñ\82Ñ\8dй Ñ\85Ñ\83Ñ\83даÑ\81 Ð±Ð°Ð¹Ð³Ð°Ð° Ñ\8dÑ\81Ñ\8dÑ\85ийг Ò¯Ð·Ñ\8cе',
 'tooltip-search-fulltext' => 'Энэ текстийг хуудсуудаас хайх',
-'tooltip-p-logo' => 'Нүүр хуудас',
+'tooltip-p-logo' => 'Нүүр хуудаст зочлох',
 'tooltip-n-mainpage' => 'Нүүр хуудаст зочлох',
 'tooltip-n-mainpage-description' => 'Нүүр хуудаст зочлох',
 'tooltip-n-portal' => 'Энэ төслийн тухай, түүн дээр юу хийж болох, ба хаана зүйлсийг мэдэж авах тухай',
@@ -2645,7 +2679,7 @@ $1',
 'tooltip-t-specialpages' => 'Тусгай хуудаснуудын жагсаалт',
 'tooltip-t-print' => 'Энэ хуудасны хувилж болох хувилбар',
 'tooltip-t-permalink' => 'Хуудасны одоогийн хувилбар луу очих тогтмол линк',
-'tooltip-ca-nstab-main' => 'Өгүүллийн хуудсыг үзэх',
+'tooltip-ca-nstab-main' => 'Өгүүлж Ð±Ñ\83й Ð³Ð¾Ð» хуудсыг үзэх',
 'tooltip-ca-nstab-user' => 'Хэрэглэгчийн хуудсыг үзэх',
 'tooltip-ca-nstab-media' => 'Медиа хуудсыг үзэх.',
 'tooltip-ca-nstab-special' => 'Энэ бол тусгай хуудас, та үүнийг шууд засварлах боломжгүй.',
@@ -2659,7 +2693,7 @@ $1',
 'tooltip-save' => 'Засваруудаа хадгалах',
 'tooltip-preview' => 'Өөрийн оруулах гэж буй өөрчлөлтүүдийг урьдчилан харах. Үүнийг ашиглана уу!',
 'tooltip-diff' => 'Таны бичлэгт үйлдсэн өөрчлөлтүүдийг харуул.',
-'tooltip-compareselectedversions' => 'Энэ хуудасны сонгосон хоёр хувилбарын ялгааг харна уу.',
+'tooltip-compareselectedversions' => 'Энд дарж сонгосон хоёр хувилбарын ялгааг хараарай.',
 'tooltip-watch' => 'Энэ хуудсыг өөрийн хянах жагсаалтандаа нэмэх',
 'tooltip-watchlistedit-normal-submit' => 'Гарчигийг устгах',
 'tooltip-watchlistedit-raw-submit' => 'Хянаж буй хуудсуудын жагсаалтыг шинэчлэх',
@@ -3146,7 +3180,7 @@ $1',
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'бүгдийг',
 'namespacesall' => 'бүгдийг',
-'monthsall' => 'бүгдийг',
+'monthsall' => 'бүх сар',
 
 # Email address confirmation
 'confirmemail' => 'Мэйл хаягийг баталгаажуулах',
@@ -3326,6 +3360,7 @@ $5
 
 # Special:SpecialPages
 'specialpages' => 'Тусгай хуудсууд',
+'specialpages-note-top' => 'Томъёолбор',
 'specialpages-note' => '* Ердийн тусгай хуудсууд.
 * <strong class="mw-specialpagerestricted">Хориотой тусгай хуудсууд.</strong>',
 'specialpages-group-maintenance' => 'Засвар үйлчилгээний тайлангууд',
@@ -3357,7 +3392,7 @@ $5
 
 # Special:Tags
 'tags' => 'Хүчинтэй өөрчлөлтийн тагууд',
-'tag-filter' => '[[Special:Tags|Тагийн]] шүүлтүүр:',
+'tag-filter' => '[[Special:Tags|Үгээр]] шүүх:',
 'tag-filter-submit' => 'Шүүлтүүр',
 'tags-title' => 'Тагууд',
 'tags-intro' => 'Энэхүү хуудсанд програм хангамжийн засвар гэж тэмдэглэх боломжтой тагууд болон тэдний тайлбарыг жагсаан бичив.',
index 59fcdbe..374a55e 100644 (file)
@@ -45,6 +45,7 @@
  * @author कोलࣿहापࣿरी
  * @author कोल्हापुरी
  * @author प्रणव कुलकर्णी
+ * @author प्रतिमा
  * @author शࣿरीहरि
  * @author संतोष दहिवळ
  */
@@ -865,7 +866,7 @@ $2',
 
 # Change password dialog
 'changepassword' => 'परवलीचा शब्द बदला',
-'resetpass_announce' => 'तà¥\81मà¥\8dहà¥\80 à¤\88-मà¥\87ल à¤®à¤§à¥\82न à¤¦à¤¿à¤²à¥\87लà¥\8dया à¤¤à¤¾à¤¤à¥\8dपà¥\81रतà¥\8dया à¤¶à¤¬à¥\8dदाà¤\82à¤\95ानà¥\87 à¤¸à¤¨à¥\8bà¤\82द à¤ªà¥\8dरवà¥\87शित à¤\86हात. à¤\86पला à¤¸à¤¨à¥\8bà¤\82द-पà¥\8dरवà¥\87श à¤ªà¥\82रà¥\8dण à¤\95रणà¥\8dयासाठà¥\80, à¤\95à¥\83पया à¤¯à¥\87थà¥\87 à¤¨à¤µà¥\80न à¤ªà¤°à¤µà¤²à¥\80à¤\9aा à¤¶à¤¬à¥\8dद à¤¦à¥\8dया:',
+'resetpass_announce' => 'à¤\96ातà¥\8dयामधà¥\8dयà¥\87 à¤ªà¥\8dरविषà¥\8dà¤\9f à¤¹à¥\8bणà¥\87 à¤¥à¤¾à¤\82बविणà¥\8dयाà¤\95रिता à¤\95à¥\83पया à¤\86पलà¥\8dया à¤\96ातà¥\8dयाà¤\9aा à¤\95à¥\82à¤\9fशबà¥\8dद à¤¬à¤¦à¤²à¤¾.',
 'resetpass_text' => '<!-- मजकूर इथे लिहा -->',
 'resetpass_header' => 'खात्याचा परवलीचा शब्द बदला',
 'oldpassword' => 'जुना परवलीचा शब्दः',
@@ -1814,6 +1815,7 @@ $1",
 'php-uploaddisabledtext' => 'PHP मध्ये संचिका चढवणे प्रतिबंधित केले आहे.
 कृपया file_uploads मांडणी (setting) तपासावी.',
 'uploadscripted' => 'या संचिकेत HTML किंवा स्क्रिप्ट कोडचा आंतर्भाव आहे, त्याचा एखाद्या विचरकाकडून विचित्र अर्थ लावला जाऊ शकतो.',
+'uploadinvalidxml' => 'अपभारीत संचिकेतील XML पार्स करता आले नाही.',
 'uploadvirus' => 'ह्या संचिकेत व्हायरस आहे. अधिक माहिती: $1',
 'uploadjava' => 'ही फाईल झीप ह्या प्रकारातील आहे ज्यामधे जावा .क्लास फाईल. आहे,जावा फाईलचे अपभारणास परवानगी नाही कारण त्याने सुरक्षा-बंधने टाळल्या जाऊ शकतात.',
 'upload-source' => 'स्रोत संचिका',
@@ -4097,6 +4099,4 @@ $5
 'expand_templates_generate_xml' => 'XML चा पार्स (parse) वृक्ष दाखवा',
 'expand_templates_preview' => 'झलक',
 
-# Unknown messages
-'uploadinvalidxml' => 'अपभारीत संचिकेतील XML पार्स करता आले नाही.',
 );
index aa5c08a..653126f 100644 (file)
@@ -235,7 +235,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Kirimkan saya salinan e-mel yang saya hantar kepada pengguna lain',
 'tog-diffonly' => 'Jangan tunjukkan kandungan laman di bawah perbezaan',
 'tog-showhiddencats' => 'Tunjukkan kategori tersembunyi',
-'tog-noconvertlink' => 'Lumpuhkan penukaran tajuk pautan',
 'tog-norollbackdiff' => 'Abaikan perbezaan selepas melakukan pengunduran suntingan.',
 'tog-useeditwarning' => 'Beri saya amaran apabila saya meninggalkan sesebuah laman penyuntingan tanpa menyimpan perubahan.',
 'tog-prefershttps' => 'Sentiasa gunakan sambungan terlindung apabila log masuk',
@@ -1724,6 +1723,7 @@ Jika anda memiliki imej ini dalam leraian penuh, sila muat naik fail tersebut. J
 'uploaddisabledtext' => 'Ciri muat naik fail dimatikan.',
 'php-uploaddisabledtext' => 'Pemuatnaikan fail PHP dilumpuhkan. Sila semak tetapan file_uploads.',
 'uploadscripted' => 'Fail ini mengandungi kod HTML atau skrip yang boleh disalahtafsirkan oleh pelayar web.',
+'uploadinvalidxml' => 'XML dalam fail yang dimuat naik ini tidak dapat dihuraikan.',
 'uploadvirus' => 'Fail tersebut mengandungi virus! Butiran: $1',
 'uploadjava' => 'Fail ini ialah fail ZIP yang mengandungi fail .class Java.
 Memuat naik fail Java tidak dibenarkan, kerana boleh menyebabkan sekatan keselamatan dipintas.',
@@ -4074,6 +4074,4 @@ Sebenarnya, ia mengembangkan segalanya dalam tanda kurung panah berganda.',
 'expand_templates_generate_rawhtml' => 'Paparkan HTML mentah',
 'expand_templates_preview' => 'Pralihat',
 
-# Unknown messages
-'uploadinvalidxml' => 'XML dalam fail yang dimuat naik ini tidak dapat dihuraikan.',
 );
index 3f5268e..d580427 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author C.R.
  * @author Carmine Colacino
  * @author Chelin
  * @author Cryptex
@@ -281,7 +282,7 @@ $messages = array(
 'feedlinks' => 'Feed:',
 'site-atom-feed' => "Feed Atom 'e $1",
 'page-atom-feed' => 'Feed Atom ppe "$1"',
-'red-link-title' => '$1 (a paggena nun esiste)',
+'red-link-title' => "$1 ('a paggena nun esiste)",
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Articulo',
@@ -637,6 +638,7 @@ Vere anche 'e [[Special:WantedCategories|categurìe richieste]].",
 'sp-contributions-blocklog' => 'blocche',
 'sp-contributions-logs' => 'registre',
 'sp-contributions-talk' => 'Chiàcchiera',
+'sp-contributions-suppresslog' => 'contribbute utente scancellate',
 'sp-contributions-username' => 'Nnerizzo IP o nomme utente',
 'sp-contributions-submit' => 'Truova',
 
@@ -718,7 +720,7 @@ Vere anche 'e [[Special:WantedCategories|categurìe richieste]].",
 'tooltip-p-logo' => 'Visita a paggena prencepale',
 'tooltip-n-mainpage' => 'Visita a paggena prencepale',
 'tooltip-n-mainpage-description' => 'Visita a paggena prencepale',
-'tooltip-n-portal' => 'Descrizione ddo prugietto, che pou fa, addo truova e cose',
+'tooltip-n-portal' => "Descrizione d&#39;'o prugietto, che po' ffa, addò truvà 'e ccose",
 'tooltip-n-recentchanges' => 'Ennece dde urdeme cagnamiénte ddo sito',
 'tooltip-n-randompage' => 'Na paggena qualsiase',
 'tooltip-n-help' => "Paggena 'e ajùto",
index d1c2621..5a45e9e 100644 (file)
@@ -1739,7 +1739,7 @@ Informasjonen vil være offentlig.',
 'recentchanges-legend-heading' => "'''Tegnforklaring:'''",
 'recentchanges-legend-newpage' => '(se også [[Special:NewPages|liste av nye sider]])',
 'recentchanges-legend-plusminus' => '«(±123)»',
-'rcnotefrom' => "Nedenfor er endringene siden '''$2''' (opp til '''$1''' vises).",
+'rcnotefrom' => 'Nedenfor er endringene gjort siden <strong>$2</strong> (frem til <strong>$1</strong> vises).',
 'rclistfrom' => 'Vis nye endringer med start fra $1',
 'rcshowhideminor' => '$1 mindre endringer',
 'rcshowhidebots' => '$1 roboter',
@@ -1870,6 +1870,7 @@ Om du fortsatt ønsker å laste opp filen, gå tilbake og last den opp under et
 'uploaddisabledtext' => 'Opplasting er slått av.',
 'php-uploaddisabledtext' => 'PHP-filopplasting er deaktivert. Sjekk innstillingen for file_uploads.',
 'uploadscripted' => 'Denne filen inneholder HTML eller skripting som kan feiltolkes av en nettleser.',
+'uploadinvalidxml' => 'XML-en i den opplastede filen kunne ikke tolkes.',
 'uploadvirus' => 'Denne filen inneholder virus! Detaljer: $1',
 'uploadjava' => 'Filen er en ZIP-fil som inneholder en Java-fil av typen .class.
 Det er ikke tillatt å laste opp Java-filer, fordi de kan omgå sikkerhetsrestriksjoner.',
@@ -4236,6 +4237,4 @@ Faktisk utvider den det meste innkapslet i doble krøllparenteser.',
 'expand_templates_generate_rawhtml' => 'Vis ubehandlet HTML',
 'expand_templates_preview' => 'Forhåndsvisning',
 
-# Unknown messages
-'uploadinvalidxml' => 'XML-en i den opplastede filen kunne ikke tolkes.',
 );
index 2b6052f..60eab6c 100644 (file)
@@ -360,7 +360,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Stuur mien kopieën van berichten an aandere gebrukers',
 'tog-diffonly' => 'Laot de inhoud van ziejen niet onder de an-egeven wiezigingen zien.',
 'tog-showhiddencats' => 'Laot verbörgen kategorieën zien',
-'tog-noconvertlink' => 'Ziednaamkonversie uutschakelen',
 'tog-norollbackdiff' => 'Wiezigingen vortlaoten nao t weerummedreien',
 'tog-useeditwarning' => "Waorschuw mien a'k n bewörken zied aof wil sluten die nog niet op-esleugen is",
 'tog-prefershttps' => "Altied n beveiligde verbiending gebruken a'j an-emeld bin",
index 6928110..8a73ad0 100644 (file)
@@ -92,7 +92,6 @@ $messages = array(
 'tog-ccmeonemails' => 'मैले अरु प्रयोगकर्ताहरुलाई पठाउने इ-मेल को प्रतिलिपि मलाई पठाउने',
 'tog-diffonly' => 'तलका पृष्टहरुको diffहरु सामग्री नदेखाउने',
 'tog-showhiddencats' => 'लुकाइएको प्रकारहरु देखाउने',
-'tog-noconvertlink' => 'सम्बन्ध शीर्षक रुपान्तरण निस्क्रिय पार्ने',
 'tog-norollbackdiff' => 'पूर्वस्थितिमा फर्काएपछि  diff हटाउने',
 'tog-useeditwarning' => 'सम्पादनहरू सङ्ग्रह गरिनसकेको अवस्थामा अर्को पृष्ठमा जान खोज्दा चेतावनी देखाउने',
 'tog-prefershttps' => 'प्रवेश गर्दा जहिले पनि सुरक्षित जडान प्रयोग गर्ने',
@@ -330,7 +329,7 @@ $1',
 'youhavenewmessagesfromusers' => 'तपाईंको लागि  {{PLURAL:$3|प्रयोगकर्ता|$3 प्रयोगकर्ताहरु}} ($2) बाट $1',
 'youhavenewmessagesmanyusers' => 'तपाईँलाई धेरै प्रयोगकर्ताहरू($2) बाट $1 छ ।',
 'newmessageslinkplural' => '{{PLURAL:$1|एउटा नयाँ सन्देश|999=नयाँ सन्देशहरू}}',
-'newmessagesdifflinkplural' => 'à¤\85नà¥\8dतिम {{PLURAL:$1|समà¥\8dपादन|समà¥\8dपादनहरू}}',
+'newmessagesdifflinkplural' => 'à¤\85नà¥\8dतिम {{PLURAL:$1|परिवरà¥\8dतन|999=परिवरà¥\8dतनहरू}}',
 'youhavenewmessagesmulti' => 'तपाईंको लागि $1 मा  नयाँ सन्देशहरू छन्',
 'editsection' => 'सम्पादन',
 'editold' => 'सम्पादन गर्ने',
@@ -422,6 +421,7 @@ $1',
 'cannotdelete-title' => 'पृष्ठ  "$1" लाई मेट्न सकिएन',
 'delete-hook-aborted' => 'हुकले सम्पादनकार्य बन्द गरिदियो ।
 कुनै कारण दिइएन ।',
+'no-null-revision' => '$1 पृष्ठको लागि खालि पुनरावलोकन सिर्जना गर्न सकिएन',
 'badtitle' => 'गलत शीर्षक',
 'badtitletext' => 'अनुरोध गरेको पृष्ठ शीर्षक अमान्य, खाली वा गलत रुपमा अन्तर भाषा वा अन्तर विकी सम्बन्ध गरिएको थियो।  यसमा शीर्षकमा प्रयोग गर्न नमिल्ने एक वा बढी अक्षरहरू रहेका हुनसक्छन् ।',
 'perfcached' => 'तलको डाटाहरु क्याचमा रहेका कुराहरु हुन्। अपटुडेट नहुनपनि सक्छन्।अधिकतम {{PLURAL:$1|नतिजा|$1 नतिजाहरू}} क्यासमा उपलब्ध छ।',
@@ -448,6 +448,8 @@ $2',
 'customjsprotected' => 'तपाईलाई यस जाभास्कृप्ट पृष्ठ सम्पादन गर्ने अनुमति छैन, किनकी यसमा कुनै अर्को प्रयोगकर्ताको व्यक्तिगत अभिरुचीहरु संग्रहित छन् ।',
 'mycustomcssprotected' => 'यस CSSपृष्ठ सम्पादन गर्नको लागि लागि तपाईँलाई अनुमति छैन ।',
 'mycustomjsprotected' => 'यस JavaScript पृष्ठ सम्पादन गर्नको लागि लागि तपाईँलाई अनुमति छैन ।',
+'myprivateinfoprotected' => 'तपाईँसँग तपाईँको निजी जानकारीहरू सम्पादन गर्ने अनुमती छैन',
+'mypreferencesprotected' => 'तपाईँसँग तपाईँको अभिरुचीहरू सम्पादन गर्ने अनुमती छैन',
 'ns-specialprotected' => 'विशेष पृष्ठ सम्पादन गर्न सकिदैन ।',
 'titleprotected' => ' [[User:$1|$1]]द्वारा यो शीर्षक निर्माणहुनबाट जोगाइएको छ।
 कारण   "\'\'$2\'\'" हो ।',
@@ -549,7 +551,7 @@ $2',
 'passwordtooshort' => 'पासवर्ड कम्तिमा {{PLURAL:$1|१ अक्षर |$1 अक्षरहरु}}को हुनुपर्छ ।',
 'password-name-match' => 'तपाईँको प्रवेशशव्द प्रयोगकर्ता नाम भन्दा फरक हुनुपर्छ ।',
 'password-login-forbidden' => 'यो प्रयोगकर्ता नाम र प्रवेश शव्द वर्जित गरिएकोछ ।',
-'mailmypassword' => 'नयाà¤\81 à¤ªà¥\8dरवà¥\87शशवà¥\8dद à¤\87मà¥\87ल गर्नुहोस्',
+'mailmypassword' => 'पासवरà¥\8dड à¤ªà¥\82रà¥\8dवनिरà¥\8dधारित गर्नुहोस्',
 'passwordremindertitle' => '{{SITENAME}}को लागि नयाँ अस्थायी पासवर्ड',
 'passwordremindertext' => 'कसैले (सायद तपाईँ, IP ठेगाना $1 बाट), {{SITENAME}}($4) को लागि नयाँ प्रवेशशव्द अनुरोध गर्नुभएको छ । प्रयोगकर्ता "$2" को लागि नयाँ अस्थायी प्रवेशशव्द "$3"तयार पारिएको छ। यदि यो तपाईको इच्छामा भएको भए अहिले तपाईँले प्रवेशगरी नयाँ प्रवेशशव्द छान्नु पर्ने हुन्छ।
 तपाईको अस्थायी प्रवेशशव्द  {{PLURAL:$5|एक दिन|$5 दिनहरू पछि}} अमान्य हुनेछ ।
@@ -561,8 +563,8 @@ $2',
 'passwordsent' => '"$1" को लागि दर्ता गरिएको ई-मेल ठेगानामा एक प्रवेशशव्द पठाइएको छ।
 कृपया त्यसलाई प्राप्त गरेपछि प्रवेश गर्नुहोला ।',
 'blocked-mailpassword' => 'तपाईको IP ठेगानालाई सम्पादनगर्नबाट रोक लगाइएको छ, र त्यसैले दुरुपयोग रोक्नको लागि प्रवेशशव्द पुनर्लाभ प्रक्रिया प्रयोग गर्न अनुमति छैन ।',
-'eauthentsent' => 'दिइएको इमेल ठेगानामा  किटानी इमेल पठाइएको छ ।
-तपाà¤\88à¤\95à¥\8b à¤\96ातामा à¤\85रà¥\81 à¤\87मà¥\87ल à¤ªà¤ à¤\89नà¥\81 à¤\85à¤\98ि , à¤\87मà¥\87लमा à¤²à¥\87à¤\96िà¤\8fà¤\95à¥\8b à¤®à¤¾à¤°à¥\8dà¤\97दरà¥\8dशन à¤\85नà¥\81सार , à¤¤à¥\8dयà¥\8b à¤\96ाता à¤¤à¤ªà¤¾à¤\88à¤\81à¤\95à¥\88 à¤¹à¥\8b à¤­à¤¨à¥\87र à¤¨à¤¿à¤¶à¥\8dà¤\9aित à¤\97राà¤\89नु पर्नेछ ।',
+'eauthentsent' => 'दिइएको इमेल ठेगानामा इमेल पठाइएको छ ।
+तपाà¤\88à¤\81à¤\95à¥\8b à¤\96ातामा à¤\85रà¥\81 à¤\87मà¥\87ल à¤ªà¤ à¤\89नà¥\81 à¤\85à¤\98ि , à¤\87मà¥\87लमा à¤²à¥\87à¤\96िà¤\8fà¤\95à¥\8b à¤®à¤¾à¤°à¥\8dà¤\97दरà¥\8dशन à¤\85नà¥\81सार , à¤¤à¥\8dयà¥\8b à¤\96ाता à¤¤à¤ªà¤¾à¤\88à¤\81à¤\95à¥\88 à¤¹à¥\8b à¤­à¤¨à¥\87र à¤¨à¤¿à¤¶à¥\8dà¤\9aित à¤\97रà¥\8dनु पर्नेछ ।',
 'throttled-mailpassword' => 'बितेको {{PLURAL:$1|घण्टा|$1 घण्टाहरु}} भित्र एउटा प्रवेशशब्द अनुस्मारक पठाई सकिएको छ।
 दुरुपयोगबाट बचाउकोलागि प्रत्येक {{PLURAL:$1|घण्टा|$1 घण्टाहरु}}मा केवल एउटा प्रवेशशब्द अनुस्मारक पठाइन्छ।',
 'mailerror' => ' चिठी :$1 पठाउँदा त्रुटी भयो',
@@ -1300,6 +1302,8 @@ HTML ट्यागहरु जाँच्नुहोस् ।',
 'right-editusercssjs' => 'प्रयोगकर्ताको CSS र JS फाइलहरु सम्पादन गर्ने',
 'right-editusercss' => 'प्रयोगकर्ताको CSS फाइलहरु सम्पादन गर्ने',
 'right-edituserjs' => 'प्रयोकर्ताको  JS फाइलहरु सम्पादनगर्ने',
+'right-editmyusercss' => 'तपाईँको आफ्नो CSS फाइलहरू सम्पादन गर्नुहोस्',
+'right-editmyuserjs' => 'तपाईँको आफ्नो जाभा स्क्रिप्ट फाइलहरू सम्पादन गर्ने',
 'right-rollback' => 'पछिल्लो प्रयोगकर्ताको सम्पादनहरुको छरितो रुपमा पछाडि पर्काउने',
 'right-markbotedits' => 'पछाडि फर्काउने सम्पादनहरुलाई बोट सम्पादनकारुपमा चिनो लगाउने',
 'right-noratelimit' => 'दर सीमाले  असर नपार्ने',
@@ -1579,6 +1583,7 @@ $1',
 'listfiles_size' => 'आकार',
 'listfiles_description' => 'वर्णन',
 'listfiles_count' => 'संस्करणहरु',
+'listfiles-latestversion' => 'हालको संस्करण',
 'listfiles-latestversion-yes' => 'हो',
 'listfiles-latestversion-no' => 'हैन',
 
@@ -1603,6 +1608,7 @@ $1',
 'linkstoimage' => 'यस फाइलमा निम्न{{PLURAL:$1|पृष्ठ जोडिन्छ|$1 पृष्ठहरु जोडिन्छन}}:',
 'nolinkstoimage' => 'यो फाईलसंग लिंकभएको कुनै पृष्ठ छैन.',
 'morelinkstoimage' => 'हेर्नुहोस् [[Special:WhatLinksHere/$1|थप लिंकहरु]] यो फाइलको।',
+'linkstoimage-redirect' => '$1 (फाइल अनुप्रेषण) $2',
 'sharedupload' => 'यो फाइल $1 को हो र अन्य परियोजनामा प्रयोग गरिएको हुनसक्छ।',
 'filepage-nofile' => 'यस नामको फाइल छैन।',
 'filepage-nofile-link' => 'यस नामको फाइल छैन तर तपाईं [$1 यो उर्ध्वभरण गर्न सक्नुहुन्छ].',
@@ -1610,6 +1616,7 @@ $1',
 'shared-repo-from' => ' $1 बाट',
 'shared-repo' => 'एल साझा भण्डार',
 'shared-repo-name-wikimediacommons' => 'विकिमीडिया कमन्स',
+'upload-disallowed-here' => 'तपाईँले यो फाइल अधिलेखन गर्न सक्नुहुन्न ।',
 
 # File reversion
 'filerevert' => 'पूर्वस्थिति $1 मा फर्काउने',
@@ -1681,6 +1688,8 @@ $1',
 'statistics-users-active-desc' => 'प्रयोगकर्ताहरु जो{{PLURAL:$1|बितेको एक दिन|बितेका $1 दिनहरु}}देखि  जो सक्रिय छन्',
 'statistics-mostpopular' => 'सबैभन्दा धेरै हेरिएको पृष्ठहरु',
 
+'pageswithprop-submit' => 'जाने',
+
 'doubleredirects' => 'दोहोरो अनुप्रेषण',
 'double-redirect-fixed-move' => '[[$1]] सारिएको छ।
 यसले [[$2]] तिर अनुप्रेषित गर्दछ।',
@@ -1737,6 +1746,13 @@ $1',
 'protectedpages-indef' => 'नखुलेको सुरक्षा मात्र',
 'protectedpages-cascade' => 'लामबद्ध सुरक्षाहरु मात्रा',
 'protectedpagesempty' => 'दिइएको प्यारामिटर प्रयोग गरि सुरक्षा गरिएका पृष्ठहरु छैनन् ।',
+'protectedpages-page' => 'पृष्ठ',
+'protectedpages-expiry' => 'सकिनेछ',
+'protectedpages-performer' => 'प्रयोगकर्ता सुरक्षित गरिँदै',
+'protectedpages-params' => 'सुरक्षा प्यारामेटर',
+'protectedpages-reason' => 'कारण',
+'protectedpages-unknown-timestamp' => 'अज्ञात',
+'protectedpages-unknown-performer' => 'अज्ञात प्रयोगकर्ता',
 'protectedtitles' => 'सुरक्षा गरिएका शिर्षकहरु',
 'protectedtitlesempty' => 'दिइएको प्यारामिटर प्रयोग गरि सुरक्षा गरिएका शीर्षकहरु छैनन् ।',
 'listusers' => 'प्रयोगकर्ता सूची',
@@ -1843,6 +1859,7 @@ $1',
 'mailnologin' => 'ईमेल पठाउने ठेगाना नै भएन ।',
 'mailnologintext' => 'तपाईले अरु प्रयोगकर्ताहरुलाई ईमेल पठाउनको लागि आफु पहिले [[Special:UserLogin|प्रवेश(लगइन)गरेको]] हुनुपर्छ र [[Special:Preferences|आफ्नो रोजाइहरुमा]] एउटा वैध ईमेल ठेगाना भएको हुनुपर्छ।',
 'emailuser' => 'यो प्रयोगकर्तालाई ई-मेल पठाउनुहोस्',
+'emailuser-title-notarget' => 'प्रयोगकर्तालाई इमेल गर्नुहोस्',
 'emailpage' => 'प्रयोगकर्तालाई इमेल गर्नुहोस्',
 'usermailererror' => 'मेल अब्जेक्टले देखाएको त्रुटि:',
 'defemailsubject' => '{{SITENAME}} प्रयपोगकर्ता "$1" बाट इमेल',
@@ -1991,6 +2008,9 @@ proceed with caution.',
 'rollback-success' => '$1द्वारा उल्टाइएका सम्पादनहरु;
 पछिल्लो संशोधनमा $2द्वारा परिवर्तन गरि पुनः फर्काइएको।',
 
+# Edit tokens
+'sessionfailure-title' => 'सत्र त्रुटी',
+
 # Protect
 'protectlogpage' => 'सुरक्षण लग',
 'protectedarticle' => '"[[$1]]" लाई सुरक्षित गरियो',
@@ -2016,6 +2036,7 @@ proceed with caution.',
 'protect-level-sysop' => 'प्रबन्धकहरु मात्र',
 'protect-summary-cascade' => 'लाममा राख्ने',
 'protect-expiring' => '$1 (UTC) मा सकिने छ ।',
+'protect-expiring-local' => 'समाप्ति समय $1',
 'protect-expiry-indefinite' => 'अनिश्चित काल',
 'protect-cascade' => 'यो पृष्ठमा संलग्न सुरक्षित पृष्ठहरु(लामबद्द सुरक्षा)',
 'protect-cantedit' => 'तपाईँ यस पृष्ठको सुरक्षा स्तर परिवर्तन गर्न सक्नुहुन्न , किन कि तपाईँलाई यसको सम्पादनको अनुमति छैन ।',
@@ -2080,8 +2101,8 @@ $3द्वारा $1को ($4को  समय $5 मा) मेटाइए
 'undeletedrevisions' => '{{PLURAL:$1|एउटा संशोधन|$1 संशोधनहरु}} पुनर्स्थापित गरियो',
 'undeletedrevisions-files' => '{{PLURAL:$1|एउटा संशोधन|$1 संशोधनहरु}} र {{PLURAL:$2|एउटा फाइल|$2 फाइलहरु}} पुनर्स्थापित गरियो',
 'undeletedfiles' => '{{PLURAL:$1|१ फाइल|$1 फाइलहरु }} पूर्वस्थितिमा ल्याइयो',
-'cannotundelete' => 'मेटाएको रद्द गर्ने काम असफल भयो;
-कसैले पहिले नैं मेटाएको रद्द गरिसकेकोछ।',
+'cannotundelete' => 'मेटाएको रद्द गर्ने काम असफल भयो:
+$1',
 'undeletedpage' => "'''$1लाई पूर्वावस्थामा ल्याइयो'''
 भर्खरै मेटाइएको रिकर्डहरु र पुनर्स्थापनाहरु हेर्न [[Special:Log/delete|मेटाइएको लग]]मा जानुहोस्।",
 'undelete-header' => 'भर्खर मेटिएका पृष्ठहरु हेर्न [[Special:Log/delete|मेटाइएका लग]]मा जानुहोस्।',
@@ -2391,6 +2412,7 @@ $1को बन्देजको कारण : "$2" हो',
 'allmessages-prefix' => 'प्रिफिक्स अनुसार फिल्टर:',
 'allmessages-language' => 'भाषा:',
 'allmessages-filter-submit' => 'जाउ',
+'allmessages-filter-translate' => 'अनुवाद गर्ने',
 
 # Thumbnails
 'thumbnail-more' => 'ठूलो बनाउने',
@@ -2553,12 +2575,18 @@ $1को बन्देजको कारण : "$2" हो',
 'pageinfo-header-properties' => 'पृष्ठ गुणहरू',
 'pageinfo-display-title' => 'प्रदर्शन शिर्षक',
 'pageinfo-views' => 'अवलोकन संख्या',
-'pageinfo-watchers' => 'निगरानी कर्ताहरुको संख्या',
-'pageinfo-edits' => 'सम्पादन संख्या',
-'pageinfo-authors' => 'फरक सम्पादकरुको संख्या',
+'pageinfo-watchers' => 'पृष्ठ निगरानी कर्ताहरुको संख्या',
+'pageinfo-edits' => 'कुल सम्पादन संख्या',
+'pageinfo-authors' => 'कुल फरक सम्पादकरूको संख्या',
+'pageinfo-toolboxlink' => 'पृष्ठ जानकारी',
+'pageinfo-redirectsto' => 'अनुप्रेषित',
 'pageinfo-redirectsto-info' => 'जानकारी',
+'pageinfo-contentpage' => 'सामग्री पृष्ठको रुपमा गणना गरिएको',
 'pageinfo-contentpage-yes' => 'हो',
 'pageinfo-protect-cascading-yes' => 'हो',
+'pageinfo-category-pages' => 'पृष्ठहरूको संख्या',
+'pageinfo-category-subcats' => 'उपश्रेणीहरूको संख्या',
+'pageinfo-category-files' => 'फाइलहरूको संख्या',
 
 # Skin names
 'skinname-cologneblue' => 'कोलोग्ने निलो',
@@ -2641,9 +2669,16 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 मिनेट|$1 मिनेटहरु}}',
 'hours' => '{{PLURAL:$1|$1 घण्टा|$1 घण्टाहरु}}',
 'days' => '{{PLURAL:$1|$1 दिन|$1 दिनहरु}}',
+'weeks' => '{{PLURAL:$1|$1 हप्ता|$1 हप्ताहरू}}',
+'months' => '{{PLURAL:$1|$1 महिना|$1 महिनाहरू}}',
+'years' => '{{PLURAL:$1|$1 वर्ष|$1 वर्षहरू}}',
 'ago' => '$1 पहिले',
+'just-now' => 'भर्खरै',
 
 # Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|घन्टा|घन्टा}} पहिले',
+'minutes-ago' => '$1 {{PLURAL:$1|मिनेट|मिनेट}} पहिले',
+'seconds-ago' => '$1 {{PLURAL:$1|सेकेन्ड|सेकेन्ड}} पहिले',
 'monday-at' => 'सोमबार $1 मा',
 'tuesday-at' => 'मङ्गलबार $1मा',
 'wednesday-at' => 'बुधबार $1मा',
@@ -2863,7 +2898,7 @@ $8',
 'exif-compression-34712' => 'जेपेग२०००',
 
 'exif-copyrighted-true' => 'प्रकाशन अधिकार सिमित गरिएको',
-'exif-copyrighted-false' => 'पबà¥\8dलिà¤\95 à¤¡à¥\8bमà¥\87न',
+'exif-copyrighted-false' => 'पà¥\8dराà¤\95ाशन à¤\85धिà¤\95ार à¤¨à¤\96à¥\81लाà¤\87à¤\8fà¤\95à¥\8b',
 
 'exif-photometricinterpretation-2' => 'आरजीबी(रातोहरियोनिलो)',
 
@@ -2874,9 +2909,9 @@ $8',
 'exif-orientation-3' => '180° मा घुमाइएको',
 'exif-orientation-4' => 'लंब रुपमा फ्लिप (Flip) गरिएको',
 'exif-orientation-5' => '९०° घडिको उल्टो दिशामाको परिक्रमा र मास्तिर फर्काइएको(फ्लिप)',
-'exif-orientation-6' => '90° CW घुमाइएको',
+'exif-orientation-6' => 'घडीको उल्टो दिशामा ९०° घुमाइएको',
 'exif-orientation-7' => '९०° घडिको दिशामाको परिक्रमा र मास्तिर फर्काइएको(फ्लिप)',
-'exif-orientation-8' => '९०° à¤\98डिà¤\95à¥\8b à¤\89लà¥\8dà¤\9fà¥\8b à¤¦à¤¿à¤¶à¤¾à¤®à¤¾à¤\95à¥\8b à¤ªà¤°à¤¿à¤\95à¥\8dरमा à¤\97रिएको',
+'exif-orientation-8' => 'à¤\98डिà¤\95à¥\8b à¤¦à¤¿à¤¶à¤¾à¤®à¤¾ à¥¯à¥¦Â° à¤\98à¥\81माà¤\87एको',
 
 'exif-planarconfiguration-1' => 'टुक्रे प्रारुप',
 'exif-planarconfiguration-2' => 'प्लानर प्रारुप',
@@ -3316,6 +3351,10 @@ $5
 'version-software-product' => 'उत्पादन',
 'version-software-version' => 'संस्करण',
 
+# Special:Redirect
+'redirect-submit' => 'जाने',
+'redirect-file' => 'फाइल नाम',
+
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'नक्कल फाइल खोज्ने',
 'fileduplicatesearch-summary' => 'ह्यास मानको आधारमा दुरुस्त नक्कल फाइहरु खोज्ने ।',
@@ -3369,6 +3408,8 @@ $5
 'tags-display-header' => 'परिवर्तन सूचीहरुमाथि झलक',
 'tags-description-header' => 'पूर्ण अर्थको वर्णन',
 'tags-hitcount-header' => 'ट्याग गरिएक परिवर्तनहरू',
+'tags-active-yes' => 'हो',
+'tags-active-no' => 'हैन',
 'tags-edit' => 'सम्पादन गर्नुहोस्',
 'tags-hitcount' => '$1 {{PLURAL:$1|परिवर्तन|परिवर्तनहरु}}',
 
@@ -3388,6 +3429,7 @@ $5
 'dberr-problems' => 'क्षमा पाउँ! यो साइटमा तकनीकी गड़बड़ी आइपरेकोछ।',
 'dberr-again' => 'केही समय पर्खिएर पुन: लोड हुन दिनुहोस् ।',
 'dberr-info' => '(डेटाबेस सर्वर $1सित सम्पर्क साध्न सकिंदैन)',
+'dberr-info-hidden' => '(डेटावेस सर्भरमा सम्पर्क स्थापना गर्न सकिएन)',
 'dberr-usegoogle' => 'तपाईले अहिले गुगलबाट खोज गर्न प्रयास गर्न सक्नुहुन्छ।',
 'dberr-outofdate' => 'कृपया स्मरणमा राख्नुहोस् हाम्रा लेखहरूको सूची जुन उनीहरूले राखेका छन् त्यो अद्यावधिक नहुन सक्छ ।',
 'dberr-cachederror' => 'यो अनुरोध गरिएको पृष्ठको क्याशमा रहेका प्रतिलिपी हो , र अद्यावधिक नहुन सक्छ ।',
@@ -3403,6 +3445,9 @@ $5
 'htmlform-submit' => 'बुझाउने',
 'htmlform-reset' => 'परिवर्तनहरू परित्याग गर्नुहोस्',
 'htmlform-selectorother-other' => 'अन्य',
+'htmlform-no' => 'हैन',
+'htmlform-yes' => 'हो',
+'htmlform-chosen-placeholder' => 'एक विकल्प छान्नुहोस्',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 पूरा पाठ खोज समर्थन सहित',
@@ -3410,7 +3455,12 @@ $5
 
 # New logging system
 'logentry-delete-restore' => '$3 पृष्ठ $1ले पुनर्स्थापित गरेको हो',
+'revdelete-content-hid' => 'सामग्री लुकाइएको',
+'revdelete-summary-hid' => 'सम्पादन सारांस लुकाइएको',
 'revdelete-uname-hid' => 'प्रयोगकर्ताको नाम लुकाइयो',
+'revdelete-content-unhid' => 'सामग्री देखाइएको',
+'revdelete-summary-unhid' => 'सम्पादन सारांस देखाइएको',
+'revdelete-uname-unhid' => 'प्रयोगकर्ता देखाइएको',
 'revdelete-restricted' => 'प्रबन्धकहरुमाथि सीमितता लागू गरियो',
 'revdelete-unrestricted' => 'प्रवन्धककोलागि निषेधहरु हटाइयो ।',
 'logentry-move-move' => '$1 द्वारा $3 पृष्ठलाई $4 मा सारियो',
@@ -3420,6 +3470,7 @@ $5
 'feedback-subject' => 'विषय:',
 'feedback-message' => 'सन्देश:',
 'feedback-cancel' => 'रद्द गर्ने',
+'feedback-submit' => 'प्रतिकृया बुझाउनुहोस्',
 'feedback-error2' => 'त्रुटि: सम्पादन असफल',
 'feedback-close' => 'गरियो',
 
@@ -3455,4 +3506,9 @@ $5
 'api-error-unknownerror' => 'अज्ञात त्रुटि: "$1".',
 'api-error-uploaddisabled' => 'यस विकिमा अपलोड निस्क्रिय गरिएकोछ।',
 
+# Special:ExpandTemplates
+'expand_templates_output' => 'परिणाम',
+'expand_templates_generate_rawhtml' => 'सुद्ध HTML देखाउने',
+'expand_templates_preview' => 'पूर्वावलोकन',
+
 );
index 9a7b3b0..1aa1d63 100644 (file)
@@ -416,14 +416,13 @@ $messages = array(
 'tog-ccmeonemails' => 'Mij een kopie zenden van e-mails die ik naar andere gebruikers stuur',
 'tog-diffonly' => 'Pagina-inhoud onder wijzigingen niet weergeven',
 'tog-showhiddencats' => 'Verborgen categorieën weergeven',
-'tog-noconvertlink' => 'Paginanaamconversie uitschakelen',
 'tog-norollbackdiff' => 'Wijzigingen weglaten na terugdraaien',
-'tog-useeditwarning' => 'U waarschuwen als u een bewerkte pagina die nog niet is opgeslagen wil verlaten',
+'tog-useeditwarning' => 'Waarschuwen als u een bewerkte pagina wilt verlaten die nog niet is opgeslagen',
 'tog-prefershttps' => 'Altijd een beveiligde verbinding gebruiken wanneer u bent aangemeld',
 
 'underline-always' => 'Altijd',
 'underline-never' => 'Nooit',
-'underline-default' => 'Standaard in uw vormgeving of webbrowser',
+'underline-default' => 'Standaard gedrag van vormgeving of webbrowser',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Lettertypestijl bewerkingsvenster:',
@@ -533,7 +532,7 @@ $messages = array(
 'qbedit' => 'Bewerken',
 'qbpageoptions' => 'Deze pagina',
 'qbmyoptions' => "Mijn pagina's",
-'faq' => 'Veel gestelde vragen',
+'faq' => 'Veelgestelde vragen',
 'faqpage' => 'Project:Veelgestelde vragen',
 
 # Vector skin
@@ -970,6 +969,8 @@ Mogelijk hebt u uw wachtwoord al gewijzigd of een nieuw tijdelijk wachtwoord aan
 Om het inloggen te voltooien moet u hier een nieuw wachtwoord instellen:',
 'resetpass-temp-password' => 'Tijdelijk wachtwoord:',
 'resetpass-abort-generic' => 'De wachtwoordwijziging is afgebroken door een uitbreiding.',
+'resetpass-expired' => 'Uw wachtwoord is verlopen. Stel een nieuw wachtwoord om aan te melden.',
+'resetpass-expired-soft' => 'Uw wachtwoord is verlopen, en moet opnieuw worden ingesteld. Kies een nieuw wachtwoord nu, of klik op "{{int:resetpass-submit-cancel}}" als u het later opnieuw wilt.',
 
 # Special:PasswordReset
 'passwordreset' => 'Wachtwoord opnieuw instellen',
@@ -1512,6 +1513,7 @@ Probeer een andere zoekopdracht.',
 'searchrelated' => 'gerelateerd',
 'searchall' => 'alle',
 'showingresults' => "Hieronder {{PLURAL:$1|staat '''1''' resultaat|staan '''$1''' resultaten}} vanaf #'''$2'''.",
+'showingresultsinrange' => 'Hieronder {{PLURAL:$1|wordt|worden}} maximaal {{PLURAL:$1|<strong>1</strong> resultaat|<strong>$1 </strong>resultaten}} weergegeven in het bereik #<strong>$2</strong> tot #<strong>$3</strong>.',
 'showingresultsnum' => "Hieronder {{PLURAL:$3|staat '''1''' resultaat|staan '''$3''' resultaten}} vanaf #'''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|Resultaat '''$1''' van '''$3'''|Resultaten '''$1 - $2''' van '''$3'''}} voor '''$4'''",
 'search-nonefound' => 'Er zijn geen resultaten voor uw zoekopdracht.',
@@ -1835,14 +1837,26 @@ Als u deze opgeeft, kan deze naam gebruikt worden om u erkenning te geven voor u
 'recentchanges-legend-heading' => "'''Legenda:'''",
 'recentchanges-legend-newpage' => "Zie ook de [[Special:NewPages|Lijst met nieuwe pagina's]].",
 'recentchanges-legend-plusminus' => "(''±123'')",
-'rcnotefrom' => "Wijzigingen sinds '''$2''' (met een maximum van '''$1''' wijzigingen).",
+'rcnotefrom' => 'Wijzigingen sinds <strong>$3 om $4</strong> (maximaal <strong>$1</strong> {{PLURAL:$1|wijziging|wijzigingen}}).',
 'rclistfrom' => 'Wijzigingen bekijken vanaf $1',
 'rcshowhideminor' => 'Kleine wijzigingen $1',
+'rcshowhideminor-show' => 'weergeven',
+'rcshowhideminor-hide' => 'verbergen',
 'rcshowhidebots' => 'bots $1',
+'rcshowhidebots-show' => 'weergeven',
+'rcshowhidebots-hide' => 'verbergen',
 'rcshowhideliu' => 'geregistreerde gebruikers $1',
+'rcshowhideliu-show' => 'weergeven',
+'rcshowhideliu-hide' => 'verbergen',
 'rcshowhideanons' => 'anonieme gebruikers $1',
+'rcshowhideanons-show' => 'weergeven',
+'rcshowhideanons-hide' => 'verbergen',
 'rcshowhidepatr' => 'gecontroleerde bewerkingen $1',
+'rcshowhidepatr-show' => 'weergeven',
+'rcshowhidepatr-hide' => 'verbergen',
 'rcshowhidemine' => 'mijn bewerkingen $1',
+'rcshowhidemine-show' => 'weergeven',
+'rcshowhidemine-hide' => 'verbergen',
 'rclinks' => 'De $1 laatste wijzigingen bekijken in de laatste $2 dagen<br />$3',
 'diff' => 'wijz',
 'hist' => 'gesch',
@@ -1979,6 +1993,8 @@ Vraag iemand die onderdrukte bestandsgegevens kan bekijken om de situatie opnieu
 'php-uploaddisabledtext' => 'Het uploaden van bestanden is uitgeschakeld in PHP.
 Controleer de instelling "file_uploads".',
 'uploadscripted' => 'Dit bestand bevat HTML- of scriptcode die foutief door uw browser kan worden weergegeven.',
+'uploadscriptednamespace' => 'Dit SVG-bestand bevat een ongeldige naamruimte "$1".',
+'uploadinvalidxml' => 'De XML in het geüploade bestand kon niet worden geparst.',
 'uploadvirus' => 'Het bestand bevat een virus! Details: $1',
 'uploadjava' => 'Het bestand is een ZIP-bestand dat een Java .class-bestand bevat.
 Het uploaden van Java-bestanden is niet toegestaan omdat hiermee beveiligingsinstellingen omzeild kunnen worden.',
@@ -2357,17 +2373,20 @@ De pagina's zijn ook niet als sjabloon opgenomen.",
 'deadendpagestext' => "De onderstaande pagina's verwijzen niet naar andere pagina's in deze wiki.",
 'protectedpages' => "Beveiligde pagina's",
 'protectedpages-indef' => 'Alleen blokkades zonder vervaldatum',
+'protectedpages-summary' => "Deze pagina bevat een lijst met beveiligde pagina's. Zie [[{{#special:ProtectedTitles}}]] voor een lijst van pagina's die niet aangemaakt mogen worden.",
 'protectedpages-cascade' => 'Alleen beveiligingen met de cascade-optie',
 'protectedpages-noredirect' => 'Doorverwijzingen verbergen',
 'protectedpagesempty' => "Er zijn momenteel geen pagina's beveiligd die aan deze voorwaarden voldoen.",
 'protectedpages-timestamp' => 'Tijdstip',
 'protectedpages-page' => 'Pagina',
 'protectedpages-expiry' => 'Verloopt',
+'protectedpages-performer' => 'Beveiligd door',
 'protectedpages-params' => 'Beveiligingsopties',
 'protectedpages-reason' => 'Reden',
 'protectedpages-unknown-timestamp' => 'Onbekend',
 'protectedpages-unknown-performer' => 'Onbekende gebruiker',
 'protectedtitles' => 'Beveiligde paginanamen',
+'protectedtitles-summary' => "Deze pagina bevat een lijst met pagina's die niet mogen worden aangemaakt. Zie [[{{#special:ProtectedPages}}]] voor de lijst met beveiligde pagina's.",
 'protectedtitlesempty' => 'Er zijn geen paginanamen beveiligd die aan deze voorwaarden voldoen.',
 'listusers' => 'Gebruikerslijst',
 'listusers-editsonly' => 'Alleen gebruikers met bewerkingen weergeven',
@@ -2477,7 +2496,7 @@ Heeft tenminste een topleveldomein nodig, zoals bijvoorbeeld "*.org".<br />
 'listgrouprights' => 'Rechten van gebruikersgroepen',
 'listgrouprights-summary' => 'Op deze pagina staan de gebruikersgroepen in deze wiki beschreven, met hun bijbehorende rechten.
 Er kan [[{{MediaWiki:Listgrouprights-helppage}}|extra informatie]] over individuele rechten aanwezig zijn.',
-'listgrouprights-key' => 'Leganda:
+'listgrouprights-key' => 'Legenda:
 * <span class="listgrouprights-granted">Toegewezen recht</span>
 * <span class="listgrouprights-revoked">Ingetrokken recht</span>',
 'listgrouprights-group' => 'Groep',
@@ -2646,7 +2665,7 @@ Het verwijderen van dit soort pagina's is met rechten beperkt om het per ongeluk
 'delete-warning-toobig' => 'Deze pagina heeft een lange bewerkingsgeschiedenis, meer dan $1 {{PLURAL:$1|versie|versies}}.
 Het verwijderen van deze pagina kan de werking van de database van {{SITENAME}} verstoren.
 Wees voorzichtig.',
-'deleting-backlinks-warning' => "'''Waarschuwing:''' andere pagina's gebruiken of verwijzen naar de pagina die u wilt verwijderen.",
+'deleting-backlinks-warning' => "'''Waarschuwing:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|andere pagina's]] gebruiken of verwijzen naar de pagina die u wilt verwijderen.",
 
 # Rollback
 'rollback' => 'Wijzigingen ongedaan maken',
@@ -2826,8 +2845,10 @@ De laatste regel uit het blokkeerlogboek wordt hieronder ter referentie weergege
 'sp-contributions-blocked-notice-anon' => 'Dit IP-adres is geblokkeerd.
 De laatste regel uit het blokkeerlogboek wordt hieronder ter referentie weergegeven:',
 'sp-contributions-search' => 'Zoeken naar bijdragen',
+'sp-contributions-suppresslog' => 'onderdrukte gebruikersbijdragen',
 'sp-contributions-username' => 'IP-adres of gebruikersnaam:',
 'sp-contributions-toponly' => 'Alleen nieuwste versies weergeven',
+'sp-contributions-newonly' => "Alleen nieuwe pagina's weergeven",
 'sp-contributions-submit' => 'Bekijken',
 
 # What links here
@@ -2861,7 +2882,7 @@ Geef hieronder een reden op (bijvoorbeeld welke pagina's gevandaliseerd zijn).",
 'ipadressorusername' => 'IP-adres of gebruikersnaam:',
 'ipbexpiry' => 'Vervalt (maak een keuze):',
 'ipbreason' => 'Reden:',
-'ipbreason-dropdown' => "*Veel voorkomende redenen voor blokkades
+'ipbreason-dropdown' => "*Veelvoorkomende redenen voor blokkades
 ** Foutieve informatie invoeren
 ** Verwijderen van informatie uit pagina's
 ** Spamkoppeling naar externe websites
@@ -3144,6 +3165,7 @@ $2',
 'thumbnail_image-type' => 'Dit bestandstype wordt niet ondersteund',
 'thumbnail_gd-library' => 'De instellingen voor de GD-bibliotheek zijn incompleet. De functie $1 ontbreekt',
 'thumbnail_image-missing' => 'Het bestand lijkt niet aanwezig te zijn: $1',
+'thumbnail_image-failure-limit' => 'Het maken van een miniatuurafbeelding is te vaak mislukt ($1 keer of vaker). Probeer het later nog eens.',
 
 # Special:Import
 'import' => "Pagina's importeren",
@@ -4400,6 +4422,4 @@ Vrijwel alle tekst tussen dubbele accolades wordt gesubstitueerd.',
 'expand_templates_generate_rawhtml' => 'Ruwe HTML weergeven',
 'expand_templates_preview' => 'Voorvertoning',
 
-# Unknown messages
-'uploadinvalidxml' => 'De XML in het geüploade bestand kon niet worden geparst.',
 );
index 0371b7b..1b15a35 100644 (file)
@@ -356,7 +356,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Send meg kopi av e-postane eg sender til andre brukarar',
 'tog-diffonly' => 'Ikkje vis sideinnhaldet under skilnadene mellom versjonane',
 'tog-showhiddencats' => 'Vis gøymde kategoriar',
-'tog-noconvertlink' => 'Slå av konvertering av sidetitlar',
 'tog-norollbackdiff' => 'Ikkje vis skilnad etter attenderulling',
 'tog-useeditwarning' => 'Gje ei åtvaring om eg går ut av ei redigeringsside og ikkje alle endringar er lagra',
 'tog-prefershttps' => 'Alltid bruk ei trygg kopling når du er innlogga',
@@ -1304,6 +1303,7 @@ Pass på at den nye sida også har innhald frå den innfletta sida.',
 'showhideselectedversions' => 'Vis/løyn valde versjonar',
 'editundo' => 'angre',
 'diff-empty' => '(Ingen skilnad)',
+'diff-multi-sameuser' => '({{PLURAL:$1|Éin mellomversjon|$1 mellomversjonar}} av den same brukaren er ikkje {{PLURAL:$1|vist|viste}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Ein mellomversjon|$1 mellomversjonar}} av meir enn $2 {{PLURAL:$2|brukar|brukarar}}  er ikkje {{PLURAL:$1|vist|viste}})',
 'difference-missing-revision' => '{{PLURAL:$2|Éin versjon|$2 versjonar}} av skilnaden ($1) vart ikkje {{PLURAL:$2|funnen|funne}}.
 
@@ -2388,6 +2388,7 @@ Attendemelding og hjelp:
 'delete-edit-reasonlist' => 'Endre grunnar til sletting',
 'delete-toobig' => 'Denne sida har ein stor endringsshistorikk, med over {{PLURAL:$1|$1&nbsp;endring|$1&nbsp;endringar}}. Sletting av slike sider er avgrensa for å unngå utilsikta forstyrring av {{SITENAME}}.',
 'delete-warning-toobig' => 'Denne sida har ein lang endringshistorikk, med meir enn {{PLURAL:$1|$1&nbsp;endring|$1&nbsp;endringar}}. Dersom du slettar henne kan det forstyrre handlingar i databasen til {{SITENAME}}, ver varsam.',
+'deleting-backlinks-warning' => "'''Åtvaring''': Andre sider lenkjer til eller inkluderer sida du er i ferd med å sletta.",
 
 # Rollback
 'rollback' => 'Rull attende endringar',
index bfdc4fa..8cbbc3d 100644 (file)
@@ -327,7 +327,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Me mandar una còpia dels corrièrs electronics que mandi als autres utilizaires',
 'tog-diffonly' => 'Far pas veire lo contengut de las paginas jos las difs',
 'tog-showhiddencats' => 'Afichar las categorias amagadas',
-'tog-noconvertlink' => 'Desactivar la conversion dels títols',
 'tog-norollbackdiff' => 'Ometre lo diff aprèp l’utilizacion d’un revert',
 'tog-useeditwarning' => 'M’avisar quand quiti una pagina de modificacion sens publicar los cambiaments',
 'tog-prefershttps' => 'Utilizar totjorn una connexion securizada en essent connectat',
@@ -826,6 +825,9 @@ Esperatz $1 abans d’ensajar tornarmai.',
 'suspicious-userlogout' => 'Vòstra demanda de desconnexion es estada refusada perque sembla qu’es estada mandada per un navigador copat o la mesa en escondedor d’un proxy.',
 'createacct-another-realname-tip' => 'Lo nom vertadièr es opcional.
 Se decidissètz de lo provesir, serà utilizat per atribuir a l’utilizaire sos trabalhs.',
+'pt-login' => 'Se connectar',
+'pt-createaccount' => 'Crear un compte',
+'pt-userlogout' => 'Se desconnectar',
 
 # Email sending
 'php-mail-error-unknown' => 'Error desconeguda dins la foncion mail() de PHP.',
@@ -834,7 +836,7 @@ Se decidissètz de lo provesir, serà utilizat per atribuir a l’utilizaire sos
 
 # Change password dialog
 'changepassword' => 'Modificacion del senhal',
-'resetpass_announce' => 'Vos sètz enregistrat amb un senhal temporari mandat per corrièr electronic. Per acabar l’enregistrament, vos cal picar un senhal novèl aicí :',
+'resetpass_announce' => 'Per acabar l’enregistrament, vos cal picar un senhal novèl.',
 'resetpass_text' => '<!-- Apondètz lo tèxte aicí -->',
 'resetpass_header' => 'Modificar lo senhal del compte',
 'oldpassword' => 'Senhal ancian :',
@@ -842,6 +844,8 @@ Se decidissètz de lo provesir, serà utilizat per atribuir a l’utilizaire sos
 'retypenew' => 'Confirmar lo senhal novèl :',
 'resetpass_submit' => 'Cambiar lo senhal e s’enregistrar',
 'changepassword-success' => 'Vòstre senhal es estat cambiat amb succès !',
+'changepassword-throttled' => 'Avètz ensajat un tròp grand nombre de connexions darrièrament.
+Esperatz $1 abans d’ensajar tornarmai.',
 'resetpass_forbidden' => 'Los senhals pòdon pas èsser cambiats',
 'resetpass-no-info' => 'Vos cal èsser connectat per aver accès a aquesta pagina.',
 'resetpass-submit-loggedin' => 'Modificar lo senhal',
@@ -854,7 +858,7 @@ Benlèu ja avètz modificat vòstre senhal o demandat un senhal temporari novèl
 # Special:PasswordReset
 'passwordreset' => 'Remesa a zèro del senhal',
 'passwordreset-text-one' => 'Emplenatz aqueste formulari per reïnicializar vòstre senhal.',
-'passwordreset-text-many' => "{{PLURAL:$1|Completatz un d'aqueles camps per reïnicializar vòstre senhal.}}",
+'passwordreset-text-many' => "{{PLURAL:$1|Completatz un d'aqueles camps per recebre un senhal temporari per corrièr electronic.}}",
 'passwordreset-legend' => 'Reïnicializar lo senhal',
 'passwordreset-disabled' => 'La reïnicializacion dels senhals es estada desactivada sus aqueste wiki.',
 'passwordreset-emaildisabled' => 'Las foncionalitats e-mail son estadas desactivadas sus aqueste wiki.',
@@ -1098,7 +1102,9 @@ Existís ja.',
 'content-failed-to-parse' => "Fracàs de l'analisi del contengut de $2 pel modèl $1: $3",
 'invalid-content-data' => 'Donadas del contengut invalidas',
 'content-not-allowed-here' => 'Lo contengut "$1" es pas autorizat sus la pagina [[$2]]',
-'editwarning-warning' => "Quitar aquesta pagina vos farà pèrdre totas las modificacions qu'avètz fachas. Se sètz connectat amb vòstre compte, podètz levar aqueste avertiment dins la seccion « Modificacion » de vòstras preferéncias.",
+'editwarning-warning' => "Quitar aquesta pagina vos farà pèrdre totas las modificacions qu'avètz fachas.
+Se sètz connectat, podètz desactivar aqueste avertiment dins la seccion « {{int:prefs-editing}} » de vòstras preferéncias.",
+'editpage-notsupportedcontentformat-title' => 'Format de contengut pas pres en carga',
 
 # Content models
 'content-model-wikitext' => 'wikitèxte',
@@ -1139,7 +1145,9 @@ D'unas inclusions seràn pas efectuadas.",
 'cantcreateaccount-text' => "La creacion de compte dempuèi aquesta adreça IP ('''$1''') es estada blocada per [[User:$3|$3]].
 
 La rason balhada per $3 èra ''$2''.",
-'cantcreateaccount-range-text' => "La creacion de compte dempuèi las adressas IP  '''$1''', que la vòstra n'es ('''$4''') es estada blocada per [[User:$3|$3]].",
+'cantcreateaccount-range-text' => "La creacion de compte dempuèi las adreças IP dins la plaja '''$1''', que compren vòstra agreça IP ('''$4''') son estadas blocadas per [[User:$3|$3]].
+
+Lo motiu provesit per $3 es ''$2''",
 
 # History pages
 'viewpagelogs' => 'Vejatz las operacions per aquesta pagina',
@@ -1174,7 +1182,7 @@ Benlèu es estada escafada o renomenada.
 Ensajatz de [[Special:Search|recercar sul wiki]] per trobar de paginas en rapòrt.',
 
 # Revision deletion
-'rev-deleted-comment' => '(comentari suprimit)',
+'rev-deleted-comment' => '(resumit de comentari suprimit)',
 'rev-deleted-user' => '(nom d’utilizaire suprimit)',
 'rev-deleted-event' => '(entrada suprimida)',
 'rev-deleted-user-contribs' => "[nom d'utilizaire o adreça IP suprimida - modificacion amagada sus las contribucions]",
@@ -1327,7 +1335,7 @@ Podètz trobar de detalhs dins lo [{{fullurl:{{#Special:Log}}/delete|page={{FULL
 'shown-title' => 'Afichar $1 {{PLURAL:$1|resultat|resultats}} per pagina',
 'viewprevnext' => 'Veire ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "* Pagina '''[[$1]]'''",
-'searchmenu-new' => "'''Crear la pagina ''[[:$1|$1]]'' sus aqueste wiki !'''",
+'searchmenu-new' => '<strong>Crear la pagina « [[:$1|$1]] » sus aqueste wiki !</strong> {{PLURAL:$2|0=|Vejatz tanben la pagina trobada amb vòstra recèrca.|Vejatz tanben los resultats de vòstra recèrca.}}',
 'searchprofile-articles' => 'Paginas de contengut',
 'searchprofile-project' => "Paginas d'ajuda e del projècte",
 'searchprofile-images' => 'Multimèdia',
@@ -1343,6 +1351,7 @@ Podètz trobar de detalhs dins lo [{{fullurl:{{#Special:Log}}/delete|page={{FULL
 'search-result-score' => 'Pertinéncia : $1%',
 'search-redirect' => '(redireccion cap a $1)',
 'search-section' => '(seccion $1)',
+'search-file-match' => '(correspond al contengut del fichièr)',
 'search-suggest' => 'Avètz volgut dire : $1',
 'search-interwiki-caption' => 'Projèctes fraires',
 'search-interwiki-default' => '$1 resultats :',
@@ -1666,16 +1675,29 @@ Tanben podètz causir de permetre a d’autres de vos contactar per vòstra pagi
 'recentchanges-label-minor' => 'Aqueste cambiament es menor',
 'recentchanges-label-bot' => 'Aqueste cambiament es estat efectuat per un bòt.',
 'recentchanges-label-unpatrolled' => 'Aqueste cambiament es pas estat verificat encara.',
+'recentchanges-label-plusminus' => "La talha de la pagna a cambiat d'aqueste nombre d’octets.",
 'recentchanges-legend-heading' => "'''Legenda :'''",
 'recentchanges-legend-newpage' => '(veire tanben la [[Special:NewPages|lista de las paginas novèlas]]).',
-'rcnotefrom' => "Vaquí los cambiaments efectuats dempuèi lo '''$2''' ('''$1''' al maximum).",
+'rcnotefrom' => 'Çaijós las modificacions efectuadas dempuèi lo <strong>$2</strong> (fins a <strong>$1</strong> afichats).',
 'rclistfrom' => 'Afichar las modificacions novèlas dempuèi lo $1.',
 'rcshowhideminor' => '$1 los cambiaments menors',
+'rcshowhideminor-show' => 'Afichar',
+'rcshowhideminor-hide' => 'Amagar',
 'rcshowhidebots' => '$1 los robòts',
+'rcshowhidebots-show' => 'Afichar',
+'rcshowhidebots-hide' => 'Amagar',
 'rcshowhideliu' => '$1 los utilizaires enregistrats',
+'rcshowhideliu-show' => 'Afichar',
+'rcshowhideliu-hide' => 'Amagar',
 'rcshowhideanons' => '$1 los utilizaires anonims',
+'rcshowhideanons-show' => 'Afichar',
+'rcshowhideanons-hide' => 'Amagar',
 'rcshowhidepatr' => '$1 las modificacions susvelhadas',
+'rcshowhidepatr-show' => 'Afichar',
+'rcshowhidepatr-hide' => 'Amagar',
 'rcshowhidemine' => '$1 mas modificacions',
+'rcshowhidemine-show' => 'Afichar',
+'rcshowhidemine-hide' => 'Amagar',
 'rclinks' => 'Afichar los $1 darrièrs cambiaments efectuats al cors dels $2 darrièrs jorns; $3 cambiaments menors.',
 'diff' => 'dif',
 'hist' => 'ist',
@@ -1798,6 +1820,8 @@ S'o volètz importar tornamai, tornatz en rèire e importatz-lo jos un autre nom
 'uploaddisabledtext' => "L'impòrt de fichièrs cap al servidor es desactivat.",
 'php-uploaddisabledtext' => "Lo telecargament de fichièrs es estat desactivat dins PHP. Verificatz l'opcion de configuracion file_uploads.",
 'uploadscripted' => "Aqueste fichièr conten de còde HTML o un escript que poiriá èsser interpretat d'un biais incorrècte per un navigador Internet.",
+'uploadscriptednamespace' => "Aqueste fichièr SVG conten un espaci de noms '$1' pas autorizat.",
+'uploadinvalidxml' => 'Lo XML dins lo fichièr importat a pas pogut èsser analisat.',
 'uploadvirus' => 'Aqueste fichièr conten un virús ! Per mai de detalhs, consultatz : $1',
 'uploadjava' => 'Es un fichièr ZIP que conten un fichièr Java .class.
 Lo telecargament de fichièrs Java es pas autorizat, perque pòdon contornar de restriccions de seguretat.',
@@ -2114,6 +2138,7 @@ Las entradas <del>barradas</del> son estadas resolgudas.',
 'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikis}}',
 'nlinks' => '$1 {{PLURAL:$1|ligam|ligams}}',
 'nmembers' => '$1 {{PLURAL:$1|membre|membres}}',
+'nmemberschanged' => '$1 → $2 {{PLURAL:$2|membre|membres}}',
 'nrevisions' => '$1 {{PLURAL:$1|revision|revisions}}',
 'nviews' => '$1 {{PLURAL:$1|consultacion|consultacions}}',
 'nimagelinks' => 'Utilisat sus $1 {{PLURAL:$1|pagina|paginas}}',
@@ -2152,6 +2177,14 @@ Las entradas <del>barradas</del> son estadas resolgudas.',
 'protectedpages-cascade' => 'Unicament las proteccions en cascada',
 'protectedpages-noredirect' => 'Amagar las redireccions',
 'protectedpagesempty' => 'Cap de pagina es pas protegida actualament.',
+'protectedpages-timestamp' => 'Orodatatge',
+'protectedpages-page' => 'Pagina',
+'protectedpages-expiry' => 'Expira lo',
+'protectedpages-performer' => 'Proteccion de l’utilizaire',
+'protectedpages-params' => 'Paramètres de proteccion',
+'protectedpages-reason' => 'Motiu',
+'protectedpages-unknown-timestamp' => 'Desconegut',
+'protectedpages-unknown-performer' => 'Utilizaire desconegut',
 'protectedtitles' => 'Títols protegits',
 'protectedtitlesempty' => 'Cap de títol es pas actualament protegit amb aquestes paramètres.',
 'listusers' => 'Lista dels participants',
@@ -2363,21 +2396,20 @@ per modificar vòstra lista de seguiment.',
 'enotif_lastvisited' => 'Consultatz $1 per totes los cambiaments dempuèi vòstra darrièra visita.',
 'enotif_lastdiff' => 'Consultatz $1 per veire aquesta modificacion.',
 'enotif_anon_editor' => 'utilizaire anonim $1',
-'enotif_body' => 'Car(a) $WATCHINGUSERNAME,
+'enotif_body' => 'Car $WATCHINGUSERNAME,
 
 $PAGEINTRO $NEWPAGE
 
-Resumit del contributor : $PAGESUMMARY 
-$PAGEMINOREDIT
+Resumit del contributor :
+$PAGESUMMARY $PAGEMINOREDIT
 
 Contactatz aqueste contributor :
 corrièl : $PAGEEDITOR_EMAIL
 wiki : $PAGEEDITOR_WIKI
 
-I aurà pas d’autras notificacions en cas de cambiaments ulteriors, levat se visitatz aquela pagina.
-Podètz tanben reïnicializar las bandièras de notificacion per totas las paginas de vòstra lista de seguiment.
+I aurà pas d’autras notificacions en cas de cambiaments ulteriors, levat se visitatz aquela pagina un còp connectat. Podètz tanben reïnicializar las bandièras de notificacion per totas las paginas de vòstra lista de seguiment.
 
-             Vòstre sistèma de notificacion de {{SITENAME}}
+Vòstre sistèma de notificacion de {{SITENAME}}
 
 --
 Pour modificar los paramètres de notificacion per corrièl, visitatz {{canonicalurl:{{#special:Preferences}}}}
@@ -2595,8 +2627,10 @@ $1",
 'sp-contributions-blocked-notice-anon' => 'Aquesta adreça IP es actualament blocada.
 La darrièra intrada del jornal dels blocatges es indicada çaijós a títol d’informacion :',
 'sp-contributions-search' => 'Cercar las contribucions',
+'sp-contributions-suppresslog' => 'contribucions suprimidas d’un utilizaire',
 'sp-contributions-username' => 'Adreça IP o nom d’utilizaire :',
 'sp-contributions-toponly' => 'Mostrar sonque las contribucions que son lo darrièr cambiament',
+'sp-contributions-newonly' => 'Afichar unicament las modificacions que son de creacions de pagina',
 'sp-contributions-submit' => 'Cercar',
 
 # What links here
@@ -2697,8 +2731,8 @@ a partir d'una adreça IP precedentament blocada.",
 'change-blocklink' => 'modificar lo blocatge',
 'contribslink' => 'contribucions',
 'emaillink' => 'mandar un messatge',
-'autoblocker' => 'Sètz estat autoblocat perque partejatz una adreça IP amb "[[User:$1|$1]]".
-La rason balhada per $1 es : « $2 ».',
+'autoblocker' => 'Sètz estat blocat automaticament perque vòstra adreça IP es estada utilizada recentament per « [[User:$1|$1]] ».
+Lo motiu provesit pel blocatge de $1 es « $2 »',
 'blocklogpage' => 'Istoric dels blocatges',
 'blocklog-showlog' => 'Aqueste utilizaire es estat blocat precedentament. Lo jornal dels blocatges es disponible çaijós :',
 'blocklog-showsuppresslog' => 'Aqueste utilizaire es estat blocat e amagat precedentament. Lo jornal de las supressions es disponible çaijós :',
@@ -2718,7 +2752,7 @@ Consultatz la [[Special:BlockList|lista dels utilizaires blocats]] per veire los
 'range_block_disabled' => "Lo blocatge de plajas d'IP es estat desactivat.",
 'ipb_expiry_invalid' => 'Temps d’expiracion invalid.',
 'ipb_expiry_temp' => 'Las plajas dels utilizaires amagats deurián èsser permanentas.',
-'ipb_hide_invalid' => "Impossible de suprimir aqueste compte ; sembla qu'a tròp de modificacions.",
+'ipb_hide_invalid' => "Impossible de suprimir aqueste compte ; sembla qu'a mai {{PLURAL:$1|d’una modificacion|de $1 modificacions}}.",
 'ipb_already_blocked' => '« $1 » ja es blocat',
 'ipb-needreblock' => '$1 ja es blocat. Volètz modificar los paramètres ?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|Autre blocatge|Autres blocatges}}',
@@ -2866,6 +2900,7 @@ Visitatz la [https://www.mediawiki.org/wiki/Localisation Localizacion MediaWiki]
 'allmessages-prefix' => 'Filtrar per prefix :',
 'allmessages-language' => 'Lenga :',
 'allmessages-filter-submit' => 'Aplicar',
+'allmessages-filter-translate' => 'Tradusir',
 
 # Thumbnails
 'thumbnail-more' => 'Agrandir',
@@ -2917,7 +2952,7 @@ Salvatz-lo sus vòstre disc dur puèi importatz-lo aicí.",
 'importuploaderrortemp' => "Lo telecargament del fichièr d'importar a pas capitat. Un dorsièr temporari es mancant.",
 'import-parse-failure' => "Ruptura dins l'analisi de l'impòrt XML",
 'import-noarticle' => "Pas de pagina d'importar !",
-'import-nonewrevisions' => 'Totas las revisions son estadas importadas deperabans.',
+'import-nonewrevisions' => 'Cap de revision pas importada (totas èran ja presentas, o ignoradas del fach d’errors).',
 'xml-error-string' => '$1 a la linha $2, col $3 (octet $4) : $5',
 'import-upload' => "Impòrt d'un fichier XML",
 'import-token-mismatch' => 'Pèrda de las donadas de sesilha. Tornatz ensajar.',
@@ -3806,7 +3841,14 @@ Ensajatz la previsualizacion normala.',
 'version-hook-name' => 'Nom del croquet',
 'version-hook-subscribedby' => 'Definit per',
 'version-version' => '(Version $1)',
-'version-license' => 'Licéncia',
+'version-license' => 'Licéncia de MediaWiki',
+'version-ext-license' => 'Licéncia',
+'version-ext-colheader-name' => 'Extensions',
+'version-ext-colheader-license' => 'Licéncia',
+'version-ext-colheader-description' => 'Descripcion',
+'version-ext-colheader-credits' => 'Autors',
+'version-license-title' => 'Licéncia per $1',
+'version-credits-title' => 'Mercejaments per $1',
 'version-poweredby-credits' => "Aqueste wiki fonciona gràcias a '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'autres',
 'version-poweredby-translators' => 'traductors de translatewiki.net',
@@ -3818,7 +3860,7 @@ Ensajatz la previsualizacion normala.',
 'version-entrypoints-header-url' => 'URL',
 
 # Special:Redirect
-'redirect' => 'Redirigit per fichièr, utilizaire, o ID de revision',
+'redirect' => 'Redirigit per fichièr, utilizaire, pagina o ID de revision.',
 'redirect-legend' => 'Redirigir cap a una pagina o un fichièr',
 'redirect-submit' => 'Validar',
 'redirect-lookup' => 'Recèrca :',
@@ -4015,6 +4057,7 @@ Ensajatz la previsualizacion normala.',
 'api-error-overwrite' => 'Espotir un fichièr existent es pas autorizat.',
 'api-error-stashfailed' => 'Error intèrna : lo servidor a pas pogut enregistrar lo fichièr temporari.',
 'api-error-publishfailed' => 'Error intèrna: Lo servidor a pas pogut publicar lo fichièr temporari.',
+'api-error-stasherror' => "Una error s'es produsida al moment del telecargament del fichièr per lo dissimular.",
 'api-error-timeout' => 'Lo servidor a pas respondut dins lo relambi pervist.',
 'api-error-unclassified' => "Una error desconeguda s'es producha.",
 'api-error-unknown-code' => 'Error desconeguda : « $1 »',
@@ -4055,7 +4098,11 @@ Ensajatz la previsualizacion normala.',
 
 # Special:ExpandTemplates
 'expandtemplates' => 'Espandiment dels modèls',
-'expand_templates_intro' => 'Aquesta pagina permet de testar l’espandiment de modèls, que son desvolopats recursivament. Las foncions e las variablas predefinidas, coma <nowiki>{{</nowiki>#language:...}} e <nowiki>{{</nowiki>CURRENTDAY}} tanben son desvolopadas.',
+'expand_templates_intro' => "Aquesta pagina especiala accèpta un tèxte wiki source e permet de realizar recursivament l’espandiment dels modèls que conten.
+Realiza tanben l’espandiment de las foncions del parser talas coma
+<code><nowiki>{{</nowiki>#language:...}}</code> e de variablas coma
+<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.
+En fach, realiza l'espandiment de gaireben tot çò qu'es enquadrat per d'acoladas doblas.",
 'expand_templates_title' => 'Títol de l’article, util per exemple se lo modèl utiliza {{FULLPAGENAME}} :',
 'expand_templates_input' => 'Picatz vòstre tèxte aicí :',
 'expand_templates_output' => 'Visualizatz lo resultat :',
index 4076b81..4388f73 100644 (file)
@@ -23,6 +23,7 @@
  * @author Geitost
  * @author Herr Kriss
  * @author Holek
+ * @author Jacenty359
  * @author Jwitos
  * @author Kaganer
  * @author Kaligula
@@ -317,7 +318,7 @@ $magicWords = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Podkreślenie linków',
+'tog-underline' => 'Podkreślenie linków:',
 'tog-hideminor' => 'Ukryj drobne edycje w ostatnich zmianach',
 'tog-hidepatrolled' => 'Ukryj sprawdzone edycje w ostatnich zmianach',
 'tog-newpageshidepatrolled' => 'Ukryj sprawdzone strony na liście nowych stron',
@@ -353,7 +354,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Przesyłaj mi kopie wiadomości, które wysyłam do innych użytkowników',
 'tog-diffonly' => 'Nie pokazuj treści stron pod porównaniami zmian',
 'tog-showhiddencats' => 'Pokazuj ukryte kategorie',
-'tog-noconvertlink' => 'Wyłącz konwersję tytułów w linkach',
 'tog-norollbackdiff' => 'Pomiń pokazywanie zmian po użyciu funkcji „cofnij”',
 'tog-useeditwarning' => 'Ostrzegaj mnie, gdy opuszczam stronę edycji bez zapisania zmian',
 'tog-prefershttps' => 'Zawsze używaj bezpiecznego połączenia po zalogowaniu',
@@ -863,6 +863,9 @@ Odczekaj $1 zanim ponowisz próbę.',
 'suspicious-userlogout' => 'Żądanie wylogowania zostało odrzucone ponieważ wygląda na to, że zostało wysłane przez uszkodzoną przeglądarkę lub buforujący serwer proxy.',
 'createacct-another-realname-tip' => 'Wpisanie imienia i nazwiska nie jest obowiązkowe.
 Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje autorstwo.',
+'pt-login' => 'Zaloguj się',
+'pt-createaccount' => 'Utwórz konto',
+'pt-userlogout' => 'Wyloguj',
 
 # Email sending
 'php-mail-error-unknown' => 'Wystąpił nieznany błąd w funkcji PHP mail()',
@@ -887,10 +890,13 @@ Odczekaj $1, zanim ponowisz próbę.',
 'resetpass-submit-cancel' => 'Anuluj',
 'resetpass-wrong-oldpass' => 'Nieprawidłowe tymczasowe lub aktualne hasło.
 Być może właśnie zmienił{{GENDER:|eś|aś|eś(‐aś)}} swoje hasło lub poprosił{{GENDER:|eś|aś|eś(‐aś)}} o nowe tymczasowe hasło.',
+'resetpass-recycled' => 'Zmień swoje hasło na inne niż aktualne.',
+'resetpass-temp-emailed' => 'Zalogowałeś się dzięki tymczasowemu kodowi.
+Aby dokończyć logowanie, musisz ustawić nowe hasło tutaj:',
 'resetpass-temp-password' => 'Tymczasowe hasło:',
 'resetpass-abort-generic' => 'Zmiana hasła została przerwana przez rozszerzenie.',
 'resetpass-expired' => 'Twoje hasło wygasło. Proszę ustawić nowe hasło do logowania.',
-'resetpass-expired-soft' => 'Twoje hasło wygasło i musi zostać zresetowane. Proszę wybrać nowe hasło albo kliknąć przycisk Anuluj, aby zresetować je później.',
+'resetpass-expired-soft' => 'Twoje hasło wygasło i musi zostać zresetowane. Proszę wybrać nowe hasło albo kliknąć na "{{int:resetpass-submit-cancel}}", aby zresetować je później.',
 
 # Special:PasswordReset
 'passwordreset' => 'Wyczyść hasło',
@@ -1055,11 +1061,11 @@ Upewnij się, czy na pewno zamierza{{GENDER:|łeś|łaś|sz}} utworzyć lub zmod
 'userpage-userdoesnotexist-view' => 'Konto użytkownika „$1” nie jest zarejestrowane.',
 'blocked-notice-logextract' => '{{GENDER:$1|Ten użytkownik|Ta użytkowniczka}} jest obecnie {{GENDER:$1|zablokowany|zablokowana}}.
 Ostatni wpis rejestru blokad jest pokazany poniżej.',
-'clearyourcache' => "'''Uwaga:''' aby zobaczyć zmiany po zapisaniu, może zajść potrzeba wyczyszczenia pamięci podręcznej przeglądarki.
-* '''Firefox / Safari:''' Przytrzymaj ''Shift'' podczas klikania ''Odśwież bieżącą stronę'', lub naciśnij klawisze ''Ctrl+F5'' lub ''Ctrl+R'' (''⌘-R'' na komputerze Mac)
-* '''Google Chrome:''' Naciśnij ''Ctrl-Shift-R'' (''⌘-Shift-R'' na komputerze Mac)
-* '''Internet Explorer:''' Przytrzymaj ''Ctrl'' jednocześnie klikając ''Odśwież'' lub naciśnij klawisze ''Ctrl+F5''
-* '''Opera:''' Wyczyść pamięć podręczną w ''Narzędzia → Preferencje''",
+'clearyourcache' => '<strong>Uwaga:</strong> aby zobaczyć zmiany po zapisaniu, może zajść potrzeba wyczyszczenia pamięci podręcznej przeglądarki.
+* <strong>Firefox / Safari:</strong> Przytrzymaj <em>Shift</em> podczas klikania <em>Odśwież bieżącą stronę</em>, lub naciśnij klawisze <em>Ctrl+F5</em> lub <em>Ctrl+R</em> (<em>⌘-R</em> na komputerze Mac)
+* <strong>Google Chrome:</strong> Naciśnij <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> na komputerze Mac)
+* <strong>Internet Explorer:</strong> Przytrzymaj <em>Ctrl</em>, jednocześnie klikając <em>Odśwież</em>, lub naciśnij klawisze <em>Ctrl+F5</em>
+* <strong>Opera:</strong> Wyczyść pamięć podręczną w <em>Narzędzia → Preferencje</em>',
 'usercssyoucanpreview' => "'''Podpowiedź:''' Użyj przycisku „Podgląd”, aby przetestować nowy arkusz stylów CSS przed jego zapisaniem.",
 'userjsyoucanpreview' => "'''Podpowiedź:''' Użyj przycisku „Podgląd”, aby przetestować nowy kod JavaScript przed jego zapisaniem.",
 'usercsspreview' => "'''Pamiętaj, że to tylko podgląd arkusza stylów CSS – nic jeszcze nie zostało zapisane!'''",
@@ -1746,11 +1752,23 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
 'rcnotefrom' => "Poniżej pokazano zmiany wykonane po '''$2''' (nie więcej niż '''$1''' pozycji).",
 'rclistfrom' => 'Pokaż nowe zmiany od $1',
 'rcshowhideminor' => '$1 drobne zmiany',
+'rcshowhideminor-show' => 'Pokaż',
+'rcshowhideminor-hide' => 'Ukryj',
 'rcshowhidebots' => '$1 boty',
+'rcshowhidebots-show' => 'Pokaż',
+'rcshowhidebots-hide' => 'Ukryj',
 'rcshowhideliu' => '$1 zarejestrowanych',
+'rcshowhideliu-show' => 'Pokaż',
+'rcshowhideliu-hide' => 'Ukryj',
 'rcshowhideanons' => '$1 anonimowych',
+'rcshowhideanons-show' => 'Pokaż',
+'rcshowhideanons-hide' => 'Ukryj',
 'rcshowhidepatr' => '$1 sprawdzone',
+'rcshowhidepatr-show' => 'Pokaż',
+'rcshowhidepatr-hide' => 'Ukryj',
 'rcshowhidemine' => '$1 moje edycje',
+'rcshowhidemine-show' => 'Pokaż',
+'rcshowhidemine-hide' => 'Ukryj',
 'rclinks' => 'Pokaż ostatnie $1 zmian w ciągu ostatnich $2 dni.<br />$3',
 'diff' => 'różn.',
 'hist' => 'hist.',
@@ -1879,6 +1897,8 @@ Sprawdź historię usunięć tamtego pliku zanim prześlesz go ponownie.',
 'uploaddisabledtext' => 'Możliwość przesyłania plików została wyłączona.',
 'php-uploaddisabledtext' => 'Przesyłanie plików PHP zostało zablokowane. Sprawdź ustawienie „file_uploads”.',
 'uploadscripted' => 'Plik zawiera kod HTML lub skrypt, który może zostać błędnie zinterpretowany przez przeglądarkę internetową.',
+'uploadscriptednamespace' => "Ten plik SVG zawiera niepoprawną nazwę '$1'",
+'uploadinvalidxml' => 'Nie udało się przeanalizować XML w załadowanym pliku.',
 'uploadvirus' => 'W pliku jest wirus! Szczegóły: $1',
 'uploadjava' => 'Ten plik zawiera deklarację klasy Java skompresowaną ZIP.
 Przesyłanie plików Java nie jest dozwolone, ponieważ mogłoby zostać użyte do obchodzenia zabezpieczeń.',
@@ -2251,6 +2271,7 @@ Każdy wiersz zawiera linki do pierwszego i drugiego przekierowania oraz link, d
 'deadendpagestext' => 'Poniższe strony nie posiadają odnośników do innych stron znajdujących się w {{GRAMMAR:MS.lp|{{SITENAME}}}}.',
 'protectedpages' => 'Strony zabezpieczone',
 'protectedpages-indef' => 'Tylko strony zabezpieczone na zawsze',
+'protectedpages-summary' => 'Ta strona zawiera istniejące strony które są chronione. Aby uzyskać listę tytułów których stworzenie jest zabronione, zobacz [[{{#special:ProtectedTitles}}]].',
 'protectedpages-cascade' => 'Tylko strony zabezpieczone rekursywnie',
 'protectedpages-noredirect' => 'Ukryj przekierowania',
 'protectedpagesempty' => 'Żadna strona nie jest obecnie zabezpieczona z podanymi parametrami.',
@@ -2263,6 +2284,7 @@ Każdy wiersz zawiera linki do pierwszego i drugiego przekierowania oraz link, d
 'protectedpages-unknown-timestamp' => 'Nieznane',
 'protectedpages-unknown-performer' => 'Użytkownik nieznany',
 'protectedtitles' => 'Zabezpieczone nazwy stron',
+'protectedtitles-summary' => 'Ta strona zawiera tytuły, których tworzenie jest zabronione. Aby zobaczyć listę istniejących stron które są chronione, odwiedź tą stronę [[{{#special:ProtectedPages}}]]',
 'protectedtitlesempty' => 'Dla tych ustawień dopuszczalne jest utworzenie stron o dowolnej nazwie.',
 'listusers' => 'Lista użytkowników',
 'listusers-editsonly' => 'Pokaż tylko użytkowników z edycjami',
@@ -2359,7 +2381,7 @@ Wymaga podania co najmniej domeny najwyższego poziomu np. „*.org”.<br />
 # Special:ActiveUsers
 'activeusers' => 'Lista aktywnych użytkowników',
 'activeusers-intro' => 'Poniżej znajduje się lista użytkowników, którzy byli aktywni w ciągu {{PLURAL:$1|ostatniego dnia|ostatnich $1 dni}}.',
-'activeusers-count' => 'w ciągu {{PLURAL:$3|ostatniego dnia|ostatnich $3 dni}} {{GENDER:$2|wykonał|wykonała|wykonał}} $1 {{PLURAL:$1|edycję|edycje|edycji}}',
+'activeusers-count' => 'w ciągu {{PLURAL:$3|ostatniego dnia|ostatnich $3 dni}} {{GENDER:$2|wykonał|wykonała|wykonał}} $1 {{PLURAL:$1|operację|operacje|operacji}}',
 'activeusers-from' => 'Pokaż użytkowników zaczynając od',
 'activeusers-hidebots' => 'Ukryj boty',
 'activeusers-hidesysops' => 'Ukryj administratorów',
@@ -2533,7 +2555,7 @@ Zobacz na stronie $2 rejestr ostatnio wykonanych usunięć.',
 Usuwanie jej zostało ograniczone ze względu na możliwość zakłócenia pracy {{GRAMMAR:D.lp|{{SITENAME}}}}.',
 'delete-warning-toobig' => 'Ta strona ma bardzo długą historię edycji – ponad $1 {{PLURAL:$1|zmianę|zmiany|zmian}}.<br />
 Bądź ostrożny, ponieważ usunięcie jej może spowodować zakłócenia w pracy {{GRAMMAR:D.lp|{{SITENAME}}}}.',
-'deleting-backlinks-warning' => "''' Uwaga:''' Do strony, którą masz zamiar usunąć, odwołują się inne strony.",
+'deleting-backlinks-warning' => "''' Uwaga:''' Do strony, którą masz zamiar usunąć, odwołują się [[Special:WhatLinksHere/{{FULLPAGENAME}}|inne strony]].",
 
 # Rollback
 'rollback' => 'Cofnij edycję',
@@ -2712,6 +2734,7 @@ Poniżej znajduje się ostatni wpis w rejestrze blokowania.',
 'sp-contributions-search' => 'Szukaj wkładu',
 'sp-contributions-username' => 'Adres IP lub nazwa użytkownika',
 'sp-contributions-toponly' => 'Pokaż wyłącznie ostatnie wersje',
+'sp-contributions-newonly' => 'Pokazuj wyłącznie stworzenia stron',
 'sp-contributions-submit' => 'Szukaj',
 
 # What links here
@@ -3072,6 +3095,7 @@ Brak katalogu dla plików tymczasowych.',
 'import-error-special' => 'Strona „$1” nie została zaimportowana, ponieważ należy do specjalnej przestrzeni nazw, która nie zezwala na strony.',
 'import-error-invalid' => 'Strona „$1” nie została zaimportowana, ponieważ jej nazwa jest nieprawidłowa.',
 'import-error-unserialize' => 'Wersja $2 strony "$1" nie może zostać odserializowana. Wersja używa modelu treści $3 zserializowanego jako $4',
+'import-error-bad-location' => 'Zmiana $2 używająca modelu danych $3 nie może zostać zapisana na "$1" na tej wiki, ze względu na to, że ten model danych nie jest wspierany na tej stronie.',
 'import-options-wrong' => '{{PLURAL:$2|Niepoprawna opcja|Niepoprawne opcje}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'Wskazana strona główna jest niepoprawna.',
 'import-rootpage-nosubpage' => 'Przestrzeń nazw "$1" strony głównej nie dopuszcza stron podrzędnych.',
@@ -4249,6 +4273,7 @@ W przeciwnym wypadku można użyć prostego formularza poniżej. Komentarz zosta
 'api-error-overwrite' => 'Nadpisanie istniejącego pliku nie jest dopuszczalne.',
 'api-error-stashfailed' => 'Błąd wewnętrzny – serwer nie mógł zapisać pliku tymczasowego.',
 'api-error-publishfailed' => 'Błąd wewnętrzny: serwer nie mógł zapisać pliku tymczasowego.',
+'api-error-stasherror' => 'Wystąpił błąd podczas przesyłania pliku.',
 'api-error-timeout' => 'Serwer nie odpowiedział w oczekiwanym czasie.',
 'api-error-unclassified' => 'Wystąpił nieznany błąd',
 'api-error-unknown-code' => 'Błąd nieznany – „$1”',
@@ -4306,6 +4331,4 @@ W zasadzie rozwijane jest prawie wszystko w podwójnych nawiasach klamrowych.',
 'expand_templates_generate_rawhtml' => 'Pokaż surowy HTML',
 'expand_templates_preview' => 'Podgląd',
 
-# Unknown messages
-'uploadinvalidxml' => 'Nie udało się przeanalizować XML w załadowanym pliku.',
 );
index 7ca9697..ce2ccc2 100644 (file)
@@ -79,7 +79,6 @@ $messages = array(
 'tog-ccmeonemails' => "Mandeme na còpia dij mëssagi ëd pòsta eletrònica che i-j mando a j'àotri utent",
 'tog-diffonly' => 'Smon-e pa ël contnù dle pàgine sota le diferense',
 'tog-showhiddencats' => 'Smon-e le categorìe stërmà',
-'tog-noconvertlink' => "Disativé la conversion dij tìtoj ant j'anliure",
 'tog-norollbackdiff' => "Fé nen vëdde le diferense apress d'avèj ripristinà",
 'tog-useeditwarning' => 'Aviseme quand che i chito na pàgina ëd modìfiche con dle modìfiche nen salvà',
 'tog-prefershttps' => "Dovré sempe na conession sigura pr'ësté andrinta al sistema",
@@ -615,7 +614,7 @@ Për finì ëd rintré ant ël sistema, a dev definì na neuva ciav ambelessì:"
 'resetpass-temp-password' => 'Ciav provisòria:',
 'resetpass-abort-generic' => "La modìfica ëd la ciav a l'é stàita anulà da n'estension.",
 'resetpass-expired' => "Soa ciav a l'é scadùa. Për piasì, ch'a definissa na ciav neuva për rintré ant ël sistema.",
-'resetpass-expired-soft' => "Soa ciav a l'é scadùa e a l'ha damanca d'esse arnovà. Për piasì, ch'a serna na neuva ciav adess o ch'a sgnaca su anulé për cangela pi tard.",
+'resetpass-expired-soft' => "Soa ciav a l'é scadùa e a l'ha damanca d'esse arnovà. Për piasì, ch'a serna na neuva ciav adess o ch'a sgnaca su «{{int:resetpass-submit-cancel}}» për cangela pi tard.",
 
 # Special:PasswordReset
 'passwordreset' => 'Ri-inissialisassion ëd la ciav',
@@ -1464,14 +1463,26 @@ Costa anformassion a sarà pùblica.",
 'recentchanges-legend-heading' => "'''Legend:'''",
 'recentchanges-legend-newpage' => '(vëdde ëdcò [[Special:NewPages|lista dle pàgine neuve]])',
 'recentchanges-legend-plusminus' => "(''±123'')",
-'rcnotefrom' => ' Ambelessì sota a-i é la lista dle modìfiche da <b>$2</b> (fin-a a <b>$1</b>).',
+'rcnotefrom' => 'Ambelessì sota a-i é la lista dle modìfiche da <strong>$2</strong> (mostrà fin-a a <strong>$1</strong>).',
 'rclistfrom' => 'Mostré le modìfiche a parte da $1',
 'rcshowhideminor' => '$1 le modìfiche cite',
+'rcshowhideminor-show' => 'Smon-e',
+'rcshowhideminor-hide' => 'Stërmé',
 'rcshowhidebots' => '$1 ij trigomiro',
+'rcshowhidebots-show' => 'Smon-e',
+'rcshowhidebots-hide' => 'Stërmé',
 'rcshowhideliu' => "$1 j'utent registrà",
+'rcshowhideliu-show' => 'Smon-e',
+'rcshowhideliu-hide' => 'Stërmé',
 'rcshowhideanons' => "$1 j'utent anònim",
+'rcshowhideanons-show' => 'Smon-e',
+'rcshowhideanons-hide' => 'Stërmé',
 'rcshowhidepatr' => '$1 le modìfiche verificà',
+'rcshowhidepatr-show' => 'Smon-e',
+'rcshowhidepatr-hide' => 'Stërmé',
 'rcshowhidemine' => '$1 mie modìfiche',
+'rcshowhidemine-show' => 'Smon-e',
+'rcshowhidemine-hide' => 'Stërmé',
 'rclinks' => "Mostré j'ùltime $1 modìfiche ëd j'ùltim $2 dì<br />$3",
 'diff' => 'dif.',
 'hist' => 'stòria',
@@ -1601,6 +1612,8 @@ A dovrìa ciamé a cheidun con la possibilità ëd vëdde ij dàit dj'archivi el
 'php-uploaddisabledtext' => "Ij cariament d'archivi a son disabilità an PHP.
 Për piasì, ch'a controla l'ampostassion file_uploads.",
 'uploadscripted' => "St'archivi-sì a l'ha andrinta chèich-còs (dël còdes HTML ò pura un senari) che a podrìa esse travajà mal da chèich programa ëd navigassion.",
+'uploadscriptednamespace' => "S'archivi SVG a conten në spassi nominal «$1» nen autorisà",
+'uploadinvalidxml' => "L'XML ant l'archivi carià a l'ha nen podù esse analisà.",
 'uploadvirus' => "St'archivi-sì a l'han andrinta un '''vìrus!''' Detaj: $1",
 'uploadjava' => "L'archivi a l'é n'archivi ZIP ch'a conten n'archivi Java .class.
 As peulo pa cariesse dj'archivi Java, përché a peulo causé l'agirament ëd le restrission ëd sicurëssa.",
@@ -2260,7 +2273,7 @@ Lë scancelassion ëd pàgine parèj a l'é stàita limità për evité ch'as fa
 'delete-warning-toobig' => "Sta pàgina-sì a l'ha na stòria motobin longa, bele pì che $1 {{PLURAL:$1|revision|revision}}.
 A scancelela as peul fesse darmagi a j'operassion dla base ëd dat ëd {{SITENAME}};
 ch'a daga da ment a lòn ch'a fa.",
-'deleting-backlinks-warning' => "'''Avis:''' D'àutre pàgine a l'han na liurao a transcludo a la pàgina che chiel a veul ëscancelé.",
+'deleting-backlinks-warning' => "'''Avis:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|D'àutre pàgine]] a l'han na liura o a transcludo la pàgina che chiel a veul ëscancelé.",
 
 # Rollback
 'rollback' => 'Gavé via le modìfiche',
@@ -2435,6 +2448,7 @@ L'ùltima intrada dël registr dij blocagi a l'é butà sì-sota për arferiment
 'sp-contributions-search' => 'Arserché le contribussion',
 'sp-contributions-username' => "Adrëssa IP ò stranòm dl'utent:",
 'sp-contributions-toponly' => "Mostré mach le modìfiche ch'a son j'ùltime revision",
+'sp-contributions-newonly' => "Mostré mach le modìfiche ch'a son dle creassion ëd pàgina",
 'sp-contributions-submit' => 'Arserché',
 
 # What links here
@@ -3986,6 +4000,4 @@ An efet, a espand praticament tut lòn ch'a-i é antrames dle grafe dobie.",
 'expand_templates_generate_rawhtml' => "Smon-e l'HTML sempi",
 'expand_templates_preview' => 'Preuva',
 
-# Unknown messages
-'uploadinvalidxml' => "L'XML ant l'archivi carià a l'ha nen podù esse analisà.",
 );
index c658a6a..20fb6e8 100644 (file)
@@ -984,7 +984,7 @@ $1',
 'shown-title' => 'په هر مخ $1 {{PLURAL:$1|پايله|پايلې}} ښکاره کول',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) کتل',
 'searchmenu-exists' => "'''په دې ويکي يو مخ د \"[[:\$1]]\" په نامه دی'''",
-'searchmenu-new' => "'''په دې ويکي د \"[[:\$1]]\" مخ جوړول!'''",
+'searchmenu-new' => '<strong>په دې ويکي د "[[:$1]]" مخ جوړول!</strong> {{PLURAL:$2|0=|See also the page found with your search.|د پلټنو موندل شوې پايلې هم وگورئ.}}',
 'searchprofile-articles' => 'مېنځپانگيز مخونه',
 'searchprofile-project' => 'د لارښود او پروژې مخونه',
 'searchprofile-images' => 'گڼرسنۍ',
@@ -1248,8 +1248,8 @@ $1',
 'recentchanges-label-bot' => 'دا سمون يو روباټ ترسره کړی',
 'recentchanges-label-unpatrolled' => 'دغه سمون تر اوسه پورې نه دی څارل شوی',
 'recentchanges-label-plusminus' => 'د بايټونو د شمېر له مخې د مخ د بدلون کچه',
-'recentchanges-legend-newpage' => '(دا هم وگورۍ [[Special:NewPages|د نويو مخونو لړليک]])',
-'rcnotefrom' => "په همدې ځای کې لاندې هغه بدلونونه دي چې د '''$2''' نه راپدېخوا پېښ شوي (تر '''$1''' پورې ښکاره شوي).",
+'recentchanges-legend-newpage' => '([[Special:NewPages|د نويو مخونو لړليک]] هم وگورئ)',
+'rcnotefrom' => 'دلته لاندې د <strong>$2</strong> څخه راپدېخوا پېښ شوي بدلونونه راغلي (تر <strong>$1</strong> پورې ښکاري).',
 'rclistfrom' => 'هغه نوي بدلونونه ښکاره کول چې له $1 نه پيلېږي',
 'rcshowhideminor' => 'وړې سمونې $1',
 'rcshowhidebots' => 'روباټ $1',
@@ -1823,7 +1823,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'protect-summary-cascade' => 'ځوړاوبيز',
 'protect-expiring' => 'په $1 (UTC) پای ته رسېږي',
 'protect-expiring-local' => 'پای نېټه $1',
-'protect-expiry-indefinite' => 'Ù\84امحدوده',
+'protect-expiry-indefinite' => 'Ù\86امحدوده',
 'protect-cascade' => 'په همدې مخ کې د ټولو گډو مخونو څخه ژغورنه کېږي (ځوړاوبيزه ژغورنه)',
 'protect-cantedit' => 'تاسې نه شی کولای چې د دې مخ د ژغورنې په کچه کې بدلون راولی، دا ځکه چې تاسې د دې مخ د سمولو اجازه نه لری.',
 'protect-othertime' => 'بل وخت:',
@@ -1836,7 +1836,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 ** بې گټې سمونې او خپرونې
 ** ډېر لوستونکی مخ',
 'protect-edit-reasonlist' => 'د ژغورنې سببونه سمول',
-'protect-expiry-options' => '1 Ø³Ø§Ø¹Øª:1 hour,1 Ù\88رÚ\81:1 day,1 Ø§Ù\88Ù\88Ù\86Û\8d:1 week,2 Ø§Ù\88Ù\88Ù\86Û\8d:2 weeks,1 Ù\85Ù\8aاشت:1 month,3 Ù\85Ù\8aاشتÛ\90:3 months,6 Ù\85Ù\8aاشتÛ\90:6 months,1 Ú©Ø§Ù\84:1 year,Ù\84امحدوده:infinite',
+'protect-expiry-options' => '1 Ø³Ø§Ø¹Øª:1 hour,1 Ù\88رÚ\81:1 day,1 Ø§Ù\88Ù\88Ù\86Û\8d:1 week,2 Ø§Ù\88Ù\88Ù\86Û\8d:2 weeks,1 Ù\85Ù\8aاشت:1 month,3 Ù\85Ù\8aاشتÛ\90:3 months,6 Ù\85Ù\8aاشتÛ\90:6 months,1 Ú©Ø§Ù\84:1 year,Ù\86امحدوده:infinite',
 'restriction-type' => 'اجازه:',
 'restriction-level' => 'د بنديز کچه:',
 'minimum-size' => 'وړه کچه',
@@ -1943,8 +1943,10 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'ipbemailban' => 'د کارن لخوا په برېښليک رالېږلو بنديز',
 'ipbsubmit' => 'په دې کارن بنديز لگول',
 'ipbother' => 'بل وخت:',
-'ipboptions' => '2 Ø³Ø§Ø¹ØªÙ\88Ù\86Ù\87:2 hours,1 Ù\88رÚ\81:1 day,3 Ù\88رÚ\81Û\90:3 days,1 Ø§Ù\88Ù\88Ù\86Û\8d:1 week,2 Ø§Ù\88Ù\88Ù\86Û\8d:2 weeks,1 Ù\85Ù\8aاشت:1 month,3 Ù\85Ù\8aاشتÛ\90:3 months,6 Ù\85Ù\8aاشتÛ\90:6 months,1 Ú©Ø§Ù\84:1 year,Ù\84امحدوده:infinite',
+'ipboptions' => '2 Ø³Ø§Ø¹ØªÙ\88Ù\86Ù\87:2 hours,1 Ù\88رÚ\81:1 day,3 Ù\88رÚ\81Û\90:3 days,1 Ø§Ù\88Ù\88Ù\86Û\8d:1 week,2 Ø§Ù\88Ù\88Ù\86Û\8d:2 weeks,1 Ù\85Ù\8aاشت:1 month,3 Ù\85Ù\8aاشتÛ\90:3 months,6 Ù\85Ù\8aاشتÛ\90:6 months,1 Ú©Ø§Ù\84:1 year,Ù\86امحدوده:infinite',
 'ipbhidename' => 'کارن-نوم له سمون او لړليکونو پټول',
+'ipbwatchuser' => 'د دې کارن د خبرو اترو مخ او کارن مخ کتل',
+'ipb-disableusertalk' => 'د بنديز لگېدو سره دې د کارن د خبرو اترو مخ د سمولو مخنيوی هم پلي شي',
 'ipb-confirm' => 'د بنديز تاييد',
 'badipaddress' => 'ناسمه IP پته',
 'blockipsuccesssub' => 'بنديز په برياليتوب سره ولگېده',
index 1bd8be8..6ad3666 100644 (file)
@@ -324,7 +324,7 @@ $magicWords = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Sublinhar ligação:',
+'tog-underline' => 'Sublinhar links:',
 'tog-hideminor' => 'Esconder edições menores nas mudanças recentes',
 'tog-hidepatrolled' => 'Esconder edições patrulhadas nas mudanças recentes',
 'tog-newpageshidepatrolled' => 'Esconder páginas patrulhadas na lista de páginas novas',
@@ -333,7 +333,7 @@ $messages = array(
 'tog-numberheadings' => 'Auto-numerar cabeçalhos',
 'tog-showtoolbar' => 'Mostrar barra de edição',
 'tog-editondblclick' => 'Editar páginas quando houver um clique duplo',
-'tog-editsectiononrightclick' => 'Possibilitar a edição de seções por clique com o botão direito no título da seção',
+'tog-editsectiononrightclick' => 'Possibilitar a edição de secções por clique com o botão direito no título da secção',
 'tog-rememberpassword' => 'Recordar os meus dados neste browser (no máximo, durante $1 {{PLURAL:$1|dia|dias}})',
 'tog-watchcreations' => 'Adicionar as páginas e ficheiros que eu criar às minhas páginas vigiadas',
 'tog-watchdefault' => 'Adicionar as páginas e ficheiros que eu editar às minhas páginas vigiadas',
@@ -360,10 +360,9 @@ $messages = array(
 'tog-ccmeonemails' => 'Enviar-me cópias das mensagens por correio eletrónico que eu enviar a outros utilizadores',
 'tog-diffonly' => 'Não mostrar o conteúdo da página ao comparar duas edições',
 'tog-showhiddencats' => 'Mostrar categorias ocultas',
-'tog-noconvertlink' => 'Impossibilitar a conversão dos títulos de links',
 'tog-norollbackdiff' => 'Omitir diferenças depois de reverter edições em bloco',
 'tog-useeditwarning' => 'Avisar-me ao abandonar uma página editada sem gravar as alterações.',
-'tog-prefershttps' => 'Sempre utilizar uma conexão segura ao iniciar sessão',
+'tog-prefershttps' => 'Usar sempre uma ligação segura quando estiver autenticado',
 
 'underline-always' => 'Sempre',
 'underline-never' => 'Nunca',
@@ -373,7 +372,7 @@ $messages = array(
 'editfont-style' => 'Fonte de edição:',
 'editfont-default' => 'Fonte por omissão, do browser',
 'editfont-monospace' => 'Fonte monoespaçada',
-'editfont-sansserif' => 'Fonte sans-serif',
+'editfont-sansserif' => 'Fonte sem serifa',
 'editfont-serif' => 'Fonte serifada',
 
 # Dates
@@ -591,8 +590,8 @@ Consulte a página da [[Special:Version|versão do sistema]].',
 
 'ok' => 'OK',
 'retrievedfrom' => 'Obtida de "$1"',
-'youhavenewmessages' => 'Tem $1 ($2).',
-'youhavenewmessagesfromusers' => 'Tem $1 de {{PLURAL:$3|outro utilizador|$3 utilizadores}} ($2).',
+'youhavenewmessages' => '{{PLURAL:$3|Tem}} $1 ($2).',
+'youhavenewmessagesfromusers' => '{{PLURAL:$4|Tem}} $1 de {{PLURAL:$3|outro utilizador|$3 utilizadores}} ($2).',
 'youhavenewmessagesmanyusers' => 'Tem $1 de muitos utilizadores ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|uma mensagem nova|999=mensagens novas}}',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|última alteração|999=últimas alterações}}',
@@ -900,7 +899,7 @@ Para completar a autenticação, tem de definir uma palavra-chave nova aqui:',
 'resetpass-temp-password' => 'Palavra-chave temporária:',
 'resetpass-abort-generic' => 'A alteração da palavra-chave foi cancelada por uma extensão.',
 'resetpass-expired' => 'A sua palavra-chave expirou. Para autenticar-se, defina uma nova.',
-'resetpass-expired-soft' => 'A sua palavra-chave expirou e tem de ser redefinida. Escolha uma nova agora ou clique cancelar para redefini-la mais tarde.',
+'resetpass-expired-soft' => 'A sua palavra-chave expirou e tem de ser redefinida. Escolha uma nova agora ou clique "{{int:resetpass-submit-cancel}}" para redefini-la mais tarde.',
 
 # Special:PasswordReset
 'passwordreset' => 'Redefinir palavra-chave',
@@ -1063,8 +1062,8 @@ Os detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{F
 'userpage-userdoesnotexist' => 'A conta "<nowiki>$1</nowiki>" não se encontra registada.
 Verifique se deseja realmente criar ou editar esta página, por favor.',
 'userpage-userdoesnotexist-view' => 'A conta de utilizador "$1" não está registada.',
-'blocked-notice-logextract' => 'Este utilizador encontra-se atualmente bloqueado.
-Para referência, o último registro de bloqueio é apresentado abaixo:',
+'blocked-notice-logextract' => 'Este utilizador está bloqueado.
+Para referência, o último registo de bloqueio é apresentado abaixo:',
 'clearyourcache' => "'''Nota:''' Após gravar, terá de limpar a ''cache'' do seu browser para ver as alterações.
 *'''Firefox / Safari:''' Pressione ''Shift'' enquanto clica ''Recarregar'', ou pressione ''Ctrl-F5'' ou ''Ctrl-R'' (''⌘-R'' no Mac)
 *'''Google Chrome:''' Pressione ''Ctrl-Shift-R'' (''⌘-Shift-R'' no Mac)
@@ -1264,31 +1263,31 @@ Tente [[Special:Search|pesquisar na wiki]] novas páginas relevantes.',
 'rev-deleted-user' => '(nome de utilizador removido)',
 'rev-deleted-event' => '(entrada removida)',
 'rev-deleted-user-contribs' => '[nome de utilizador ou IP removido - edição ocultada das contribuições]',
-'rev-deleted-text-permission' => "Esta revisão de página foi '''eliminada'''.
-Podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].",
-'rev-deleted-text-unhide' => "Esta revisão de página foi '''eliminada'''.
-Podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].
-Pode mesmo assim [$1 ver esta edição] se deseja prosseguir.",
-'rev-suppressed-text-unhide' => "Esta revisão de página foi '''suprimida'''.
-Podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registo de supressões].
-Pode mesmo assim [$1 ver esta revisão] se deseja prosseguir.",
-'rev-deleted-text-view' => "Esta revisão de página foi '''eliminada'''.
-Você pode vê-la; podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].",
-'rev-suppressed-text-view' => "Esta revisão de página foi '''suprimida'''.
-Você pode vê-la; podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registo de supressões].",
-'rev-deleted-no-diff' => "Não pode ver esta diferença entre revisões porque uma das revisões foi '''eliminada'''.
-Podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].",
-'rev-suppressed-no-diff' => "Não pode ver esta diferença entre versões porque uma das revisões foi '''eliminada'''.",
-'rev-deleted-unhide-diff' => "Uma das revisões desta diferença entre revisões foi '''eliminada'''.
-Podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].
-Pode mesmo assim [$1 ver estas diferenças] se deseja prosseguir.",
-'rev-suppressed-unhide-diff' => "Uma das revisões desta diferença entre revisões foi '''suprimida'''.
-Podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registo de supressões].
-Pode mesmo assim [$1 ver estas diferenças] se deseja prosseguir.",
-'rev-deleted-diff-view' => "Uma das revisões desta diferença entre revisões foi '''eliminada'''.
-Você pode ver a diferença entre revisões; podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].",
-'rev-suppressed-diff-view' => "Uma das revisões desta diferença entre revisões foi '''suprimida'''.
-Você pode ver a diferença entre revisões; podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registo de supressões].",
+'rev-deleted-text-permission' => 'Esta revisão de página foi <strong>eliminada</strong>.
+Encontrará detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].',
+'rev-deleted-text-unhide' => 'Esta revisão de página foi <strong>eliminada</strong>.
+Encontrará detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].
+Pode mesmo assim [$1 ver esta revisão] se deseja prosseguir.',
+'rev-suppressed-text-unhide' => 'Esta revisão de página foi <strong>suprimida</strong>.
+Encontrará detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registo de supressões].
+Pode mesmo assim [$1 ver esta revisão] se deseja prosseguir.',
+'rev-deleted-text-view' => 'Esta revisão de página foi <strong>eliminada</strong>.
+Você pode vê-la; encontrará detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].',
+'rev-suppressed-text-view' => 'Esta revisão de página foi <strong>suprimida</strong>.
+Você pode vê-la; encontrará detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registo de supressões].',
+'rev-deleted-no-diff' => 'Não pode ver esta diferença entre revisões porque uma das revisões foi <strong>eliminada</strong>.
+Encontrará detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].',
+'rev-suppressed-no-diff' => 'Não pode ver esta diferença entre versões porque uma das revisões foi <strong>eliminada</strong>.',
+'rev-deleted-unhide-diff' => 'Uma das revisões desta diferença entre revisões foi <strong>eliminada</strong>.
+Encontrará detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].
+Pode mesmo assim [$1 ver estas diferenças] se deseja prosseguir.',
+'rev-suppressed-unhide-diff' => 'Uma das revisões desta diferença entre revisões foi <strong>suprimida</strong>.
+Encontrará detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registo de supressões].
+Pode mesmo assim [$1 ver estas diferenças] se deseja prosseguir.',
+'rev-deleted-diff-view' => 'Uma das revisões desta diferença entre revisões foi <strong>eliminada</strong>.
+Pode ver a diferença entre revisões; encontrará detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].',
+'rev-suppressed-diff-view' => 'Uma das revisões desta diferença entre revisões foi <strong>suprimida</strong>.
+Pode ver a diferença entre revisões; encontrará detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registo de supressões].',
 'rev-delundel' => 'mostrar/esconder',
 'rev-showdeleted' => 'mostrar',
 'revisiondelete' => 'Eliminar/restaurar edições',
@@ -1299,8 +1298,8 @@ Você pode ver a diferença entre revisões; podem existir mais detalhes no [{{f
 'revdelete-show-file-submit' => 'Sim',
 'revdelete-selected' => "'''{{PLURAL:$2|Edição selecionada|Edições selecionadas}} de [[:$1]]:'''",
 'logdelete-selected' => "'''{{PLURAL:$1|Evento do registo selecionado|Eventos do registo selecionados}}:'''",
-'revdelete-text' => "'''Edições e eventos eliminados continuarão a aparecer no histórico e registos da página, mas partes do seu conteúdo estarão inacessíveis ao público.'''
-Outros administradores da {{SITENAME}} continuarão a poder aceder ao conteúdo escondido e podem restaurá-lo novamente através desta mesma interface, a menos que restrições adicionais sejam definidas.",
+'revdelete-text' => '<strong>Edições e operações eliminadas continuarão a aparecer no histórico da página e nos registos, mas partes do seu conteúdo estarão inacessíveis ao público.</strong>
+Outros administradores da {{SITENAME}} continuarão a poder aceder ao conteúdo escondido e podem repô-lo através desta mesma interface, a menos que restrições adicionais sejam definidas.',
 'revdelete-confirm' => 'Por favor confirme que pretende executar esta operação, que compreende as suas consequências e que o faz em concordância com as [[{{MediaWiki:Policy-url}}|políticas e recomendações]].',
 'revdelete-suppress-text' => "A supressão '''só''' deverá ser usada nos seguintes casos:
 * Informação potencialmente caluniosa, difamatória ou injuriosa
@@ -1417,7 +1416,7 @@ Os detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{F
 'nextn-title' => '{{PLURAL:$1|próximo|próximos}} $1 {{PLURAL:$1|resultado|resultados}}',
 'shown-title' => 'Mostrar $1 {{PLURAL:$1|resultado|resultados}} por página',
 'viewprevnext' => 'Ver ($1 {{int:pipe-separator}} $2) ($3).',
-'searchmenu-exists' => "'''Há uma página com o nome \"[[:\$1]]\" nesta wiki'''",
+'searchmenu-exists' => '<strong>Há uma página com o nome "[[:$1]]" nesta wiki.</strong> {{PLURAL:$2|0=|Veja também os outros resultados encontrados.}}',
 'searchmenu-new' => '<strong>Crie a página "[[:$1]]" nesta wiki!</strong> {{PLURAL:$2|0=|Veja também a página encontrada na pesquisa.|Veja também os resultados da pesquisa.}}',
 'searchprofile-articles' => 'Páginas de conteúdo',
 'searchprofile-project' => 'Páginas de ajuda e de projeto',
@@ -1444,7 +1443,7 @@ Os detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{F
 'searchrelated' => 'relacionados',
 'searchall' => 'todos',
 'showingresults' => "{{PLURAL:$1|É apresentado '''um''' resultado|São apresentados até '''$1''' resultados}} abaixo{{PLURAL:$1||, começando pelo '''$2'''º}}.",
-'showingresultsinrange' => 'Mostrando abaixo até {{PLURAL:$1|<strong>1</strong> resultado|<strong>$1</strong> resultados}} entre #<strong>$2</strong> e #<strong>$3</strong>.',
+'showingresultsinrange' => 'Apresenta-se abaixo {{PLURAL:$1|<strong>1</strong> resultado|até <strong>$1</strong> resultados}} no intervalo #<strong>$2</strong> a #<strong>$3</strong>.',
 'showingresultsnum' => "{{PLURAL:$3|É apresentado '''um''' resultado|São apresentados '''$3''' resultados}} abaixo{{PLURAL:$3||, começando pelo '''$2'''º}}.",
 'showingresultsheader' => "{{PLURAL:$5|Resultado '''$1''' de '''$3'''|Resultados '''$1–$2''' de '''$3'''}} para '''$4'''",
 'search-nonefound' => 'A pesquisa não produziu resultados.',
@@ -1765,14 +1764,27 @@ Se optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu
 'recentchanges-label-plusminus' => 'Alteração no tamanho da página, em bytes',
 'recentchanges-legend-heading' => "'''Legenda:'''",
 'recentchanges-legend-newpage' => '([[Special:NewPages|lista de páginas novas]])',
-'rcnotefrom' => 'Abaixo estão as mudanças desde <b>$2</b> (mostradas até <b>$1</b>).',
+'recentchanges-legend-plusminus' => '(<em>±123</em>)',
+'rcnotefrom' => 'Abaixo estão as mudanças desde <strong>$2</strong> (mostradas até <strong>$1</strong>).',
 'rclistfrom' => 'Mostrar as novas mudanças a partir das $1',
 'rcshowhideminor' => '$1 edições menores',
+'rcshowhideminor-show' => 'Mostrar',
+'rcshowhideminor-hide' => 'Esconder',
 'rcshowhidebots' => '$1 robôs',
+'rcshowhidebots-show' => 'Mostrar',
+'rcshowhidebots-hide' => 'Esconder',
 'rcshowhideliu' => '$1 utilizadores registados',
+'rcshowhideliu-show' => 'Mostrar',
+'rcshowhideliu-hide' => 'Esconder',
 'rcshowhideanons' => '$1 utilizadores anónimos',
+'rcshowhideanons-show' => 'Mostrar',
+'rcshowhideanons-hide' => 'Esconder',
 'rcshowhidepatr' => '$1 edições patrulhadas',
+'rcshowhidepatr-show' => 'Mostrar',
+'rcshowhidepatr-hide' => 'Esconder',
 'rcshowhidemine' => '$1 as minhas edições',
+'rcshowhidemine-show' => 'Mostrar',
+'rcshowhidemine-hide' => 'Esconder',
 'rclinks' => 'Mostrar as últimas $1 mudanças nos últimos $2 dias<br />$3',
 'diff' => 'dif',
 'hist' => 'his',
@@ -1815,7 +1827,7 @@ As suas [[Special:Watchlist|páginas vigiadas]] aparecem a '''negrito'''.",
 Para sua conveniência, é apresentado de seguida o registo de eliminação e de movimento da página:",
 'uploadtext' => "Utilize o formulário abaixo para fazer upload de ficheiros novos.
 Para ver ou pesquisar ficheiros anteriormente enviados, consulte a [[Special:FileList|lista de ficheiros]].
-Os reenvios de um ficheiro são também registrados no [[Special:Log/upload|registro de uploads]] e as eliminações no [[Special:Log/delete|registro de eliminações]].
+Os reenvios de um ficheiro são também registados no [[Special:Log/upload|registo de uploads]] e as eliminações no [[Special:Log/delete|registo de eliminações]].
 
 Para utilizar um ficheiro numa página, depois de ter feito o upload, insira um link com um dos seguintes formatos:
 * '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.jpg]]</nowiki></code>''' para mostrar uma imagem nas suas dimensões originais;
@@ -1892,7 +1904,7 @@ Caso deseje, mesmo assim, carregar o seu ficheiro, volte atrás e envie-o com um
 'file-exists-duplicate' => 'Este ficheiro é um duplicado {{PLURAL:$1|do seguinte|dos seguintes}}:',
 'file-deleted-duplicate' => 'Um ficheiro idêntico a este ([[:$1]]) foi eliminado anteriormente.
 Verifique o motivo da eliminação do ficheiro antes de prosseguir com o re-envio.',
-'file-deleted-duplicate-notitle' => 'Um ficheiro idêntico a este foi eliminado anteriormente, e o título foi suprimido. Você deve pedir a alguém capaz de ver os dados de ficheiros eliminados para que revise a situação antes de carregar novamente este ficheiro.',
+'file-deleted-duplicate-notitle' => 'Um ficheiro idêntico já foi eliminado e o seu título suprimido. Devia pedir a alguém capaz de ver os dados dos ficheiros eliminados para verificar a situação antes de carregá-lo novamente.',
 'uploadwarning' => 'Aviso de envio',
 'uploadwarning-text' => 'Modifique a descrição do ficheiro abaixo e tente novamente, por favor.',
 'savefile' => 'Gravar ficheiro',
@@ -1905,6 +1917,8 @@ Verifique o motivo da eliminação do ficheiro antes de prosseguir com o re-envi
 'php-uploaddisabledtext' => 'O carregamento de ficheiros está impossibilitado no PHP.
 Verifique a configuração file_uploads, por favor.',
 'uploadscripted' => 'Este ficheiro contém HTML ou código que pode ser erradamente interpretado por um browser.',
+'uploadscriptednamespace' => "Este ficheiro SVG contém um espaço nominal que não é permitido '$1'",
+'uploadinvalidxml' => 'Erro detectado na análise do XML do ficheiro carregado.',
 'uploadvirus' => 'O ficheiro contém um vírus! Detalhes: $1',
 'uploadjava' => 'Este é um ficheiro ZIP que contém um ficheiro .class de Java.
 Não é permitido o upload de ficheiros Java, porque estes podem contornar as restrições de segurança.',
@@ -2170,6 +2184,7 @@ Talvez queira editar a descrição na [$2 página original de descrição do fic
 'randompage-nopages' => 'Não há páginas {{PLURAL:$2|no seguinte espaço nominal|nos seguintes espaços nominais}}: $1.',
 
 # Random page in category
+'randomincategory' => 'Página aleatória na categoria',
 'randomincategory-invalidcategory' => '"$1" não é um nome de categoria válido',
 'randomincategory-nopages' => 'Não há páginas na categoria [[:Category:$1|$1]].',
 'randomincategory-selectcategory' => 'Obter página aleatória da categoria: $1 $2',
@@ -2235,6 +2250,7 @@ Agora redirecciona para [[$2]].',
 'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikis}}',
 'nlinks' => '$1 {{PLURAL:$1|ligação|ligações}}',
 'nmembers' => '$1 {{PLURAL:$1|membro|membros}}',
+'nmemberschanged' => '$1 → $2 {{PLURAL:$2|membro|membros}}',
 'nrevisions' => '$1 {{PLURAL:$1|edição|edições}}',
 'nviews' => '$1 {{PLURAL:$1|visita|visitas}}',
 'nimagelinks' => 'Usada {{PLURAL:$1|numa página|em $1 páginas}}',
@@ -2276,9 +2292,13 @@ Agora redirecciona para [[$2]].',
 'protectedpages-cascade' => 'Apenas proteções em cascata',
 'protectedpages-noredirect' => 'Esconder redirecionamentos',
 'protectedpagesempty' => 'Neste momento, nenhuma das páginas está protegida com estes parâmetros.',
-'protectedpages-timestamp' => 'Timestamp',
+'protectedpages-timestamp' => 'Data e hora',
+'protectedpages-page' => 'Página',
 'protectedpages-expiry' => 'Expira em',
-'protectedpages-params' => 'Parâmetros de protecção',
+'protectedpages-performer' => 'Protetor',
+'protectedpages-params' => 'Parâmetros de proteção',
+'protectedpages-reason' => 'Motivo',
+'protectedpages-unknown-timestamp' => 'Desconhecido',
 'protectedpages-unknown-performer' => 'Utilizador desconhecido',
 'protectedtitles' => 'Títulos protegidos',
 'protectedtitles-summary' => 'Esta página lista os títulos protegidos, cuja criação está impossibilitada. Para ver as páginas protegidas consulte [[{{#special:ProtectedPages}}]].',
@@ -2557,7 +2577,7 @@ A eliminação de páginas como esta foi restringida na {{SITENAME}}, para evita
 'delete-warning-toobig' => 'Esta página tem um histórico de edições longo, com mais de $1 {{PLURAL:$1|edição|edições}}.
 Eliminá-la poderá causar problemas na base de dados da {{SITENAME}};
 prossiga com precaução.',
-'deleting-backlinks-warning' => "'''Aviso:''' Outras páginas possuem ligação à ou são transcluídas da página que está prestes a eliminar.",
+'deleting-backlinks-warning' => "'''Aviso:''' Há [[Special:WhatLinksHere/{{FULLPAGENAME}}|páginas]] que contêm links para a página que está prestes a eliminar ou que a transcluem.",
 
 # Rollback
 'rollback' => 'Reverter edições',
@@ -2733,8 +2753,10 @@ Para referência é apresentado abaixo o último registo de bloqueio:',
 'sp-contributions-blocked-notice-anon' => 'Este endereço IP está bloqueado neste momento.
 Para referência é apresentado abaixo o último registo de bloqueio:',
 'sp-contributions-search' => 'Pesquisar contribuições',
+'sp-contributions-suppresslog' => 'contribuições suprimidas',
 'sp-contributions-username' => 'Endereço IP ou utilizador:',
 'sp-contributions-toponly' => 'Mostrar somente as revisões mais recentes',
+'sp-contributions-newonly' => 'Mostrar só edições que são criações de páginas',
 'sp-contributions-submit' => 'Pesquisar',
 
 # What links here
@@ -2792,7 +2814,7 @@ Isto só deve ser feito para prevenir vandalismo e de acordo com a [[{{MediaWiki
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] foi {{GENDER:$1|bloqueado|bloqueada}}.<br />
 Consulte a [[Special:BlockList|lista de bloqueios]] para rever os bloqueios.',
 'ipb-blockingself' => 'Está prestes a bloquear-se a si próprio. Tem a certeza de que pretende fazê-lo?',
-'ipb-confirmhideuser' => 'Está prestes a bloquear um utilizador com "Ocultar nome de utilizador/IP" ativado. Isto irá suprimir o nome do utilizador de todas as listas e entradas dos registros. Tem a certeza de que pretende fazê-lo?',
+'ipb-confirmhideuser' => 'Está prestes a bloquear um utilizador com "Ocultar nome de utilizador/IP" ativado. Isto irá suprimir o nome do utilizador de todas as listas e entradas dos registos. Tem a certeza de que pretende fazê-lo?',
 'ipb-confirmaction' => 'Se tem a certeza de que quer fazê-lo, marque o campo "{{int:ipb-confirm}}" ao fundo.',
 'ipb-edit-dropdown' => 'Editar motivos de bloqueio',
 'ipb-unblock-addr' => 'Desbloquear $1',
@@ -3093,6 +3115,7 @@ Não há um diretório temporário.',
 'import-error-special' => 'A página "$1" não pode ser importada porque ela pertence a um espaço nominal especial que não permite páginas.',
 'import-error-invalid' => 'A página "$1" não pode ser importada porque seu nome é inválido.',
 'import-error-unserialize' => 'Revisão $2 da página "$1" não pode ser desserializada. Foi relatado que a revisão usava o modelo de conteúdo $3 serializado como $4.',
+'import-error-bad-location' => 'A revisão $2, que usa o modelo de conteúdo $3, não pode ser gravada em "$1" nesta wiki, porque o modelo não é suportado nessa página.',
 'import-options-wrong' => '{{PLURAL:$2|Opção errada|Opções erradas}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'A raiz da página dada é um título inválido.',
 'import-rootpage-nosubpage' => 'O domínio "$1" da página de raiz não permite subpáginas.',
@@ -3144,7 +3167,7 @@ Utilize o botão "Antever resultado" antes de gravar, por favor.',
 'tooltip-p-logo' => 'Visite a página principal',
 'tooltip-n-mainpage' => 'Visitar a página principal',
 'tooltip-n-mainpage-description' => 'Visitar a página principal',
-'tooltip-n-portal' => 'Sobre o projeto, o que se pode fazer e onde achar as coisas',
+'tooltip-n-portal' => 'Sobre o projeto, o que se pode fazer e onde encontrar as coisas',
 'tooltip-n-currentevents' => 'Informação temática sobre acontecimentos atuais',
 'tooltip-n-recentchanges' => 'A lista de mudanças recentes nesta wiki.',
 'tooltip-n-randompage' => 'Carregar página aleatória',
@@ -3316,9 +3339,9 @@ $1',
 'nextdiff' => 'Edição posterior →',
 
 # Media information
-'mediawarning' => '<strong>AVISO:</strong> Este tipo de arquivo pode conter código malicioso.
+'mediawarning' => '<strong>Aviso:</strong> Este tipo de ficheiro pode conter código malicioso.
 Se o executar, o seu sistema pode ficar comprometido.',
-'imagemaxsize' => 'Tamanho limite da imagem:<br /><em>(para páginas com descrições de arquivos)</em>',
+'imagemaxsize' => 'Tamanho limite da imagem:<br /><em>(para páginas de descrição de ficheiros)</em>',
 'thumbsize' => 'Tamanho de miniaturas:',
 'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|página|páginas}}',
 'file-info' => 'tamanho: $1, tipo MIME: $2',
@@ -3328,7 +3351,7 @@ Se o executar, o seu sistema pode ficar comprometido.',
 'svg-long-desc' => 'ficheiro SVG, de $1 × $2 pixels, tamanho: $3',
 'svg-long-desc-animated' => 'ficheiro SVG animado, de $1 × $2 pixels, tamanho: $3',
 'svg-long-error' => 'Ficheiro SVG inválido: $1',
-'show-big-image' => 'Arquivo original',
+'show-big-image' => 'Ficheiro original',
 'show-big-image-preview' => 'Tamanho desta antevisão: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Outra resolução|Outras resoluções}}: $1.',
 'show-big-image-size' => '$1 × $2 pixels',
@@ -3822,7 +3845,7 @@ Pode agora [[Special:UserLogin|autenticar-se]] e desfrutar da wiki.',
 'confirmemail_loggedin' => 'O seu endereço de correio eletrónico foi confirmado.',
 'confirmemail_subject' => 'Confirmação de endereço de correio eletrónico da {{SITENAME}}',
 'confirmemail_body' => 'Alguém, provavelmente você a partir do endereço IP $1,
-registrou uma conta "$2" com este endereço de correio eletrónico na {{SITENAME}}.
+registou uma conta "$2" com este endereço de correio eletrónico na {{SITENAME}}.
 
 Para confirmar que esta conta é realmente sua e ativar
 as funcionalidades de correio eletrónico na {{SITENAME}},
@@ -3894,6 +3917,9 @@ Por favor, confirme que você quer realmente recriar esta página.',
 'confirm-unwatch-button' => 'OK',
 'confirm-unwatch-top' => 'Remover esta página das páginas vigiadas?',
 
+# Separators for various lists, etc.
+'quotation-marks' => '"$1"',
+
 # Multipage image navigation
 'imgmultipageprev' => '← página anterior',
 'imgmultipagenext' => 'página seguinte →',
@@ -3995,6 +4021,7 @@ Também pode [[Special:EditWatchlist|editar a lista da maneira convencional]].',
 'version-ext-colheader-credits' => 'Autores',
 'version-license-title' => 'Licença para $1',
 'version-license-not-found' => 'Não foi encontrada informação detalhada da licença para esta extensão.',
+'version-credits-title' => 'Créditos de autoria da extensão $1',
 'version-credits-not-found' => 'Não foi encontrada informação detalhada dos créditos para esta extensão.',
 'version-poweredby-credits' => 'Esta wiki é potenciada por <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.',
 'version-poweredby-others' => 'outros',
@@ -4147,8 +4174,8 @@ Em conjunto com este programa deve ter recebido [{{SERVER}}{{SCRIPTPATH}}/COPYIN
 'revdelete-unrestricted' => 'restrições a administradores removidas',
 'logentry-move-move' => '$1 moveu a página $3 para $4',
 'logentry-move-move-noredirect' => '$1 moveu a página $3 para $4 sem deixar um redirecionamento',
-'logentry-move-move_redir' => '$1 moveu a página $3 para $4 sobre um redirecionamento',
-'logentry-move-move_redir-noredirect' => '$1 moveu a página $3 para $4 sobre um redirecionamento sem deixar um redirecionamento',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|moveu}} a página $3 para $4 sobre um redirecionamento',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|moveu}} a página $3 para $4 sobre um redirecionamento sem deixar um redirecionamento',
 'logentry-patrol-patrol' => '$1 {{GENDER:$2|marcou}} a revisão $4 da página $3 como patrulhada',
 'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|marcou}} automaticamente a revisão $4 da página $3 como patrulhada',
 'logentry-newusers-newusers' => 'A conta de utilizador $1 foi {{GENDER:$2|criada}}',
@@ -4272,6 +4299,4 @@ Na verdade, expande tudo o que estiver entre chavetas duplas.",
 'expand_templates_generate_rawhtml' => 'Mostrar o HTML puro',
 'expand_templates_preview' => 'Antevisão do resultado',
 
-# Unknown messages
-'uploadinvalidxml' => 'Erro detectado na análise do XML do ficheiro carregado.',
 );
index 592a920..49b4913 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Alcali
  * @author Alchimista
+ * @author Anaclaudiaml
  * @author Bani
  * @author Brion
  * @author BrunaaAa
@@ -367,7 +368,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Receber cópias de e-mails que eu enviar a outros usuários',
 'tog-diffonly' => 'Não mostrar o conteúdo da página ao comparar duas edições',
 'tog-showhiddencats' => 'Exibir categorias ocultas',
-'tog-noconvertlink' => 'Desabilitar conversão de títulos de links',
 'tog-norollbackdiff' => 'Omitir diferenças após desfazer edições em bloco',
 'tog-useeditwarning' => 'Avisar-me quando eu deixar uma janela de edição sem ter salvo as alterações',
 'tog-prefershttps' => 'Usar sempre uma conexão segura quando estiver conectado',
@@ -785,6 +785,7 @@ Não se esqueça de personalizar as suas [[Special:Preferences|preferências no
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuda para iniciar sessão]]',
 'userlogin-loggedin' => 'Você já está conectado como {{GENDER:$1|$1}}.
 Use o formulário abaixo para iniciar sessão como outro usuário.',
+'userlogin-createanother' => 'Criar uma outra conta',
 'createacct-join' => 'Insira suas informações abaixo.',
 'createacct-another-join' => 'Preeencha as informações para a nova conta',
 'createacct-emailrequired' => 'Endereço de e-mail',
@@ -873,6 +874,8 @@ Por favor aguarde $1 antes de tentar novamente.',
 'suspicious-userlogout' => 'Sua solicitação para sair foi negada porque aparentemente foi enviada por um navegador danificado ou por um servidor proxy com cache.',
 'createacct-another-realname-tip' => 'O nome verdadeiro é opcional.
 Se você optar por fornecê-lo, este nome será utilizado para dar ao usuário a atribuição de seu trabalho.',
+'pt-login' => 'Entrar',
+'pt-createaccount' => 'Criar conta',
 
 # Email sending
 'php-mail-error-unknown' => 'Erro desconhecido na função mail() do PHP',
@@ -881,7 +884,7 @@ Se você optar por fornecê-lo, este nome será utilizado para dar ao usuário a
 
 # Change password dialog
 'changepassword' => 'Alterar senha',
-'resetpass_announce' => 'Você foi autenticado através de uma senha temporária. Para prosseguir, será necessário definir uma nova senha.',
+'resetpass_announce' => 'Para completar a autenticação, é necessário definir uma nova senha.',
 'resetpass_text' => '<!-- Adicionar texto aqui -->',
 'resetpass_header' => 'Alterar a senha da conta',
 'oldpassword' => 'Senha antiga',
@@ -897,8 +900,12 @@ Por favor, aguarde $1 antes de tentar novamente.',
 'resetpass-submit-cancel' => 'Cancelar',
 'resetpass-wrong-oldpass' => 'Senha temporária ou atual inválida.
 Você pode já ter alterado com sucesso a sua senha, ou solicitado uma nova senha temporária.',
+'resetpass-recycled' => 'Por favor, redefina sua nova senha para uma diferente da atual.',
+'resetpass-temp-emailed' => 'Você está autenticado com o código temporário enviado. Para finalizar a autenticação, você deve inserir uma nova senha aqui:',
 'resetpass-temp-password' => 'Senha temporária:',
 'resetpass-abort-generic' => 'Uma extensão cancelou a alteração da senha.',
+'resetpass-expired' => 'Sua senha expirou. Por favor insira uma nova senha para autenticar-se.',
+'resetpass-expired-soft' => 'Sua senha expirou e necessita ser resetada. Por favor escolha uma nova agora, ou clique "{{int:resetpass-submit-cancel}}" para resetar mais tarde.',
 
 # Special:PasswordReset
 'passwordreset' => 'Redefinir senha',
@@ -1407,7 +1414,7 @@ Os detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{F
 'nextn-title' => '{{PLURAL:$1|próximo|próximos}} $1 {{PLURAL:$1|resultado|resultados}}',
 'shown-title' => 'Mostrar $1 {{PLURAL:$1|resultado|resultados}} por página',
 'viewprevnext' => 'Ver ($1 {{int:pipe-separator}} $2) ($3).',
-'searchmenu-exists' => "'''Há uma página com o nome \"[[:\$1]]\" nesta wiki'''",
+'searchmenu-exists' => '<strong>Há uma página com o nome "[[:$1]]" neste wiki.</strong> {{PLURAL:$2|0=|Veja também os outros resultados da pesquisa encontrados.}}',
 'searchmenu-new' => '<strong>Criar a página "[[:$1]]" nesta wiki!</strong>{{PLURAL:$2|0=| Veja também a página encontrada com sua pesquisa.|Veja também os resultados das pesquisas encontradas.}}',
 'searchprofile-articles' => 'Páginas de conteúdo',
 'searchprofile-project' => 'Ajuda e páginas de projeto',
@@ -1756,11 +1763,23 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
 'rcnotefrom' => "Seguem as alterações desde as '''$4''' de '''$3''' (limitadas a '''$1''').",
 'rclistfrom' => 'Mostrar as novas alterações a partir das $1',
 'rcshowhideminor' => '$1 edições menores',
+'rcshowhideminor-show' => 'Exibir',
+'rcshowhideminor-hide' => 'Ocultar',
 'rcshowhidebots' => '$1 robôs',
+'rcshowhidebots-show' => 'Exibir',
+'rcshowhidebots-hide' => 'Ocultar',
 'rcshowhideliu' => '$1 usuários registrados',
+'rcshowhideliu-show' => 'Exibir',
+'rcshowhideliu-hide' => 'Ocultar',
 'rcshowhideanons' => '$1 usuários anônimos',
+'rcshowhideanons-show' => 'Exibir',
+'rcshowhideanons-hide' => 'Ocultar',
 'rcshowhidepatr' => '$1 edições patrulhadas',
+'rcshowhidepatr-show' => 'Exibir',
+'rcshowhidepatr-hide' => 'Ocultar',
 'rcshowhidemine' => '$1 minhas edições',
+'rcshowhidemine-show' => 'Exibir',
+'rcshowhidemine-hide' => 'Ocultar',
 'rclinks' => 'Exibir as $1 alterações recentes feitas nos últimos $2 dias<br />$3',
 'diff' => 'dif',
 'hist' => 'his',
@@ -1882,6 +1901,7 @@ Se você ainda quer enviar seu arquivo, volte e use um novo nome.
 'file-exists-duplicate' => 'Este arquivo é uma duplicata do seguinte {{PLURAL:$1|arquivo|arquivos}}:',
 'file-deleted-duplicate' => 'Um arquivo idêntico a este ([[:$1]]) foi eliminado anteriormente.
 Verifique o histórico de eliminação de tal arquivo antes de tentar re-enviar.',
+'file-deleted-duplicate-notitle' => 'Um arquivo idêntico a este foi anteriormente excluído, e o título foi suprimido. Você deve comunicar com alguém capaz de visualizar dados suprimidos, para verificar a situação antes de enviá-lo novamente.',
 'uploadwarning' => 'Aviso de envio',
 'uploadwarning-text' => 'Modifique a descrição do arquivo abaixo e tente novamente.',
 'savefile' => 'Salvar arquivo',
@@ -1894,6 +1914,8 @@ Verifique o histórico de eliminação de tal arquivo antes de tentar re-enviar.
 'php-uploaddisabledtext' => 'O envio de arquivos via PHP está desativado.
 Verifique a configuração file_uploads.',
 'uploadscripted' => 'Este arquivo contém HTML ou código que pode ser erroneamente interpretado por um navegador web.',
+'uploadscriptednamespace' => 'Este aruivo SVG contém um espaço nominal probido "$1"',
+'uploadinvalidxml' => 'O XML no arquivo enviado não pôde ser analisado.',
 'uploadvirus' => 'O arquivo contém vírus!
 Detalhes: $1',
 'uploadjava' => 'Este é um arquivo ZIP que contém um arquivo .class de Java.
@@ -2274,6 +2296,7 @@ Entradas <del>riscadas</del> foram resolvidas.',
 'protectedpages-unknown-timestamp' => 'Desconhecido',
 'protectedpages-unknown-performer' => 'Usuário desconhecido',
 'protectedtitles' => 'Títulos protegidos',
+'protectedtitles-summary' => 'Está página lista os títulos já protegidos de criação. Para ver a lista de páginas existentes que estão protegidas, consulte [[{{#special:ProtectedPages}}]].',
 'protectedtitlesempty' => 'Neste momento, nenhum dos títulos está protegido com estes parâmetros.',
 'listusers' => 'Lista de usuários',
 'listusers-editsonly' => 'Mostrar apenas usuários com edições',
@@ -2721,8 +2744,10 @@ $1',
 'sp-contributions-blocked-notice-anon' => 'Este endereço IP encontra-se bloqueado.
 Segue, para referência, a entrada mais recente no registro de bloqueios:',
 'sp-contributions-search' => 'Navegar pelas contribuições',
+'sp-contributions-suppresslog' => 'Contribuições de usuário eliminadas',
 'sp-contributions-username' => 'Endereço de IP ou usuário:',
 'sp-contributions-toponly' => 'Mostrar somente as edições que sejam a última alteração',
+'sp-contributions-newonly' => 'Mostrar somente as edições que criaram uma nova página.',
 'sp-contributions-submit' => 'Pesquisar',
 
 # What links here
@@ -3074,6 +3099,7 @@ Salve o arquivo no seu computador e importe-o aqui.',
 'import-error-special' => 'A página "$1" não pôde ser importada porque ela pertence a um espaço nominal especial que não suporta páginas.',
 'import-error-invalid' => 'A página "$1" não pôde ser importada por seu nome ser inválido.',
 'import-error-unserialize' => 'Revisão  $2  da página " $1 " não pôde ser desserializada. A revisão foi relatada para usar o modelo de conteúdo  $3  serializado como  $4',
+'import-error-bad-location' => 'A revisão $2, que usa o modelo de conteúdo $3, não pode ser gravada em "$1" nesta wiki, pois o modelo não é suportado nessa página.',
 'import-options-wrong' => '{{PLURAL:$2|Opção com erro|Opções com erros}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'A página raiz dada é um título inválido.',
 'import-rootpage-nosubpage' => 'O espaço nominal $1 da página principal não permite subpáginas.',
@@ -4247,6 +4273,4 @@ Na verdade, expande tudo que está entre chaves duplas.',
 'expand_templates_generate_rawhtml' => 'Mostrar HTML puro',
 'expand_templates_preview' => 'Pré-visualização',
 
-# Unknown messages
-'uploadinvalidxml' => 'O XML no arquivo enviado não pôde ser analisado.',
 );
index 345bcd9..4a332b6 100644 (file)
  * @author Od1n
  * @author Onecountry
  * @author Opraco
+ * @author Orlodrim
  * @author OsamaK
  * @author PhiLiP
  * @author Piangpha
  * @author Verdy p
  * @author Vinhtantran
  * @author Vivaelcelta
+ * @author Vriullop
  * @author Waldir
  * @author Whym
  * @author Yekrats
@@ -220,9 +222,6 @@ Live preview is an experimental feature (unavailable by default) to use edit pre
 'tog-ccmeonemails' => 'Option in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}. {{Gender}}',
 'tog-diffonly' => 'Toggle option used in [[Special:Preferences]]. {{Gender}}',
 'tog-showhiddencats' => 'Toggle option used in [[Special:Preferences]]. {{Gender}}',
-'tog-noconvertlink' => "{{optional}}
-
-''(the message is considered optional because it is only used in wikis with language variants)''",
 'tog-norollbackdiff' => "Option in [[Special:Preferences]], 'Misc' tab. Only shown for users with the rollback right. By default a diff is shown below the return screen of a rollback. Checking this preference toggle will suppress that. {{Gender}}
 {{Identical|Rollback}}",
 'tog-useeditwarning' => 'Used as label for the checkbox in [[Special:Preferences#mw-prefsection-editing|Special:Preferences]].',
@@ -394,8 +393,10 @@ See also:
 Followed by a colon and a list of categories.
 
 Parameters:
-* $1 - number of hidden categories',
-'hidden-category-category' => 'Name of the [[mw:Help:Tracking categories|tracking category]] where hidden categories will be listed.',
+* $1 - number of hidden categories
+{{Identical|Hidden category}}',
+'hidden-category-category' => 'Name of the [[mw:Help:Tracking categories|tracking category]] where hidden categories will be listed.
+{{Identical|Hidden category}}',
 'category-subcat-count' => 'This message is displayed at the top of a category page showing the number of pages in the category.
 
 Parameters:
@@ -657,8 +658,8 @@ See also:
 {{Identical|View}}',
 'toolbox' => 'The title of the toolbox below the search menu.
 {{Identical|Tool}}',
-'userpage' => '',
-'projectpage' => 'Used as link text in Talk page of project page.',
+'userpage' => 'Used in user talk pages as the text of the link to the user page, with the Cologne Blue skin.',
+'projectpage' => 'Used as link text in Talk page of project page with the Cologne Blue skin.',
 'imagepage' => 'Used as link text in Talk page of file page.',
 'mediawikipage' => 'Used as link text in Talk page of MediaWiki message page.',
 'templatepage' => 'Used as link text in Talk page of template page.',
@@ -1578,7 +1579,9 @@ This message is used in html.
 'createacct-another-realname-tip' => "{{doc-singularthey}}
 Used on the account creation form when creating another user's account. Similar to {{msg-mw|prefs-help-realname}}.
 {{Identical|Real name attribution}}",
-'pt-login' => "Shown as the caption of the button at [[Special:UserLogin]], and also to anonymous users in the upper right corner of the page when they can't create an account (otherwise the message {{msg-mw|nav-login-createaccount}} is shown there)
+'pt-login' => "Shown to anonymous users in the upper right corner of the page when they can't create an account (otherwise the message {{msg-mw|nav-login-createaccount}} is shown there).
+{{Identical|Log in}}",
+'pt-login-button' => "Shown as the caption of the button at [[Special:UserLogin]].
 {{Identical|Log in}}",
 'pt-createaccount' => 'Used on the top of the page for logged out users, where it appears next to {{msg-mw|login}}, so consider making them similar.
 {{Identical|Create account}}',
@@ -1642,7 +1645,7 @@ Parameters:
 'resetpass-temp-password' => 'The label of the input box for the temporary password (received by email) on the form displayed after logging in with a temporary password.',
 'resetpass-abort-generic' => 'Generic error message shown on [[Special:ChangePassword]] when an extension aborts a password change from a hook.',
 'resetpass-expired' => "Generic error message shown on [[Special:ChangePassword]] when a user's password is expired",
-'resetpass-expired-soft' => 'Generic marning message shown on [[Special:ChangePassword]] when a user needs to reset their password, but they are not prevented from logging in at this time',
+'resetpass-expired-soft' => 'Generic warning message shown on [[Special:ChangePassword]] when a user needs to reset their password, but they are not prevented from logging in at this time',
 
 # Special:PasswordReset
 'passwordreset' => 'Title of [[Special:PasswordReset]].
@@ -2647,17 +2650,16 @@ See also:
 * {{msg-mw|Revdelete-reason-dropdown|item list for dropdown|notext=1}}
 * {{msg-mw|Revdelete-reasonotherlist|item in dropdown}}
 * {{msg-mw|Revdelete-submit|submit button}}',
-'revdelete-reasonotherlist' => '{{Identical|Other reason}}
-{{RevisionDelete}}
+'revdelete-reasonotherlist' => '{{RevisionDelete}}
 Used as an item in dropdown.
 [[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]
-
 See also:
 * {{msg-mw|Revdelete-legend|legend for the form}}
 * {{msg-mw|Revdelete-log|label for dropdown}}
 * {{msg-mw|Revdelete-reason-dropdown|item list for dropdown|notext=1}}
 * {{msg-mw|Revdelete-otherreason|label for input box}}
-* {{msg-mw|Revdelete-submit|submit button}}',
+* {{msg-mw|Revdelete-submit|submit button}}
+{{Identical|Other reason}}',
 'revdelete-edit-reasonlist' => '{{Identical|Edit delete reasons}}
 {{RevisionDelete}}
 [[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]',
@@ -3682,35 +3684,107 @@ Preceded by legend example {{msg-mw|Recentchanges-legend-plusminus}}.',
 A plus/minus sign with a number for the legend.',
 'rcnotefrom' => 'This message is displayed at [[Special:RecentChanges]] when viewing recentchanges from some specific time.
 
-The corresponding message is {{msg-mw|Rclistfrom}} (without split of date and time, [[bugzilla:19104|Bug 19104]]).
+The corresponding message is {{msg-mw|Rclistfrom}} (split into date and time).
 
 Parameters:
 * $1 - the maximum number of changes that are displayed
 * $2 - a date and time
 * $3 - (Optional) a date
 * $4 - (Optional) a time',
-'rclistfrom' => 'Used on [[Special:RecentChanges]].
-
-Parameters:
-* $1 - a link to the revision of a specific date and time. The date and the time are the link description (without split of date and time, [[bugzilla:19104|Bug 19104]]).
+'rclistfrom' => 'Used on [[Special:RecentChanges]]. Parameters:
+* $1 - (Optional) date and time. The date and the time adds to the rclistfrom description.
+* $2 - time. The time adds to the rclistfrom link description (with split of date and time).
+* $3 - date. The date adds to the rclistfrom link description (with split of date and time).
 
 The corresponding message is {{msg-mw|Rcnotefrom}}.',
 'rcshowhideminor' => 'Option text in [[Special:RecentChanges]]. Parameters:
-* $1 - the "show/hide" command, with the text taken from either {{msg-mw|Show}} or {{msg-mw|Hide}}',
+* $1 - the "show/hide" command, with the text taken from either {{msg-mw|rcshowhideminor-show}} or {{msg-mw|rcshowhideminor-hide}}',
+'rcshowhideminor-show' => '{{doc-actionlink}}
+Option text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideminor}}.
+
+See also:
+* {{msg-mw|rcshowhideminor-hide}}
+{{Identical|Show}}',
+'rcshowhideminor-hide' => '{{doc-actionlink}}
+Option text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideminor}}.
+
+See also:
+* {{msg-mw|rcshowhideminor-show}}
+{{Identical|Hide}}',
 'rcshowhidebots' => 'Option text in [[Special:RecentChanges]]. Parameters:
-* $1 - the "show/hide" command, with the text taken from either {{msg-mw|Show}} or {{msg-mw|Hide}}
+* $1 - the "show/hide" command, with the text taken from either {{msg-mw|rcshowhidebots-show}} or {{msg-mw|rcshowhidebots-hide}}
 {{Identical|$1 bots}}',
+'rcshowhidebots-show' => '{{doc-actionlink}}
+Option text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidebots}}.
+
+See also:
+* {{msg-mw|rcshowhidebots-show}}
+{{Identical|Show}}',
+'rcshowhidebots-hide' => '{{doc-actionlink}}
+Option text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidebots}}.
+
+See also:
+* {{msg-mw|rcshowhidebots-hide}}
+{{Identical|Hide}}',
 'rcshowhideliu' => 'Option text in [[Special:RecentChanges]]. Parameters:
 * $1 - any one of the following messages:
-** {{msg-mw|Show}}
-** {{msg-mw|Hide}}',
+** {{msg-mw|rcshowhideliu-show}}
+** {{msg-mw|rcshowhideliu-hide}}',
+'rcshowhideliu-show' => '{{doc-actionlink}}
+Option text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideliu}}.
+
+See also:
+* {{msg-mw|rcshowhideliu-hide}}
+{{Identical|Show}}',
+'rcshowhideliu-hide' => '{{doc-actionlink}}
+Option text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideliu}}.
+
+See also:
+* {{msg-mw|rcshowhideliu-show}}
+{{Identical|Hide}}',
 'rcshowhideanons' => 'Option text in [[Special:RecentChanges]]. Parameters:
-* $1 - the "show/hide" command, with the text taken from either {{msg-mw|Show}} or {{msg-mw|Hide}}
+* $1 - the "show/hide" command, with the text taken from either {{msg-mw|rcshowhideanons-show}} or {{msg-mw|showhideanons-hide}}
 {{Identical|Anonymous user}}',
+'rcshowhideanons-show' => '{{doc-actionlink}}
+Option text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideanons}}.
+
+See also:
+* {{msg-mw|rcshowhideanons-hide}}
+{{Identical|Hide}}',
+'rcshowhideanons-hide' => '{{doc-actionlink}}
+Option text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideanons}}.
+
+See also:
+* {{msg-mw|rcshowhideanons-show}}
+{{Identical|hide}}',
 'rcshowhidepatr' => 'Option text in [[Special:RecentChanges]]. Parameters:
-* $1 - the "show/hide" command, with the text taken from either {{msg-mw|Show}} or {{msg-mw|Hide}}',
+* $1 - the "show/hide" command, with the text taken from either {{msg-mw|rcshowhidepatr-show}} or {{msg-mw|rcshowhidepatr-hide}}',
+'rcshowhidepatr-show' => '{{doc-actionlink}}
+Option text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidepatr}}.
+
+See also:
+* {{msg-mw|rcshowhidepatr-hide}}
+{{Identical|Show}}',
+'rcshowhidepatr-hide' => '{{doc-actionlink}}
+Option text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidepatr}}.
+
+See also:
+* {{msg-mw|rcshowhidepatr-show}}
+{{Identical|Hide}}',
 'rcshowhidemine' => 'Option text in [[Special:RecentChanges]]. Parameters:
-* $1 - the "show/hide" command, with the text taken from either {{msg-mw|Show}} or {{msg-mw|Hide}}',
+* $1 - the "show/hide" command, with the text taken from either {{msg-mw|rcshowhidemine-show}} or {{msg-mw|rcshowhidemine-hide}}',
+'rcshowhidemine-show' => '{{doc-actionlink}}
+Option text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidemine}}.
+
+See also:
+* {{msg-mw|rcshowhidemine-hide}}
+{{Identical|show}}',
+'rcshowhidemine-hide' => '{{doc-actionlink}}
+Option text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidemine}}.
+
+See also:
+* {{msg-mw|rcshowhidemine-show}}
+{{Identical|hide}}',
 'rclinks' => "Used on [[Special:RecentChanges]].
 * \$1 - a list of different choices with number of pages to be shown.<br />&nbsp;Example: \"''50{{int:pipe-separator}}100{{int:pipe-separator}}250{{int:pipe-separator}}500\".
 * \$2 - a list of clickable links with a number of days for which recent changes are to be displayed.<br />&nbsp;Example: \"''1{{int:pipe-separator}}3{{int:pipe-separator}}7{{int:pipe-separator}}14{{int:pipe-separator}}30''\".
@@ -4142,6 +4216,15 @@ See also:
 * {{msg-mw|zip-wrong-format}}
 * {{msg-mw|uploadjava}}
 * {{msg-mw|uploadvirus}}',
+'uploadscriptednamespace' => 'Used as error message when uploading a file. This error is specific to SVG files, when they include a namespace that has not been whitelisted.
+
+Parameters:
+* $1 - the invalid namespace name
+See also:
+* {{msg-mw|zip-wrong-format}}
+* {{msg-mw|uploadjava}}
+* {{msg-mw|uploadvirus}}',
+'uploadinvalidxml' => 'Error message displayed when the uploaded file contains XML that cannot be properly parsed and checked.',
 'uploadvirus' => 'Error message displayed when uploaded file contains a virus.
 
 Parameters:
@@ -5038,7 +5121,11 @@ See also:
 This refers to expiry timestamp.
 {{Identical|Expire}}',
 'protectedpages-performer' => 'This is a column header in the table on the page [[Special:ProtectedPages]].',
-'protectedpages-params' => 'This is a column header in the table on the page [[Special:ProtectedPages]].',
+'protectedpages-params' => 'This is a column header in the table on the page [[Special:ProtectedPages]].
+
+Protection parameters are:
+* {{msg-mw|Restriction-level-autoconfirmed}}
+* {{msg-mw|Restriction-level-sysop}}',
 'protectedpages-reason' => 'This is a column header in the table on the page [[Special:ProtectedPages]].
 {{Identical|Reason}}',
 'protectedpages-unknown-timestamp' => 'This is shown, when the date and time is unknown for a protection on the page [[Special:ProtectedPages]].
@@ -5847,7 +5934,19 @@ Parameters:
 {{Related|Protect-locked}}',
 'protect-cascadeon' => 'Used in Protection form.
 * $1 - number of cascade source pages',
-'protect-default' => '{{Identical|Default}}',
+'protect-default' => 'Describes the protection state of a page that allows all users to do a certain thing, like editing or moving the page. Example:
+
+<div style="border: 2px dotted gray; padding: .25cm">
+=={{int:Pageinfo-header-restrictions/en}}==
+{| class="wikitable"
+|-
+| {{int:Restriction-edit/en}}
+| {{int:Protect-default/en}}
+|-
+| {{int:Restriction-move/en}}
+| {{int:Protect-level-autoconfirmed/en}}
+|}
+</div>',
 'protect-fallback' => 'This message is used as an option in the protection form on wikis were extra protection levels have been configured.
 
 Parameters:
@@ -6263,9 +6362,19 @@ Anon version:
 * {{msg-mw|Sp-contributions-blocked-notice-anon}}',
 'sp-contributions-blocked-notice-anon' => 'Same as {{msg-mw|Sp-contributions-blocked-notice}} but for anonymous users.',
 'sp-contributions-search' => 'Used on [[Special:Contributions]]',
+'sp-contributions-suppresslog' => 'Used as a display name for a link to log entries of suppressed edits made by that user.
+
+Used as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].
+
+See also {{msg-mw|sp-contributions-deleted}}, {{msg-mw|sp-deletedcontributions-contribs}}, {{msg-mw|contributions}}, {{msg-mw|deletedcontributions-title}}.',
 'sp-contributions-username' => 'This message appears whenever someone requests [[Special:Contributions]].
 {{Identical|IP address or username}}',
-'sp-contributions-toponly' => '"top revision" means the "latest revision"',
+'sp-contributions-toponly' => 'A checkbox at [[Special:Mycontributions|Special:Contributions]]',
+'sp-contributions-newonly' => 'Used as checkbox label at [[Special:Mycontributions|Special:Contributions]].
+
+"page creation" means the "first revision" of a page.
+
+Preceded by {{msg-mw|Sp-contributions-toponly}}.',
 'sp-contributions-submit' => '{{Identical|Search}}',
 'sp-contributions-explain' => '{{optional}}',
 
@@ -8172,7 +8281,8 @@ This message is followed by the total number of times the page has been edited.'
 'pageinfo-magic-words' => 'The list of magic words on the page. Parameters:
 * $1 is the number of magic words on the page.',
 'pageinfo-hidden-categories' => 'The list of hidden categories on the page. Parameters:
-* $1 is the number of hidden categories on the page.',
+* $1 - the number of hidden categories on the page
+{{Identical|Hidden category}}',
 'pageinfo-templates' => 'The list of templates transcluded within the page. Parameters:
 * $1 is the number of templates transcluded within the current page.
 See also:
@@ -8909,12 +9019,14 @@ See also Wikipedia on [[w:Focal_length#In_photography|focal length]].',
 'exif-gpslatituderef' => 'In older versions of mediawiki this referred to if the latitude was North or South. This is no longer used in modern versions of mediawiki except for when using a foreign image repository that is using an older version of mediawiki since the information is now contained in {{msg-mw|exif-gpslatitude}}.
 {{Related|Exif-gpslatitude}}',
 'exif-gpslatitude' => 'The latitude of the location from where the picture was taken from.
-{{Related|Exif-gpslatitude}}',
+{{Related|Exif-gpslatitude}}
+{{Identical|Latitude}}',
 'exif-gpslongituderef' => 'Same as {{msg-mw|exif-gpslatituderef}} but for longitude.
 
 {{Related|Exif-gpslatitude}}',
 'exif-gpslongitude' => 'The longitude of the location from where the picture was taken from.
-{{Related|Exif-gpslatitude}}',
+{{Related|Exif-gpslatitude}}
+{{Identical|Longitude}}',
 'exif-gpsaltituderef' => 'No longer used except for when using foreign image repository with old version of mediawiki. 0 for above sea level, 1 for below sea level.',
 'exif-gpsaltitude' => 'Altitude in meters that the image was taken at.',
 'exif-gpstimestamp' => 'Time (does not include date) that GPS measurement was taken, in UTC. Since often this is at the same time as photo was taken, this is sometimes more reliable than {{msg-mw|exif-datetimeoriginal}}.',
@@ -10747,6 +10859,4 @@ test
 'expand_templates_generate_rawhtml' => 'Used as checkbox label.',
 'expand_templates_preview' => '{{Identical|Preview}}',
 
-# Unknown messages
-'uploadinvalidxml' => 'Error message displayed when the uploaded file contains XML that cannot be properly parsed and checked.',
 );
index f37147d..6844d02 100644 (file)
@@ -300,7 +300,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Huk ruraqkunaman kachasqay e-chaskikunamanta iskaychasqakunata kachamuway',
 'tog-diffonly' => "Huk kaykunap uranpi kaq p'anqap samiqninta ama rikuchiychu",
 'tog-showhiddencats' => 'Pakasqa katiguriyakunata rikuchiy',
-'tog-noconvertlink' => "T'inki suti t'ikrayman ama niy",
 'tog-norollbackdiff' => 'Ruraqpa hukchasqankunata kutichispa ama wakin kayta willaychu',
 'tog-useeditwarning' => "Yuyampaway p'anqata saqiptiy manaraq rurarqusqay hukchasqakunata waqaychaspay.",
 'tog-prefershttps' => "Yaykurqaspaqa hayk'appas takyasqa t'inkiwan llamk'ay",
@@ -1747,6 +1746,7 @@ Kay churkunayki rikcha hunt'a chhikan kayniyuq kaptinqa, chay hunt'atam churkuy,
 'uploaddisabledtext' => 'Willañiqi churkuyqa manam saqillasqachu.',
 'php-uploaddisabledtext' => "PHP-wan willañiqi churkuyqa hark'asqam. Ama hina kaspa, willañiqi churkuy allinkachinakunata llanchiy.",
 'uploadscripted' => "Kay willañiqiqa wakichi icha HTML qillqayuqmi, llika wamp'unaqa pantalla unanchanmanchá.",
+'uploadinvalidxml' => 'Manam atinichu churkusqa willañiqipi XML-ta kuskiyta.',
 'uploadvirus' => 'Willañiqipiqa añawmi! Yuyay: $1',
 'uploadjava' => 'Kay ZIP willañiqiqa Java .class willañiqiyuqmi.
 Java churkuyqa manam saqillasqachu, qasikanapaq saywachasqa kanman karunchana tiyanman.',
@@ -3992,6 +3992,4 @@ Mana chayqa, kay qatiqpi kaq hunt'ana p'anqatam llamk'achiyta atinki. Willapuyni
 'expand_templates_generate_rawhtml' => 'Chawa HTML-ta rikuchiy',
 'expand_templates_preview' => 'Ñawpaqta qhawallay',
 
-# Unknown messages
-'uploadinvalidxml' => 'Manam atinichu churkusqa willañiqipi XML-ta kuskiyta.',
 );
index 3250799..6ddfd10 100644 (file)
@@ -2071,7 +2071,7 @@ Conferma per plaschair che ti ta es conscient da las consequenzas e che ti agesc
 'actioncomplete' => "L' acziun è terminada.",
 'actionfailed' => "L'acziun n'è betg reussida",
 'deletedtext' => '"$1" è vegnì stizzà.
-Sin $2 chattas ti ina glista dals davos artitgels stizzads.',
+En il $2 chattas ti ina glista dals davos artitgels stizzads.',
 'dellogpage' => "Protocol d'eliminaziuns",
 'dellogpagetext' => "Sutvart è ina glista dals elements stizzads l'ultim.",
 'deletionlog' => "protocol d'eliminaziuns",
index 13e0f83..98b45e3 100644 (file)
@@ -334,7 +334,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Doresc să primesc o copie a mesajelor e-mail pe care le trimit',
 'tog-diffonly' => 'Nu arăta conținutul paginii sub dif',
 'tog-showhiddencats' => 'Arată categoriile ascunse',
-'tog-noconvertlink' => 'Dezactivează conversia titlurilor',
 'tog-norollbackdiff' => 'Nu arăta diferența după efectuarea unei reveniri',
 'tog-useeditwarning' => 'Avertizează-mă când părăsesc o pagină fără a salva modificările',
 'tog-prefershttps' => 'Utilizează întotdeauna o conexiune securizată când sunt autentificat(ă)',
@@ -870,7 +869,7 @@ Pentru a finaliza acțiunea de autentificare, trebuie să setați o parolă nou
 'resetpass-temp-password' => 'Parolă temporară:',
 'resetpass-abort-generic' => 'Schimbarea parolei a fost anulată de către o extensie.',
 'resetpass-expired' => 'Parola dumneavoastră a expirat. Alegeți o parolă nouă pentru a vă autentifica.',
-'resetpass-expired-soft' => 'Parola dumneavoastră a expirat și trebuie schimbată. Alegeți o parolă nouă acum sau apăsați Revocare pentru a o reseta mai târziu.',
+'resetpass-expired-soft' => 'Parola dumneavoastră a expirat și trebuie schimbată. Alegeți o parolă nouă acum sau apăsați „{{int:resetpass-submit-cancel}}” pentru a o reseta mai târziu.',
 
 # Special:PasswordReset
 'passwordreset' => 'Resetare parolă',
@@ -1724,14 +1723,26 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 'recentchanges-legend-heading' => "'''Legendă:'''",
 'recentchanges-legend-newpage' => '(vedeți și [[Special:NewPages|lista cu pagini noi]])',
 'recentchanges-legend-plusminus' => "(''±123'')",
-'rcnotefrom' => 'Dedesubt sunt modificările de la <b>$2</b> (maxim <b>$1</b> de modificări sunt afișate - schimbă numărul maxim de linii alegând altă valoare mai jos).',
-'rclistfrom' => 'Se arată modificările începând cu $1',
+'rcnotefrom' => 'Dedesubt sunt modificările începând cu <b>$2</b> (maximum <b>$1</b> afișate).',
+'rclistfrom' => 'Se afișează modificările începând cu $1',
 'rcshowhideminor' => '$1 modificările minore',
+'rcshowhideminor-show' => 'Arată',
+'rcshowhideminor-hide' => 'Ascunde',
 'rcshowhidebots' => '$1 roboții',
+'rcshowhidebots-show' => 'Arată',
+'rcshowhidebots-hide' => 'Ascunde',
 'rcshowhideliu' => '$1 utilizatorii înregistrați',
+'rcshowhideliu-show' => 'Arată',
+'rcshowhideliu-hide' => 'Ascunde',
 'rcshowhideanons' => '$1 utilizatorii anonimi',
+'rcshowhideanons-show' => 'Arată',
+'rcshowhideanons-hide' => 'Ascunde',
 'rcshowhidepatr' => '$1 modificările patrulate',
+'rcshowhidepatr-show' => 'Arată',
+'rcshowhidepatr-hide' => 'Ascunde',
 'rcshowhidemine' => '$1 contribuțiile mele',
+'rcshowhidemine-show' => 'Arată',
+'rcshowhidemine-hide' => 'Ascunde',
 'rclinks' => 'Se arată ultimele $1 modificări din ultimele $2 zile.<br />
 $3',
 'diff' => 'dif',
@@ -1859,6 +1870,8 @@ Ar trebui să contactați pe cineva care poate vizualiza datele suprimate ale fi
 'php-uploaddisabledtext' => 'Încărcarea de fișiere este dezactivată în PHP.
 Vă rugăm să verificați setările din file_uploads.',
 'uploadscripted' => 'Fișierul conține HTML sau cod script care poate fi interpretat în mod eronat de un browser.',
+'uploadscriptednamespace' => 'Acest fișier SVG conține un spațiu de nume „$1” neautorizat.',
+'uploadinvalidxml' => 'Nu s-a putut analiza conținutul XML din fișierul încărcat.',
 'uploadvirus' => 'Fișierul conține un virus! Detalii: $1',
 'uploadjava' => 'Fișierul de față este o arhivă ZIP care conține un fișier de clasă Java.
 Încărcarea fișierelor Java nu este permisă, întrucât pot evita restricțiile de securitate.',
@@ -2686,8 +2699,10 @@ Ultima blocare este indicată mai jos pentru informare:',
 'sp-contributions-blocked-notice-anon' => 'Această adresă IP este blocată acum.
 Iată aici ultima înregistrare relevantă din jurnalul blocărilor:',
 'sp-contributions-search' => 'Căutare contribuții',
+'sp-contributions-suppresslog' => 'contribuții suprimate ale utilizatorului',
 'sp-contributions-username' => 'Adresă IP sau nume de utilizator:',
 'sp-contributions-toponly' => 'Afișează numai versiunile recente',
+'sp-contributions-newonly' => 'Afișează numai modificările care au dus la crearea de pagini',
 'sp-contributions-submit' => 'Căutare',
 
 # What links here
@@ -4208,6 +4223,4 @@ MediaWiki este distribuit în speranța că va fi folositor, dar FĂRĂ VREO GAR
 'expand_templates_generate_rawhtml' => 'Arată HTML brut',
 'expand_templates_preview' => 'Previzualizare',
 
-# Unknown messages
-'uploadinvalidxml' => 'Nu s-a putut analiza conținutul XML din fișierul încărcat.',
 );
index 38255d1..39e4423 100644 (file)
@@ -61,7 +61,6 @@ $messages = array(
 'tog-ccmeonemails' => "Manneme 'na copie de le mail ca je manne a l'ôtre utinde",
 'tog-diffonly' => 'No fà vedè le pàggene cu le condenute sotte a le differenze',
 'tog-showhiddencats' => 'Fa vedè le categorije scunnute',
-'tog-noconvertlink' => "Disabbilite 'a conversione d'u titele de collegamende",
 'tog-norollbackdiff' => "Non sce penzanne a le differenze apprisse l'esecuzione de 'nu rollback",
 'tog-useeditwarning' => "Avvisave quanne jie lasse 'na pàgene cangiate senze ca agghie sarvate le cangiaminde",
 'tog-prefershttps' => "Ause sembre 'na connessione secure quanne trase",
@@ -591,7 +590,7 @@ Ce tu scacchie de metterle, quiste avène ausate pe dà 'u giuste merite a 'a fa
 
 # Change password dialog
 'changepassword' => "Cange 'a password",
-'resetpass_announce' => "Tu tè colleghete cu 'nu codece mannete pe e-mail temboranee.
+'resetpass_announce' => "Tu tè collegate cu 'nu codece mannate pe e-mail temboranèe.
 Pe spiccià 'a procedure de collegamende, tu a 'mbostà 'na password nove aqquà:",
 'resetpass_text' => "<!-- Mitte 'u teste aqquà -->",
 'resetpass_header' => "Cange 'a password d'u cunde utende",
@@ -1461,7 +1460,7 @@ Ce tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
 'recentchanges-label-unpatrolled' => "Stu cangiamende non g'à state angore condrollate",
 'recentchanges-legend-heading' => "'''Leggende:'''",
 'recentchanges-legend-newpage' => "('ndruche pure [[Special:NewPages|elenghe de le pàggene nuève]])",
-'rcnotefrom' => "Sotte stonne le cangiaminde da '''$2''' (fine a '''$1''' mustrete).",
+'rcnotefrom' => "Sotte stonne le cangiaminde da '''$2''' ('nzigne a '''$1''' fatte vedè).",
 'rclistfrom' => 'Fà vedè le urteme cangiaminde partenne da $1',
 'rcshowhideminor' => '$1 cangiaminde stuèdeche',
 'rcshowhidebots' => '$1 bot',
@@ -1600,6 +1599,8 @@ Avissa verificà 'a storie d'a scangellazzione d'u file apprime de condinuà a c
 'php-uploaddisabledtext' => "Le carecaminde de file sonde disabilitate in PHP.<br />
 Pe piacere verifiche le 'mbostaziune d'u ''file_uploads''.",
 'uploadscripted' => "Stu file condene HTML o codece de script ca ponne essere inderpretete jndr'à 'nu mode sbagliete da le browser.",
+'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",
 'uploadjava' => "'U file jè 'nu file de tipe ZIP ca condene 'nu file de classe Java.
 'U carecamende de le file Java non g'è permesse, purcé lore ponne causà l'aggiramende de le restriziune de sicurezze.",
@@ -4174,6 +4175,4 @@ In pratiche tutte quidde ca stè jndr'à le doppie parendesi graffe.<br />",
 'expand_templates_generate_xml' => "Fà vedè l'arvule de l'analisi XML",
 'expand_templates_preview' => 'Andeprime',
 
-# Unknown messages
-'uploadinvalidxml' => "L'XML jndr'à 'u file carecate non ge pò essere analizzate.",
 );
index 626286c..6cb525d 100644 (file)
@@ -479,7 +479,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Отправлять мне копии писем, которые я посылаю другим участникам',
 'tog-diffonly' => 'Не показывать содержание страницы под сравнением двух версий',
 'tog-showhiddencats' => 'Показывать скрытые категории',
-'tog-noconvertlink' => 'Отключить ссылку на преобразование заголовка',
 'tog-norollbackdiff' => 'Не показывать разницу версий после выполнения отката',
 'tog-useeditwarning' => 'Предупреждать, когда я покидаю страницу с несохранёнными изменениями',
 'tog-prefershttps' => 'Всегда использовать защищённое соединение после представления системе',
@@ -1020,7 +1019,7 @@ $2',
 'resetpass-temp-password' => 'Временный пароль:',
 'resetpass-abort-generic' => 'Изменение пароля было прервано расширением.',
 'resetpass-expired' => 'Срок действия вашего пароля истёк. Пожалуйста, установите новый пароль для входа в систему.',
-'resetpass-expired-soft' => 'Срок действия вашего пароля истёк, и теперь он должен быть изменён. Пожалуйста, выберите новый пароль или нажмите «Отменить», чтобы изменить его позже.',
+'resetpass-expired-soft' => 'Срок действия вашего пароля истёк, и теперь он должен быть изменён. Пожалуйста, выберите новый пароль или нажмите «{{int:resetpass-submit-cancel}}», чтобы изменить его позже.',
 
 # Special:PasswordReset
 'passwordreset' => 'Сброс пароля',
@@ -1878,14 +1877,26 @@ $1",
 'recentchanges-legend-heading' => "'''Легенда:'''",
 'recentchanges-legend-newpage' => '(см. также [[Special:NewPages|список новых страниц]])',
 'recentchanges-legend-plusminus' => "(''±123'')",
-'rcnotefrom' => "Ниже перечислены изменения с '''$2''' (не более '''$1''').",
+'rcnotefrom' => 'Ниже перечислены изменения с <strong>$2</strong> (показано не более <strong>$1</strong>).',
 'rclistfrom' => 'Показать изменения с $1.',
 'rcshowhideminor' => '$1 малые правки',
+'rcshowhideminor-show' => 'Показать',
+'rcshowhideminor-hide' => 'Скрыть',
 'rcshowhidebots' => '$1 ботов',
+'rcshowhidebots-show' => 'Показать',
+'rcshowhidebots-hide' => 'Скрыть',
 'rcshowhideliu' => '$1 представившихся участников',
+'rcshowhideliu-show' => 'Показать',
+'rcshowhideliu-hide' => 'Скрыть',
 'rcshowhideanons' => '$1 непредставившихся',
+'rcshowhideanons-show' => 'Показать',
+'rcshowhideanons-hide' => 'Скрыть',
 'rcshowhidepatr' => '$1 проверенные правки',
+'rcshowhidepatr-show' => 'Показать',
+'rcshowhidepatr-hide' => 'Скрыть',
 'rcshowhidemine' => '$1 свои правки',
+'rcshowhidemine-show' => 'Показать',
+'rcshowhidemine-hide' => 'Скрыть',
 'rclinks' => 'Показать последние $1 изменений за $2 дней<br />$3',
 'diff' => 'разн.',
 'hist' => 'история',
@@ -2012,6 +2023,8 @@ $1",
 'uploaddisabledtext' => 'Загрузка файлов отключена.',
 'php-uploaddisabledtext' => 'Загрузка файлов отключена в настройках PHP. Пожалуйста, проверьте значение свойства file_uploads.',
 'uploadscripted' => 'Файл содержит HTML-код или скрипт, который может быть ошибочно обработан браузером.',
+'uploadscriptednamespace' => "Этот SVG-файл содержит некорректное пространство имён '$1'",
+'uploadinvalidxml' => 'XML в загруженном файле не может быть проанализирован.',
 'uploadvirus' => 'Файл содержит вирус! См. $1',
 'uploadjava' => 'Файл представляет собой ZIP-архив, содержащий .class файл Java.
 Загрузка Java-файлов не допускается из-за соображений безопасности.',
@@ -2668,7 +2681,7 @@ $UNWATCHURL
 'delete-warning-toobig' => 'У этой страницы очень длинная история изменений, более $1 {{PLURAL:$1|версии|версий}}.
 Её удаление может привести к нарушению нормальной работы базы данных сайта «{{SITENAME}}»;
 действуйте с осторожностью.',
-'deleting-backlinks-warning' => "'''Предупреждение.''' Другие страницы ссылаются или содержат страницу, которую вы собираетесь удалить.",
+'deleting-backlinks-warning' => "'''Предупреждение.''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Другие страницы]] ссылаются на страницу, которую вы собираетесь удалить или содержат её.",
 
 # Rollback
 'rollback' => 'Откатить изменения',
@@ -2841,8 +2854,10 @@ $1',
 'sp-contributions-blocked-notice-anon' => 'Этот IP-адрес в данный момент заблокирован.
 Ниже приведена последняя запись из журнала блокировок:',
 'sp-contributions-search' => 'Поиск вклада',
+'sp-contributions-suppresslog' => 'удалённый вклад участника',
 'sp-contributions-username' => 'IP-адрес или имя участника:',
 'sp-contributions-toponly' => 'Показывать только правки, являющиеся последними версиями',
+'sp-contributions-newonly' => 'Показывать только правки, являющиеся созданием страниц',
 'sp-contributions-submit' => 'Найти',
 
 # What links here
@@ -3998,10 +4013,10 @@ $5
 
 # Delete conflict
 'deletedwhileediting' => "'''Внимание'''. Эта страница была удалена после того, как вы начали её править!",
-'confirmrecreate' => "{{GENDER:$1|Участник&nbsp;|Участница&nbsp;|}}[[User:$1|$1]] ([[User talk:$1|обс]]) {{GENDER:$1|удалил|удалила}} эту страницу после того, как вы начали её редактировать, по следующей причине:
+'confirmrecreate' => "{{GENDER:$1|Участник|Участница|}}&nbsp;[[User:$1|$1]] ([[User talk:$1|обс]]) {{GENDER:$1|удалил|удалила}} эту страницу после того, как вы начали её редактировать, по следующей причине:
 : ''$2''.
\9fожалÑ\83йÑ\81Ñ\82а, Ð¿Ð¾Ð´Ñ\82веÑ\80диÑ\82е, Ñ\87Ñ\82о Ð²Ñ\8b Ñ\85оÑ\82иÑ\82е Ð²Ð¾Ñ\81Ñ\81Ñ\82ановить эту страницу.",
-'confirmrecreate-noreason' => '{{GENDER:$1|Участник&nbsp;|Участница&nbsp;|}}[[User:$1|$1]] ([[User talk:$1|обс]]) {{GENDER:$1|удалил|удалила}} эту страницу после того, как вы начали её редактировать. Пожалуйста, подтвердите, что вы действительно хотите восстановить эту страницу.',
\9fожалÑ\83йÑ\81Ñ\82а, Ð¿Ð¾Ð´Ñ\82веÑ\80диÑ\82е, Ñ\87Ñ\82о Ð²Ñ\8b Ñ\85оÑ\82иÑ\82е Ð²Ð½Ð¾Ð²Ñ\8c Ñ\81оздать эту страницу.",
+'confirmrecreate-noreason' => '{{GENDER:$1|Участник|Участница|}}&nbsp;[[User:$1|$1]] ([[User talk:$1|обс]]) {{GENDER:$1|удалил|удалила}} эту страницу после того, как вы начали её редактировать. Пожалуйста, подтвердите, что вы действительно хотите вновь создать эту страницу.',
 'recreate' => 'Создать заново',
 
 'unit-pixel' => ' пикс.',
@@ -4471,6 +4486,4 @@ MediaWiki распространяется в надежде, что она бу
 'expand_templates_generate_rawhtml' => 'Показать HTML',
 'expand_templates_preview' => 'Предпросмотр',
 
-# Unknown messages
-'uploadinvalidxml' => 'XML в загруженном файле не может быть проанализирован.',
 );
index 5404ea8..e4bf359 100644 (file)
@@ -512,7 +512,8 @@ $2',
 'invalidtitle-knownnamespace' => 'Непряавилна назва в просторї назв „$2“ і текстом „$3“',
 'invalidtitle-unknownnamespace' => 'Неправилна назва з незнамым чіслом простору назв $1 і текстом „$2“',
 'exception-nologin' => 'Не сьте приголошеный(а)',
-'exception-nologin-text' => 'Гевся сторінка або дїя потребує, жебы сьте были на тотїй вікі приголошены.',
+'exception-nologin-text' => 'Жебы ся дістати но тоту сторінку ся просиме [[Special:Userlogin|приголосьте]].',
+'exception-nologin-text-manual' => 'Жебы ся дістати на тоту сторінку ся мусите $1.',
 
 # Virus scanner
 'virus-badscanner' => "Зла конфіґурація: незнамый антивіровый проґрам: ''$1''",
@@ -562,6 +563,8 @@ $2',
 'userlogin-resetpassword-link' => 'Забыли сьте гесло?',
 'helplogin-url' => 'Help:Приголошіня',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Поміч з приголошованём]]',
+'userlogin-loggedin' => 'Уж сьте {{GENDER:$1|приголошеный|приголошена}} як $1.
+Хоснуйте формулар долов жебы сьте ся приголосили як другый хоснователь.',
 'userlogin-createanother' => 'Створити інше конто',
 'createacct-join' => 'Ниже уведьте вашы інформації',
 'createacct-another-join' => 'Ниже уведьте інформації нового конта',
@@ -628,8 +631,8 @@ $2',
 Жебы ся то не зловжывало та гесло може быти заслане лем раз за $1 {{PLURAL:$1|годину|годины|годин}}.',
 'mailerror' => 'Хыба засыланя ел. пошты: $1',
 'acct_creation_throttle_hit' => 'Хоснователї приходячі з вашой IP адресы уж днесь створили {{PLURAL:$1|конто|конта|конт}}, што є дозволене максімум. Зато теперь не є дозволено з той IP адресы закладати далшы конта.',
-'emailauthenticated' => 'Ð\90дÑ\80еÑ\81а Ð²Ð°Ñ\88ой ÐµÐ». Ð¿Ð¾Ñ\88Ñ\82Ñ\8b Ð±Ñ\8bла Ð¾Ð²Ñ\96Ñ\80ена Ð´Ð½Ñ\8f $2 о $3.',
-'emailnotauthenticated' => 'Ð\90дÑ\80еÑ\81а Ð²Ð°Ñ\88ой ÐµÐ». Ð¿Ð¾Ñ\88Ñ\82Ñ\8b Ð´Ð¾Ñ\82епеÑ\80Ñ\8c Ð½Ðµ Ð±Ñ\8bла Ð¾Ð²Ñ\96Ñ\80ена, Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 ÐµÐ». Ð¿Ð¾Ñ\88Ñ\82Ñ\8b Ñ\81Ñ\83Ñ\82Ñ\8c Ð½ÐµÐ´Ð¾Ñ\81Ñ\82Ñ\83пны.',
+'emailauthenticated' => 'Ð\90дÑ\80еÑ\81а Ð²Ð°Ñ\88ой ÐµÐ». Ð¿Ð¾Ñ\88Ñ\82Ñ\8b Ð±Ñ\8bла Ð¿Ð¾Ñ\82веÑ\80джнена $2 о $3.',
+'emailnotauthenticated' => 'Ð\90дÑ\80еÑ\81а Ð²Ð°Ñ\88ой ÐµÐ». Ð¿Ð¾Ñ\88Ñ\82Ñ\8b Ð´Ð¾Ñ\82епеÑ\80Ñ\8c Ð½Ðµ Ð±Ñ\8bла Ð¿Ð¾Ñ\82веÑ\80ждена. Ð£ Ð½Ð°Ñ\81Ñ\82Ñ\83пнÑ\8bÑ\85 Ñ\84Ñ\83нкÑ\86Ñ\96й Ð½Ðµ Ð±Ñ\83дÑ\83Ñ\82Ñ\8c Ð¿Ð¾Ñ\81Ñ\8bланÑ\8b Ð¶Ð°Ð´Ð½Ñ\8b Ð¼ÐµÐ¹Ð»ы.',
 'noemailprefs' => 'Шпеціфікуйте адресу ел. пошты, жебы наслїднуючі можности могли фунґовати.',
 'emailconfirmlink' => 'Потвердьте свою адресу ел. пошты',
 'invalidemailaddress' => 'Уведена адреса ел. пошты не може быти прията, бо она не має правилный формат.
@@ -650,6 +653,9 @@ $2',
 'suspicious-userlogout' => 'Ваша пожадавка на одголошіня была одвергнута, бо вызерає то так, же была послана розбитым переглядачом або кешуючім проксі-сервером.',
 'createacct-another-realname-tip' => 'Правдиве імя є волительне.
 Кідь вы зволите го додати, тото буде пак хосноване на доданя участникового попису про ёго роботу.',
+'pt-login' => 'Приголошіня',
+'pt-createaccount' => 'Створити конто',
+'pt-userlogout' => 'Одголосити ся',
 
 # Email sending
 'php-mail-error-unknown' => 'Незнама хыба у PHP mail() функції',
@@ -658,21 +664,27 @@ $2',
 
 # Change password dialog
 'changepassword' => 'Змінити гесло',
-'resetpass_announce' => 'Ð\9fÑ\80иголоÑ\88Ñ\83Ñ\94Ñ\82е Ñ\81Ñ\8f Ð´Ð¾Ñ\87аÑ\81нÑ\8bм Ð³ÐµÑ\81лом, ÐºÐ¾Ñ\82Ñ\80е Ð±Ñ\8bло Ð¿Ð¾Ñ\81лане ÐµÐ»ÐµÐºÑ\82Ñ\80онÑ\96Ñ\87нов Ð¿Ð¾Ñ\88Ñ\82ов. Ð\9fÑ\80о Ð·Ð°ÐºÐ¾Ð½Ñ\87Ñ\96нÑ\8f Ð¿Ñ\80иголоÑ\88Ñ\96нÑ\8f Ñ\82Ñ\80еба Ð·Ð°Ð´Ð°Ñ\82и Ð½Ð¾Ð²Ðµ Ð³ÐµÑ\81ло Ñ\82Ñ\83:',
+'resetpass_announce' => 'Ð\96ебÑ\8b Ñ\81Ñ\8cÑ\82е Ð·Ð°Ð²ÐµÑ\80Ñ\88Ñ\8bли Ð¿Ñ\80иголоÑ\88Ñ\96нÑ\8f, Ð¼Ñ\83Ñ\81иÑ\82е Ñ\81обÑ\96 Ð½Ð°Ñ\81Ñ\82авиÑ\82и Ð½Ð¾Ð²Ðµ Ð³ÐµÑ\81ло.',
 'resetpass_header' => 'Зміна гесла',
 'oldpassword' => 'Старе гесло:',
 'newpassword' => 'Нове гесло:',
 'retypenew' => 'Напиште знову нове гесло:',
 'resetpass_submit' => 'Наставити гесло і приголосити ся',
 'changepassword-success' => 'Ваше гесло было успішно змінено!',
+'changepassword-throttled' => 'Зробили сьте дуже много спроб о приголошіня.
+Просиме Вас, почекайте $1 перед далшов спробов.',
 'resetpass_forbidden' => 'Гесла не є можне змінити',
 'resetpass-no-info' => 'Ку тій сторінцї мають прямый приступ лем приголошены хоснователї.',
 'resetpass-submit-loggedin' => 'Змінити гесло',
 'resetpass-submit-cancel' => 'Сторно',
 'resetpass-wrong-oldpass' => 'Неправилне дочасне або актуалне гесло.
 Може сьте собі уж гесло успішно змінили, або сьте выжадали нове дочасне гесло.',
+'resetpass-recycled' => 'Нове гесло собі дайте дашто друге як ваше теперїшнє гесло.',
+'resetpass-temp-emailed' => 'Приголошуєте ся дочасным геслом засланым імейлом.
+Жебы сьте завершыли приголошіня, гев сові наставте нове гесло:',
 'resetpass-temp-password' => 'Дочасне гесло:',
 'resetpass-abort-generic' => 'Зміна гесла заблокована была росшырїнём.',
+'resetpass-expired' => 'Платность вашого гесла скінчіла. На приголошіня собі наставте нове гесло.',
 
 # Special:PasswordReset
 'passwordreset' => 'Ресет гесла',
@@ -719,6 +731,8 @@ $2
 'changeemail-password' => 'Ваше гесло на портал {{SITENAME}}:',
 'changeemail-submit' => 'Змінити імейл',
 'changeemail-cancel' => 'Сторно',
+'changeemail-throttled' => 'Зробили сьте дуже много спроб о приголошіня.
+Просиме Вас, почекайте $1 перед далшов спробов.',
 
 # Special:ResetTokens
 'resettokens' => 'Реініціалізація клічів',
@@ -1155,7 +1169,7 @@ $1",
 'shown-title' => 'Вказати $1 {{PLURAL:$1|резултат|резултаты|резултатів}} на сторінку',
 'viewprevnext' => 'Перегляднути ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''У тій вікі є сторінка з назвов «[[:$1]]»'''",
-'searchmenu-new' => "'''Створити сторінку «[[:$1]]» у тій вікі!'''",
+'searchmenu-new' => '<strong>Створити сторінку на тій вікі „[[:$1]]“!</strong> {{PLURAL:$2|0=|Тыж собі посмотьте сторінку найдену вашым гляданём.|Тыж посмотьте сторінкы найдены вашым гляданём.}}',
 'searchprofile-articles' => 'Статї',
 'searchprofile-project' => 'Сторінкы помочі і проєкту',
 'searchprofile-images' => 'Мултімедія',
@@ -1491,15 +1505,28 @@ $1",
 'recentchanges-label-minor' => 'Тото є мала зміна',
 'recentchanges-label-bot' => 'Тото едітованя зроблене ботом',
 'recentchanges-label-unpatrolled' => 'Тота зміна дотеперь не была патролёвана.',
+'recentchanges-legend-heading' => "'''Леґенда:'''",
 'recentchanges-legend-newpage' => '$1 — нова сторінка',
-'rcnotefrom' => 'Ð\9dиже {{PLURAL:$1|Ñ\94\81Ñ\83Ñ\82Ñ\8c\94}} Ð½Ð°Ð¹Ð²ÐµÑ\86е <b>$1</b> {{PLURAL:$1|змÑ\96на|змÑ\96нÑ\8b|змÑ\96н}} Ð¾Ð´ <b>$2</b>.',
+'rcnotefrom' => 'Ð\94олов Ñ\81Ñ\83Ñ\82Ñ\8c Ð²ÐºÐ°Ð·Ð°Ð½Ñ\8b Ð·Ð¼Ñ\96нÑ\8b Ð¾Ð´ <strong>$2</strong> (до <strong>$1</strong>).',
 'rclistfrom' => 'Вказати едітованя почінаючі з $1.',
 'rcshowhideminor' => '$1 маленькы едітованя',
+'rcshowhideminor-show' => 'Вказати',
+'rcshowhideminor-hide' => 'Сховати',
 'rcshowhidebots' => '$1 ботів',
-'rcshowhideliu' => '$1 приголошеных',
+'rcshowhidebots-show' => 'Вказати',
+'rcshowhidebots-hide' => 'Сховати',
+'rcshowhideliu' => '$1 реґістрованых хоснователїв',
+'rcshowhideliu-show' => 'Вказати',
+'rcshowhideliu-hide' => 'Сховати',
 'rcshowhideanons' => '$1 анонімів',
+'rcshowhideanons-show' => 'Вказати',
+'rcshowhideanons-hide' => 'Сховати',
 'rcshowhidepatr' => '$1 перевірене едітованя',
+'rcshowhidepatr-show' => 'Вказати',
+'rcshowhidepatr-hide' => 'Сховати',
 'rcshowhidemine' => '$1 мої едітованя',
+'rcshowhidemine-show' => 'Вказати',
+'rcshowhidemine-hide' => 'Сховати',
 'rclinks' => 'Вказати послїднї $1 зміны за $2 днїв<br />$3',
 'diff' => 'різн.',
 'hist' => 'історія',
@@ -1969,6 +1996,11 @@ $1',
 'protectedpages-indef' => 'Лем замкы на нестановлено',
 'protectedpages-cascade' => 'Лем каскадовы замкы',
 'protectedpagesempty' => 'Жадна сторінка не є замкнута з тыма параметрами.',
+'protectedpages-timestamp' => 'Часова значка',
+'protectedpages-expiry' => 'Кінчіть',
+'protectedpages-reason' => 'Прічіна',
+'protectedpages-unknown-timestamp' => 'Не є знаме',
+'protectedpages-unknown-performer' => 'Незнамый хоснователь',
 'protectedtitles' => 'Замкнуты назвы сторінок',
 'protectedtitlesempty' => 'Жадна назва не є замкнута з тыма параметрами.',
 'listusers' => 'Список хоснователїв',
@@ -2388,7 +2420,7 @@ $1',
 'contributions' => 'Приспівкы {{GENDER:$1|хоснователя|хоснователькы}}',
 'contributions-title' => 'Приспівок хоснователя $1',
 'mycontris' => 'Приспівкы',
-'contribsub2' => 'Приспівок $1 ($2)',
+'contribsub2' => '{{GENDER:$3|хоснователї|хоснователькы}} $1 ($2)',
 'nocontribs' => 'Ненайджены жадны зміны за тыма крітеріями.',
 'uctop' => '(остатня)',
 'month' => 'Од місяця (і скоре):',
@@ -2698,6 +2730,7 @@ $1',
 'allmessages-prefix' => 'Філтер за префіксом:',
 'allmessages-language' => 'Язык:',
 'allmessages-filter-submit' => 'Выконати',
+'allmessages-filter-translate' => 'Переложыти',
 
 # Thumbnails
 'thumbnail-more' => 'Звекшыти',
@@ -2967,7 +3000,7 @@ $1',
 'svg-long-desc' => 'SVG-файл, номінално $1 × $2 пікселів, розмір файлу: $3',
 'svg-long-desc-animated' => 'Анімованый SVG-файл, номінално $1 × $2 пікселів, розмір файлу: $3',
 'svg-long-error' => 'Неправильный файл SVG: $1',
-'show-big-image' => 'Ð\9fовне Ñ\80озлиÑ\88Ñ\96нÑ\8f',
+'show-big-image' => 'Ð\9eÑ\80Ñ\96Ò\91Ñ\96налнÑ\8bй Ñ\84айл',
 'show-big-image-preview' => 'Розмір того нагляду: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Інше|іншы}} розлишіня: $1.',
 'show-big-image-size' => '$1 × $2 пікселів',
index ae3e444..ef1ed10 100644 (file)
@@ -18,6 +18,7 @@
  * @author Krinkle
  * @author Mahitgar
  * @author Naveen Sankar
+ * @author NehalDaveND
  * @author Omnipaedista
  * @author Shantanoo
  * @author Shijualex
@@ -344,18 +345,18 @@ $messages = array(
 'thu' => 'गुरुः',
 'fri' => 'शुक्रः',
 'sat' => 'शनिः',
-'january' => 'à¤\9cनà¥\81वरि',
-'february' => 'फ़à¥\87बà¥\8dरà¥\81वरि',
-'march' => 'मार्च',
-'april' => 'à¤\8fपà¥\8dरिलà¥\8d',
-'may_long' => 'मà¥\87यà¥\8d',
-'june' => 'जून',
-'july' => 'à¤\9cà¥\82लयà¥\8d',
-'august' => 'à¤\93à¤\97सà¥\8dà¤\9fà¥\8d',
-'september' => 'सपà¥\8dतमà¥\8dबरà¥\8d',
-'october' => 'à¤\85षà¥\8dà¤\9fà¥\8bबरà¥\8d',
-'november' => 'नवम्बर',
-'december' => 'दशमà¥\8dबरà¥\8d',
+'january' => 'à¤\9cनवरà¥\80',
+'february' => 'फरवरà¥\80',
+'march' => 'मार्च',
+'april' => 'à¤\85पà¥\8dरà¥\88ल',
+'may_long' => 'मà¤\88',
+'june' => 'जून',
+'july' => 'à¤\9cà¥\81लाà¤\88',
+'august' => 'à¤\85à¤\97सà¥\8dत',
+'september' => 'सितमà¥\8dबर',
+'october' => 'à¤\85à¤\95à¥\8dतà¥\82बर',
+'november' => 'नवम्बर',
+'december' => 'दिसमà¥\8dबर',
 'january-gen' => 'जनुवरि',
 'february-gen' => 'फे़ब्रुवरि',
 'march-gen' => 'मार्च्',
@@ -368,21 +369,21 @@ $messages = array(
 'october-gen' => 'अष्टोबर्',
 'november-gen' => 'नवम्बर्',
 'december-gen' => 'दशम्बर्',
-'jan' => 'à¤\9cनà¥\81॰',
-'feb' => 'फ़à¥\87बà¥\8dरà¥\81॰',
-'mar' => 'मार्च',
-'apr' => 'à¤\8fपà¥\8dरि॰',
-'may' => 'मेय्',
-'jun' => 'जून',
-'jul' => 'à¤\9cà¥\82लयà¥\8d',
-'aug' => 'ओग',
-'sep' => 'सपà¥\8dतà¤\82॰',
-'oct' => 'à¤\85षà¥\8dà¤\9fà¥\8b॰',
-'nov' => 'नवà¤\82॰',
-'dec' => 'दशà¤\82॰',
+'jan' => 'à¤\9cà¥\87न.',
+'feb' => 'फà¥\87ब.',
+'mar' => 'मार्च.',
+'apr' => 'एप्र॰',
+'may' => 'मे',
+'jun' => 'जून',
+'jul' => 'à¤\9cà¥\81ल.',
+'aug' => 'ओग.',
+'sep' => 'सà¥\87पà¥\8d.',
+'oct' => 'à¤\93à¤\95à¥\8dà¤\9fà¥\8b.',
+'nov' => 'नवà¥\87.',
+'dec' => 'डिस.',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|वर्गः|वर्गाः }}',
+'pagecategories' => '{{PLURAL:$1|वर्गः|वर्गाः}}',
 'category_header' => '"$1" इत्येतस्मिन् वर्गे विद्यमानानि पृष्ठानि',
 'subcategories' => 'उपवर्गाः',
 'category-media-header' => '"$1" इत्येतस्मिन् वर्गे माध्यमाम्',
@@ -409,7 +410,7 @@ The following {{PLURAL:$1|file is|$1 files are}} in the current category.',
 'mypage' => 'मम पृष्ठम्',
 'mytalk' => 'मम सम्भाषणम्',
 'anontalk' => 'अस्य आइ.पी. संकेतस्य कृते सम्भाषणम्',
-'navigation' => 'परà¥\8dयà¤\9fनम्',
+'navigation' => 'सà¤\9eà¥\8dà¤\9aरणम्',
 'and' => '&#32;तथा च',
 
 # Cologne Blue skin
@@ -430,17 +431,17 @@ The following {{PLURAL:$1|file is|$1 files are}} in the current category.',
 'vector-action-unprotect' => 'सुरक्षितीकरणस्य निरसनम्',
 'vector-view-create' => 'सृज्यताम्',
 'vector-view-edit' => 'सम्पाद्यताम्',
-'vector-view-history' => 'à¤\87तिहासà¤\83 à¤¦à¥\83श्यताम्',
+'vector-view-history' => 'à¤\87तिहासà¤\83 à¤¦à¤°à¥\8dश्यताम्',
 'vector-view-view' => 'पठ्यताम्',
 'vector-view-viewsource' => 'स्रोतः दृश्यताम्',
 'actions' => 'क्रियाः',
-'namespaces' => 'नामाà¤\95ाशानि',
-'variants' => 'भिनà¥\8dनरà¥\82पाणि',
+'namespaces' => 'नामाà¤\95ाशà¤\83',
+'variants' => 'पाठभà¥\87दà¤\83',
 
 'navigation-heading' => 'मार्गणसूचिः',
 'errorpagetitle' => 'दोषः',
 'returnto' => '$1 इत्येतद् प्रति निवर्तताम्।',
-'tagline' => '{{SITENAME}} à¤\87तà¥\8dयसà¥\8dमातà¥\8d',
+'tagline' => '{{SITENAME}} à¤¤à¤\83',
 'help' => 'साहाय्यम्',
 'search' => 'अन्विष्यताम्',
 'searchbutton' => 'अन्विष्यताम्',
@@ -449,8 +450,8 @@ The following {{PLURAL:$1|file is|$1 files are}} in the current category.',
 'history' => 'पृष्ठस्य इतिहासः',
 'history_short' => 'इतिहासः',
 'updatedmarker' => 'मम पौर्विक-आगमन-पश्चात् परिवर्तितानि',
-'printableversion' => 'मà¥\81दà¥\8dरणयà¥\8bà¤\97à¥\8dया à¤\86वà¥\83तà¥\8dतिà¤\83',
-'permalink' => 'सà¥\8dथिरसमà¥\8dपरà¥\8dà¤\95तनà¥\8dतà¥\81ः',
+'printableversion' => 'मà¥\81दà¥\8dरणयà¥\8bà¤\97à¥\8dयà¤\82 à¤¸à¤\82सà¥\8dà¤\95रणमà¥\8d',
+'permalink' => 'सà¥\8dथायिपरिसनà¥\8dधिः',
 'print' => 'मुद्र्यताम्',
 'view' => 'दृश्यताम्',
 'edit' => 'सम्पाद्यताम्',
@@ -470,12 +471,12 @@ The following {{PLURAL:$1|file is|$1 files are}} in the current category.',
 'talkpage' => 'अस्य पृष्ठस्य विषये चर्चा क्रियताम्',
 'talkpagelinktext' => 'सम्भाषणम्',
 'specialpage' => 'विशेषपृष्ठम्',
-'personaltools' => 'वà¥\88यà¤\95à¥\8dतिà¤\95à¥\8bपà¤\95रणानि',
+'personaltools' => 'वà¥\88यà¤\95à¥\8dतिà¤\95साधनानि',
 'postcomment' => 'नवीनः विभागः',
 'articlepage' => 'लेखः दृश्यताम्',
 'talk' => 'सम्भाषणम्',
-'views' => 'दà¥\83शà¥\8dयानि',
-'toolbox' => 'à¤\89पà¤\95रणपà¥\87à¤\9fिका',
+'views' => 'मतानि',
+'toolbox' => 'साधनशलाका',
 'userpage' => 'योजकपृष्ठं दृश्यताम्',
 'projectpage' => 'प्रकल्पपृष्ठं दृश्यताम्',
 'imagepage' => 'सञ्चिकापृष्ठं दृश्यताम्',
@@ -487,11 +488,11 @@ The following {{PLURAL:$1|file is|$1 files are}} in the current category.',
 'otherlanguages' => 'अन्यासु भाषासु',
 'redirectedfrom' => '($1 इत्यस्मात् पुनर्निर्दिष्टम्)',
 'redirectpagesub' => 'अनुप्रेषण-पृष्ठम्',
-'lastmodifiedat' => 'एतस्य पृष्ठस्य अन्तिमपरिवर्तनं $1 दिनाङ्के $2 समये कृतम्',
+'lastmodifiedat' => '$1 (तमे) दिनाङ्के अन्तिमसम्पादनं $2 समये अभवत्',
 'viewcount' => 'एतत्पृष्ठं {{PLURAL:$1|एक वारं|$1 वारं}} दृष्टम् अस्ति',
 'protectedpage' => 'संरक्षितपृष्ठम्',
-'jumpto' => 'à¤\97मà¥\8dयतामà¥\8d à¤\85तà¥\8dर :',
-'jumptonavigation' => 'परà¥\8dयà¤\9fनमà¥\8d',
+'jumpto' => 'à¤\85तà¥\8dर à¤\97मà¥\8dयतामà¥\8d :',
+'jumptonavigation' => 'सà¤\9eà¥\8dà¤\9aरणà¤\82',
 'jumptosearch' => 'अन्वेषणम्',
 'view-pool-error' => 'भोः, अधुना वितारकः अतिभाराक्रान्तः ।
 बहवः योजकाः एतत् पृष्ठं द्रष्टुं प्रयतमानाः सन्ति ।
@@ -502,23 +503,23 @@ $1',
 'pool-errorunknown' => 'अज्ञाता त्रुटिः',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
-'aboutsite' => '{{SITENAME}} à¤\87तà¥\8dयसà¥\8dय à¤µà¤¿à¤·à¤¯à¥\87',
-'aboutpage' => 'Project:à¤\8fतदà¥\8dविषयà¤\95मà¥\8d',
+'aboutsite' => '{{SITENAME}} à¤µà¤¿à¤·à¤¯à¤\95à¤\82',
+'aboutpage' => 'Project:विषयकम्',
 'copyright' => 'अस्य घटकानि $1 इत्यस्यान्तर्गतानि उपलब्धानि।',
 'copyrightpage' => '{{ns:project}}:प्रतिलिप्यधिकाराः',
-'currentevents' => 'सदà¥\8dयà¤\83à¤\95ालà¥\80नवार्ताः',
-'currentevents-url' => 'Project:सदà¥\8dयà¤\83à¤\95ालà¥\80नवार्ताः',
-'disclaimers' => 'पà¥\8dरतà¥\8dयाà¤\96à¥\8dयानमà¥\8d',
-'disclaimerpage' => 'Project:साधारणà¤\82 à¤ªà¥\8dरतà¥\8dयाà¤\96à¥\8dयानम्',
+'currentevents' => 'वरà¥\8dतमानवार्ताः',
+'currentevents-url' => 'Project:वरà¥\8dतमानवार्ताः',
+'disclaimers' => 'à¤\85सà¥\8dवà¥\80à¤\95ारà¤\83',
+'disclaimerpage' => 'Project:सामानà¥\8dयाऽसà¥\8dवà¥\80à¤\95रणम्',
 'edithelp' => 'सम्पादनार्थं सहाय्यम्',
-'helppage' => 'Help:à¤\86नà¥\8dतरà¥\8dयमà¥\8d',
+'helppage' => 'Help:à¤\85नà¥\8dतरà¥\8dवसà¥\8dतà¥\81',
 'mainpage' => 'मुख्यपृष्ठम्',
 'mainpage-description' => 'मुख्यपृष्ठम्',
 'policy-url' => 'Project:नीतिः',
 'portal' => 'समुदायद्वारम्',
 'portal-url' => 'Project:समुदायद्वारम्',
-'privacy' => 'निभà¥\83ततानीतिः',
-'privacypage' => 'Project:निभà¥\83ततानीतिः',
+'privacy' => 'à¤\97à¥\8bपनà¥\80यतानीतिः',
+'privacypage' => 'Project:à¤\97à¥\8bपनà¥\80यतानीतिः',
 
 'badaccess' => 'अनुज्ञा-प्रमादः',
 'badaccess-group0' => 'भवदर्थम्, अत्र प्रार्थितक्रियायाः प्रवर्तनं न अनुमतम्।',
@@ -529,7 +530,7 @@ $1',
 
 'ok' => 'अस्तु',
 'pagetitle' => '$1 - {{SITENAME}}',
-'retrievedfrom' => '"$1" à¤\87तà¥\8dयसà¥\8dमादà¥\8d à¤\89दà¥\8dधà¥\83तमà¥\8d',
+'retrievedfrom' => '"$1" à¤\87तà¥\8dयसà¥\8dमादà¥\8d à¤ªà¥\81नà¤\83 à¤ªà¥\8dरापà¥\8dतिà¤\83',
 'youhavenewmessages' => 'भवदर्थम् $1 सन्ति। ($2).',
 'youhavenewmessagesfromusers' => 'भवदर्थम् {{PLURAL:$3|अन्यस्मात् सदस्यात्|$3 सदस्येभ्यः}} $1 अस्ति ($2)।',
 'youhavenewmessagesmanyusers' => 'नैकेभ्यः योजकेभ्यः ते $1 सन्ति $2 ।',
@@ -541,7 +542,7 @@ $1',
 'viewsourceold' => 'स्रोतः दृश्यताम्',
 'editlink' => 'सम्पाद्यताम्',
 'viewsourcelink' => 'स्रोतः दृश्यताम्',
-'editsectionhint' => 'à¤\85यà¤\82 à¤µà¤¿à¤­à¤¾à¤\97à¤\83 à¤¸à¤®à¥\8dपादà¥\8dयतामà¥\8d: $1',
+'editsectionhint' => 'समà¥\8dपादनविभाà¤\97à¤\83: $1',
 'toc' => 'अन्तर्विषयाः',
 'showtoc' => 'दर्श्यताम्',
 'hidetoc' => 'गोप्यताम्',
@@ -557,7 +558,7 @@ $1',
 'site-atom-feed' => '$1 अणुपूरणम्',
 'page-rss-feed' => '"$1" आरएसएस-पूरणम्',
 'page-atom-feed' => '"$1" अणुपूरणम्',
-'red-link-title' => '$1 (पà¥\83षà¥\8dठमà¥\8d à¤\87दानà¥\80à¤\82 à¤¯à¤¾à¤µà¤¤à¥\8d à¤¨ à¤°à¤\9aितमà¥\8d)',
+'red-link-title' => '$1 (पà¥\83षà¥\8dठà¤\82 à¤¨ à¤µà¤¿à¤¦à¥\8dयतà¥\87)',
 'sort-descending' => 'अवरोहिक्रमेण सज्जयतु',
 'sort-ascending' => 'आरोहिक्रमेण सज्जयतु',
 
@@ -590,10 +591,11 @@ $1',
 'enterlockreason' => 'तन्त्रितीकरणस्य कारणं ददातु, अपि च आकलितं ददातु यत् तन्त्रणं कदा उद्घाट्यिष्यते।',
 'readonlytext' => 'समंकाधारं वर्तमानकाले तन्त्रितमस्ति नूतनान् प्रविष्टीन् विरुध्य तथा च अन्यानि परिवर्तनानि विरुध्य। इदं नियमिततया समंकाधार परिचर्याऽर्थं तथा स्यात्। तत्पश्चादिदं सामान्यतां संप्राप्स्यति।
 तन्त्रितीकारकेन प्रबन्धकेन इदं कारणं प्रदत्तम्: $1',
-'missing-article' => 'त्ताधारेण(डाटाबेस् इत्यनेन) "$1" $2 इतिनामकं प्राप्तव्यं यत् पृष्ठं तत् नैव प्राप्तम्।
-प्रायः कालातीतस्य अथवा अपाकृतस्य इतिहाससम्पर्कतन्तोः कारणेन एवं भवति।
-यदि नैवं तर्हि भवता तन्त्रांशकीटकं प्राप्तं स्यात्।
-कृपया कोऽपि [[Special:ListUsers/sysop|administrator]]अस्य पृष्ठस्य सङ्केतज्ञापनपूर्वकं सूच्यताम्।',
+'missing-article' => 'दत्तनिधौ (in database) $2 अन्तः कुत्रापि "$1" न प्राप्तम् ।
+
+प्रायः अपाकृतस्य पृष्ठस्य इतिहासदर्शनस्य चेष्टाकाले एवं भवति ।
+
+तादृशी स्थितिः यदि नास्ति, तर्हि तन्त्रांशे वद्यमाना त्रुटिः भवेत् । कृपया कमपि [[Special:ListUsers/sysop|प्रबन्धकम्]] अस्य पृष्ठस्य सार्वसङ्केतं (U.R.L.) सूच्यताम् ।',
 'missingarticle-rev' => '(आवृत्तिः# :$1)',
 'missingarticle-diff' => '(व्यतिरेक: $1, $2)',
 'readonly_lag' => 'मुख्य-समंकाधार-परिवेशकं उपमुख्य-समंकाधार-परिवेशकस्य संप्रापणात् पूर्वे एव स्वतः तन्त्रितम् अस्ति।',
@@ -671,7 +673,7 @@ $2',
 'password-change-forbidden' => 'अस्यां विक्यां निकुञ्चं परिवर्तयितुं न शक्नोति ।',
 'externaldberror' => 'तत्र प्रमाणीकरण समंकाधारे त्रुटिर्जाता, अथवा भवान् स्वकीयां बाह्य-लेखां अद्यतनीकर्तुं अनुमतिं न धारयति।',
 'login' => 'प्रविश्यताम्',
-'nav-login-createaccount' => 'प्रविश्यताम्/ सदस्यता प्राप्यताम्',
+'nav-login-createaccount' => 'प्रविश्यताम् / सदस्यता प्राप्यताम्',
 'loginprompt' => '{{SITENAME}} इत्यत्र प्रवेष्टुं कुकी इत्येते (cookies)  समर्थीकरणीयानि।',
 'userlogin' => 'प्रविश्यताम्/ सदस्यता प्राप्यताम्',
 'userloginnocreate' => 'प्रविश्यताम्',
@@ -1016,6 +1018,7 @@ $2
 प्रतीयते यदिदं अपाकृतमस्ति।',
 'edit-conflict' => 'सम्पादनयोः/सम्पादनानां अन्तर्विरोधः।',
 'edit-no-change' => 'भवतः सम्पादनम् उपेक्षितम्, यतो हि भवता पाठे न किमपि परिवर्तनं कृतम्।',
+'postedit-confirmation' => 'सम्पादनं रक्षितम् ।',
 'edit-already-exists' => 'नूतनं पृष्ठं स्रष्टुं नापारयत्।
 इदं पूर्वे एव विद्यते।',
 'defaultmessagetext' => 'सन्देशपाठं स्थिरयतु ।',
@@ -1068,7 +1071,7 @@ $2
 'nohistory' => 'अस्य पृष्ठस्य कृते पृष्ठेतिहासः न वर्तते।',
 'currentrev' => 'सद्यःकालीना आवृत्तिः',
 'currentrev-asof' => 'वर्तमाना आवृत्तिः $1 इति समये',
-'revisionasof' => '$1 à¤\87तà¥\8dयसà¥\8dय à¤\86वà¥\83तà¥\8dतिà¤\83',
+'revisionasof' => '$1 à¤\87तà¥\8dयसà¥\8dय à¤¸à¤\82सà¥\8dà¤\95रणà¤\82',
 'revision-info' => '$1इति समयस्य आवृत्तिः $2 इत्यनेन',
 'previousrevision' => '← पुरातनानि संस्करणानि',
 'nextrevision' => 'नूतनतरा आवृत्तिः →',
@@ -1209,17 +1212,17 @@ You can still [$1 view this revision]",
 'difference-title' => '"$1" इत्यस्य अवतरणमध्ये व्यत्यासः ।',
 'difference-title-multipage' => '"$1" तथा "$2" पुटयोः मध्ये व्यत्यासः ।',
 'difference-multipage' => 'पुटेषु व्यत्यासः ।',
-'lineno' => 'पà¤\82क्तिः $1:',
+'lineno' => 'पà¤\99à¥\8dक्तिः $1:',
 'compareselectedversions' => 'चितानाम् आवृत्तीनां तोलनं क्रियताम्',
 'showhideselectedversions' => 'चितावतरणानि दर्शयतु/गोपयतु ।',
-'editundo' => 'निषà¥\8dà¤\95à¥\8dरियताम्',
+'editundo' => 'पà¥\82रà¥\8dववत्',
 'diff-multi-manyusers' => '({{PLURAL:$2|योजकेन|$2 योजकैः}} कृता {{PLURAL:$1|मध्यमा आवृत्तिः|$1 मध्यमा आवृत्तयः}} न दर्शिताः ।)',
 'difference-missing-revision' => '{{PLURAL:$2|One revision|$2 पुनरावृत्तेः }} व्यत्यासः ($1) {{PLURAL:$2|was|were}} न दृष्टः ।
 कारणम् अत्र दृश्यते । [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].',
 
 # Search results
-'searchresults' => 'à¤\85नà¥\8dवà¥\87षणसà¥\8dय à¤«à¤²à¤¿à¤¤à¤¾à¤¨à¤¿',
-'searchresults-title' => '"$1" à¤\87तà¥\8dयसà¥\8dय à¤\95à¥\83तà¥\87 à¤\85नà¥\8dवà¥\87षणफलानि',
+'searchresults' => 'à¤\85नà¥\8dवà¥\87षणपरिणामाà¤\83',
+'searchresults-title' => '"$1" à¤\95à¥\83तà¥\87 à¤\85नà¥\8dवà¥\87षणपरिणामाà¤\83',
 'toomanymatches' => 'अत्यधिकाः मेलाः प्रत्यागताः । अन्यप्रश्नेन यतताम् ।',
 'titlematches' => 'पुटशीर्षिकामेलाः ।',
 'textmatches' => 'पुटपाठस्य मेलाः',
@@ -1536,7 +1539,7 @@ You can still [$1 view this revision]",
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|परिवर्तनम्|परिवर्तनानि}}',
-'recentchanges' => 'सदà¥\8dयà¥\8bà¤\9cातानि à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनानि',
+'recentchanges' => 'सद्यपरिवर्तनानि',
 'recentchanges-legend' => 'सद्योजातानां परिवर्तनानां विकल्पाः',
 'recentchanges-summary' => 'अस्मिन् विकियोजनायां सद्योजातानि परिवर्तनानि दर्श्यन्ताम्',
 'recentchanges-feed-description' => 'अस्मिन् विकियोजनायां सद्योजातानि परिवर्तनानि दर्श्यन्ताम्',
@@ -1924,7 +1927,7 @@ See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'unusedtemplateswlh' => 'अन्यानुबन्धाः ।',
 
 # Random page
-'randompage' => 'यादृच्छिकपृष्ठम्',
+'randompage' => '‎अशृङ्खलं (random) पृष्ठं',
 'randompage-nopages' => 'अधोनिदेशितनामस्थाने पुटानि न सन्ति । {{PLURAL:$2| एतन्नमस्थाने}} नास्ति : $1।',
 
 # Random redirect
@@ -1977,7 +1980,7 @@ See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'fewestrevisions' => 'न्यूनतमालोकनयुक्तपुटानि ।',
 
 # Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|बà¥\88à¤\9fà¥\8d|बà¥\88à¤\9fà¥\8dसà¥\8d}}',
+'nbytes' => '$1 {{PLURAL:$1|à¤\85षà¥\8dà¤\9fà¤\95मà¥\8d|à¤\85षà¥\8dà¤\9fà¤\95ानि}}',
 'ncategories' => '{{PLURAL:$1|वर्गः|वर्गाः }}',
 'ninterwikis' => '$1 {{PLURAL:$1|अन्तार्विकी|अन्तार्विक्यः}}',
 'nlinks' => '$1 {{PLURAL:$1|अनुबन्धः|अनुबन्धाः}}',
@@ -2027,7 +2030,7 @@ See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'listusers-creationsort' => 'सर्जनदिनाङ्कैः वर्गीकरोतु ।',
 'usereditcount' => '$1 {{PLURAL:$1|दिनम्|दिनानि}}',
 'usercreated' => '$1 दिने $2 समये रचितम् योजकनाम $3',
-'newpages' => 'नवà¥\80नपà¥\83षà¥\8dठमà¥\8d',
+'newpages' => 'नवà¥\80नपà¥\83षà¥\8dठाà¤\83',
 'newpages-username' => 'योजकनामन्:',
 'ancientpages' => 'प्राचीनतमानि पृष्ठानि',
 'move' => 'चाल्यताम्',
@@ -2290,7 +2293,7 @@ Feedback and further assistance:
 # Rollback
 'rollback' => 'सम्पादनं निर्वर्तयतु ।',
 'rollback_short' => 'प्रत्याहरणम् ।',
-'rollbacklink' => 'पà¥\8dरतिनिवरà¥\8dतà¥\8dयतामà¥\8d',
+'rollbacklink' => 'पà¥\8dरतà¥\8dयाहरणà¤\82',
 'rollbacklinkcount' => '$1 {{PLURAL:$1|सम्पादनम्|सम्पादनानि}} प्रत्याहरतु ।',
 'rollbacklinkcount-morethan' => '$1 {{PLURAL:$1|सम्पादनम्|सम्पादनानि}} अधिकं प्रत्याहरतु ।',
 'rollbackfailed' => 'प्रत्यहरणम् असफलम् ।',
@@ -2461,7 +2464,7 @@ $2 द्वारा सम्पादितां अन्तिमावृ
 'sp-contributions-submit' => 'अन्विष्यताम्',
 
 # What links here
-'whatlinkshere' => 'à¤\95à¥\87भà¥\8dयà¤\83 à¤ªà¥\83षà¥\8dठà¥\87भà¥\8dयà¤\83 à¤¸à¤®à¥\8dबदà¥\8dधमà¥\8d',
+'whatlinkshere' => 'à¤\85नà¥\87न à¤¸à¤¹ à¤¸à¤®à¥\8dबदà¥\8dधाà¤\83',
 'whatlinkshere-title' => '"$1" इत्येतेन सम्बद्धानि पृष्ठानि',
 'whatlinkshere-page' => 'पृष्ठम् :',
 'linkshere' => "अधोलिखितानि पृष्ठाणि '''[[:$1]]''' इत्येतद् प्रति संबंधनं कुर्वन्ति :",
@@ -2835,13 +2838,13 @@ $2 इति प्रकारस्य अवरोधं कर्तुं 
 'tooltip-pt-preferences' => 'भवतः इष्टतमानि',
 'tooltip-pt-watchlist' => 'भवद्भिः परिवर्तनानि निरीक्ष्यमाणानां पृष्ठानां सूची',
 'tooltip-pt-mycontris' => 'भवतः योगदानानाम् आवली',
-'tooltip-pt-login' => 'भवानà¥\8d à¤¨ à¤ªà¥\8dरविषà¥\8dà¤\9fà¤\83। à¤ªà¥\8dरवà¥\87शà¤\83 à¤\85निवारà¥\8dयà¤\83 à¤¨।',
+'tooltip-pt-login' => 'समà¥\8dपà¥\8dरवà¥\87शाय à¤ªà¥\8dरà¥\8bतà¥\8dसहामहà¥\87 à¥¤ à¤ªà¤°à¤¨à¥\8dतà¥\81 à¤¸à¤®à¥\8dपà¥\8dरवà¥\87शà¤\83 à¤\90à¤\9aà¥\8dà¤\9bिà¤\95à¤\83 ।',
 'tooltip-pt-logout' => 'निर्गमनम्',
-'tooltip-ca-talk' => 'पà¥\83षà¥\8dठानà¥\8dतरà¥\8dà¤\97तविषयà¥\87 चर्चा',
-'tooltip-ca-edit' => 'भवानà¥\8d à¤\87दà¤\82 à¤ªà¥\83षà¥\8dठà¤\82 à¤¸à¤®à¥\8dपादयितà¥\81मà¥\8d à¤\85रà¥\8dहति। à¤°à¤\95à¥\8dषणातà¥\8dपà¥\82रà¥\8dवà¤\82 à¤\95à¥\83पया à¤ªà¥\8dराà¤\97à¥\8dदà¥\83शà¥\8dयà¤\82 à¤ªà¤¶à¥\8dयतà¥\81।',
+'tooltip-ca-talk' => 'पà¥\83षà¥\8dठाऽनà¥\8dतरà¥\8dà¤\97ताय à¤µà¤¿à¤·à¤¯à¤¾à¤¯ चर्चा',
+'tooltip-ca-edit' => 'à¤\87दà¤\82 à¤ªà¥\83षà¥\8dठà¤\82 à¤¸à¤®à¥\8dपादयितà¥\81à¤\82 à¤¶à¤\95à¥\8dयतà¥\87 à¥¤ à¤°à¤\95à¥\8dषणातà¥\8dपà¥\82रà¥\8dवà¤\82 à¤\95à¥\83पया à¤ªà¥\8dराà¤\97à¥\8dदà¥\83शà¥\8dयà¤\82 à¤¦à¥\83शà¥\8dयतामà¥\8d ।',
 'tooltip-ca-addsection' => 'नूतनः विभागः आरभ्यताम्',
 'tooltip-ca-viewsource' => 'इदं पृष्ठं संरक्षितं विद्यते। भवान् अस्य स्रोतः द्रष्टुम् अर्हति।',
-'tooltip-ca-history' => 'à¤\85सà¥\8dय à¤ªà¥\83षà¥\8dठसà¥\8dय à¤ªà¥\81रातनà¥\8dयà¤\83 à¤\86वà¥\83तà¥\8dतयः',
+'tooltip-ca-history' => 'à¤\85सà¥\8dय à¤ªà¥\83षà¥\8dठसà¥\8dय à¤ªà¥\81रातनाऽऽवà¥\83तà¥\8dतिः',
 'tooltip-ca-protect' => 'इदं पृष्ठं संरक्ष्यताम्',
 'tooltip-ca-unprotect' => 'अस्य पुटास्य सुरक्षां परिवर्तयतु ।',
 'tooltip-ca-delete' => 'इदं पृष्ठम् अपाक्रियताम्',
@@ -2849,28 +2852,28 @@ $2 इति प्रकारस्य अवरोधं कर्तुं 
 'tooltip-ca-move' => 'इदं पृष्ठं चाल्यताम्',
 'tooltip-ca-watch' => 'इदं पृष्ठं भवतः अवेक्षणसूच्यां योज्यताम्',
 'tooltip-ca-unwatch' => 'इदं पृष्ठं भवतः अवेक्षणसूच्याः निष्कास्यताम्',
-'tooltip-search' => '{{SITENAME}} à¤\85तà¥\8dर à¤\85नà¥\8dविषà¥\8dयतामà¥\8d',
+'tooltip-search' => '{{SITENAME}} अन्विष्यताम्',
 'tooltip-search-go' => 'समानशिरोनामयुक्तं पृष्ठं विद्यते चेत् तत्र गम्यताम्',
-'tooltip-search-fulltext' => 'à¤\87दà¤\82 à¤µà¤\9aनं पृष्ठेषु अन्विष्यताम्',
+'tooltip-search-fulltext' => 'à¤\8fनà¤\82 à¤µà¤¾à¤\95à¥\8dयाà¤\82शं पृष्ठेषु अन्विष्यताम्',
 'tooltip-p-logo' => 'मुख्यपृष्ठं गम्यताम्',
 'tooltip-n-mainpage' => 'मुख्यपृष्ठं गम्यताम्',
 'tooltip-n-mainpage-description' => 'मुख्यपृष्ठं गम्यताम्',
-'tooltip-n-portal' => 'पà¥\8dरà¤\95लà¥\8dपविषयà¥\87 à¤­à¤µà¤¤à¤¾ à¤\95िà¤\82 à¤\95रà¥\8dतà¥\81à¤\82 à¤¶à¤\95à¥\8dयà¤\82, à¤\95à¥\81तà¥\8dर à¤\85नà¥\8dवà¥\87षणà¤\82 à¤¶à¤\95्यम्',
-'tooltip-n-currentevents' => 'सदà¥\8dयà¤\83à¤\95ालà¥\80नà¤\98à¤\9fनानां पृष्ठभूमिका प्राप्यताम्',
-'tooltip-n-recentchanges' => 'सदà¥\8dयà¥\8bà¤\9cातानाà¤\82 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनानाà¤\82 à¤¸à¥\82à¤\9aà¥\80',
-'tooltip-n-randompage' => 'à¤\95िमपà¥\8dयà¥\87à¤\95à¤\82 पृष्ठं गम्यताम्',
+'tooltip-n-portal' => 'तà¥\8dवया à¤ªà¥\8dरà¤\95लà¥\8dपविषयà¥\87 à¤\95िà¤\82 à¤\95रà¥\8dतà¥\81à¤\82 à¤¶à¤\95à¥\8dयतà¥\87, à¤\95à¥\81तà¤\83 à¤¸à¤¾à¤¹à¤¾à¤¯à¥\8dयà¤\82 à¤ªà¥\8dरापà¥\8dतव्यम्',
+'tooltip-n-currentevents' => 'वरà¥\8dतमानपà¥\8dरसà¤\99à¥\8dà¤\97ानां पृष्ठभूमिका प्राप्यताम्',
+'tooltip-n-recentchanges' => 'सदà¥\8dयपरिवरà¥\8dतनानामà¥\8d à¤\86वलिà¤\83',
+'tooltip-n-randompage' => 'à¤\85शà¥\83à¤\99à¥\8dà¤\96लà¤\82 (random) पृष्ठं गम्यताम्',
 'tooltip-n-help' => 'अन्वेषणस्थानम्',
-'tooltip-t-whatlinkshere' => 'à¤\8fततà¥\8dसमà¥\8dबदà¥\8dधानाà¤\82 à¤¸à¤°à¥\8dवà¥\87षाà¤\82 à¤µà¤¿à¤\95ि-पà¥\83षà¥\8dठानाà¤\82 à¤¸à¥\82à¤\9aà¥\80',
-'tooltip-t-recentchangeslinked' => 'à¤\8fततà¥\8dसमà¥\8dबदà¥\8dधà¥\87षà¥\81 à¤ªà¥\83षà¥\8dठà¥\87षà¥\81 à¤\9cातानि à¤¸à¤¦à¥\8dयà¤\83à¤\95ालà¥\80नानि परिवर्तनानि',
+'tooltip-t-whatlinkshere' => 'à¤\85तà¥\8dर à¤¸à¤®à¥\8dबदà¥\8dधानाà¤\82 à¤ªà¤°à¤¿à¤¸à¤¨à¥\8dधितानाà¤\82 à¤µà¤¿à¤\95ि-पà¥\83षà¥\8dठानामà¥\8d à¤\86वलिà¤\83',
+'tooltip-t-recentchangeslinked' => 'à¤\8fततà¥\8dपà¥\83षà¥\8dठसमà¥\8dबदà¥\8dधà¥\87षà¥\81 à¤ªà¥\83षà¥\8dठà¥\87षà¥\81 à¤¸à¤¦à¥\8dयà¤\9cातानि परिवर्तनानि',
 'tooltip-feed-rss' => 'अस्मै पृष्ठाय आर-एस-एस-पूरणम्',
 'tooltip-feed-atom' => 'अस्मै पृष्ठाय अणुपूरणम्',
 'tooltip-t-contributions' => 'अस्य योजकस्य योगदानानाम् आवलिः',
 'tooltip-t-emailuser' => 'एतस्मै योजकाय ईपत्रं प्रेष्यताम्',
-'tooltip-t-upload' => 'सà¤\82चिकाः आरोप्यन्ताम्',
-'tooltip-t-specialpages' => 'सरà¥\8dवà¥\87षाà¤\82 à¤µà¤¿à¤¶à¤¿à¤·à¥\8dà¤\9fपà¥\83षà¥\8dठानाà¤\82 à¤¸à¥\82à¤\9aà¥\80',
+'tooltip-t-upload' => 'सà¤\9eà¥\8dचिकाः आरोप्यन्ताम्',
+'tooltip-t-specialpages' => 'सरà¥\8dवà¥\87षाà¤\82 à¤µà¤¿à¤¶à¤¿à¤·à¥\8dà¤\9fपà¥\83षà¥\8dठानामà¥\8d à¤\86वलिà¤\83',
 'tooltip-t-print' => 'अस्य पृष्ठस्य मुद्रणयोग्या आवृत्तिः',
-'tooltip-t-permalink' => 'पृष्ठस्य अस्याः आवृत्तेः स्थिरसम्पर्कतन्तुः',
-'tooltip-ca-nstab-main' => 'à¤\86नà¥\8dतरà¥\8dयà¤\82 à¤¦à¥\83शà¥\8dयतामà¥\8d',
+'tooltip-t-permalink' => 'पृष्ठस्यास्य स्थायिपरिसन्धिः',
+'tooltip-ca-nstab-main' => 'à¤\86नà¥\8dतरà¥\8dविषयà¤\95à¤\82 à¤ªà¥\83षà¥\8dठà¤\82 à¤ªà¤¶à¥\8dयतà¥\81',
 'tooltip-ca-nstab-user' => 'योजकपृष्ठं दृश्यताम्',
 'tooltip-ca-nstab-media' => 'माध्यमपुटम् अवलोकयतु ।',
 'tooltip-ca-nstab-special' => 'इदमेकं विशिष्टं पृष्ठम्, भवान् इदं पृष्ठं सम्पादयितुं न अर्हति।',
@@ -2890,10 +2893,10 @@ $2 इति प्रकारस्य अवरोधं कर्तुं 
 'tooltip-watchlistedit-raw-submit' => 'अवलोकनावलीं समुद्धरतु ।',
 'tooltip-recreate' => 'एतत्पुटं पूर्वमेव अपमर्जितः अतः पुन सृजतु ।',
 'tooltip-upload' => 'उत्तारणम् आरभताम्',
-'tooltip-rollback' => '"पà¥\82रà¥\8dण-पà¥\8dरतिà¤\97मनà¤\82(रà¥\8bलबà¥\88à¤\95à¥\8d à¤\87तà¥\8dयà¥\87तदà¥\8d)" à¤\85सà¥\8dय à¤ªà¥\83षà¥\8dठसà¥\8dय à¤¸à¤\82पादनानि à¤\85à¤\82तिम-यà¥\8bà¤\97दातà¥\83à¤\95à¥\83तानि à¤µà¤¿à¤ªà¤°à¥\80तà¥\80à¤\95रà¥\8bति à¤\8fà¤\95à¥\87न à¤\95à¥\8dलिà¤\95à¥\8dà¤\95ारà¥\87ण',
-'tooltip-undo' => '"निषà¥\8dà¤\95à¥\8dरियतामà¥\8d" à¤\87तà¥\8dयà¥\87तदà¥\8d à¤\87दà¤\82 à¤¸à¤®à¥\8dपादनà¤\82 à¤µà¤¿à¤ªà¤°à¥\80तà¥\80à¤\95रà¥\8bति, à¤¤à¤¥à¤¾ à¤\9a à¤¸à¤®à¥\8dपादनपà¥\8dरारà¥\82पà¤\82 à¤ªà¥\8dराà¤\97à¥\8dदà¥\83शà¥\8dयरà¥\82पà¥\87ण à¤\89दà¥\8dà¤\98ाà¤\9fयति।
+'tooltip-rollback' => '"पà¥\8dरतà¥\8dयाहरणमà¥\8d (roll back)" à¤\87तà¥\8dयà¥\87ततà¥\8d à¤\85नà¥\8dतिमसमà¥\8dपादà¤\95सà¥\8dय à¤\85नà¥\8dतिमयà¥\8bà¤\97दानà¤\82 à¤¨à¤¿à¤°à¤¾à¤\95रà¥\8bति à¥¤',
+'tooltip-undo' => '"पà¥\82रà¥\8dववतà¥\8d" à¤\87ति à¤\85नà¥\8dतिमसमà¥\8dपादनमà¥\8d à¤\85पाà¤\95रà¥\8bति, à¤¸à¤®à¥\8dपादनपà¥\8dरारà¥\82पà¤\82 à¤ªà¥\8dराà¤\97à¥\8dदà¥\83शà¥\8dयरà¥\82पà¥\87ण à¤\89दà¥\8dà¤\98ाà¤\9fयति, à¤¨à¤µà¥\80नसमà¥\8dपादनानà¥\8dतरà¤\82 à¤¸à¤®à¥\8dपादनपà¥\83षà¥\8dठà¤\82 à¤ªà¥\8dराà¤\97à¥\8dदà¥\83शà¥\8dयतà¥\8dवà¥\87न à¤ªà¥\8dरदरà¥\8dशयति à¤\9a à¥¤ 
 
-à¤\85सà¥\8dय à¤¸à¤¾à¤°à¤¾à¤\82शà¥\87 à¤\95ारणमपि à¤²à¥\87à¤\96ितà¥\81à¤\82 à¤¶à¤\95à¥\8dयतà¥\87।',
+à¤\85सà¥\8dय à¤¸à¤¾à¤°à¤¾à¤\82शà¥\87 à¤\85पाà¤\95रणसà¥\8dय à¤\95ारणमपि à¤²à¥\87à¤\96ितà¥\81à¤\82 à¤¶à¤\95à¥\8dयतà¥\87 ।',
 'tooltip-preferences-save' => 'आद्यताः रक्षतु ।',
 'tooltip-summary' => 'संक्षिप्तः सारांशः योज्यताम्',
 
@@ -3049,12 +3052,11 @@ $2 इति प्रकारस्य अवरोधं कर्तुं 
 'just-now' => 'अधुनैव',
 
 # Bad image list
-'bad_image_list' => 'रà¥\82पमà¥\8d à¤\8fवमà¥\8d à¤\85सà¥\8dति -
+'bad_image_list' => 'à¤\85तà¥\8dर à¤ªà¥\8dरारà¥\82पà¤\82 à¤\8fवà¤\82 à¤­à¤µà¥\87तà¥\8d -
 
-à¤\95à¥\87वलà¤\82 à¤¸à¥\82à¤\9aà¥\8dयनà¥\8dतरà¥\8dà¤\97ताà¤\83 à¤µà¤¿à¤·à¤¯à¤¾à¤\83 (* à¤\87ति à¤\9aिनà¥\8dहातà¥\8d à¤\86रभमाणाà¤\83 à¤ªà¤\82à¤\95à¥\8dतयà¤\83)परामà¥\83षà¥\8dà¤\9fाà¤\83
+à¤\95à¥\87वलमà¥\8d à¤\86वलà¥\8dयनà¥\8dतरà¥\8dà¤\97ताà¤\83 à¤µà¤¿à¤·à¤¯à¤¾à¤\83 (* à¤\87ति à¤\9aिनà¥\8dहातà¥\8d à¤\86रभमाणाà¤\83 à¤ªà¤\99à¥\8dà¤\95à¥\8dतयà¤\83) à¤\86à¤\95लिताà¤\83 
 
-प्रथमः सम्पर्कतन्तुः दोषपूर्णां सञ्चिकां प्रत्येव गच्छेत्।
-तस्याम् एव पङ्क्तौ उत्तरोत्तरसम्पर्कतन्तवः अपवादाः ज्ञेयाः। अर्थात् येषु पृष्ठेषु एषा सञ्चिका योजिता स्यात्।',
+पङ्क्त्यां विद्यमाना प्रथमा परिसन्धिः (link) दोषपूर्णया सञ्चिकया सह परिसन्धिता (linked) स्यादेव । तस्यामेव पङ्क्तौ उत्तरोत्तरं विद्यमानाः परिसन्धयः अपवादिताः ज्ञेयाः, अर्थात् अत्र तेषां पृष्ठानाम् आवलिरेव भविष्यति, येषु एषा सञ्चिका विद्यते ।',
 
 # Metadata
 'metadata' => 'अधिदत्तानि',
@@ -3668,7 +3670,7 @@ $5
 'fileduplicatesearch-noresults' => '"$1" इति नाम्ना सञ्चिका न दृष्टा ।',
 
 # Special:SpecialPages
-'specialpages' => 'विशà¥\87षपृष्ठानि',
+'specialpages' => 'विशिषà¥\8dà¤\9fपृष्ठानि',
 'specialpages-note' => '* साधारणं विशेषपुटम् । 
 * <span class="mw-specialpagerestricted">प्रतिद्धं विशेषपुटम् ।</span>',
 'specialpages-group-maintenance' => 'निर्वहणवृत्तानि ।',
index 3b869bf..fe06b83 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Andria
+ * @author L2212
  * @author Marzedu
  * @author Node ue
  * @author לערי ריינהארט
@@ -606,6 +607,9 @@ Cosas de ammentare: '''({{int:cur}})''' = diferèntzias cun sa versione currente
 'nextn' => '{{PLURAL:$1|imbeniente|imbenientes $1}}',
 'shown-title' => 'Ammustra $1 {{PLURAL:$1|resurtadu|resurtados}} pro pàgina',
 'viewprevnext' => 'Càstia ($1 {{int:pipe-separator}} $2) ($3).',
+'searchprofile-articles' => 'Pàginas de càbidu',
+'searchprofile-project' => 'Pàginas de agiudu e de su progetu',
+'searchprofile-images' => 'Multimèdia',
 'searchprofile-everything' => 'Totu',
 'searchprofile-advanced' => 'Avantzada',
 'searchprofile-articles-tooltip' => 'Chirca in $1',
@@ -994,7 +998,7 @@ S'indiritzu chi as insertadu in is [[Special:Preferences|preferèntzias usuàriu
 
 # Watchlist
 'watchlist' => 'Sa watchlist mea',
-'mywatchlist' => 'Sa watchlist mea',
+'mywatchlist' => 'Pàginas annotadas',
 'nowatchlist' => 'No as indicadu pàginas in sa watchlist tua.',
 'watchnologin' => 'No intrau (log in)',
 'watchnologintext' => 'Devi prima fare il [[Special:UserLogin|login]]
index 80af240..aa5f76d 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author (vinny)
+ * @author AmaryllisGardener
  * @author Avicennasis
  * @author Derek Ross
  * @author John Reid
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Unnerline airtins:',
-'tog-hideminor' => 'Hide smaa edits in recent chynges',
-'tog-hidepatrolled' => 'Hide patrolled edits in recent chynges',
-'tog-newpageshidepatrolled' => 'Hide patrolled pages frae the new page list',
-'tog-extendwatchlist' => 'Mak watchleet bigger tae shaw aw chynges,no jyst the maist recent',
-'tog-usenewrc' => 'Groop chynges bi page in recent chynges and watchleet',
+'tog-hideminor' => 'Skauk smaa eidits in recent chynges',
+'tog-hidepatrolled' => 'Skauk patrolled eidits in recent chynges',
+'tog-newpageshidepatrolled' => 'Skauk patrolled pages frae the new page leet',
+'tog-extendwatchlist' => 'Mak watchleet bigger tae shaw aw chynges, no just the maist recent',
+'tog-usenewrc' => 'Groop chynges bi page in recent chynges n watchleet',
 'tog-numberheadings' => 'Auto-nummer heidins',
-'tog-showtoolbar' => 'Shaw edit tuilbar',
-'tog-editondblclick' => 'Edit pages on dooble-clap (JavaScript)',
+'tog-showtoolbar' => 'Shaw eidit tuilbaur',
+'tog-editondblclick' => 'Eidit pages oan dooble-clap (JavaScript)',
 'tog-editsectiononrightclick' => 'Enable section editin bi richt-clapin on section teitles',
 'tog-rememberpassword' => 'Mynd ma password oan this browser (fer ae maximum o $1 {{PLURAL:$1|day|days}})',
-'tog-watchcreations' => 'Add pages that Ah create an files Ah uplaid til ma watchleet',
-'tog-watchdefault' => 'Add pages an files that Ah edit til ma watchleet',
-'tog-watchmoves' => 'Eik pages an files that Ah muiv til ma watchleet',
-'tog-watchdeletion' => 'Eik pages an files that Ah get rid o til ma watchleet',
+'tog-watchcreations' => 'Add pages that Ah cræft n files that Ah uplaid til ma watchleet',
+'tog-watchdefault' => 'Add pages n files that Ah eedit til ma watchleet',
+'tog-watchmoves' => 'Add pages n files that Ah muiv til ma watchleet',
+'tog-watchdeletion' => 'Eik pages n files that Ah get rid o til ma watchleet',
 'tog-minordefault' => 'Mairk aa edits "smaa" bi defaut',
-'tog-previewontop' => 'Shaw scance afore edit box an no efter it',
-'tog-previewonfirst' => 'Shaw scance on first edit',
+'tog-previewontop' => 'Shaw owerview afore eedit kist n naw efter it',
+'tog-previewonfirst' => 'Shaw luikower oan firstwhile eidit',
 'tog-enotifwatchlistpages' => 'Wab-mail me whan ae page or file on ma watchleet is chynged',
-'tog-enotifusertalkpages' => 'Send me ae email whan ma uiser talk page is chynged',
-'tog-enotifminoredits' => 'Send me ae wab-mail fer wee edits o pages an files ava',
+'tog-enotifusertalkpages' => 'Send me ae wab-mail whan ma uiser tauk page is chynged',
+'tog-enotifminoredits' => 'Send me ae wab-mail fer wee eedits o pages n files ava',
 'tog-enotifrevealaddr' => 'Shaw ma email address in notification mails',
 'tog-shownumberswatching' => 'Shaw the nummer o watching uisers',
+'tog-oldsig' => 'Existin signatur:',
 'tog-fancysig' => 'Treat signature as wikitext (wioot aen autæmatic airtin)',
 'tog-uselivepreview' => 'Uise live preview (experimental)',
-'tog-forceeditsummary' => 'Gie me a jottin when A dinnae put in a edit summary',
-'tog-watchlisthideown' => 'Hide yer ain edits frae yer watchleet',
-'tog-watchlisthidebots' => 'Hide bot edits frae yer watchleet',
-'tog-watchlisthideminor' => 'Dinna shaw sma edits on ma watchleet',
-'tog-watchlisthideliu' => 'Hide edits by loggit in uisers frae the watchleet',
-'tog-watchlisthideanons' => 'Hide edits by nameless uisers frae the watchleet',
-'tog-watchlisthidepatrolled' => 'Hide patrolled edits frae the watchlist',
+'tog-forceeditsummary' => 'Gie me ae jottin when Ah dinnae put in aen eidit owerview',
+'tog-watchlisthideown' => 'Skauk ma eidits frae the watchleet',
+'tog-watchlisthidebots' => 'Skauk bot eidits frae the watchleet',
+'tog-watchlisthideminor' => 'Dinna shaw smaa eidits oan ma watchleet',
+'tog-watchlisthideliu' => 'Skauk eidits bi loggit in uisers fae the watchleet',
+'tog-watchlisthideanons' => 'Skauk eidits bi nameless uisers fae the watchleet',
+'tog-watchlisthidepatrolled' => 'Skauk patrolled eidits fae the watchleet',
 'tog-ccmeonemails' => 'Gie me copies o emails A write tae ither uisers',
 'tog-diffonly' => 'Dinna shaw page contents ablo diffs',
-'tog-showhiddencats' => 'Shaw hidden categories',
+'tog-showhiddencats' => "Shaw Skauk't categeries",
 'tog-norollbackdiff' => 'Lave oot diff efter rowin back',
-'tog-useeditwarning' => 'Warnish me whan a lea aen edit page wi onsaved chynges',
+'tog-useeditwarning' => 'Warnish me whan Ah lea aen eidit page wi onhained chynges',
 'tog-prefershttps' => 'Aye uise ae secure connection whan loggit in',
 
 'underline-always' => 'Aye',
@@ -80,8 +82,8 @@ $messages = array(
 'tuesday' => 'Tysday',
 'wednesday' => 'Wadensday',
 'thursday' => 'Fuirsday',
-'friday' => 'Friday',
-'saturday' => 'Seturday',
+'friday' => 'Fryday',
+'saturday' => 'Setturday',
 'sun' => 'Sun',
 'mon' => 'Mon',
 'tue' => 'Tue',
@@ -89,10 +91,10 @@ $messages = array(
 'thu' => 'Thu',
 'fri' => 'Fri',
 'sat' => 'Sat',
-'january' => 'Januar',
-'february' => 'Februar',
+'january' => 'Januair',
+'february' => 'Febuair',
 'march' => 'Mairch',
-'april' => 'Apryle',
+'april' => 'Aprile',
 'may_long' => 'Mey',
 'june' => 'Juin',
 'july' => 'Julie',
@@ -101,18 +103,18 @@ $messages = array(
 'october' => 'October',
 'november' => 'November',
 'december' => 'December',
-'january-gen' => 'Januar',
-'february-gen' => 'February',
-'march-gen' => 'March',
-'april-gen' => 'Apryle',
-'may-gen' => 'May',
+'january-gen' => 'Januair',
+'february-gen' => 'Februar',
+'march-gen' => 'Mairch',
+'april-gen' => 'Aprile',
+'may-gen' => 'Mey',
 'june-gen' => 'Juin',
 'july-gen' => 'Julie',
 'august-gen' => 'August',
 'september-gen' => 'September',
 'october-gen' => 'October',
 'november-gen' => 'November',
-'december-gen' => 'Dizember',
+'december-gen' => 'December',
 'jan' => 'Jan',
 'feb' => 'Feb',
 'mar' => 'Mai',
@@ -125,13 +127,13 @@ $messages = array(
 'oct' => 'Oct',
 'nov' => 'Nov',
 'dec' => 'Diz',
-'january-date' => '$1 Januar',
-'february-date' => '$1 Febuar',
+'january-date' => '$1 Januair',
+'february-date' => '$1 Febuair',
 'march-date' => '$1 Mairch',
 'april-date' => '$1 Apryl',
 'may-date' => '$1 Mey',
 'june-date' => '$1 Juin',
-'july-date' => '$1 Juli',
+'july-date' => '$1 Julie',
 'august-date' => '$1 August',
 'september-date' => '$1 September',
 'october-date' => '$1 October',
@@ -144,8 +146,8 @@ $messages = array(
 'subcategories' => 'Subcategories',
 'category-media-header' => 'Eetems in category "$1"',
 'category-empty' => "''This category haes no pages or eetems at the meenit.''",
-'hidden-categories' => '{{PLURAL:$1|Hidden categorie|Hidden categories}}',
-'hidden-category-category' => 'Hidden cætegories',
+'hidden-categories' => "{{PLURAL:$1|Skauk't categerie|Skauk't categeries}}",
+'hidden-category-category' => "Skauk't cætegories",
 'category-subcat-count' => '{{PLURAL:$2|This category juist haes the follaein subcategory.|This category haes the follaein {{PLURAL:$1|subcategory|$1 subcategories}}, oot o $2 awthegither.}}',
 'category-subcat-count-limited' => 'This category haes the follaein {{PLURAL:$1|subcategory|$1 subcategories}}.',
 'category-article-count' => '{{PLURAL:$2|This category contains the ae follaein page.|The follaein {{PLURAL:$1|page|$1 pages}} is in this category, oot o $2 total.}}',
@@ -165,14 +167,14 @@ $messages = array(
 'morenotlisted' => 'This leet isna complete.',
 'mypage' => 'Ma page',
 'mytalk' => 'Ma tauk',
-'anontalk' => 'Talk fer this IP address',
+'anontalk' => 'Tauk fer this IP address',
 'navigation' => 'Navigation',
-'and' => '&#32;an',
+'and' => '&#32;n',
 
 # Cologne Blue skin
 'qbfind' => 'Rake',
 'qbbrowse' => 'Brouse',
-'qbedit' => 'Edit',
+'qbedit' => 'Eidit',
 'qbpageoptions' => 'This page',
 'qbmyoptions' => 'Ma pages',
 'faq' => 'ASQ',
@@ -180,13 +182,13 @@ $messages = array(
 
 # Vector skin
 'vector-action-addsection' => 'Add topic',
-'vector-action-delete' => 'Delete',
+'vector-action-delete' => 'Delyte',
 'vector-action-move' => 'Flit',
 'vector-action-protect' => 'Fend',
-'vector-action-undelete' => 'Ondelete',
+'vector-action-undelete' => 'Ondelyte',
 'vector-action-unprotect' => 'Chynge protection',
 'vector-view-create' => 'Mak',
-'vector-view-edit' => 'Edit',
+'vector-view-edit' => 'Eedit',
 'vector-view-history' => 'See history',
 'vector-view-view' => 'Read',
 'vector-view-viewsource' => 'View soorce',
@@ -195,7 +197,7 @@ $messages = array(
 'variants' => 'Variants',
 
 'navigation-heading' => 'Navigâtion menu',
-'errorpagetitle' => 'Error',
+'errorpagetitle' => 'Mistak',
 'returnto' => 'Return tae $1.',
 'tagline' => 'Frae {{SITENAME}}',
 'help' => 'Help',
@@ -210,15 +212,15 @@ $messages = array(
 'permalink' => 'Permanent airtin',
 'print' => 'Prent',
 'view' => 'View.',
-'edit' => 'Edit',
+'edit' => 'Eedit',
 'create' => 'Mak',
-'editthispage' => 'Edit this page',
+'editthispage' => 'Eedit this page',
 'create-this-page' => 'Mak this page',
-'delete' => 'Delete',
-'deletethispage' => 'Delete this page',
-'undeletethispage' => 'Ondelete this page',
+'delete' => 'Delyte',
+'deletethispage' => 'Delyte this page',
+'undeletethispage' => 'Ondelyte this page',
 'undelete_short' => 'Undelete {{PLURAL:$1|ane edit|$1 edits}}',
-'viewdeleted_short' => 'View {{PLURAL:$1|yin deletit eidit|$1 deletit eidits}}',
+'viewdeleted_short' => 'See {{PLURAL:$1|yin delytit eedit|$1 delytit eedits}}',
 'protect' => 'Fend',
 'protect_change' => 'chynge',
 'protectthispage' => 'Fend this page',
@@ -226,16 +228,16 @@ $messages = array(
 'unprotectthispage' => 'Chynge fend fer this page',
 'newpage' => 'New page',
 'talkpage' => 'Blether ower this page',
-'talkpagelinktext' => 'Talk',
+'talkpagelinktext' => 'Tauk',
 'specialpage' => 'Byordinar Page',
 'personaltools' => 'Personal tuils',
-'postcomment' => 'Eik a message',
+'postcomment' => 'New section',
 'articlepage' => 'Leuk at content page',
 'talk' => 'Collogue',
 'views' => 'Views',
 'toolbox' => 'Tuilkist',
 'userpage' => 'View uiser page',
-'projectpage' => 'View project page',
+'projectpage' => 'See waurk page',
 'imagepage' => 'look ower image page',
 'mediawikipage' => 'View message page',
 'templatepage' => 'View template page',
@@ -258,15 +260,15 @@ Please wait ae while afore ye try tae access this page again.
 $1',
 'pool-timeout' => 'Timeout waitin fer the lock',
 'pool-queuefull' => 'Pool line is ful',
-'pool-errorunknown' => "Onken't error",
+'pool-errorunknown' => 'Onknawn mistak.',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Aboot {{SITENAME}}',
 'aboutpage' => 'Project:Aboot',
 'copyright' => 'Content is available unner $1 onless itherwise noted.',
 'copyrightpage' => '{{ns:project}}:Copyrichts',
-'currentevents' => 'Gaun on the nou',
-'currentevents-url' => 'Project:Gaun on the nou',
+'currentevents' => 'Gaun oan the nou',
+'currentevents-url' => 'Project:Gaun oan the nou',
 'disclaimers' => 'Disclamation',
 'disclaimerpage' => 'Project:General_disclamation',
 'edithelp' => 'Editin help',
@@ -280,7 +282,7 @@ $1',
 'privacypage' => 'Project:Privacy policy',
 
 'badaccess' => 'Permeission mishanter',
-'badaccess-group0' => 'WARNIN: Ye arnae alloued tae dae whit you hae requestit!',
+'badaccess-group0' => "Ye'r no permited tae dae whit ye hae requestit!",
 'badaccess-groups' => 'The action ye hae requestit is limitit tae uisers in {{PLURAL:$2|the group|ane o the groups}}: $1.',
 
 'versionrequired' => 'Version $1 of MediaWiki requirit',
@@ -293,13 +295,13 @@ $1',
 'youhavenewmessagesmanyusers' => 'Ye hae $1 fae moni uisers ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|ae new message|999=new messages}}',
 'newmessagesdifflinkplural' => 'last {{PLURAL:$1|chynge|999=chynges}}',
-'youhavenewmessagesmulti' => 'Ye hae neow messages on $1',
-'editsection' => 'edit',
-'editold' => 'edit',
+'youhavenewmessagesmulti' => 'Ye hae new messages oan $1',
+'editsection' => 'eedit',
+'editold' => 'eedit',
 'viewsourceold' => 'ken soorce',
-'editlink' => 'edit',
-'viewsourcelink' => 'Scance ower the source',
-'editsectionhint' => 'Edit section: $1',
+'editlink' => 'eedit',
+'viewsourcelink' => 'view soorce',
+'editsectionhint' => 'Eedit section: $1',
 'toc' => 'Table o contents',
 'showtoc' => 'shaw',
 'hidetoc' => 'scouk',
@@ -307,7 +309,7 @@ $1',
 'collapsible-expand' => 'Mak mair muckle',
 'thisisdeleted' => 'View or cower $1?',
 'viewdeleted' => 'View $1?',
-'restorelink' => '{{PLURAL:$1|one delete edit|$1 delete edits}}',
+'restorelink' => '{{PLURAL:$1|yin delytit eidit|$1 delytit eidits}}',
 'feedlinks' => 'Feed:',
 'feed-invalid' => "This feeds subscrieve's teep isnae habile.",
 'feed-unavailable' => 'Syndication feeds isna available',
@@ -324,7 +326,7 @@ $1',
 'nstab-user' => 'Uiser page',
 'nstab-media' => 'Eetem page',
 'nstab-special' => 'Byordinar page',
-'nstab-project' => 'Project page',
+'nstab-project' => 'Waurk page',
 'nstab-image' => 'Eimage',
 'nstab-mediawiki' => 'Message',
 'nstab-template' => 'Template',
@@ -337,72 +339,71 @@ $1',
 Ye micht hae mistyped the URL, or follaed a wrang link
 This micht forby be caused by a bug in the saftware uised by {{SITENAME}}.",
 'nosuchspecialpage' => 'Nae sic byordinar page',
-'nospecialpagetext' => '<strong>Ye hae requestit an invalid byordinar page.</strong>
+'nospecialpagetext' => '<strong>Ye hae requestit aen onvalid byordinar page.</strong>
 
-A leet o valid byordinar pages can be funnd at [[Special:SpecialPages|{{int:specialpages}}]].',
+A leet o valid byordinar pages can be foond at [[Special:SpecialPages|{{int:specialpages}}]].',
 
 # General errors
-'error' => 'Error',
-'databaseerror' => 'Database error',
+'error' => 'Mistak',
+'databaseerror' => 'Database mistak',
 'databaseerror-text' => 'Ae database speirin mistak has occurred.
 This micht be cause o ae bug in the saffware.',
 'databaseerror-textcl' => 'Ae database speirin mistak has occurred.',
 'databaseerror-query' => 'Speirin: $1',
-'databaseerror-function' => 'Fwnction: $1',
+'databaseerror-function' => 'Function: $1',
 'databaseerror-error' => 'Mistake: $1',
-'laggedslavemode' => 'Warning: Page micht nae contain recent updates',
+'laggedslavemode' => '<strong>Warnishment:</strong> Page micht naw contain recent updates',
 'readonly' => 'Database lockit',
-'enterlockreason' => "Enter a raeson for the lock, includin an estimate o whan the lock'll be lowsed",
-'readonlytext' => "The databae is lockit tae new entries an ither modifeecations the nou,
-likely for routine database maintenance; efter that it'll be back tae normal.
-The adminstration that lockit it gied this explanation:
-$1",
-'missing-article' => 'The database didna find the text o a page that it shuid hae fund, cawed "$1" $2.
-
-Maistly this is caused by follaein an ootdated diff or history link tae a page that haes been delete.
-
-If this isna the case, you micht hae fund a bug in the saftware.
-Please lat an [[Special:ListUsers/sysop|administrator]] ken aboot this, makin note o the URL.',
-'missingarticle-rev' => '(revision#: $1)',
+'enterlockreason' => "Enter ae raeson fer the lock, inclædin aen estimate o whan the lock'll be lowsed",
+'readonlytext' => "The databae is lockit tae new entries n ither modifeecations the nou,
+likelie fer routine database maintenance; efter that it'll be back til normal.
+The admeenstration that lockit it gied this explanation: $1",
+'missing-article' => 'The database didna fynd the tex o ae page that it shid hae foond, cawed "$1" $2.
+
+Maistly this is caused bi follaein aen ootdated diff or histerie link til ae page that haes been delytit.
+
+Gif this isna the case, ye micht hae foond ae bug in the saffware.
+Please lat aen [[Special:ListUsers/sysop|admeenistrater]] ken aboot this, makin note o the URL.',
+'missingarticle-rev' => '(reveesion#: $1)',
 'missingarticle-diff' => '(Diff: $1, $2)',
 'readonly_lag' => 'The database haes been autaematically lockit while the sclave database servers catch up tae the maister',
 'internalerror' => 'Internal mishanter',
-'internalerror_info' => 'Internal error: $1',
+'internalerror_info' => 'Internal mistak: $1',
 'fileappenderrorread' => 'Coudna read "$1" durin append.',
 'fileappenderror' => 'Coudna append "$1" til "$2".',
 'filecopyerror' => 'Cuidna copy file "$1" tae "$2".',
 'filerenameerror' => 'Cuidna rename file "$1" tae "$2".',
-'filedeleteerror' => 'Cuidna delete file "$1".',
+'filedeleteerror' => 'Cuidna delyte file "$1".',
 'directorycreateerror' => 'Culdnae mak directory "$1".',
 'filenotfound' => 'Cuidna fin file "$1".',
 'fileexistserror' => 'Culdnae write tae file "$1": file is already here',
 'unexpected' => 'Vailyie isnae expectit: "$1"="$2".',
-'formerror' => 'Error: cuidna submit form',
+'formerror' => 'Mistak: cuidna haun in form',
 'badarticleerror' => 'This action canna be duin tae this page.',
-'cannotdelete' => 'The page or file "$1" coudna be deleted.
-It micht awreadie hae been deleted bi some ither bodie.',
-'cannotdelete-title' => 'Canna delete page "$1"',
-'delete-hook-aborted' => 'Deletion stappit bi hook.
-It gae nae explanation.',
-'no-null-revision' => 'Coudna create new null revision fer page "$1"',
+'cannotdelete' => 'The page or file "$1" coudna be delytit.
+It micht awreadie hae been delytit bi some ither bodie.',
+'cannotdelete-title' => 'Canna delyte page "$1"',
+'delete-hook-aborted' => 'Delytion stappit bi huik.
+It gae nae explanâtion.',
+'no-null-revision' => 'Coudna mak new null reveesion fer page "$1"',
 'badtitle' => 'Bad teitle',
 'badtitletext' => 'The requestit page teitle wis invalid, tuim, or a wranglie airtit inter-leid or inter-wiki teitle. It mibbe haes ane or mair chairacters that canna be uised in teitles.',
-'perfcached' => 'The follaeing data is cached an michtna be richt up til date. A maximum o {{PLURAL:$1|yin result is|$1 results ar}} available in the cache.',
-'perfcachedts' => 'The followin data is cached, an wis hindermaist updated $1. Ae maximum o {{PLURAL:$4|yin result is|$4 results ar}} available in the cache.',
+'perfcached' => 'The follaein data is cached n michtna be richt up til date. Ae maist muckle o {{PLURAL:$1|yin result is|$1 results ar}} available in the cache.',
+'perfcachedts' => 'The follaein data is cached, n wis hindermaist updated $1. Ae maist muckkle o {{PLURAL:$4|yin result is|$4 results ar}} available in the cache.',
 'querypage-no-updates' => 'Updates for this page ar disablit at the meenit. Data here wilnae be refreshit at the meenit.',
 'viewsource' => 'View soorce',
-'viewsource-title' => 'View source fer $1',
+'viewsource-title' => 'View soorce fer $1',
 'actionthrottled' => 'Action devalit',
-'actionthrottledtext' => 'As an anti-spam meisur, ye ar limitit frae daein this action ower mony times in a ower short tid, an ye hae exceedit this limit. Please try again in a wee.',
+'actionthrottledtext' => "Aes aen anti-spam meisur, ye'r limitit fae daein this action ower monie times in aen ower short time, n ye'v exceedit this limit. Please try again in ae few minutes.",
 'protectedpagetext' => 'This page haes been protected fer tae prevent eiditing or ither actions.',
-'viewsourcetext' => 'Ye can leuk at an copy the soorce o this page:',
-'viewyourtext' => 'Ye can view an copy the source o <strong>yer eidits</strong> til this page:',
-'protectedinterface' => 'This page provides interface tex fer the saffware on this wiki, an is protected fer tae prevent abuse.
+'viewsourcetext' => 'Ye can leuk at n copie the soorce o this page:',
+'viewyourtext' => 'Ye can see n copie the soorce o <strong>yer eedits</strong> til this page:',
+'protectedinterface' => 'This page provides interface tex fer the saffware oan this wiki, n is protected fer tae prevent abuise.
 Tae add or chynge owersets fer aw wikis, please uise [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.',
 'editinginterface' => "<strong>Warnishment:</strong> Ye'r eiditing ae page that is uised tae provide interface tex fer the saffware.
 Chynges til this page will affect the appearance o the uiser interface fer ither uisers oan this wiki.
 Tae add or chynge owersets fer aw wikis, please uise [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
-'cascadeprotected' => 'This page haes been protectit fra editin, acause it is includit in the followin {{PLURAL:$1|page|pages}}, that are protectit wi the "cascading" option turnit on:
+'cascadeprotected' => 'This page haes been protectit fae eiditin, cause it is inclædit in the follaein {{PLURAL:$1|page|pages}}, that ar protectit wi the "cascadin" optie turnit oan:
 $2',
 'namespaceprotected' => "Ye dinna hae permeession tae edit pages in the '''$1''' namespace.",
 'customcssprotected' => "Ye dinna hae permeession tae eidit this CSS page cause it contains anither uiser's personal settings.",
@@ -417,8 +418,8 @@ The grunds for this are: ''$2''.",
 'filereadonlyerror' => 'Canna modify the file "$1" cause the file repository "$2" is in read-yinly mode.
 
 The administrater that lock\'t it affered this explanation: "$3".',
-'invalidtitle-knownnamespace' => 'Onvalid title wi namespace "$2" an tex "$3"',
-'invalidtitle-unknownnamespace' => 'Onvalid title wi onken\'t namespace nummer $1 an tex "$2"',
+'invalidtitle-knownnamespace' => 'Onvalid title wi namespace "$2" n tex "$3"',
+'invalidtitle-unknownnamespace' => 'Onvalid title wi onkent namespace nummer $1 n tex "$2"',
 'exception-nologin' => 'No loggit in',
 'exception-nologin-text' => 'Please [[Special:Userlogin|log in]] tae be able tae access this page or action.',
 'exception-nologin-text-manual' => 'Please $1 tae be able tae access this page or action.',
@@ -439,33 +440,33 @@ Ye can chynge yer {{SITENAME}} [[Special:Preferences|preferences]] gif ye like.'
 'userlogin-yourname' => 'Uisername',
 'userlogin-yourname-ph' => 'Enter yer uisername',
 'createacct-another-username-ph' => 'Enter the uisername',
-'yourpassword' => 'Passwaird:',
-'userlogin-yourpassword' => 'Password.',
-'userlogin-yourpassword-ph' => 'Enter yer password',
-'createacct-yourpassword-ph' => 'Enter ae password',
-'yourpasswordagain' => 'Retype passwaird:',
-'createacct-yourpasswordagain' => 'Confirm password.',
-'createacct-yourpasswordagain-ph' => 'Enter password again.',
-'remembermypassword' => 'Mynd ma password oan this browser (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'yourpassword' => 'Passwird:',
+'userlogin-yourpassword' => 'Passwaird.',
+'userlogin-yourpassword-ph' => 'Enter yer passwaird',
+'createacct-yourpassword-ph' => 'Enter ae passwaird',
+'yourpasswordagain' => 'Retype passwird:',
+'createacct-yourpasswordagain' => 'Confirm passwaird.',
+'createacct-yourpasswordagain-ph' => 'Enter passwaird again.',
+'remembermypassword' => 'Mynd ma login oan this brouser (fer $1 {{PLURAL:$1|day|days}} at the maist)',
 'userlogin-remembermypassword' => 'Keep me loggit in',
 'userlogin-signwithsecure' => 'Uise secure connection',
 'yourdomainname' => 'Yer domain:',
 'password-change-forbidden' => 'Ye canna chynge passwords oan this wiki.',
-'externaldberror' => "Aither the wis an external authenteication database mishanter, or ye'r no alloued tae update yer external accoont.",
+'externaldberror' => "Aither thaur wis aen external authentication database mistak, or ye'r naw permitit tae update yer external accoont.",
 'login' => 'Log in',
-'nav-login-createaccount' => 'Log in / mak an accoont',
+'nav-login-createaccount' => 'Log in / cræft aen accoont',
 'loginprompt' => 'Ye maun hae cookies enabled tae log in tae {{SITENAME}}.',
-'userlogin' => 'Mak an accoont or log in',
+'userlogin' => 'Cræft aen accoont or log in',
 'userloginnocreate' => 'Log in.',
 'logout' => 'Log oot',
 'userlogout' => 'Log oot',
-'notloggedin' => 'No loggit in',
+'notloggedin' => 'Naw loggit in',
 'userlogin-noaccount' => 'Dinna hae aen accoont?',
 'userlogin-joinproject' => 'Jyn {{SITENAME}}',
-'nologin' => "Dinna hae an accoont? '''$1'''.",
-'nologinlink' => 'Mak an accoont',
+'nologin' => 'Dinna hae aen accoont? $1.',
+'nologinlink' => 'Cræft aen accoont',
 'createaccount' => 'Mak new accoont',
-'gotaccount' => "Got an accoont afore? '''$1'''.",
+'gotaccount' => 'Awreadie hae aen accoont? $1.',
 'gotaccountlink' => 'Log in',
 'userlogin-resetlink' => 'Forgotten yer login details?',
 'userlogin-resetpassword-link' => 'Fergot yer password?',
@@ -473,22 +474,22 @@ Ye can chynge yer {{SITENAME}} [[Special:Preferences|preferences]] gif ye like.'
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Heelp wi loggin in]]',
 'userlogin-loggedin' => "Ye'r awreadie loggit in as {{GENDER:$1|$1}}.
 Uise the form ablow tae log in as anither uiser.",
-'userlogin-createanother' => 'Create anither accoont',
+'userlogin-createanother' => 'Mak anither accoont',
 'createacct-join' => 'Enter yer information ablow.',
 'createacct-another-join' => "Enter the new accoont's information ablow.",
 'createacct-emailrequired' => 'Wab-mail address',
 'createacct-emailoptional' => 'Wab-mail address (optional)',
 'createacct-email-ph' => 'Enter yer wab-mail address',
 'createacct-another-email-ph' => 'Enter wab-mail address',
-'createaccountmail' => 'Uise ae temporarie random password an send it til the speceefied wab-mail address',
+'createaccountmail' => 'Uise ae temporarie random passwaird n send it til the speceefied wab-mail address',
 'createacct-realname' => 'Real name (optional).',
 'createaccountreason' => 'Raison:',
 'createacct-reason' => 'Raison',
 'createacct-reason-ph' => 'Why ar ye creating anither accoont',
 'createacct-captcha' => 'Security check.',
 'createacct-imgcaptcha-ph' => 'Enter the tex ye see abuin',
-'createacct-submit' => 'Create yer accoont',
-'createacct-another-submit' => 'Create anither accoont',
+'createacct-submit' => 'Mak yer accoont',
+'createacct-another-submit' => 'Mak anither accoont',
 'createacct-benefit-heading' => '{{SITENAME}} is made bi fowk like ye.',
 'createacct-benefit-body1' => '{{PLURAL:$1|eidit|eidits}}',
 'createacct-benefit-body2' => '{{PLURAL:$1|page|pages}}.',
@@ -496,12 +497,12 @@ Uise the form ablow tae log in as anither uiser.",
 'badretype' => 'The passwords ye entered disna match.',
 'userexists' => 'The uiser name ye entered is awreadie in uiss. Please chuise ae different name.',
 'loginerror' => 'Login mishanter',
-'createacct-error' => 'Accoont creation mistak',
-'createaccounterror' => 'Coudna create accoont: $1',
-'nocookiesnew' => "The uiser accoont wis creatit, but ye'r no loggit in. {{SITENAME}} uises cookies tae log uisers in. Ye hae cookies disabled. Please enable them, than log in wi yer new uisername and password.",
+'createacct-error' => 'Accoont cræftin mistak',
+'createaccounterror' => 'Coudna mak accoont: $1',
+'nocookiesnew' => "The uiser accoont wis cræftit, but ye'r naw loggit in. {{SITENAME}} uises cookies tae log uisers in. Ye hae cookies disabled. Please enable them, than log in wi yer new uisername n passwaird.",
 'nocookieslogin' => '{{SITENAME}} uises cookies tae log in uisers. Ye hae cookies disabled. Please enable thaim an gie it anither shot.',
-'nocookiesfornew' => 'The uiser accoont wisna created, as we couda confirm its source.
-Ensure that ye have cookies enabled, relaid this page an try again.',
+'nocookiesfornew' => 'The uiser accoont wisna cræftit, aes we couda confirm its soorce.
+Ensure that ye have cookies enabled, relaid this page n gie it anither shote.',
 'noname' => "Ye hivna specifee'd a valid uisername.",
 'loginsuccesstitle' => 'Login fine',
 'loginsuccess' => 'Ye\'re nou loggit in tae {{SITENAME}} as "$1".',
@@ -510,30 +511,30 @@ Uiser names are case-sensitive.
 Check yer spellin, or uise [[Special:UserLogin/signup|mak a new accoont]].',
 'nosuchusershort' => 'The\'r nae sic uiser as "$1". Check yer spellin.',
 'nouserspecified' => 'Ye hae tae merk up a uisername.',
-'login-userblocked' => 'Uiser "$1" is blockit. Log-in no alloued.',
+'login-userblocked' => 'Uiser "$1" is blockit. Log-in naw permitit.',
 'wrongpassword' => 'The password ye entered is wrang. Please gie it anither shot.',
 'wrongpasswordempty' => 'The password ye entered is blank. Please gie it anither shot.',
 'passwordtooshort' => 'Yer password is ower short.
 It maun hae at laest {{PLURAL:$1|1 chairacter|$1 chairacters}}.',
 'password-name-match' => 'Yer password maun be different fae yer uisername.',
-'password-login-forbidden' => 'The uise o this uisername an password haes been ferbidden.',
+'password-login-forbidden' => 'The uise o this uisername n passwaird haes been ferbidden.',
 'mailmypassword' => 'Reset password',
 'passwordremindertitle' => 'Password reminder frae {{SITENAME}}',
 'passwordremindertext' => 'Somebodie (liklie ye, fae IP address $1) requested ae new
-password fer {{SITENAME}} ($4). Ae temporarie password fer uiser "$2" haes been creatit an wis set til "$3". Gif this wis yer intent, ye will need tae log in an chuise ae new password now.
-Yer temporarie password will expire in {{PLURAL:$5|one day|$5 days}}.
+passwaird fer {{SITENAME}} ($4). Ae temporarie passwaird fer uiser "$2" haes been cræftit n wis set til "$3". Gif this wis yer intent, ye will need tae log in n chuise ae new passwaird nou.
+Yer temporarie passwaird will expire in {{PLURAL:$5|yin day|$5 days}}.
 
-Gif somebodie else made this request, or gif ye hae mindit yer password, an ye nae langer wish tae chynge it, ye can ignore this message an continue uising yer auld password.',
-'noemail' => 'The\'r nae e-mail address recordit for uiser "$1".',
+Gif some ither bodie makit this request, or gif ye hae myndit yer passwaird, n ye nae langer wish tae chynge it, ye can ignore this message n continue uisin yer auld passwaird.',
+'noemail' => 'Thaur\'s nae wab-mail address recordit fer uiser "$1".',
 'noemailcreate' => 'Ye need tae provide ae valid wab-mail address.',
 'passwordsent' => 'A new password haes been sent tae the e-mail address registert for "$1". Please log in again efter ye receive it.',
 'blocked-mailpassword' => 'Yer IP address is blockit frae editin, sae it
 canna uise the password recovery function, for tae prevent abuiss.',
 'eauthentsent' => "Ae confirmation wab-mail haes been sent til the speceefied wab-mail address.
-Afore oni ither wab-mail is sent til the accoont, ye'll hae to follae the instructions in the wab-mail, sae as tae confirm that the accoont is reallie yers.",
+Afore oni ither wab-mail is sent til the accoont, ye'll hae tae follae the instructions in the wab-mail, sae as tae confirm that the accoont is reallie yers.",
 'throttled-mailpassword' => 'Ae password reset wab-mail haes awreadie been sent, wiin the laist {{PLURAL:$1|hoor|$1 hoors}}.
 Tae hinder abuiss, yinly the yin password reset wab-mail will be sent per {{PLURAL:$1|hoor|$1 hoors}}.',
-'mailerror' => 'Error sendin mail: $1',
+'mailerror' => 'Mistak sendin mail: $1',
 'acct_creation_throttle_hit' => 'Veesitors tae this wiki uisin yer IP address haev created $1 {{PLURAL:$1|accoont|accoonts}} the day, which is the maist permeettit in that lang.
 Sae veesitors uisin this IP address canna mak ony mair accoonts juist noo.',
 'emailauthenticated' => 'Yer wab-mail address wis confirmed oan $2 at $3.',
@@ -541,17 +542,17 @@ Sae veesitors uisin this IP address canna mak ony mair accoonts juist noo.',
 Nae wab-mail will be sent fer oni o the follaein features.',
 'noemailprefs' => "Nae email address haes been specifee'd, the follaein featurs willna wirk.",
 'emailconfirmlink' => 'Check yer e-mail address',
-'invalidemailaddress' => 'The email address canna be acceptit syne it seems tae be formattit wrang.
-Please enter a weel-formattit address or mak that field tuim.',
+'invalidemailaddress' => 'The wab-mail address canna be acceptit sin it seems tae be formattit wrang.
+Please enter ae weel-formattit address or mak that field tuim.',
 'cannotchangeemail' => 'Accoont wab-mail addresses canna be chynged oan this wiki.',
 'emaildisabled' => 'This site canna send wab-mails.',
 'accountcreated' => 'Accoont creatit',
-'accountcreatedtext' => 'The uiser accoont fer [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) haes been creatit.',
+'accountcreatedtext' => 'The uiser accoont fer [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|tauk]]) haes been cræftit.',
 'createaccount-title' => 'Accoont makin for {{SITENAME}}',
-'createaccount-text' => 'Somebodie creatit aen accoont fer yer wab-mail address oan {{SITENAME}} ($4) named "$2", wi password "$3".
-You should log in and change your password now.
+'createaccount-text' => 'Somebodie cræftit aen accoont fer yer wab-mail address oan {{SITENAME}} ($4) named "$2", wi passwaird "$3".
+Ye shid log in n chynge yer passwaird nou.
 
-Ye can ignore this message, gif this accoont wis creatit bi mistak.',
+Ye can ignore this message, gif this accoont wis cræftit bi mistak.',
 'usernamehasherror' => 'Uisername canna contain hash chairacters',
 'login-throttled' => "Ye'v made ower moni recent login attempts.
 Please wait $1 afore trying again.",
@@ -561,7 +562,7 @@ Please wait $1 afore trying again.",
 'createacct-another-realname-tip' => 'Real name is aen optie.
 Gif ye chuise tae provide it, this will be uised fer giein the uiser attreebution fer their wark.',
 'pt-login' => 'Log in',
-'pt-createaccount' => 'Create accoont',
+'pt-createaccount' => 'Mak accoont',
 'pt-userlogout' => 'Log oot',
 
 # Email sending
@@ -576,7 +577,7 @@ Gif ye chuise tae provide it, this will be uised fer giein the uiser attreebutio
 'oldpassword' => 'Auld password',
 'newpassword' => 'New passwaird:',
 'retypenew' => 'Retype new passwaird:',
-'resetpass_submit' => 'Mak passwaird an log in',
+'resetpass_submit' => 'Set passwaird n log in',
 'changepassword-success' => 'Yer passwaird chynge wis braw!',
 'changepassword-throttled' => "Ye'v made ower moni recent login attempts.
 Please wait $1 afore trying again.",
@@ -592,7 +593,7 @@ Tae finish loggin in, ye maun set ae new passwaird here:',
 'resetpass-temp-password' => 'Temperie passwaird:',
 'resetpass-abort-generic' => 'Passwaird chynge haes been aborted bi aen extension.',
 'resetpass-expired' => 'Yer passwaird haes expired. Please set ae new passwaird tae log-in.',
-'resetpass-expired-soft' => 'Yer passwaird haes expired, an needs tae be reset. Please chuise ae new passwaird nou, or clap oan cancel tae reset it later.',
+'resetpass-expired-soft' => 'Yer passwaird haes expired n needs tae be reset. Please chuise ae new passwaird nou, or clap oan "{{int:resetpass-submit-cancel}}" tae reset it later.',
 
 # Special:PasswordReset
 'passwordreset' => 'Reset passwaird',
@@ -603,7 +604,7 @@ Tae finish loggin in, ye maun set ae new passwaird here:',
 'passwordreset-emaildisabled' => 'Wab-mail features hae been disabled oan this wiki.',
 'passwordreset-username' => 'Uisername:',
 'passwordreset-capture' => 'View the resultin wab-mail?',
-'passwordreset-capture-help' => 'Gif ye check this box, the wab-mail (wi the temperie passwaird) will be shawn til ye an be sent til the uiser ava.',
+'passwordreset-capture-help' => 'Gif ye check this kist, the wab-mail (wi the temperie passwaird) will be shawn til ye n be sent til the uiser ava.',
 'passwordreset-email' => 'Wab-mail address:',
 'passwordreset-emailtitle' => 'Accoont details oan {{SITENAME}}',
 'passwordreset-emailtext-ip' => "Somebodie (likely ye, fae IP address $1) requested ae reset o yer passwaird fer {{SITENAME}} ($4). The follaein uiser {{PLURAL:$3|accoont is|accoonts ar}}
@@ -611,17 +612,16 @@ associated wi this wab-mail address:
 
 $2
 
-{{PLURAL:$3|This temperie passwaird|These temperie passwairds}} will expire in {{PLURAL:$5|yin day|$5 days}}.
-Ye shid log in an chuise ae new passwaird nou. Gif some ither bodie made this request, or gif ye'v mynded yer oreeginal passwaird, an ye nae longer
-wish tae chynge it, ye can ignore this message an continue uising yer auld passwaird.",
+{{PLURAL:$3|This temperie passwaird|Thir temperie passwairds}} will expire in {{PLURAL:$5|yin day|$5 days}}.
+Ye shid log in n chuise ae new passwaird nou. Gif some ither bodie makit this request, or gif ye'v mynded yer oreeginal passwaird, n ye nae longer
+wish tae chynge it, ye can ignore this message n continue uisin yer auld passwaird.",
 'passwordreset-emailtext-user' => "Uiser $1 oan {{SITENAME}} requested ae reset o yer passwaird fer {{SITENAME}}
 ($4). The follaein uiser {{PLURAL:$3|accoont is|accoonts ar}} associated wi this wab-mail address:
 
 $2
 
-{{PLURAL:$3|This temperie passwaird|These temperie passwairds}} will expire in {{PLURAL:$5|yin day|$5 days}}.
-Ye shid log in an chuise ae new password nou. Gif some ither bodie made this request, or gif ye'v mynded yer oreeginal passwaird, an ye nae longer wish tae chynge it, ye can ignore this message an continue uisin yer auld
-passwaird.",
+{{PLURAL:$3|This temperie passwaird|Thir temperie passwairds}} will expire in {{PLURAL:$5|yin day|$5 days}}.
+Ye shid log in n chuise ae new password nou. Gif some ither bodie haes makit this request, or gif ye'v mynded yer oreeginal passwaird, n ye nae langer wish tae chynge it, ye can ignore this message n continue uisin yer auld passwaird.",
 'passwordreset-emailelement' => 'Uisername: $1
 Temperie passwaird: $2',
 'passwordreset-emailsent' => 'Ae passwaird reset wab-mail haes been sent.',
@@ -656,17 +656,17 @@ Ye shid dae it gif ye accidentally shaired theim wi somebodie or gif yer accoont
 'resettokens-resetbutton' => 'Reset selected tokens.',
 
 # Edit page toolbar
-'bold_sample' => 'Bauld text',
-'bold_tip' => 'Bauld text',
-'italic_sample' => 'Italic text',
-'italic_tip' => 'Italic text',
+'bold_sample' => 'Baud tex',
+'bold_tip' => 'Baud tex',
+'italic_sample' => 'Italic tex',
+'italic_tip' => 'Italic tex',
 'link_sample' => 'Airtin teitle',
 'link_tip' => 'Internal airtin',
 'extlink_sample' => 'http://www.example.com airtin teitle',
-'extlink_tip' => 'Airtin tae an outby steid (mynd the http:// prefix)',
-'headline_sample' => 'Heidline text',
+'extlink_tip' => 'External link (mynd the http:// prefix)',
+'headline_sample' => 'Heidline tex',
 'headline_tip' => 'Level 2 heidline',
-'nowiki_sample' => 'Insert non-formattit text here',
+'nowiki_sample' => 'Insert non-formattit tex here',
 'nowiki_tip' => 'Ignore wiki formattin',
 'image_sample' => 'Exemplar.jpg',
 'image_tip' => 'Embeddit eimage',
@@ -678,35 +678,35 @@ Ye shid dae it gif ye accidentally shaired theim wi somebodie or gif yer accoont
 # Edit pages
 'summary' => 'Ootline:',
 'subject' => 'Subject/headline:',
-'minoredit' => 'This is a smaa edit',
+'minoredit' => 'This is ae smaa eedit',
 'watchthis' => 'Leuk ower this page',
 'savearticle' => 'Hain page',
 'preview' => 'Scance',
 'showpreview' => 'Scance ower',
 'showlivepreview' => 'Live leuk ower',
 'showdiff' => 'Shaw chynges',
-'anoneditwarning' => "Ye arna loggit in. Yer IP address will be recordit in this page's edit history.",
+'anoneditwarning' => "<strong>Warnishment:</strong>Ye'r naw loggit in. Yer IP address will be recordit in this page's eedit histerie.",
 'anonpreviewwarning' => "<em>Ye'r no loggit in. hainin will record yer IP address in this page's eidit history.</em>",
-'missingsummary' => "'''Mynd:''' Ye hivna gien an edit summary. Gin ye dab on Hain again, yer edit will be haint athoot ane.",
+'missingsummary' => '<strong>Mynd:</strong> Ye\'v naw gien aen eedit owerview. Gif ye clap oan "{{int:savearticle}}" again, yer eedit will be haint wioot ane.',
 'missingcommenttext' => 'Please enter a comment ablo.',
-'missingcommentheader' => '<strong>Mynd:</strong> Ye\'v no provided ae subject/headline fer this comment.
-If you clap "{{int:savearticle}}" again, yer edit will be saved wiout yin.',
+'missingcommentheader' => '<strong>Mynd:</strong> Ye\'v naw provided ae subject/heidline fer this comment.
+Gif ye clap "{{int:savearticle}}" again, yer eedit will be hained wioot yin.',
 'summary-preview' => 'Ootline leuk ower:',
 'subject-preview' => 'Subject/headline leuk ower:',
 'blockedtitle' => 'Uiser is blockit',
 'blockedtext' => '<strong>Yer uisername or IP address haes been blockit.</strong>
 
-The block wis made bi $1.
+The block wis makit bi $1.
 The raison gieen is <em>$2</em>.
 
-* Stert o block: $8
-* Expiry o block: $6
+* Stairt o block: $8
+* Expirie o block: $6
 * Intended blockee: $7
 
-Ye can contact $1 or anither [[{{MediaWiki:Grouppage-sysop}}|admeenistræter]] tae discuss the block.
-Ye canna uise the "wab-mail this uiser" feature onless ae valid wab-mail address is speceefied in yer [[Special:Preferences|accoont preferences]] an ye\'v no been blockit fae uising it.
-Your current IP address is $3, an the block ID is #$5.
-Please inclæde aw the abuin details in oni speirins ye mak.',
+Ye can contact $1 or anither [[{{MediaWiki:Grouppage-sysop}}|admeenistrater]] tae discuss the block.
+Ye canna uise the "wab-mail this uiser" feature onless ae valid wab-mail address is speceefied in yer [[Special:Preferences|accoont preferences]] n ye\'v naw been blockit fae uisin it.
+Yer current IP address is $3, n the block ID is #$5.
+Please incluide aw the abuin details in onie speirins that ye mak.',
 'autoblockedtext' => 'Yer IP address haes been autæmaticly blockit cause it wis uised bi anither uiser, wha wis blockit bi $1.
 The raison gieen is:
 
@@ -724,40 +724,40 @@ Yer current IP address is $3, an the block ID is #$5.
 Please inclæde aw abuin details in oni speirins ye mak.',
 'blockednoreason' => 'nae grunds put',
 'whitelistedittext' => 'Ye hae tae $1 tae edit pages.',
-'confirmedittext' => 'Ye maun confirm yer e-mail address afore editin pages. Please set an validate yer e-mail address throu yer [[Special:Preferences|uiser settins]].',
+'confirmedittext' => 'Ye maun confirm yer wab-mail address afore eeditin pages. Please set n validate yer wab-mail address throogh yer [[Special:Preferences|uiser settins]].',
 'nosuchsectiontitle' => 'Canna find section',
 'nosuchsectiontext' => 'Ye tried tae eidit ae section that disna exist.
-It micht hae been muived or deleted while ye were viewing the page.',
+It micht hae been muived or delytit while ye were viewing the page.',
 'loginreqtitle' => 'Login Requirit!',
 'loginreqlink' => 'log in',
 'loginreqpagetext' => 'Ye maun $1 tae view ither pages.',
 'accmailtitle' => 'Passwaird sent.',
 'accmailtext' => 'Ae randomly generated passwaird fer [[User talk:$1|$1]] haes been sent til $2. It can be chynged oan the <em>[[Special:ChangePassword|chynge passwaird]]</em> page upo loggin in.',
 'newarticle' => '(New)',
-'newarticletext' => "Ye'v follaed an airtin til a page that disna exist yet. Tae create the page, stert typin in the box ablo (see the [[{{MediaWiki:Helppage}}|help page]] for mair info). Gin ye'r here by mistak, juist dab yer brouser's '''back''' button.",
+'newarticletext' => "Ye'v follaed ae link til ae page that disna exist yet. Tae mak the page, stairt typin in the kist ablo (see the [[{{MediaWiki:Helppage}}|heelp page]] fer mair info). Gif ye'r here bi mistak, juist clap yer brouser's '''back''' button.",
 'anontalkpagetext' => "----
-<em>This is the discussion page fer aen anonymous uiser wha's no created aen accoont yet, or wha disna uise it.</em>
-We mauntherefore uise the numerical IP address tae identify him/her.
+<em>This is the discussion page fer aen anonymoos uiser that's naw cræftit aen accoont yet, or that disna uise it.</em>
+We maun therefore uise the numerical IP address tae identifie him/her.
 Sic aen IP address can be shaired bi several uisers.
-Gif ye'r aen anonymous uiser an feel that irrelevant comments hae been directed at ye, please [[Special:UserLogin/signup|create aen accoont]] or [[Special:UserLogin|log in]] tae avoid future confusion wi ither anonymous uisers.",
-'noarticletext' => 'The\'r nae text on this page the nou. 
-Ye can [[Special:Search/{{PAGENAME}}|rake for this page teitle]] in ither pages,
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rake th\' related logs],
- or [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit this page].</span>',
+Gif ye'r aen anonymos uiser n feel that onreelavant comments hae been directed at ye, please [[Special:UserLogin/signup|cræft aen accoont]] or [[Special:UserLogin|log in]] tae avoid futur confusion wi ither anonymoos uisers.",
+'noarticletext' => 'Thaur\'s naw tex oan this page the nou. 
+Ye can [[Special:Search/{{PAGENAME}}|rake fer this page teitle]] in ither pages,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rake the related logs],
+ or [{{fullurl:{{FULLPAGENAME}}|action=edit}} eidit this page].</span>',
 'noarticletext-nopermission' => 'There isna oni tex in this page the nou.
-Ye can [[Special:Search/{{PAGENAME}}|rake fer this page title]] in ither pages, or <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rake the relatit logs]</span>, but ye dina hae permeession tae create this page.',
-'missing-revision' => 'The revision #$1 o the page named "{{PAGENAME}}" disna exist.
+Ye can [[Special:Search/{{PAGENAME}}|rake fer this page title]] in ither pages, or <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rake the relatit logs]</span>, but ye dina hae permeession tae mak this page.',
+'missing-revision' => 'The reveesion #$1 o the page named "{{PAGENAME}}" disna exist.
 
-This is usually caused bi follaein aen ootdated histerie link til ae page that haes been deletit.
-Details can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].',
-'userpage-userdoesnotexist' => 'Uiser accoont "<nowiki>$1</nowiki>" hasnae been registerit. Please check gin ye wint tae mak or edit this page.',
+This is usuallie caused bi follaein aen ootdated histerie link til ae page that haes been delytit.
+Details can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].',
+'userpage-userdoesnotexist' => 'Uiser accoont "<nowiki>$1</nowiki>" hasnae been registerit. Please check gin ye wint tae mak or eidit this page.',
 'userpage-userdoesnotexist-view' => 'Uiser accoont "$1" isna registered.',
 'blocked-notice-logextract' => 'This uiser is currently blockit.
 The latest block log entry is provided ablow fer reference:',
-'clearyourcache' => "<strong>Tak tent:</strong> Efter hainin, ye micht hae tae bypass yer brouser's cache tae see the chynges.
-* <strong>Firefox / Safari:</strong> Hold <em>Shift</em> while clapin <em>Relaid</em>, or press either <em>Ctrl-F5</em> or <em>Ctrl-R</em> (<em>⌘-R</em> on a Mac)
+'clearyourcache' => "<strong>Tak tent:</strong> Efter hainin, ye micht hae tae bipass yer brouser's cache tae see the chynges.
+* <strong>Firefox / Safari:</strong> Haud <em>Shift</em> while clapin <em>Relaid</em>, or press either <em>Ctrl-F5</em> or <em>Ctrl-R</em> (<em>⌘-R</em> oan ae Mac)
 * <strong>Google Chrome:</strong> Press <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> on a Mac)
-* <strong>Internet Explorer:</strong> Hold <em>Ctrl</em> while clapin <em>Refresh</em>, or press <em>Ctrl-F5</em>
+* <strong>Internet Explorer:</strong> Haud <em>Ctrl</em> while clapin <em>Refresh</em>, or press <em>Ctrl-F5</em>
 * <strong>Opera:</strong> Clear the cache in <em>Tuils → Preferences</em>",
 'usercssyoucanpreview' => '<strong>Tip:</strong> Uise the "{{int:showpreview}}" button tae test yer new CSS afore hainin.',
 'userjsyoucanpreview' => '<strong>Tip:</strong> Uise the "{{int:showpreview}}" button tae test yer new JavaScript afore hainin.',
@@ -768,95 +768,95 @@ It haesna been hained yet!</strong>",
 It's no been hained yet!</strong>",
 'sitejspreview' => "<strong>Mynd that ye'r yinly previewing this JavaScript code.
 It's no been hained yet!</strong>",
-'userinvalidcssjstitle' => "'''Warnin:''' There isnae a skin \"\$1\". Mynd that yer ain .css an .js pages uise a lowercase teetle, e.g. {{ns:user}}:Foo/vector.css instead o {{ns:user}}:Foo/Vector.css.",
+'userinvalidcssjstitle' => '<strong>Warnishment</strong> There isnae ae skin "$1". Mynd that yer ain .css an .js pages uise a lowercase teetle, e.g. {{ns:user}}:Foo/vector.css instead o {{ns:user}}:Foo/Vector.css.',
 'updated' => '(Updatit)',
 'note' => "'''Mynd:'''",
 'previewnote' => '<strong>Mynd that this is yinly ae scænce-ower.</strong>
 Yer chynges hae no been hained yet!',
 'continue-editing' => 'Gae til eiditing area',
-'previewconflict' => 'This scance reflects the text in the upper text editin area like it will kythe gin ye chuise tae save.',
-'session_fail_preview' => "'''Sairy! We culdnae process yer edit acause o a loss o term data.
-Please try again. Gin it disnae wairk still, try loggin oot an loggin in again.'''",
-'session_fail_preview_html' => '<strong>Sairrie! We coudna process yer eidit cause o ae loss o session data.</strong>
-
-<em>Cause {{SITENAME}} haes raw HTML enabled, the preview is hidden aes ae precaution again JavaScript attacks.</em>
-
-<strong>Gif this is ae legitimate eidit attempt, please try again.</strong>
-Gif it still disna wairk, try [[Special:UserLogout|loggin oot]] an loggin back in.',
-'token_suffix_mismatch' => "'''Yer edit haes been rejectit acause yer client made a richt mess o the punctuation characters
-in the edit token. The edit haes been rejectit tae hinder corruption o the page text.
-This whiles happens when ye are uisin a bruken web-based anonymous proxy service.'''",
-'edit_form_incomplete' => '<strong>Some pairts o the eidit form didna reach the server; dooble-check that yer eidits ar intact an try again.</strong>',
+'previewconflict' => 'This scance reflects the tex in the upper tex eiditin area like it will kythe gin ye chuise tae hain.',
+'session_fail_preview' => "'''Sairy! We culdnae process yer eidit acause o ae loss o term data.'''
+Please gie it anither gae. Gin it disnae wairk still, gie [[Special:UserLogout|loggin oot]] n loggin back in again ae gae.",
+'session_fail_preview_html' => '<strong>Sairrie! We coudna process yer eedit cause o ae loss o session data.</strong>
+
+<em>Cause {{SITENAME}} haes raw HTML enabled, the owerluik is skaukt aes ae precaution again JavaScript attacks.</em>
+
+<strong>Gif this is ae legeetimate eedit attempt, please gei it anither gae.</strong>
+Gif it still disna wairk, try [[Special:UserLogout|loggin oot]] n loggin back in.',
+'token_suffix_mismatch' => '<strong>Yer eidit haes been rejectit acause yer client made ae richt mess o the punctuation characters in the eidit token.</strong>
+The eidit haes been rejectit tae hinder corruption o the page tex.
+This whiles happens when ye ar uisin ae bruken web-based anonymous proxie service.',
+'edit_form_incomplete' => '<strong>Some pairts o the eedit form didna reach the server; dooble-check that yer edits ar intact n gie it anither gae.</strong>',
 'editing' => 'Editin $1',
 'creating' => 'Makin $1',
 'editingsection' => 'Editin $1 (section)',
 'editingcomment' => 'Editin $1 (new section)',
-'editconflict' => 'Edit conflict: $1',
-'explainconflict' => "Some ither body haes chynged this page syne ye stertit editin it.
-The upper text area hauds the page text as it currently exists.
-Yer chynges is shawn in the lower text area.
-Ye'll hae tae merge yer chynges intae the existin text.
-'''Juist''' the text in the upper text area will be hained whan ye press \"{{int:savearticle}}\".",
-'yourtext' => 'Yer text',
+'editconflict' => 'Eidit conflict: $1',
+'explainconflict' => 'Some ither body haes chynged this page syne ye stertit eiditin it.
+The upper tex area hauds the page tex aes it currentlie exeests.
+Yer chynges is shawn in the lower tex area.
+Ye\'ll hae tae merge yer chynges intil the exeestin tex.
+<strong>Juist</strong> the tex in the upper tex area will be hained whan ye press "{{int:savearticle}}".',
+'yourtext' => 'Yer tex',
 'storedversion' => 'Storit version',
-'nonunicodebrowser' => "'''WARNIN: Yer brouser isna unicode compliant.  The'r a wirkaroond tae allou ye tae sauflie edit airticles: non-ASCII characters will kythe in the edit box as hexadecimal codes.'''",
-'editingold' => "'''WARNIN: Ye'r editin an oot-o-date reveision o this page. Gin ye hain it, onie chynges made syne this reveision will be lost.'''",
+'nonunicodebrowser' => '<strong>Warnishment: Yer brouser isna unicode compliant.</strong> Ae wairkaroond is in place tae permit ye tae sauflie eedit airticles: non-ASCII chairacters will kythe in the eedit kist aes hexadecimal codes.',
+'editingold' => "<strong>Warnishment:</strong> Ye'r eiditin aen oot-o-date reveesion o this page. Gin ye hain it, onie chynges makit sin this reveesion will be lost.",
 'yourdiff' => 'Differs',
-'copyrightwarning' => "Please mynd that aa contreibutions tae {{SITENAME}} is conseidert tae be released unner the $2 (see $1 for details). Gin ye dinna want yer writin tae be editit athoot mercy an redistribute at will, than dinna submit it here.<br /> Forbye thon, ye'r promisin us that ye wrat this yersel, or copied it frae a public domain or siclike free resoorce. '''DINNA SUBMIT COPYRICHTIT WARK ATHOOT PERMEISSION!'''",
-'copyrightwarning2' => "Please mynd that aa contreibutions tae {{SITENAME}} micht be editit, chynged, or remuved bi ither contreibutors.
-Gin ye dinna want yer writin tae be editit athoot mercy and redistribute at will, than dinna submit it here.<br />
-YYe'r promisin us forbye that ye wrat this yersel, or copied it frae a
-public domain or siclike free resoorce (see $1 for details).
-'''DINNA SUBMIT COPYRICHTIT WARK ATHOOT PERMEISSION!'''",
-'longpageerror' => "<strong>Mistak: The tex ye'v submitted is {{PLURAL:$1|yin kilobyte|$1 kilobytes}} lang, an this is langer nor the maximum o {{PLURAL:$2|yin kilobyte|$2 kilobytes}}.</strong>
+'copyrightwarning' => "Please mynd that aw contreebutions til {{SITENAME}} is conseedert tae be released unner the $2 (see $1 for details). Gif ye dinna want yer writin tae be eeditit wioot mercie n redistreebuted at will, than dinna haun it it here.<br /> Forbye thon, ye'r promisin us that ye wrat this yersel, or copied it fae ae publeec domain or siclike free resoorce. <strong>Dinna haun in copierichtit wark wioot permeession!</strong>",
+'copyrightwarning2' => "Please mynd that aa contreebutions til {{SITENAME}} micht be eeditit, chynged, or remuived bi ither contreebuters.
+Gin ye dinna want yer writin tae be eeditit wioot mercie n redistreebuted at will, than dinna haun it in here.<br />
+Ye'r promisin us forbye that ye wrat this yersel, or copied it fae ae
+publeec domain or siclike free resoorce (see $1 fer details).
+<strong>Dinna haun in copierichtit wark wioot permeession!</strong>",
+'longpageerror' => "<strong>Mistak: The tex ye'v submitted is {{PLURAL:$1|yin kilobyte|$1 kilobytes}} lang, n this is langer than the maist muckle o {{PLURAL:$2|yin kilobyte|$2 kilobytes}}.</strong>
 It canna be hained.",
-'readonlywarning' => "<strong>Warnishment: The database haes been lockit fer maintenance, sae ye'll no be able tae hain yer eidits richt nou.</strong>
-You micht wish tae copy an paste yer tex intil ae tex file an hain it fer later.
+'readonlywarning' => "<strong>Warnishment: The database haes been lockit fer maintenance, sae ye'll no be able tae hain yer eedits richt nou.</strong>
+Ye micht wish tae copie n paste yer tex intil ae tex file n hain it fer later.
 
 The admeenistræter that lockit it affered this explanation: $1",
-'protectedpagewarning' => '<strong>Warnishment: This page haes been protectit sae that yinly uisers wi admeenistræter privileges can edit it.</strong>
-The latest log entry is provided ablow fer reference:',
+'protectedpagewarning' => '<strong>Warnishment: This page haes been protectit sae that yinly uisers wi admeenistræter preevileges can eidit it.</strong>
+The latest log entrie is provided ablo fer reference:',
 'semiprotectedpagewarning' => '<strong>Note:</strong> This page haes been protected sae that yinly registered uisers can eidit it.
 The latest log entry is provided ablow fer reference:',
-'cascadeprotectedwarning' => "'''Warnin:''' This page haes been lockit sae that only uisers wi sysop richts can edit it, acause it is includit in the followin cascade-protectit {{PLURAL:$1|page|pages}}:",
-'titleprotectedwarning' => '<strong>Warnishment: This page haes been protected sae that [[Special:ListGroupRights|speecific richts]] ar needed tae create it.</strong>
-The latest log entry is provided ablow fer reference:',
-'templatesused' => '{{PLURAL:$1|Template|Templates}} used on this page:',
+'cascadeprotectedwarning' => '<strong>Warnishment:</strong> This page haes been lockit sae that yinlie uisers wi admeenisræter richts can eidit it, acause it is inclædit in the follaein cascade-protectit {{PLURAL:$1|page|pages}}:',
+'titleprotectedwarning' => '<strong>Warnishment: This page haes been protected sae that [[Special:ListGroupRights|speecific richts]] ar needed tae mak it.</strong>
+The laitest log entry is provided ablo fer reference:',
+'templatesused' => '{{PLURAL:$1|Template|Templates}} uised oan this page:',
 'templatesusedpreview' => '{{PLURAL:$1|Template|Templates}} uised in this scænce-ower:',
 'templatesusedsection' => '{{PLURAL:$1|Template|Templates}} uised in this section:',
 'template-protected' => '(protectit)',
 'template-semiprotected' => '(semi-protectit)',
-'hiddencategories' => 'This page is a member of {{PLURAL:$1|1 hidden category|$1 hidden categories}}:',
-'nocreatetext' => '{{SITENAME}} haes restricted the ability tae mak new pages.
-Ye can gae back an edit aen existing page, or [[Special:UserLogin|log in or mak aen accoont]].',
+'hiddencategories' => "This page is ae member o {{PLURAL:$1|1 skauk't categerie|$1 skauk't categeries}}:",
+'nocreatetext' => '{{SITENAME}} haes restricted the abeelitie tae cræft new pages.
+Ye can gang back n eedit aen exestin page, or [[Special:UserLogin|log in or cræft aen accoont]].',
 'nocreate-loggedin' => 'Ye dinnae hae the richts tae mak new pages.',
 'sectioneditnotsupported-title' => 'Section eiditin isna supported',
 'sectioneditnotsupported-text' => 'Section eiditing isna supported in this page.',
 'permissionserrors' => 'Permission mistak',
 'permissionserrorstext' => 'Ye dinnae hae the richts tae dae that, acause o the followin {{PLURAL:$1|grund|grunds}}:',
-'permissionserrorstext-withaction' => 'Ye dinna hae the richts tae $2, for the follaein {{PLURAL:$1|reason|reasons}}:',
-'recreate-moveddeleted-warn' => "'''Warnin: Ye are makkin a page that haes been deletit.'''
+'permissionserrorstext-withaction' => 'Ye dinna hae the richts tae $2, fer the follaein {{PLURAL:$1|raison|raisons}}:',
+'recreate-moveddeleted-warn' => "<strong>Warnishment: Ye'r recræftin ae page that haes been delytit.</strong>
 
-Ye shuld check that it is guid tae keep editin this page.
-The deletion and flit log for this page is providit here:",
-'moveddeleted-notice' => 'This page haes bin deletit. 
-The deletion and flit log fur the page are provided below fur reference.',
+Ye shid check that it is guid tae keep eeditin this page.
+The delytion n muiv log fer this page is providit here fer conveeniance:",
+'moveddeleted-notice' => 'This page haes been delytit. 
+The delytion n muiv log fer the page ar providit ablo fer referance.',
 'log-fulllog' => 'View ful log',
-'edit-hook-aborted' => 'Eidit aborted bi huik.
+'edit-hook-aborted' => 'Eedit abortit bi huik.
 It gae naw explanation.',
 'edit-gone-missing' => 'Coudna update the page.
 It appears tae hae been deletit.',
-'edit-conflict' => 'Eidit conflict.',
-'edit-no-change' => 'Yer eidit wis ignored cause nae chynge wis made til the tex.',
-'postedit-confirmation' => 'Yer eidit wis hained.',
+'edit-conflict' => 'Eedit confleect.',
+'edit-no-change' => 'Yer eedit wis ignored cause nae chynge wis made til the tex.',
+'postedit-confirmation' => 'Yer eedit wis hained.',
 'edit-already-exists' => 'Coudna mak ae new page.
 It awreadie exists.',
 'defaultmessagetext' => 'Defaut message tex',
 'content-failed-to-parse' => 'Failed tae parse $2 content fer $1 model: $3',
 'invalid-content-data' => 'Onvalid content data',
 'content-not-allowed-here' => '"$1" content isna permited oan the page [[$2]]',
-'editwarning-warning' => 'Leain this page micht cause ye tae lose oni chynges ye\'v made.
-Gif ye\'r loggit in, ye can disable this warning in the "{{int:prefs-editing}}" section o yer preferences.',
+'editwarning-warning' => 'Leain this page micht cause ye tae lose oni chynges that ye\'v makit.
+Gif ye\'r loggit in, ye can disable this warnishment in the "{{int:prefs-editing}}" section o yer preferences.',
 'editpage-notsupportedcontentformat-title' => 'Content format isna supported',
 'editpage-notsupportedcontentformat-text' => 'The content format $1 isna supported bi the content model $2.',
 
@@ -872,7 +872,7 @@ It shid hae less than $2 {{PLURAL:$2|caw|caws}}, thaur {{PLURAL:$1|is nou $1 caw
 'post-expand-template-inclusion-warning' => "'''Wairnin:''' Template include size is tae lairge. 
 Some templates wull nae be included.",
 'post-expand-template-inclusion-category' => 'Pages whaur template include size is exceeded',
-'post-expand-template-argument-warning' => 'Tak tent: This page hauds at least the ae template argument that haes an ower muckle expansion size.
+'post-expand-template-argument-warning' => '<strong>Warnishment:</strong> This page hauds at least the ae template argument that haes aen ower muckle expansion size.
 Thir arguments hae been left oot.',
 'post-expand-template-argument-category' => 'Pages containing omitted template arguments',
 'parser-template-loop-warning' => 'Template luip detected: [[$1]]',
@@ -887,29 +887,29 @@ Thir arguments hae been left oot.',
 'converter-manual-rule-error' => 'mistak detected in manual leid conversion rule',
 
 # "Undo" feature
-'undo-success' => 'The edit can be undone. Please check the chynges albo tae check that this is whit ye wint tae dae, an then hain the chynges albo tae be duin undooin the edit.',
+'undo-success' => 'The eidit can be ondun. Please check the chynges albo tae check that this is whit ye wint tae dae, n than hain the chynges albo tae be duin ondaein the eidit.',
 'undo-failure' => 'The edit culdnae be undone acause o conflictin edits inatween.',
 'undo-norev' => 'The eidit coudna be ondone cause it disna exist or wis deletit.',
 'undo-nochange' => 'The edit appears tae hae awready been ondone.',
-'undo-summary' => 'Undo reveision $1 by [[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]])',
-'undo-summary-username-hidden' => 'Ondae revision $1 bi ae hidden uiser',
+'undo-summary' => 'Ondae reveesion $1 bi [[Special:Contributions/$2|$2]] ([[User talk:$2|Tauk]])',
+'undo-summary-username-hidden' => "Ondae reveesion $1 bi ae skauk't uiser",
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Canna mak accoont',
 'cantcreateaccount-text' => "Accoont makkin frae this IP address ('''$1''') haes been blockit by [[User:$3|$3]].
 
 The grund for this, given by $3 is ''$2''",
-'cantcreateaccount-range-text' => "Accoont creation fae IP addresses in the range '''$1''', that inclædes yer IP address ('''$4'''), haes been blockit bi [[User:$3|$3]].
+'cantcreateaccount-range-text' => "Accoont cræftin fae IP addresses in the range '''$1''', that inclædes yer IP address ('''$4'''), haes been blockit bi [[User:$3|$3]].
 
 The raison gien bi $3 is ''$2''",
 
 # History pages
-'viewpagelogs' => 'Leuk at logs for this page',
-'nohistory' => "The'r nae edit history for this page.",
+'viewpagelogs' => 'Leuk at logs fer this page',
+'nohistory' => "Thaur's nae eedit histerie fer this page.",
 'currentrev' => 'Current reveision',
-'currentrev-asof' => 'Latest revision as of $1',
+'currentrev-asof' => 'Latest reveesion aes o $1',
 'revisionasof' => 'Reveision as o $1',
-'revision-info' => 'Revision as o $1 by $2',
+'revision-info' => 'Reveesion aes o $1 bi $2',
 'previousrevision' => '← Aulder reveision',
 'nextrevision' => 'Newer reveision →',
 'currentrevisionlink' => 'see current reveision',
@@ -918,7 +918,8 @@ The raison gien bi $3 is ''$2''",
 'last' => 'hind',
 'page_first' => 'first',
 'page_last' => 'hindermaist',
-'histlegend' => 'Diff selection: mairk the radio boxes o the versions tae compare an press enter or the button at the bottom.<br /> Legend: (cur) = difference frae current version, (last) = difference frae foregaun version, s = smaa edit.',
+'histlegend' => 'Diff selection: Maurk the radio kists o the reveesions tae compare n hit enter or the button at the bottom.<br />
+Legend: <strong>({{int:cur}})</strong> = differance wi laitest reveesion, <strong>({{int:last}})</strong> = differance wi preceedin reveesion, <strong>{{int:minoreditletter}}</strong> = smaa eidit.',
 'history-fieldset-title' => 'Browse history',
 'history-show-deleted' => 'Deletit only',
 'histfirst' => 'auldest',
@@ -927,67 +928,70 @@ The raison gien bi $3 is ''$2''",
 'historyempty' => '(empie)',
 
 # Revision feed
-'history-feed-title' => 'Revision history',
-'history-feed-description' => 'Revision history for this page on the wiki',
+'history-feed-title' => 'Reveesion histerie',
+'history-feed-description' => 'Reveesion histerie fer this page oan the wiki',
 'history-feed-item-nocomment' => '$1 at $2',
-'history-feed-empty' => 'The requestit page disnae exist.
-It micht hae been deletit frae the wiki, or the name micht hae been chynged.
-Try [[Special:Search|rakin on the wiki]] for new pages ye micht be interestit in.',
+'history-feed-empty' => 'The requestit page disnae exeest.
+It micht hae been delytit fae the wiki, or the name micht hae been chynged.
+Try [[Special:Search|rakin oan the wiki]] fer new pages ye micht be interestit in.',
 
 # Revision deletion
 'rev-deleted-comment' => '(eidit summarie remuived)',
 'rev-deleted-user' => '(uisername removit)',
 'rev-deleted-event' => '(log action remuived)',
-'rev-deleted-user-contribs' => '[uisername or IP address remuived - eidit hidden fae contreebutions]',
-'rev-deleted-text-permission' => 'This page revision haes been <strong>deletit</strong>.
-Details can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].',
-'rev-deleted-text-unhide' => 'This page revision haes been <strong>deletit</strong>.
-Details can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].
-Ye can still [$1 view this revision] gif ye wish tae proceed.',
-'rev-suppressed-text-unhide' => 'This page revision haes been <strong>suppressed</strong>.
+'rev-deleted-user-contribs' => "[uisername or IP address remuived - eidit skauk't fae contreebutions]",
+'rev-deleted-text-permission' => 'This page reveesion haes been <strong>delytit</strong>.
+Details can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].',
+'rev-deleted-text-unhide' => 'This page reveesion haes been <strong>delytit</strong>.
+Details can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].
+Ye can still [$1 view this reveesion] gif ye wish tae proceed.',
+'rev-suppressed-text-unhide' => 'This page reveesion haes been <strong>suppressed</strong>.
 Details can be foond in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].
-Ye can still [$1 view this revision] gif ye wish tae proceed.',
-'rev-deleted-text-view' => 'This page revision haes been <strong>deletit</strong>.
-You can view it; details can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].',
-'rev-suppressed-text-view' => 'This page revision haes been <strong>suppressed</strong>.
+Ye can still [$1 view this reveesion] gif ye wish tae proceed.',
+'rev-deleted-text-view' => 'This page reveesion haes been <strong>delytit</strong>.
+Ye can view it; details can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].',
+'rev-suppressed-text-view' => 'This page reveesion haes been <strong>suppressed</strong>.
 Ye can view it; details can be foond in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].',
-'rev-deleted-no-diff' => 'Ye canna view this diff cause yin o the revisions haes been <strong>deletit</strong>.
-Details can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].',
-'rev-suppressed-no-diff' => 'Ye cannae view this diff cause yin o the revisions haes been <strong>deletit</strong>.',
-'rev-deleted-unhide-diff' => 'Yin o the revisions o this diff haes been <strong>deletit</strong>.
-Details can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].
+'rev-deleted-no-diff' => 'Ye canna view this diff cause yin o the reveesions haes been <strong>delytit</strong>.
+Details can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].',
+'rev-suppressed-no-diff' => 'Ye cannae see this diff cause yin o the reveesions haes been <strong>delytit</strong>.',
+'rev-deleted-unhide-diff' => 'Yin o the reveesions o this diff haes been <strong>delytit</strong>.
+Details can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].
 Ye can still [$1 view this diff] gif ye wish tae proceed.',
-'rev-suppressed-unhide-diff' => 'Yin o the revisions o this diff haes been <strong>suppressed</strong>.
+'rev-suppressed-unhide-diff' => 'Yin o the reveesions o this diff haes been <strong>suppressed</strong>.
 Details can be foond in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].
-Ye can still [$1 view this diff] gif you wish to proceed.',
-'rev-suppressed-diff-view' => 'Yin o the revisions o this diff haes been <strong>suppressed</strong>.
+Ye can still [$1 view this diff] gif ye wish tee proceed.',
+'rev-deleted-diff-view' => "Ane o the reveesions o this diff haes been '''delytit'''.
+Ye can see this diff; details can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].",
+'rev-suppressed-diff-view' => 'Yin o the reveesions o this diff haes been <strong>suppressed</strong>.
 Ye can view this diff; details can be foond in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].',
-'rev-delundel' => 'shaw/scug',
+'rev-delundel' => 'chynge veesibility',
 'rev-showdeleted' => 'shaw',
-'revisiondelete' => 'Delete/undelete revisions',
-'revdelete-nooldid-title' => 'Onvalid target revision',
-'revdelete-nooldid-text' => "Ye'v either no speecified ae target reveesion(s) tae perform this function, the speecified revision disna exist, or ye'r attempting te hide the current reveesion.",
+'revisiondelete' => 'Delyte/ondelyte reveesions',
+'revdelete-nooldid-title' => 'Onvalid target reveesion',
+'revdelete-nooldid-text' => "Aither ye'v naw speceefied ae tairget reveesion(s) tae perform this function, the speceefied reveesion disna exeest, or ye'r attemptin tae skauk the Nou reveesion.",
 'revdelete-no-file' => 'The file speecified disna exist.',
 'revdelete-show-file-confirm' => 'Ar ye sair ye wish tae view ae deletit reveesion o the file "<nowiki>$1</nowiki>" fae $2 at $3?',
 'revdelete-show-file-submit' => 'Ai',
 'revdelete-selected' => '<strong>{{PLURAL:$2|Selected reveesion|Selected reveesions}} o [[:$1]]:</strong>',
-'revdelete-text' => '<strong>Deletit revisions an events will still appear in the page histerie an logs, but pairts o their content will be onaccessible til the public.</strong>
-Ither admeenistraters oan {{SITENAME}} will still be able tae access the hidden content an can ondelete it again through this same interface, onless addeetional restrictions ar set.',
-'revdelete-confirm' => "Please confirm that ye'r ettlin tae dae this, that ye unnerstaunn the consequences, an that ye'r daein this in accordance wi [[{{MediaWiki:Policy-url}}|the policie]].",
+'logdelete-selected' => "'''{{PLURAL:$1|Selectit log event|Selectit log events}}:'''",
+'revdelete-text' => '<strong>Delytit reveesions n events will still kyth in the page histerie n logs, but pairts o thair content will be onaccessible til the publeec.</strong>
+Ither admeenistraters oan {{SITENAME}} will still be able tae access the skaukt content n can ondelyte it again throogh this same interface, onless addeetional restreections ar set.',
+'revdelete-confirm' => "Please confirm that ye'r ettlin tae dae this, that ye unnerstaunn the consequences, n that ye'r daein this in accordance wi [[{{MediaWiki:Policy-url}}|the policie]].",
 'revdelete-suppress-text' => 'Suppression shid <strong>yinly</strong> be uised fer the follaein cases:
-* poteentially libeloos information
-* onappropriate personal information
-*: <em>hame addresses an telephane nummers, national ideentification nummers, etc.</em>',
+* poteentiallie libeloos information
+* galus personal information
+*: <em>hame addresses n telephane nummers, national ideentifeecation nummers, etc.</em>',
 'revdelete-legend' => 'Set visibeelitie restreections',
 'revdelete-hide-text' => 'Reveesion tex',
-'revdelete-hide-image' => 'Hide file content.',
-'revdelete-hide-name' => 'Hide aiction an target',
+'revdelete-hide-image' => 'Skauk file content.',
+'revdelete-hide-name' => 'Skauk aiction n tairget',
 'revdelete-hide-comment' => 'Eidit summarie',
-'revdelete-hide-user' => "Eiditor's uisername/IP address",
+'revdelete-hide-user' => "Eiditer's uisername/IP address",
 'revdelete-hide-restricted' => 'Suppress data fae admeenistraters aes weel aes ithers',
 'revdelete-radio-same' => '(dinna chynge)',
-'revdelete-radio-set' => 'Hidden',
-'revdelete-radio-unset' => 'Visible',
+'revdelete-radio-set' => "Skauk't",
+'revdelete-radio-unset' => 'Veesible',
 'revdelete-suppress' => 'Suppress data fae admeenistraters aes weel aes ithers',
 'revdelete-unsuppress' => 'Remuiv restreections oan restored reveesions',
 'revdelete-log' => 'Raison:',
@@ -1001,17 +1005,17 @@ $1',
 'revdel-restore' => 'change visibility',
 'pagehist' => 'Page history',
 'deletedhist' => 'Deletit histerie',
-'revdelete-hide-current' => 'Mistak hidin the item dated $2, $1: This is the current reveesion.
-It cannna be hidden.',
+'revdelete-hide-current' => "Mistak skaukin the eitem dated $2, $1: This is the current reveesion.
+It cannna be skauk't.",
 'revdelete-show-no-access' => 'Mistak shawin the eitem dated $2, $1: This eitem haes been maurked "restreected".
 Ye dinna hae access til it.',
 'revdelete-modify-no-access' => 'Mistak modifiein the eitem dated $2, $1: This eitem haes been maurked "restreected".
 Ye dinna hae access til it.',
 'revdelete-modify-missing' => 'Mistak modifiein item ID $1: It is missing fae the database!',
-'revdelete-no-change' => '<strong>Warnishment:</strong> The eitem dated $2, $1 awreadie haed the requested veesibeelitie settins.',
+'revdelete-no-change' => '<strong>Warnishment:</strong> The eetem dated $2, $1 awreadie haed the requested veesibeelitie settins.',
 'revdelete-concurrent-change' => "Mistak modifiein the eitem dated $2, $1: Its status appears tae'v been chynged bi some ither bodie while ye attempted tae modifie it.
 Please check the logs.",
-'revdelete-only-restricted' => 'Mistak hidin the item dated $2, $1: Ye canna suppress eitems fae view bi admeenistraters wioot selectin yin o the ither veesibeelitie opties ava.',
+'revdelete-only-restricted' => 'Mistak hidin the eetem dated $2, $1: Ye canna suppress eetems fae sicht bi admeenistraters wioot selectin yin o the ither veesibeelitie opties ava.',
 'revdelete-reason-dropdown' => '*Commyn delete raisons
 ** Copiericht violation
 ** Onappropriate comment or personal information
@@ -1019,13 +1023,13 @@ Please check the logs.",
 ** Potentially libelous information',
 'revdelete-otherreason' => 'Ither/addeetional raison:',
 'revdelete-reasonotherlist' => 'Ither raison',
-'revdelete-edit-reasonlist' => 'Eidit delete raisons',
+'revdelete-edit-reasonlist' => 'Eidit delyte raisons',
 'revdelete-offender' => 'Reveesion author:',
 
 # Suppression log
 'suppressionlog' => 'Suppreession log',
-'suppressionlogtext' => 'Ablow is ae leet o deletions an blocks involvin content hidden fae admeenistraters.
-See the [[Special:BlockList|block leet]] fer the leet o currentlie operational bans an blocks.',
+'suppressionlogtext' => "Ablo is ae leet o delytions n blocks involvin content skauk't fae admeenistraters.
+See the [[Special:BlockList|block leet]] fer the leet o currentlie operational bans n blocks.",
 
 # History merging
 'mergehistory' => 'Merge page histeries',
@@ -1034,22 +1038,22 @@ Mak sair that this chynge will maintain historical page conteenuitie.',
 'mergehistory-box' => 'Merge reveesions o twa pages:',
 'mergehistory-from' => 'Soorce page:',
 'mergehistory-into' => 'Destinâtion page:',
-'mergehistory-list' => 'Mergeable eidit history',
-'mergehistory-merge' => 'The follaein revisions o [[:$1]] can be merged intil [[:$2]].
-Uise the radio button column tae merge in yinly the reveesions maed at an afore the speecified time.
-Note that uising the navigâtion links will reset this column.',
+'mergehistory-list' => 'Mergeable eidit histerie',
+'mergehistory-merge' => 'The follaein reveesions o [[:$1]] can be merged intil [[:$2]].
+Uise the radio button column tae merge in yinly the reveesions makit at n afore the speecified time.
+Mynd that uisin the navigâtion links will reset this column.',
 'mergehistory-go' => 'Shaw mergeable eidits',
 'mergehistory-submit' => 'Merge reveesions',
 'mergehistory-empty' => 'Naw reveesions can be merged.',
 'mergehistory-success' => '$3 {{PLURAL:$3|reveesion|reveesions}} o [[:$1]] successfully merged intil [[:$2]].',
-'mergehistory-fail' => 'Onable tae perform histerie merge, please recheck the page an time parameters.',
+'mergehistory-fail' => 'Onable tae perform histerie merge, please recheck the page n time parameters.',
 'mergehistory-no-source' => 'Source page $1 disna exist.',
 'mergehistory-no-destination' => 'Destinâtion page $1 disna exist.',
 'mergehistory-invalid-source' => 'Source page maun be ae valid title.',
 'mergehistory-invalid-destination' => 'Destinâtion page maun be ae valid title.',
 'mergehistory-autocomment' => 'Merged [[:$1]] intil [[:$2]]',
 'mergehistory-comment' => 'Merged [[:$1]] intil [[:$2]]: $3',
-'mergehistory-same-destination' => 'Soorce an destinâtion pages canna be the same',
+'mergehistory-same-destination' => 'Soorce n destination pages canna be the same',
 'mergehistory-reason' => 'Raeson:',
 
 # Merge log
@@ -1059,30 +1063,30 @@ Note that uising the navigâtion links will reset this column.',
 'mergelogpagetext' => 'Ablow is ae leet o the maist recent merges o yin page histerie intil anither.',
 
 # Diffs
-'history-title' => 'Revision histerie o "$1"',
+'history-title' => 'Reveesion histerie o "$1"',
 'difference-title' => 'Difference atween reveesions of "$1"',
-'difference-title-multipage' => 'Difference atween pages "$1" an "$2"',
+'difference-title-multipage' => 'Difference atween pages "$1" n "$2"',
 'difference-multipage' => '(Difference atween pages)',
 'lineno' => 'Line $1:',
 'compareselectedversions' => 'Compare selectit versions',
 'showhideselectedversions' => 'Chynge veesibeelitie o selected reveesions',
 'editundo' => 'undo',
 'diff-empty' => '(Naw difference)',
-'diff-multi-sameuser' => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} bi the same uiser no shown)',
-'diff-multi-otherusers' => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} bi {{PLURAL:$2|one other user|$2 users}} not shown)',
+'diff-multi-sameuser' => '({{PLURAL:$1|yin intermeediate reveesion|$1 intermeediate reveesions}} bi the same uiser naw shawn)',
+'diff-multi-otherusers' => '({{PLURAL:$1|yin intermeediate reveesion|$1 intermeediate reveesions}} bi {{PLURAL:$2|yin ither uiser|$2 uisers}} no shawn)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Yin intermeediate reveesion|$1 intermeediate reveesions}} bi mair than $2 {{PLURAL:$2|uiser|uisers}} no shawn)',
-'difference-missing-revision' => '{{PLURAL:$2|Yin reveesion|$2 reveesions}} o this difference ($1) {{PLURAL:$2|was|were}} na fond.
+'difference-missing-revision' => '{{PLURAL:$2|Yin reveesion|$2 reveesions}} o this difference ($1) {{PLURAL:$2|was|were}} no fond.
 
-This is usually caused bi follaein aen ootdated diff link til ae page that haes been deletit.
-Details can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].',
+This is usually caused bi follaein aen ootdated diff link til ae page that haes been delytit.
+Details can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].',
 
 # Search results
 'searchresults' => 'Rake results',
-'searchresults-title' => 'Rake affcome for "$1"',
+'searchresults-title' => 'Rake affcome fer "$1"',
 'toomanymatches' => 'Ower moni matches were returned, please try ae different speirin',
 'titlematches' => 'Airticle teitle matches',
 'textmatches' => 'Page tex matches',
-'notextmatches' => 'Nae page text matches',
+'notextmatches' => 'Nae page tex matches',
 'prevn' => 'foregaun {{PLURAL:$1|$1}}',
 'nextn' => 'neist {{PLURAL:$1|$1}}',
 'prevn-title' => 'Previous $1 {{PLURAL:$1|ootcome|ootcomes}}',
@@ -1090,16 +1094,16 @@ Details can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 'shown-title' => 'Shaw $1 {{PLURAL:$1|ootcome|ootcomes}} per page',
 'viewprevnext' => 'View ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''There is a page named \"[[:\$1]]\" oan this wiki.'''",
-'searchmenu-new' => '<strong>Mak the page "[[:$1]]" oan this wiki!</strong> {{PLURAL:$2|0=|See the page foond wi yer rake ava.|See the rake affcome foond ava.}}',
+'searchmenu-new' => '<strong>Cræft the page "[[:$1]]" oan this wiki!</strong> {{PLURAL:$2|0=|See the page foond wi yer rake ava.|See the rake affcome foond ava.}}',
 'searchprofile-articles' => 'Content pages',
-'searchprofile-project' => 'Help and Project pages',
+'searchprofile-project' => 'Heelp n Waurk pages',
 'searchprofile-images' => 'Multimedia',
 'searchprofile-everything' => 'Everything',
 'searchprofile-advanced' => 'Advanced',
 'searchprofile-articles-tooltip' => 'Rake in $1',
 'searchprofile-project-tooltip' => 'Rake in $1',
-'searchprofile-images-tooltip' => 'Rake fur files',
-'searchprofile-everything-tooltip' => 'Rake aw o content (including talk pages)',
+'searchprofile-images-tooltip' => 'Rake fer files',
+'searchprofile-everything-tooltip' => 'Rake aw o content (inclædin tauk pages)',
 'searchprofile-advanced-tooltip' => 'Rake in custom namespaces',
 'search-result-size' => '$1 ({{PLURAL:$2|1 word|$2 words}})',
 'search-result-category-size' => '{{PLURAL:$1|1 member|$1 members}} ({{PLURAL:$2|1 subcategory|$2 subcategories}}, {{PLURAL:$3|1 file|$3 files}})',
@@ -1110,16 +1114,16 @@ Details can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 'search-suggest' => 'Did ye mean: $1',
 'search-interwiki-caption' => "Sister projec's",
 'search-interwiki-default' => "$1 results':",
-'search-interwiki-more' => '(more)',
+'search-interwiki-more' => '(mair)',
 'search-relatedarticle' => 'Relatit',
 'searcheverything-enable' => 'Rake in aw namespaces',
 'searchrelated' => 'related',
 'searchall' => 'aw',
 'showingresults' => "Shawin ablo up tae {{PLURAL:$1|'''1''' result|'''$1''' results}} stertin wi #'''$2'''.",
-'showingresultsinrange' => 'Showin ablow up til {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} in range #<strong>$2</strong> to #<strong>$3</strong>.',
+'showingresultsinrange' => 'Shawin ablo up til {{PLURAL:$1|<strong>1</strong> affcome|<strong>$1</strong> affcome}} in range #<strong>$2</strong> til #<strong>$3</strong>.',
 'showingresultsnum' => "Shawin ablo {{PLURAL:$3|'''1''' result|'''$3''' results}} stertin wi #'''$2'''.",
-'showingresultsheader' => "{{PLURAL:$5|Ootcome '''$1''' of '''$3'''|Ootcomes '''$1 - $2''' of '''$3'''}} for '''$4'''",
-'search-nonefound' => "Thare wur na ootcomes matching th' query.",
+'showingresultsheader' => '{{PLURAL:$5|Affcome <strong>$1</strong> o <strong>$3</strong>|Affcomes <strong>$1 - $2</strong> o <strong>$3</strong>}} fer <strong>$4</strong>',
+'search-nonefound' => 'Thaur were naw ootcomes matchin the speiring.',
 'powersearch-legend' => 'Advanced rake',
 'powersearch-ns' => 'Rake in namespaces:',
 'powersearch-redir' => 'Leet redirects',
@@ -1139,11 +1143,11 @@ Details can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 'skin-preview' => 'First Leuk',
 'datedefault' => 'Nae preference',
 'prefs-beta' => 'Beta features.',
-'prefs-datetime' => 'Date an time',
+'prefs-datetime' => 'Date n time',
 'prefs-labs' => 'Labs featurs',
 'prefs-user-pages' => 'Uiser pages',
 'prefs-personal' => 'Uiser data',
-'prefs-rc' => 'Recent chynges an shawin stubs',
+'prefs-rc' => 'Recent chynges n shawin stubs',
 'prefs-watchlist' => 'Watchleet',
 'prefs-watchlist-days' => 'Days tae shaw in watchleet:',
 'prefs-watchlist-days-max' => 'Mucklest $1 {{PLURAL:$1|day|days}}',
@@ -1152,245 +1156,778 @@ Details can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 'prefs-watchlist-token' => 'Watchleet token:',
 'prefs-misc' => 'Antrin settins',
 'prefs-resetpass' => 'Chynge passwaird',
+'prefs-changeemail' => 'Chynge email address',
+'prefs-setemail' => 'Set ae wab-mail address',
+'prefs-email' => 'Wab-mail opties',
+'prefs-rendering' => 'Appearence',
 'saveprefs' => 'Hain preferences',
+'restoreprefs' => 'Restore aw default settings (in aw sections)',
 'prefs-editing' => 'Editin',
+'rows' => 'Raws:',
 'searchresultshead' => 'Rake result settins',
+'stub-threshold' => 'Threshold for <a href="#" class="stub">stub link</a> formattin (bytes):',
 'stub-threshold-disabled' => 'Tuckie',
+'recentchangesdays' => 'Days tae shaw in recent chynges:',
+'recentchangesdays-max' => 'Mucklest $1 {{PLURAL:$1|day|days}}',
 'recentchangescount' => 'Nummer o eidits tae shaw bi defaut:',
-'prefs-help-watchlist-token2' => 'This is the hidlins key til the wab feed o yer watchleet. Onibodie wha kens this can read yer watchleel, sae dinna share it. Gif ye need to, [[Special:ResetTokens|You ca reset it]].',
+'prefs-help-recentchangescount' => 'This includes recent chynges, page histories, n logs.',
+'prefs-help-watchlist-token2' => 'This is the hidlins key til the wab feed o yer watchleet. Onibodie wha kens this can read yer watchleet, sae dinna shair it. Gif ye need to, [[Special:ResetTokens|Ye can reset it]].',
 'savedprefs' => 'Yer preferences haes been hained.',
+'timezoneuseserverdefault' => 'Uise wiki default ($1)',
+'timezoneuseoffset' => 'Ither (specify offset)',
 'servertime' => 'Server time the nou',
 'guesstimezone' => 'Fill in frae brouser',
+'timezoneregion-africa' => 'Africae',
+'timezoneregion-america' => 'Americae',
+'timezoneregion-antarctica' => 'Antairctica',
+'timezoneregion-arctic' => 'Airctic',
+'timezoneregion-asia' => 'Asie',
+'timezoneregion-atlantic' => 'Atlaunteec Ocean',
+'timezoneregion-australia' => 'Australie',
+'timezoneregion-europe' => 'Europ',
+'timezoneregion-pacific' => 'Paceefic Ocean',
 'allowemail' => 'Allou email frae ither uisers',
+'prefs-searchoptions' => 'Rake',
 'defaultns' => 'Itherwise rake in thir namespaces:',
 'default' => 'defaut',
 'prefs-files' => 'Files',
 'prefs-custom-css' => 'Custom CSS',
 'prefs-custom-js' => 'Custom JS',
+'prefs-common-css-js' => 'Shared CSS/JavaScript for aw skins:',
+'prefs-reset-intro' => 'Ye can uise this page tae reset yer preferences tae the steid defaults.
+This cannae be unduin.',
+'prefs-emailconfirm-label' => 'Wab-mail confirmation:',
 'youremail' => 'Yer email:',
 'username' => '{{GENDER:$1|Uisername}}:',
 'uid' => '{{GENDER:$1|Uiser}} ID:',
 'prefs-memberingroups' => '{{GENDER:$2|Member}} o {{PLURAL:$1|group|groups}}:',
+'prefs-registration' => 'Regeestration time:',
 'yourrealname' => 'Yer real name:',
 'yourlanguage' => 'Interface leid:',
 'yourvariant' => 'Content leid variant',
+'prefs-help-variant' => 'Yer preferred variant or orthography tae display the content pages o this wiki in.',
 'yournick' => 'New seegnatur:',
+'prefs-help-signature' => 'Comments on collogue pages should be signed wi "<nowiki>~~~~</nowiki>", which will be convertit intae yer signatur an a timestamp.',
 'badsig' => 'Raw signature nae guid; check HTML tags.',
 'badsiglength' => 'Yer nickname is ower lang; it haes tae be $1 {{PLURAL:$1|character|characters}} or less.',
+'yourgender' => 'Hou dae ye prefer tae be describit?',
+'gender-unknown' => 'I prefer nae tae say',
+'gender-male' => 'He eedits wiki pages',
+'gender-female' => 'She eedits wiki pages',
+'prefs-help-gender' => 'Settin this preference is aen optie.
+The saffware uises its value tae address ye n tae mention ye til ithers uisin the appropriate grammatical gender.
+This information will be publeec.',
 'email' => 'E-mail',
-'prefs-help-realname' => 'Rael name is optional an gin ye chuise tae provide it this will be uised tae gie ye attreibution for yer wark.',
-'prefs-help-email' => 'E-mail is optional, bit is needed fur password resets, shuid ye forget yer password.',
-'prefs-help-email-others' => 'Ye can chuise tae let ithers contact ye bi wab-mail through ae link on yer uiser or talk page.
+'prefs-help-realname' => 'Real name is aen optie.
+Gif ye chuise tae provide it, this will be uised fer giein ye attreebution fer yer wark.',
+'prefs-help-email' => 'Wab-mail is optional, bit is needed fer passwaird resets, shid ye ferget yer passwaird.',
+'prefs-help-email-others' => 'Ye can chuise tae let ithers contact ye bi wab-mail through ae link oan yer uiser or tauk page.
 Yer wab-mail address isna revealed whan ither uisers contact ye.',
 'prefs-help-email-required' => 'Yer e-mail address is needit.',
+'prefs-i18n' => 'Internaitionalisation',
+'prefs-signature' => 'Signatur',
+'prefs-timeoffset' => 'Time affset',
+'prefs-advancedediting' => 'General opties',
+'prefs-editor' => 'Eediter',
+'prefs-preview' => 'Luikower',
+'prefs-advancedrc' => 'Advanced opties',
+'prefs-advancedrendering' => 'Advanced opties',
+'prefs-advancedsearchoptions' => 'Advanced opties',
+'prefs-advancedwatchlist' => 'Advanced opties',
+'prefs-displayrc' => 'Displey opties',
+'prefs-displaysearchoptions' => 'Displey opties',
+'prefs-displaywatchlist' => 'Displey opties',
 'prefs-diffs' => 'Diffs',
+'prefs-help-prefershttps' => 'This preference will tak effect on yer next login.',
+'prefs-tabs-navigation-hint' => 'Tip: Ye can uise the cair n richt arrae keys tae naveegate atween the tabs in the tabs leet.',
+
+# User preference: email validation using jQuery
+'email-address-validity-valid' => 'Wab-mail address appears tae be valid',
+'email-address-validity-invalid' => 'Enter ae valid wab-mail address',
 
 # User rights
+'userrights' => 'Uiser richts management',
 'userrights-lookup-user' => 'Manish uiser boorachs',
 'userrights-user-editname' => 'Enter a uisername:',
-'editusergroup' => 'Edit uiser boorach',
+'editusergroup' => 'Eidit uiser boorach',
 'editinguser' => 'Chynging uiser richts o uiser <strong>[[User:$1|$1]]</strong> $2',
+'userrights-editusergroup' => 'Edit uiser groups',
+'saveusergroups' => 'Save uiser groups',
 'userrights-groupsmember' => 'Member o:',
+'userrights-groupsmember-auto' => 'Implicit member o:',
+'userrights-groups-help' => "Ye can alter the groops this uiser is in:
+* Ae checkit kist means that the uiser is in that groop.
+* Aen oncheckit kist means that the uiser's no in that groop.
+* Ae * indicates that ye cannae remuiv the groop yince ye'v added it, or vice versa.",
+'userrights-reason' => 'Raison:',
+'userrights-no-interwiki' => 'Ye dae nae hae permission tae edit uiser richts on ither wikis.',
+'userrights-nodatabase' => 'Database $1 daes nae exist or is nae local.',
+'userrights-nologin' => 'Ye maun [[Special:UserLogin|log in]] wi aen admeenistrater accoont tae assign uiser richts.',
+'userrights-notallowed' => 'Ye dae nae hae permission tae add or remove uiser richts.',
+'userrights-changeable-col' => 'Groups ye can chynge',
+'userrights-unchangeable-col' => 'Groups ye cannae chynge',
+'userrights-conflict' => 'Conflict o uiser richts chynges! Please luikower n confirm yer chynges.',
+'userrights-removed-self' => 'Ye successfully removed yer ain richts. As such, ye are no langer able tae access this page.',
 
 # Groups
+'group' => 'Groop:',
 'group-user' => 'Uisers',
+'group-autoconfirmed' => 'Autoconfirmed uisers',
 'group-bot' => 'Bots',
+'group-sysop' => 'Admeenistrators',
+'group-suppress' => 'Owersichts',
 'group-all' => '(aw)',
 
 'group-user-member' => '{{GENDER:$1|uiser}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|autæconfirmed uiser}}',
 'group-bot-member' => '{{GENDER:$1|bot}}',
+'group-sysop-member' => '{{GENDER:$1|admeenistrater}}',
+'group-suppress-member' => '{{GENDER:$1|owersicht}}',
+
+'grouppage-user' => '{{ns:project}}:Uisers',
+'grouppage-autoconfirmed' => '{{ns:project}}:Autæconfirmed uisers',
+'grouppage-sysop' => '{{ns:project}}:Admeenistraters',
+'grouppage-suppress' => '{{ns:project}}:Owersicht',
 
 # Rights
-'right-delete' => 'Delete pages',
+'right-edit' => 'Eedit pages',
+'right-createpage' => 'Create pages (which are nae discussion pages)',
+'right-createtalk' => 'Cræft discussion pages',
+'right-createaccount' => 'Create new uiser accoonts',
+'right-minoredit' => 'Mark edits as smaa',
+'right-move' => 'Flit pages',
+'right-move-subpages' => 'Flit pages wi thair subpages',
+'right-move-rootuserpages' => 'Flit ruit uiser pages',
+'right-movefile' => 'Flit files',
+'right-suppressredirect' => 'Nae create redirects frae soorce pages when flittin pages',
+'right-upload' => 'Uplaid files',
+'right-reupload' => 'Owerwrite existin files',
+'right-reupload-own' => 'Owerwrite existin files uplaidit bi anesel',
+'right-reupload-shared' => 'Owerride files on the shared media repository locally',
+'right-upload_by_url' => 'Uplaid files frae a URL',
+'right-purge' => 'Purge the steid cache for a page wioot confirmation',
+'right-autoconfirmed' => 'Nae be affectit bi IP-based rate leemits',
+'right-bot' => 'Be treatit aes aen autæmatit process',
+'right-nominornewtalk' => 'Nae hae smaa edits tae discussion pages trigger the new messages prompt',
+'right-apihighlimits' => 'Uise heicher leemits in API queries',
+'right-writeapi' => 'Uise o the write API',
+'right-delete' => 'Delyte pages',
+'right-bigdelete' => 'Delete pages wi lairge histories',
+'right-deletelogentry' => 'Delyte n ondelyte speceefic log entries',
+'right-deleterevision' => 'Delyte n ondylete speceefic reveesions o pages',
+'right-deletedhistory' => 'View deletit history entries, wioot thair associatit text',
+'right-deletedtext' => 'See delytit tex n chynges atween delytit reveesions',
+'right-browsearchive' => 'Rake deletit pages',
+'right-undelete' => 'Ondelyte ae page',
+'right-suppressrevision' => 'Luikower n restore reveesions skaukt fae admeenistraters',
+'right-suppressionlog' => 'see preevate logs',
+'right-block' => 'Block ither uisers fae eeditin',
+'right-blockemail' => 'Block ae uiser fae sendin wab-mail',
+'right-hideuser' => 'Block ae uisername, skaukin it fae the publeec',
+'right-ipblock-exempt' => 'Bypass IP blocks, autae-blocks  range blocks',
+'right-proxyunbannable' => 'Bypass autaematic blocks o proxies',
+'right-unblockself' => 'Onblock yersel',
+'right-protect' => 'Chynge protection levels n eedit cascade-protected pages',
+'right-editprotected' => 'Eedit pages protected aes "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Eedit pages protected aes "{{int:protect-level-autoconfirmed}}"',
+'right-editinterface' => 'Eedit the uiser interface',
+'right-editusercssjs' => "Eedit ither uisers' CSS n JavaScript files",
+'right-editusercss' => "Eedit ither uisers' CSS files",
+'right-edituserjs' => "Eedit ither uisers' JavaScript files",
+'right-editmyusercss' => 'Eidit yer ain uiser CSS files',
+'right-editmyuserjs' => 'Eedit yer ain uiser JavaScript files',
+'right-viewmywatchlist' => 'See yer ain watchleet',
+'right-editmywatchlist' => 'Eedit yer ain watchleet. Myd that some actions will still add pages even wioot this richt.',
+'right-viewmyprivateinfo' => 'See yer ain preevate data (e.g. wab-mail address, real name)',
+'right-editmyprivateinfo' => 'Eedit yer ain preevate data (e.g. wab-mail address, real name)',
+'right-editmyoptions' => 'Eedit yer ain preeferences',
+'right-rollback' => 'Quicklie rowback the eedits o the laist uiser that eeditit ae parteecular page',
+'right-markbotedits' => 'Maurk rowed-back eedits aes bot eedits',
+'right-noratelimit' => 'No be affected bi rate limits',
+'right-import' => 'Import pages fae ither wikis',
+'right-importupload' => 'Import pages fae ae file uplaid',
+'right-patrol' => "Maurk ithers' eedits aes patrowed",
+'right-autopatrol' => "Hae ye'r ain eedits autaematiclie maurked aes patrowed",
+'right-patrolmarks' => 'See recent chynges patrol maurks',
+'right-unwatchedpages' => 'See ae leet o onwatched pages',
+'right-mergehistory' => 'Merge the histerie o pages',
+'right-userrights' => 'Eedit aw uiser richts',
+'right-userrights-interwiki' => 'Eedit the uiser richts o uisers oan ither wikis',
+'right-siteadmin' => 'Lock n lowse the database',
+'right-override-export-depth' => 'Export pages incluidin linked pages up til ae depth o 5',
+'right-sendemail' => 'Send Wab-mail til ither uisers',
+'right-passwordreset' => 'See passwaird reset wab-mails',
 
 # Special:Log/newusers
-'newuserlogpage' => 'Uiser creation log',
+'newuserlogpage' => 'Uiser cræftin log',
+'newuserlogpagetext' => 'This is ae log o uiser cræftins.',
 
 # User rights log
 'rightslog' => 'Uiser richts log',
 'rightslogtext' => 'This is a log o chynges tae uiser richts.',
 
 # Associated actions - in the sentence "You do not have permission to X"
-'action-edit' => 'edit this page',
+'action-edit' => 'eedit this page',
+'action-createpage' => 'cræft pages',
+'action-createtalk' => 'cræft discussion pages',
+'action-createaccount' => 'cræft this uiser accoont',
+'action-minoredit' => 'maurk this eedit aes minor',
+'action-move' => 'muiv this page',
+'action-move-subpages' => 'mui this page, n its subpages',
+'action-move-rootuserpages' => 'muiv ruit uiser pages',
+'action-movefile' => 'muiv this file',
+'action-upload' => 'uplaid this file',
+'action-reupload' => 'owerwrite this exeestin file',
+'action-reupload-shared' => 'owerride this file oan ae shaired reposeeterie',
+'action-upload_by_url' => 'uplaid this file fae ae URL',
+'action-writeapi' => 'uise the write API',
+'action-delete' => 'delyte this page',
+'action-deleterevision' => 'delyte this reveesion',
+'action-deletedhistory' => "see this page's delytit histerie",
+'action-browsearchive' => 'rake delytit pages',
+'action-undelete' => 'ondelyte this page',
+'action-suppressrevision' => 'luikower n restore this skaukt reveesion',
+'action-suppressionlog' => 'see this preevate log',
+'action-block' => 'block this uiser fae eeditin',
+'action-protect' => 'chynge protection levels fer this page',
+'action-rollback' => 'quicklie rowback the eedits o the laist uiser that eeditit ae parteecular page',
+'action-import' => 'import pages fae anither wiki',
+'action-importupload' => 'import pages fae ae file uplaid',
+'action-patrol' => "maurk ithers' eedits aes patrowed",
+'action-autopatrol' => 'hae yer eedit maurked aes patrowed',
+'action-unwatchedpages' => 'see the leet o onwatched pages',
+'action-mergehistory' => 'merge the histerie o this page',
+'action-userrights' => 'eedit aw uiser richts',
+'action-userrights-interwiki' => 'eedit the uiser richts o uisers oan ither wikis',
+'action-siteadmin' => 'lock or lowse the database',
+'action-sendemail' => 'send wab-mails',
+'action-editmywatchlist' => 'eedit yer watchleet',
+'action-viewmywatchlist' => 'see yer watchleet',
+'action-viewmyprivateinfo' => 'see yer preevate information',
+'action-editmyprivateinfo' => 'eedit yer preevate information',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|chynge|chynges}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|sin laist veesit}}',
+'enhancedrc-history' => 'histeri',
 'recentchanges' => 'Recent chynges',
 'recentchanges-legend' => 'Recent changes options',
 'recentchanges-summary' => 'Follae the maist recent chynges tae the wiki on this page.',
+'recentchanges-noresult' => 'Naw chynges durin the gien period matchin thir guidins.',
 'recentchanges-feed-description' => 'Follae the maist recent chynges tae the wiki in this feed.',
 'recentchanges-label-newpage' => 'This edit created a freish page',
-'recentchanges-label-minor' => 'This is a smaa edit',
-'recentchanges-label-bot' => 'This edit wis performed by a bot',
+'recentchanges-label-minor' => 'This is ae smaa eedit',
+'recentchanges-label-bot' => 'This edit wis performed bi a bot',
 'recentchanges-label-unpatrolled' => 'This edit haes nae yet bin patrolled',
-'rcnotefrom' => 'Ablo is the chynges syne <b>$2</b> (up tae <b>$1</b> shawn).',
+'recentchanges-label-plusminus' => 'The page size chynged bi this nummer o bytes',
+'recentchanges-legend-newpage' => '(see [[Special:NewPages|leet o new pages]] ava)',
+'rcnotefrom' => 'Ablo ar the chynges sin <strong>$2</strong> (up til <strong>$1</strong> shawn).',
 'rclistfrom' => 'Shaw new chynges stertin frae $1',
 'rcshowhideminor' => '$1 smaa edits',
+'rcshowhideminor-show' => 'Shaw',
+'rcshowhideminor-hide' => 'Skauk',
 'rcshowhidebots' => '$1 bots',
+'rcshowhidebots-show' => 'Shaw',
+'rcshowhidebots-hide' => 'Skauk',
 'rcshowhideliu' => '$1 registered uisers',
+'rcshowhideliu-show' => 'Shaw',
+'rcshowhideliu-hide' => 'Skauk',
 'rcshowhideanons' => '$1 anonymous uisers',
+'rcshowhideanons-show' => 'Shaw',
+'rcshowhideanons-hide' => 'Skauk',
 'rcshowhidepatr' => '$1 patrolled edits',
+'rcshowhidepatr-show' => 'Shaw',
+'rcshowhidepatr-hide' => 'Skauk',
 'rcshowhidemine' => '$1 ma edits',
+'rcshowhidemine-show' => 'Shaw',
+'rcshowhidemine-hide' => 'Skauk',
 'rclinks' => 'Shaw last $1 chynges in last $2 days<br />$3',
 'diff' => 'diff',
 'hist' => 'hist',
-'hide' => 'Hod',
+'hide' => 'Skauk',
 'show' => 'shaw',
 'minoreditletter' => 's',
 'newpageletter' => 'N',
 'boteditletter' => 'b',
 'number_of_watching_users_pageview' => '[$1 watchin {{PLURAL:$1|uiser|uisers}}]',
+'rc_categories' => 'Limit til categeries (separate wi "|")',
 'rc_categories_any' => 'Ony',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} efter chynge',
 'rc-enhanced-expand' => 'Shaw details',
-'rc-enhanced-hide' => 'Hod details',
+'rc-enhanced-hide' => 'Skauk details',
+'rc-old-title' => 'oreeginlie cræftit aes "$1"',
 
 # Recent changes linked
 'recentchangeslinked' => 'Relatit chynges',
 'recentchangeslinked-feed' => 'Relatit chynges',
 'recentchangeslinked-toolbox' => 'Relatit chynges',
-'recentchangeslinked-title' => 'Changes related to "$1"',
-'recentchangeslinked-summary' => "This is a leet o' changes made recently tae pages linked frae a specified page (or tae members o' a specified category).
-Pages on [[Special:Watchlist|your watchleet]] are '''bold'''.",
+'recentchangeslinked-title' => 'Chynges relatit til "$1"',
+'recentchangeslinked-summary' => 'This is ae leet o chynges makit recentlie til pages linked fae ae speceefied page (or til memmers o ae speceefied categerie).
+Pages oan [[Special:Watchlist|yer watchleet]] ar <strong>baud</strong.',
 'recentchangeslinked-page' => 'Page name:',
-'recentchangeslinked-to' => "Shaw changes tae pages linked tae th' given page instead",
+'recentchangeslinked-to' => 'Shaw chynges til pages linked til the gien page instead',
 
 # Upload
 'upload' => 'Uplaid file',
 'uploadbtn' => 'Uplaid file',
 'reuploaddesc' => 'Gang back tae the uplaid form.',
+'upload-tryagain' => 'Haunn in modified file descreeption',
 'uploadnologin' => 'Nae loggit in',
 'uploadnologintext' => 'Please $1 tae uplaid files.',
-'uploaderror' => 'Uplaid error',
-'uploadtext' => 'Uise the form ablow tae uplaid files.
-Tae view or rake previously uplaided files gae til the [[Special:FileList|leet o uplaided files]], (re)uplaids ar loggit in the [[Special:Log/uplaid|uplaid log]] ava, deletions in the [[Special:Log/delete|deletion log]].
+'upload_directory_missing' => 'The uplaid directerie ($1) is missin n coudna be cræftit bi the wabserver.',
+'upload_directory_read_only' => 'The uplaid directerie ($1) is naw writable bi the wabserver.',
+'uploaderror' => 'Uplaid mistak',
+'upload-recreate-warning' => "'''Warnishment: Ae file bi that name haes been delytir or muived.'''
+
+The delytion n muiv log fer this page ar provided here fer conveeeniance:",
+'uploadtext' => 'Uise the form ablo tae uplaid files.
+Tae see or rake preeveeooslie uplaided files gang til the [[Special:FileList|leet o uplaided files]], (re)uplaids ar loggit in the [[Special:Log/upload|uplaid log]] ava, delytions in the [[Special:Log/delete|delytion log]].
 
-Tae inclæde ae file in ae page, uise ae link in yin o the follaein forms:
+Tae incluide ae file in ae page, uise ae link in yin o the follaein forms:
 * <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> tae uise the ful version o the file
-* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> tae uise ae 200 pixel wide rendition in ae box in the left margin wi "alt tex" aes description
-* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> fer linkin directly til the file wiout displaying the file',
+* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt tex]]</nowiki></code></strong> tae uise ae 200 pixel wide rendeetion in ae kist in the cair margin wi "alt tex" aes descreeption
+* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> fer linkin directlie til the file wioot displeyin the file.',
+'upload-permitted' => 'Permitit file types: $1.',
+'upload-prohibited' => 'Proheebited file types: $1.',
 'uploadlog' => 'uplaid log',
 'uploadlogpage' => 'Uplaid log',
 'uploadlogpagetext' => 'Ablo is a leet o the maist recent file uplaids.',
 'filedesc' => 'Ootline',
+'fileuploadsummary' => 'Ootline:',
+'filereuploadsummary' => 'File chynges:',
 'filestatus' => 'Copyricht status:',
 'filesource' => 'Soorce:',
 'uploadedfiles' => 'Uplaidit files',
-'ignorewarning' => 'Ignore warnin an hain file oniewey.',
+'ignorewarning' => 'Ignore warnishment n hain file oniewey.',
 'ignorewarnings' => 'Ignore ony warnins',
-'illegalfilename' => 'The filename "$1" haes characters that isna alloud in page teitles. Please rename the file an gie uplaidin it anither shot.',
+'minlength1' => 'Filenames maun be at least yin letter.',
+'illegalfilename' => 'The filename "$1" haes chairacters that\'s naw permitit in page teitles. Please rename the file n gie uplaidin it anither shote.',
+'filename-toolong' => 'Filenames canna be langer than 240 bytes.',
 'badfilename' => 'Eimage name haes been chynged tae "$1".',
+'filetype-mime-mismatch' => 'File exteension ".$1" disna match the detected MIME type o the file ($2).',
+'filetype-badmime' => 'Files o the MIME type "$1" ar no permitit tae be uplaided.',
+'filetype-bad-ie-mime' => 'Canna uplaid this file cause Internet Explorer wid detect it aes "$1", n this is ae non-permitit n potentiallie dangeroos file type.',
+'filetype-unwanted-type' => "'''\".\$1\"''' is aen onwanted file type.
+Preferred {{PLURAL:\$3|file type is|file types ar}} \$2.",
+'filetype-banned-type' => '<strong>".$1"</strong> {{PLURAL:$4|is naw ae permitted file type|ar naw permitted file types}}.
+Permitted {{PLURAL:$3|file type is|file types ar}} $2.',
+'filetype-missing' => 'The file haes nae extension (like ".jpg").',
+'empty-file' => 'The file that ye haunned in wiss tuim.',
+'file-too-large' => 'The file that ye haunned in wis ower muckle.',
+'filename-tooshort' => 'The filename is ower short.',
+'filetype-banned' => 'This type o file is banned.',
+'verification-error' => 'This file didna pass file verifeecation.',
+'hookaborted' => 'The modifeecation that ye tried tae mak wis abortit bi aen exteension.',
+'illegal-filename' => 'The filename isna permitit.',
+'overwrite' => 'Owerwritin aen exeestin file isna permeetit.',
+'unknown-error' => 'Aen onkent mistake occurred.',
+'tmp-create-error' => 'Coudna cræft temperie file.',
+'tmp-write-error' => 'Mistak writin temperie file.',
+'large-file' => "It's recommended that files ar nae muckler than $1;
+this file is $2.",
 'largefileserver' => 'This file is bigger nor the server is confeigurt tae allou.',
-'fileexists' => "A file wi this name exists aareadies, please check <strong>[[:$1]]</strong> gin ye'r no siccar that ye want tae chynge it.
+'emptyfile' => 'The file that ye uplaided seems tae be tuim.
+This micht be cause o ae typeower in the filename.
+Please check whether ye reallie want tae uplaid this file.',
+'windows-nonascii-filename' => 'This wiki disna support filenames wi speecial chairacters.',
+'fileexists' => "Ae file wi this name exeests aareadies, please check <strong>[[:$1]]</strong> gif ye'r no sair that ye want tae chynge it.
 [[$1|thumb]]",
-'fileexists-forbidden' => 'Ae file wi this name awreadie exists, an canna be owerwritten.
-Gif ye still wish tae uplaid yer file, please gae back an uise ae new name.
+'filepageexists' => "The descreeption page fer this file haes awreadie been cræftit at <strong>[[:$1]]</strong>, but naw file wi this name exeests the nou.
+The ootline that ye enter willna kith oan the descreeption page.
+Tae mak yer ootlline kith there, ye'll need tae manuallie eedit it.
+[[$1|thumb]]",
+'fileexists-extension' => 'Ae file wi ae siclike name exeests: [[$2|thumb]]
+* Name o the uplaidin file: <strong>[[:$1]]</strong>
+* Name o the exeestin file: <strong>[[:$2]]</strong>
+Please chuise ae different name.',
+'fileexists-thumbnail-yes' => "The file seems tae be aen eemage o reduced size ''(thumbnail)''.
+[[$1|thumb]]
+Please check the file <strong>[[:$1]]</strong>.
+Gif the checked file is the same eemage o oreeginal size it's no necessairie tae uplaid aen extra thumbnail.",
+'file-thumbnail-no' => "The filename begins wi <strong>$1</strong>.
+It seems tae be aen eemage o reduced size ''(thumbnail)''.
+Gif ye hae this emage in ful resolution uplaid this yin, itherwise please chynge the filename.",
+'fileexists-forbidden' => 'Ae file wi this name awreadie exists, n canna be owerwritten.
+Gif ye still wish tae uplaid yer file, please gang back n uise ae new name.
 [[File:$1|thumb|center|$1]]',
-'fileexists-shared-forbidden' => 'Ae file wi this name awreadie exists in the shaired file repository.
-Gif ye still wish tae uplaid yer file, please gae back an uise ae new name.
+'fileexists-shared-forbidden' => 'Ae file wi this name awreadie exeests in the shaired file repositerie.
+Gif ye still wish tae uplaid yer file, please gang back n uise ae new name.
 [[File:$1|thumb|center|$1]]',
-'uploadwarning' => 'Uplaid warnin',
+'file-exists-duplicate' => 'This file is ae dupleecate o the follaein {{PLURAL:$1|file|files}}:',
+'file-deleted-duplicate' => "Ae file ideentical til this file ([[:$1]]) haes been delytit afore.
+Ye shid check that file's delytion histerie afore proceedin tae re-uplaid it.",
+'file-deleted-duplicate-notitle' => 'Ae file identeecal til this file haes been delytit afore, n the title haes been suppressed.
+Ye shid ask somebodie wi the abeelitie tae see suppressed file data tae luik at the seetuation afore gaun oan tae re-uplaid it.',
+'uploadwarning' => 'Uplaid warnishment',
+'uploadwarning-text' => 'Please modeefie the file descreeption ablo n gie it anither gae.',
 'savefile' => 'Hain file',
 'uploadedimage' => 'uplaidit "$1"',
+'overwroteimage' => 'uplaided ae new version o "[[$1]]"',
 'uploaddisabled' => 'Sorry, uplaidin is disabled.',
+'copyuploaddisabled' => 'Uplaid bi URL disabled.',
+'uploadfromurl-queued' => 'Yer uplaid haes been pit in line.',
+'uploaddisabledtext' => 'File uplaids ar disabled.',
+'php-uploaddisabledtext' => 'File uplaids ar disabled in PHP.
+Please check the file_uploads settin.',
 'uploadscripted' => 'This file hauds HTML or script code that micht be wrang interpretit bi a wab brouser.',
+'uploadscriptednamespace' => 'This SVG file contains aen illegal namespace "$1"',
+'uploadinvalidxml' => 'The XML in the uplaided file coudna be parsed.',
 'uploadvirus' => 'The file hauds a virus! Details: $1',
+'uploadjava' => 'The file is ae ZIP file that contains ae Java .class file.
+Uplaidin Java files isna permitit cause thay can cause secureetie restreections tae be bypassed.',
+'upload-source' => 'Soorce file',
 'sourcefilename' => 'Soorce filename:',
+'sourceurl' => 'Soorce URL:',
+'destfilename' => 'Desteenation filename:',
+'upload-maxfilesize' => 'Mucklest file size: $1',
+'upload-description' => 'File descreeption',
+'upload-options' => 'Uplaid opties',
+'watchthisupload' => 'Watch this file.',
+'filewasdeleted' => 'Ae file o this name haes been preeveeooslie uplaided n than delytit.
+Ye shid check the $1 afore preceedin tae uplaid it again.',
+'filename-bad-prefix' => "The name o the file that ye'r uplaidin begins wi '''\"\$1\"''', this is ae no-descreepteeve name typiclie assigned autæmateeclie bi deegital cameras.
+Please chuise ae mai descreepteeve name fer yer file.",
+'upload-success-subj' => 'Successfu uplaid',
+'upload-success-msg' => "Yer uplaid fae [$2] wis successfu. It's available here: [[:{{ns:file}}:$1]]",
+'upload-failure-subj' => 'Uplaid problem',
+'upload-failure-msg' => 'Thaur wis ae problem wi yer uplaid fae [$2]:
+
+$1',
+'upload-warning-subj' => 'Uplaid warnishment',
+'upload-warning-msg' => 'Thaur wis ae proablem wi yer uplaid fae [$2]. Ye can return til the [[Special:Upload/stash/$1|uplaid form]] tae correct this proablem.',
+
+'upload-proto-error' => 'Oncorrect protocol',
+'upload-proto-error-text' => 'Remote uplaid needs URLs beginnin wi <code>http://</code> or <code>ftp://</code>.',
+'upload-file-error' => 'Internal mistak',
+'upload-file-error-text' => 'Aen internal mitake occurred whan attemptin tae cræft ae temperie file oan the server.
+Please contact aen [[Special:ListUsers/sysop|admeenistrater]].',
+'upload-misc-error' => 'Onkent uplaid mistake',
+'upload-misc-error-text' => 'Aen onkent error occurred durin the uplaid.
+Please vereefie that the URL is valid n accessible n gie it anither gae.
+Gif the proablem perseests, contact aen [[Special:ListUsers/sysop|admeenistrater]].',
+'upload-too-many-redirects' => 'The URL contained oewr monie reguidals',
+'upload-unknown-size' => 'Onkent size',
+'upload-http-error' => 'Aen HTTP mistake occurred: $1',
+'upload-copy-upload-invalid-domain' => 'Copie uplaids arna available fae this domain.',
+
+# File backend
+'backend-fail-stream' => 'Coudna stream file "$1".',
+'backend-fail-backup' => 'Coudna backup file "$1".',
+'backend-fail-notexists' => 'The file $1 disna exeest.',
+'backend-fail-hashes' => 'Coudna get file hashes fer comparison.',
+'backend-fail-notsame' => 'Ae non-identeecal file awreadie exeests at "$1".',
+'backend-fail-invalidpath' => '"$1" isna ae valid storage path.',
+'backend-fail-delete' => 'Coudna delyte file "$1".',
+'backend-fail-describe' => 'Coudna chynge metadata fer file "$1".',
+'backend-fail-alreadyexists' => 'The file "$1" awreadiw exeests.',
+'backend-fail-store' => 'Coudna store file "$1" at "$2".',
+'backend-fail-copy' => 'Coudna copie file "$1" til "$2".',
+'backend-fail-move' => 'Coudna muiv file "$1" til "$2".',
+'backend-fail-opentemp' => 'Coudna apen temperie file.',
+'backend-fail-writetemp' => 'Coudna write til temperie file.',
+'backend-fail-closetemp' => 'Coudna claise temperie file.',
+'backend-fail-read' => 'Coudna read file "$1".',
+'backend-fail-create' => 'Coudna write file "$1".',
+'backend-fail-maxsize' => 'Coudna write file "$1" cause it\'s muckler than {{PLURAL:$2|yin byte|$2 bytes}}.',
+'backend-fail-readonly' => 'The storage backend "$1" is read-yinlie the nou. The raison gien is: "\'\'$2\'\'"',
+'backend-fail-synced' => 'The file "$1" is in aen onconseestent state wiin the internal storage backends',
+'backend-fail-connect' => 'Coudna connect til storage backend "$1".',
+'backend-fail-internal' => 'Aen onkent mistak occurred in storage backend "$1".',
+'backend-fail-contenttype' => 'Coudna determine the content type o the file tae store at "$1".',
+'backend-fail-batchsize' => 'The storage backend wis gien ae batch o $1 file {{PLURAL:$1|operation|operations}}; the limit is $2 {{PLURAL:$2|operation|operations}}.',
+'backend-fail-usable' => 'Coudna read or write file "$1" cause o onsuffeecient permeessions or missin directeries/containers.',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'Coudna connect til the journal database fer storage backend "$1".',
+'filejournal-fail-dbquery' => 'Coudna update the journal database fer storage backend "$1".',
+
+# Lock manager
+'lockmanager-notlocked' => 'Coudna lowse "$1"; it\'s no lockit.',
+'lockmanager-fail-closelock' => 'Coud no claise lock file fer "$1".',
+'lockmanager-fail-deletelock' => 'Coudna delyte lock file fer "$1".',
+'lockmanager-fail-acquirelock' => 'Coudna acquire lock fer "$1".',
+'lockmanager-fail-openlock' => 'Coudna apen lock file fer "$1".',
+'lockmanager-fail-releaselock' => 'Coudna release lock fer "$1".',
+'lockmanager-fail-db-bucket' => 'Coudna contact enoogh lock databases in bucket $1.',
+'lockmanager-fail-db-release' => 'Coudna release locks oan database $1.',
+'lockmanager-fail-svr-acquire' => 'Coudna acquire locks oan server $1.',
+'lockmanager-fail-svr-release' => 'Coudna release locks oan server $1.',
+
+# ZipDirectoryReader
+'zip-file-open-error' => 'Ae mistak wis encoontered whan apenin the file fer ZIP checks.',
+'zip-wrong-format' => 'The speceefied file wisna ae ZIP file.',
+'zip-bad' => 'The file is ae rotten or itherwise onreadable ZIP file.
+It canna be properlie checkt fer securitie.',
+'zip-unsupported' => "The file is ae ZIP file that uises ZIP featurs that'r naw supported bi MediaWiki.
+It canna be properlie checkt fer securitie.",
+
+# Special:UploadStash
+'uploadstash' => 'Uplaid stash',
+'uploadstash-summary' => 'This page provides access til files that ar uplaided or in the process o uplaidin, but ar no yet published til the wiki. Thir files ar no veesible til oniebodie but the uiser that uplaided thaim.',
+'uploadstash-clear' => 'Clear stashed files.',
+'uploadstash-nofiles' => "Ye'v naw stashed files.",
+'uploadstash-badtoken' => 'The performin o that action wis onnsuccessfu, perhaps cause yer eeditin creeedentials hae expired. Gie it anither gae.',
+'uploadstash-errclear' => 'Clearin the files wis onsuccessfu.',
+'uploadstash-refresh' => 'Refresh the leet o files',
+'invalid-chunk-offset' => 'Onvalid chunk affset',
+
+# img_auth script messages
+'img-auth-accessdenied' => 'Access denied.',
+'img-auth-nopathinfo' => 'Missin PATH_INFO.
+Yer server isna set up tae pass this information.
+It micht be CGI-based n canna support img_auth.
+See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
+'img-auth-notindir' => 'Requested path isna in the confeegured uplaid directerie.',
+'img-auth-badtitle' => 'Onable tae cræft ae valid title fae "$1".',
+'img-auth-nologinnWL' => 'Ye\'r naw loggit in n "$1" isna in the whiteleet.',
+'img-auth-nofile' => 'File "$1" disna exeest.',
+'img-auth-isdir' => 'Ye\'r attemptin tae access ae directerie "$1".
+Yinlie file access is premitit.',
+'img-auth-streaming' => 'Streamin "$1".',
+'img-auth-public' => 'The function o img_auth.php is tae ootpit files fae ae preevate wiki.
+This wiki is confeegured aes ae publeec wiki.
+Fr optimal securitie, img_auth.php is disabled.',
+'img-auth-noread' => 'Uiser disna hae access tae read "$1".',
+'img-auth-bad-query-string' => 'The URL haaes aen onvalid speirin string.',
+
+# HTTP errors
+'http-invalid-url' => 'Onvalid URL: $1',
+'http-invalid-scheme' => 'URLs wi the "$1" preefix ar naw supported.',
+'http-request-error' => 'HTTP request failed cause o onkent mistak.',
+'http-read-error' => 'HTTP read mistak.',
+'http-timed-out' => 'HTTP request haes timed oot.',
+'http-curl-error' => 'Mistake fetchin URL: $1',
+'http-bad-status' => 'Thaur wis ae proablem wi the HTTP request: $1 $2',
+
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error6' => 'Coudna reach URL',
+'upload-curl-error6-text' => 'The URL provided coudna be reached.
+Please double-check that the URL is correct n the site is up.',
+'upload-curl-error28' => 'Uplaid timeoot',
+'upload-curl-error28-text' => 'The site tuik ower lang tae respond.
+Please check that the site is up, wait ae short while n gei it anither gae.
+Ye micht want tae try at ae less busie time.',
 
 'license' => 'Licensing:',
-'license-header' => 'Licensing',
+'license-header' => 'Licensin',
 'nolicense' => 'Nane selected',
+'license-nopreview' => '(Luikower naw available)',
+'upload_source_url' => '(ae valid, publeeclie accessible URL)',
+'upload_source_file' => '(ae file oan yer computer)',
 
 # Special:ListFiles
+'listfiles-summary' => 'This speecial page shaws aw uplaided files.',
+'listfiles_search_for' => 'Rake fer media name:',
 'imgfile' => 'file',
 'listfiles' => 'Eimage leet',
+'listfiles_thumb' => 'Thummnail',
 'listfiles_name' => 'Name',
 'listfiles_user' => 'Uiser',
 'listfiles_size' => 'Size',
+'listfiles_description' => 'Descreeption',
+'listfiles-show-all' => 'Incluide auld versions o eemages',
+'listfiles-latestversion' => 'The Nou version',
+'listfiles-latestversion-yes' => 'Ay',
+'listfiles-latestversion-no' => 'Naw',
 
 # File description page
 'file-anchor-link' => 'Eimage',
 'filehist' => 'File history',
-'filehist-help' => "Click oan a date/time tae view th' file as it appeared at that time.",
-'filehist-deleteone' => 'delete',
+'filehist-help' => 'Clap oan ae date/time tae view the file aes it appeared at that time.',
+'filehist-deleteall' => 'delyte aw',
+'filehist-deleteone' => 'delyte',
 'filehist-revert' => 'revert',
 'filehist-current' => 'current',
 'filehist-datetime' => 'Date/Time',
 'filehist-thumb' => 'Thumbnail',
-'filehist-thumbtext' => 'Thumbnail for version as of $1',
+'filehist-thumbtext' => 'Thumbnail fer version aes o $1',
+'filehist-nothumb' => 'Naw thummnail',
 'filehist-user' => 'Uiser',
 'filehist-dimensions' => 'Dimensions',
 'filehist-comment' => 'Comment',
+'filehist-missing' => 'File missin',
 'imagelinks' => 'File uisage',
 'linkstoimage' => 'The follaein {{PLURAL:$1|page airts|$1 pages airt}} tae this file:',
+'linkstoimage-more' => 'Mair than $1 {{PLURAL:$1|page links|pages link}} til this file.
+The follaein leet shaws the {{PLURAL:$1|first page link|first $1 page links}} til this file yinlie.
+Ae [[Special:WhatLinksHere/$2|ful leet]] is available.',
 'nolinkstoimage' => "The'r nae pages airts tae this eimage.",
-'sharedupload-desc-here' => "This file is frae $1 and may be used bi other projects.
-Th' description oan tis [$2 file description page] thare is shown below.",
+'morelinkstoimage' => 'See [[Special:WhatLinksHere/$1|mair links]] til this file.',
+'linkstoimage-redirect' => '$1 (file reguidal) $2',
+'duplicatesoffile' => 'The follaein {{PLURAL:$1|file is ae dupleecate|$1 files ar dupleecates}} o this file ([[Special:FileDuplicateSearch/$2|mair details]]):',
+'sharedupload' => 'This file is fae $1 n can be uised bi ither waurks.',
+'sharedupload-desc-there' => 'This file is fae $1 n can be uised bi ither waurks.
+Please see the [$2 file deescreeption page] fer further information.',
+'sharedupload-desc-here' => 'This file is fae $1 n micht be uised bi ither waurks.
+The descreeption oan its [$2 file descreeption page] thaur is shawn ablo.',
+'sharedupload-desc-edit' => 'This file is fae $1 n can be uised bi ither waurks.
+Perhaps ye want tae eedit the deescreeption oan its [$2 file deescreeption page] thaur.',
+'sharedupload-desc-create' => 'This file is fae $1 n can be uised bi ither waurks.
+Perhaps ye want tae eedit the deescreeption oan its [$2 file deescreeption page] thaur.',
+'filepage-nofile' => 'Naw file b this name exeests.',
+'filepage-nofile-link' => 'Nae file bi this name exeests, but ye can [$1 uplaid it].',
+'uploadnewversion-linktext' => 'Uplaid ae new version o this file',
+'shared-repo-from' => 'fae $1',
+'shared-repo' => 'ae shared repositerie',
+'upload-disallowed-here' => 'Ye canna owerwrite this file.',
 
 # File reversion
 'filerevert' => 'Revert $1',
 'filerevert-legend' => 'Revert file',
+'filerevert-intro' => "Ye'r aboot tae revert the file '''[[Media:$1|$1]]''' til the [$4 version aes o $3, $2].",
+'filerevert-comment' => 'Raison:',
+'filerevert-defaultcomment' => 'Reverted til version aes o $2, $1',
 'filerevert-submit' => 'Revert',
+'filerevert-success' => "'''[[Media:$1|$1]]''' haes been reverted til the [$4 version aes o $3, $2].",
+'filerevert-badversion' => "Thaur's naw preeveeoos local version o this file wi the provided timestamp.",
 
 # File deletion
-'filedelete-submit' => 'Delete',
+'filedelete' => 'Delyte $1',
+'filedelete-legend' => 'Delyte file',
+'filedelete-intro' => "Ye'r aboot tae delyte the file '''[[Media:$1|$1]]''' alang wi aw o its histerie.",
+'filedelete-intro-old' => "Ye'r delytin the version o '''[[Media:$1|$1]]''' aes o [$4 $3, $2].",
+'filedelete-comment' => 'Raison:',
+'filedelete-submit' => 'Delyte',
+'filedelete-success' => "'''$1''' haes been delytit.",
+'filedelete-success-old' => "The version o '''[[Media:$1|$1]]''' aes o $3, $2 haes been delytit.",
+'filedelete-nofile' => "'''$1''' disna exeest.",
+'filedelete-nofile-old' => "Thaur's naw archived version o '''$1''' wi the speceefied attreebutes.",
+'filedelete-otherreason' => 'Ither/addeetional raison:',
+'filedelete-reason-otherlist' => 'Ither raison',
+'filedelete-reason-dropdown' => '*Commyn delyte raisons
+** Copiericht violation
+** Dupleecatit file',
+'filedelete-edit-reasonlist' => 'Eedit delyte raisons',
+'filedelete-maintenance' => 'Delytion n restoration o files tempralie disabled during maintenance.',
+'filedelete-maintenance-title' => 'Canna delyte file',
 
 # MIME search
+'mimesearch' => 'MIME rake',
+'mimesearch-summary' => 'This page enables the filterin o files fer thair MIME type.
+Input: contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'mimetype' => 'MIME type:',
 'download' => 'dounlaid',
 
+# Unwatched pages
+'unwatchedpages' => 'Onwatched pages',
+
+# List redirects
+'listredirects' => 'Leet o reguidals',
+
 # Unused templates
 'unusedtemplates' => 'Templates that arena uised',
-'unusedtemplatestext' => 'This page leets aw pages in the {{ns:template}} namespace that arna incæded in anither page. Mynd an check fer ither airtins til the templates afore deletin theim.',
+'unusedtemplatestext' => "This page leets aw pages in the {{ns:template}} namespace that's naw incuidit in anither page. Mynd n check fer ither links til the templates afore delytin thaim.",
 'unusedtemplateswlh' => 'ither links',
 
 # Random page
 'randompage' => 'Wale page allevolie',
+'randompage-nopages' => "Thaur's naw pages in the follaein {{PLURAL:$2|namespace|namespaces}}: $1.",
+
+# Random page in category
+'randomincategory' => 'Random page in categerie',
+'randomincategory-invalidcategory' => '"$1" isna ae valid categerie name.',
+'randomincategory-nopages' => "Thaur's naw pages in the [[:Category:$1|$1]] categerie.",
+'randomincategory-selectcategory' => 'Get random page fae categerie: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Gae',
+
+# Random redirect
+'randomredirect' => 'Random reguidal',
+'randomredirect-nopages' => 'Thaur\'s naw reguidals in the namespace "$1".',
 
 # Statistics
-'statistics' => 'Statistics',
-'statistics-header-pages' => 'Page statistics',
-'statistics-header-edits' => 'Edit statistics',
-'statistics-header-views' => 'View statistics',
-'statistics-header-users' => 'Uiser statistics',
-'statistics-header-hooks' => 'Ither statistics',
+'statistics' => 'Stateestics',
+'statistics-header-pages' => 'Page stateestics',
+'statistics-header-edits' => 'Eidit stateestics',
+'statistics-header-views' => 'View stateestics',
+'statistics-header-users' => 'Uiser stateestics',
+'statistics-header-hooks' => 'Ither stateestics',
 'statistics-pages' => 'Pages',
+'statistics-pages-desc' => 'Aw pages in the wiki, incluidin tauk pages, reguidals, etc.',
+'statistics-files' => 'Uplaided files',
+'statistics-edits' => 'Page eedits sin {{SITENAME}} wis set up',
+'statistics-edits-average' => 'Average eedits per page',
+'statistics-views-total' => 'Seeins total',
+'statistics-views-total-desc' => "Seeins til non-exeestant pages n speecial pages'r naw incluidit",
+'statistics-views-peredit' => 'Seeins per eedit',
+'statistics-users' => 'Registered [[Special:ListUsers|uisers]]',
+'statistics-users-active' => 'Acteeve uisers',
+'statistics-users-active-desc' => 'Uisers that hae performed aen action in the laist {{PLURAL:$1|day|$1 days}}',
+'statistics-mostpopular' => 'Maist seen pages',
+
+'pageswithprop' => 'Pages wi ae page propertie',
+'pageswithprop-legend' => 'Pages wi ae page propertie',
+'pageswithprop-text' => 'This page leets pages that uise ae particular page propertie.',
+'pageswithprop-prop' => 'Propertie name:',
+'pageswithprop-submit' => 'Gae',
+'pageswithprop-prophidden-long' => 'lang tex propertie value skaukt ($1)',
+'pageswithprop-prophidden-binary' => 'binarie propertie value skaukt ($1)',
 
 'doubleredirects' => 'Dooble reguidals',
 'doubleredirectstext' => 'This page leets pages that redirect til ither redirect pages.
 Ilka rou contains airtins til the first and seicont redirect, aes weel aes the terget o the secont redirect, whilk is usually the "real" terget page whaur the first redirect shid point.
 <del>Crossed oot</del> entries hae been solved.',
+'double-redirect-fixed-move' => '[[$1]] haes been muived.
+It nou reguides til [[$2]].',
+'double-redirect-fixed-maintenance' => 'Fixin dooble reguidal fae [[$1]] til [[$2]].',
+'double-redirect-fixer' => 'Reguidal fixer',
 
 'brokenredirects' => 'Brucken reguidals',
 'brokenredirectstext' => 'The folling redirects link til non-existent pages:',
-'brokenredirects-edit' => 'edit',
-'brokenredirects-delete' => 'delete',
+'brokenredirects-edit' => 'eedit',
+'brokenredirects-delete' => 'delyte',
 
 'withoutinterwiki' => 'Pages athoot leid links',
+'withoutinterwiki-summary' => 'The follaein pages dinan link til ither leid versions.',
 'withoutinterwiki-legend' => 'Prefix',
 'withoutinterwiki-submit' => 'Shaw',
 
+'fewestrevisions' => 'Pages wi the fewest reeveesions',
+
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byte|bytes}}',
 'ncategories' => '$1 {{PLURAL:$1|category|categories}}',
 'nlinks' => '$1 {{PLURAL:$1|link|links}}',
 'nmembers' => '$1 {{PLURAL:$1|membir|membirs}}',
+'nmemberschanged' => '$1 → $2 {{PLURAL:$2|memmer|memmers}}',
 'nrevisions' => '$1 {{PLURAL:$1|reveision|reveisions}}',
 'nviews' => '$1 {{PLURAL:$1|view|views}}',
+'nimagelinks' => 'Uised oan $1 {{PLURAL:$1|page|pages}}',
+'ntransclusions' => 'uised oan $1 {{PLURAL:$1|page|pages}}',
+'specialpage-empty' => "Thaur's naw affcomes fer this report.",
+'lonelypages' => 'Orphant pages',
+'lonelypagestext' => "The follaein pages'r naw linkt fae or transcluided intil ither pages in {{SITENAME}}.",
 'uncategorizedpages' => 'Uncategoreised pages',
 'uncategorizedcategories' => 'Uncategoreised categories',
+'uncategorizedimages' => 'Oncategerized files',
+'uncategorizedtemplates' => 'Oncategerized templates',
 'unusedcategories' => 'Unuised categories',
 'unusedimages' => 'Unuised images',
 'wantedcategories' => 'Wantit categories',
 'wantedpages' => 'Wantit pages',
+'wantedpages-badtitle' => 'Onvalid title in affcome set: $1',
+'wantedfiles' => 'Wantit files',
+'wantedfiletext-cat' => 'The follaein files ar uised but dinna exeest. Files fae foreign repositeries micht be leetit despite exeestin. Onie sic false poseeteeves will be <del>struck oot</del>. Addeetionallie, pages that embed files that dinna exeest ar leetit in [[:$1]].',
+'wantedfiletext-nocat' => 'The follaein files ar uised but dinna exeest. Files fae foreign repositeries micht be leetit despite exeestin. Onie sic false poseeteeves will be <del>struck oot</del>.',
+'wantedtemplates' => 'Wantit templates',
 'mostlinked' => 'Maist airtit-til pages',
 'mostlinkedcategories' => 'Maist airtit-til categories',
+'mostlinkedtemplates' => 'Maist linkt-til templates',
 'mostcategories' => 'Airticles wi the maist categories',
 'mostimages' => 'Maist uised eimages',
+'mostinterwikis' => 'Pages wi the maist interwikis',
 'mostrevisions' => 'Maist revised airticles',
-'prefixindex' => 'All pages with prefix',
+'prefixindex' => 'Aw pages wi prefix',
+'prefixindex-namespace' => 'Aw pages wi preefix ($1 namespace)',
+'prefixindex-strip' => 'Strip preefix in leet',
 'longpages' => 'Lang pages',
 'deadendpages' => 'Deid-end pages',
-'protectedpages-summary' => 'This page leets existing pages that are nou protectit. Fer a leet o titles that are protectit fae creation, see [[{{#special:ProtectedTitles}}]].',
+'deadendpagestext' => 'The follaein pages dinna link til ither pages in {{SITENAME}}.',
+'protectedpages' => 'Pretectit pages',
+'protectedpages-indef' => 'Indefineet pretections yinlie',
+'protectedpages-summary' => 'This page leets existin pages that ar nou protectit. Fer a leet o titles that ar protectit fae cræftin, see [[{{#special:ProtectedTitles}}]].',
+'protectedpages-cascade' => 'Cascadin protections yinlie',
+'protectedpages-noredirect' => 'Skauk reguidals',
+'protectedpagesempty' => 'Naw pages ar Nou pretectit wi thir parameters.',
 'protectedpages-timestamp' => 'Timestamp.',
 'protectedpages-page' => 'Page.',
 'protectedpages-expiry' => 'Dies',
@@ -1399,95 +1936,190 @@ Ilka rou contains airtins til the first and seicont redirect, aes weel aes the t
 'protectedpages-reason' => 'Raison',
 'protectedpages-unknown-timestamp' => "Onken't",
 'protectedpages-unknown-performer' => "Onken't user",
-'protectedtitles-summary' => 'This page leets titles that are nou protectit fae creation. Fer a leet of exeesting pages that are protectit, see [[{{#special:ProtectedPages}}]].',
+'protectedtitles' => 'Pretectit titles',
+'protectedtitles-summary' => 'This page leets titles that ar nou protectit fae cræftin. Fer a leet of exeesting pages that ar protectit, see [[{{#special:ProtectedPages}}]].',
+'protectedtitlesempty' => 'Naw titles ar the Nou protected wi thir parameters.',
 'listusers' => 'Uiser leet',
-'usercreated' => '{{GENDER:$3|Created}} on $1 at $2',
+'listusers-editsonly' => 'Shaw yinlie uisers wi eedits',
+'listusers-creationsort' => 'Sort bi cræftin date',
+'listusers-desc' => 'Sort in descendin order',
+'usereditcount' => '$1 {{PLURAL:$1|eedit|eedits}}',
+'usercreated' => '{{GENDER:$3|Cræftit}} oan $1 at $2',
 'newpages' => 'New pages',
 'newpages-username' => 'Uisername:',
 'ancientpages' => 'Auldest pages',
 'move' => 'Flit',
 'movethispage' => 'Flit this page',
-'unusedimagestext' => 'The follaeing files exist but arna embeddit in oni page.
-Please note that ither wab sites micht airt til ae file wi ae direct URL, an sae micht still be leetit here despite being in active uiss.',
+'unusedimagestext' => 'The follaein files exeest but arna embeddit in onie page.
+Please mynd that ither wab sites micht link til ae file wi ae direct URL, n sae micht still be leetit here despite being in acteeve uiss.',
 'unusedcategoriestext' => 'The follaein category pages exists, tho nae ither airticle or category maks uiss o thaim.',
 'notargettitle' => 'Nae target',
 'notargettext' => "Ye hivna specifee'd a tairget page or uiser tae perform this function on.",
+'nopagetitle' => 'Naw sic tairget page',
+'nopagetext' => "The tairget page that ye'v speeceefied disna exeest.",
 'pager-newer-n' => '{{PLURAL:$1|newer 1|newer $1}}',
 'pager-older-n' => '{{PLURAL:$1|older 1|older $1}}',
+'suppress' => 'Owersicht',
+'querypage-disabled' => 'This speecial page is disablit fer performance raisons.',
 
 # Book sources
 'booksources' => 'Beuk sources',
-'booksources-search-legend' => 'Search fur book sources',
+'booksources-search-legend' => 'Rake fer buik soorces',
 'booksources-go' => 'Gang',
+'booksources-text' => "Ablo is ae leet o links til ither sites that sell new n uised buiks, n mmicht hae further information aneat buiks that ye'r seekin ava:",
+'booksources-invalid-isbn' => 'The gien ISBN disna seem tae be valid; check fer mistaks copiein fae the oreeginal soorce.',
 
 # Special:Log
 'specialloguserlabel' => 'Performer:',
 'speciallogtitlelabel' => 'Target (title or uiser):',
 'log' => 'Logs',
 'all-logs-page' => 'Aw public logs',
-'alllogstext' => 'Combined display o aw available logs o {{SITENAME}}.
-Ye can narrae down the view bi selectin ae log type, the uisername (case-sensitive), or the affected page (case-sensitive ava).',
+'alllogstext' => 'Combined displey o aw available logs o {{SITENAME}}.
+Ye can narrae doon the whit ye see bi selectin ae log type, the uisername (case-sensiteeve), or the affected page (case-sensiteeve ava).',
 'logempty' => 'Nae matchin items in log.',
+'log-title-wildcard' => 'Rake titles stairtin wi this tex',
+'showhideselectedlogentries' => 'Chynge veesibeelitie o selectit log entries',
 
 # Special:AllPages
-'allpages' => 'Aa pages',
+'allpages' => 'Aw pages',
 'alphaindexline' => '$1 tae $2',
 'nextpage' => 'Neist page ($1)',
 'prevpage' => 'Page afore ($1)',
 'allpagesfrom' => 'Shaw pages stairtin at:',
+'allpagesto' => 'Displey pages endin at:',
 'allarticles' => 'Aa airticles',
 'allinnamespace' => 'Aa pages ($1 namespace)',
 'allpagessubmit' => 'Gang',
 'allpagesprefix' => 'Shaw pages wi prefix:',
 'allpagesbadtitle' => 'The page teitle gien wis wrang or haed a cross-lied or cross-wiki prefix. It micht hae ane or twa characters that canna be uised in teitles',
 'allpages-bad-ns' => '{{SITENAME}} disna hae a namespace "$1".',
+'allpages-hide-redirects' => 'Skauk reguidals',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => "Ye'r seein ae cached version o this page, this can be up til $1 auld.",
+'cachedspecial-viewing-cached-ts' => "Ye'r seein ae cached version o this page, this micht naw be compleatelie actual.",
+'cachedspecial-refresh-now' => 'See latest.',
 
 # Special:Categories
 'categories' => 'Categories',
-'categoriespagetext' => 'The follaeing {{PLURAL:$1|categorie contains|categories contain}} pages or media.
-[[Special:UnusedCategories|Onuised categories]] arna shawn here.
-See [[Special:WantedCategories|wanted categories]] ava.',
+'categoriespagetext' => 'The follaein {{PLURAL:$1|categerie contains|categeries contain}} pages or media.
+[[Special:UnusedCategories|Onuised categeries]] arna shawn here.
+See [[Special:WantedCategories|wanted categeries]] ava.',
+'categoriesfrom' => 'Displey categeries stairtin at:',
 'special-categories-sort-count' => 'sairt bi coont',
 'special-categories-sort-abc' => 'sairt by the alphabet',
 
 # Special:DeletedContributions
-'sp-deletedcontributions-contribs' => 'contreibutions',
+'deletedcontributions' => 'Delytit uiser contreebutions',
+'deletedcontributions-title' => 'Delytit uiser contreebutions',
+'sp-deletedcontributions-contribs' => 'contreebutions',
 
 # Special:LinkSearch
+'linksearch' => 'External links rake',
+'linksearch-pat' => 'Rake pattern:',
 'linksearch-ns' => 'Namespace:',
 'linksearch-ok' => 'Rake',
+'linksearch-text' => 'Wildcairds like "*.wikipedia.org" can be uised.
+Needs at least ae top-level domain, fer example "*.org".<br />
+Supported {{PLURAL:$2|protocol|protocols}}: <code>$1</code> (defaults to http:// gif naw protocol is speceefied).',
 'linksearch-line' => '$1 is linked from $2',
+'linksearch-error' => 'Wildcards micht appear yinlie at the stairt o the hoastname.',
 
 # Special:ListUsers
+'listusersfrom' => 'Displey uisers stairtin at:',
 'listusers-submit' => 'Shaw',
+'listusers-noresult' => 'Naw uiser foond.',
 'listusers-blocked' => '(blockit)',
 
+# Special:ActiveUsers
+'activeusers' => 'Acteeve uisers leet',
+'activeusers-intro' => 'This is ae leet o uisers that had some kynd o acteevitie wiin the last $1 {{PLURAL:$1|day|days}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|action|actions}} in the laist {{PLURAL:$3|day|$3 days}}',
+'activeusers-from' => 'Displey uisers stairtin at:',
+'activeusers-hidebots' => 'Skauk bots',
+'activeusers-hidesysops' => 'Skauk admeenistraters',
+'activeusers-noresult' => 'Naw uisers foond.',
+
 # Special:ListGroupRights
+'listgrouprights' => 'Uiser groop richts',
+'listgrouprights-summary' => 'The follaein is aae leet o uiser groops defined oan this wiki, wi thair associated access richts.
+There micht be [[{{MediaWiki:Listgrouprights-helppage}}|addeetional information]] aneat indiveedual richts.',
+'listgrouprights-key' => 'Legend:
+* <span class="listgrouprights-granted">Grantit richt</span>
+* <span class="listgrouprights-revoked">Revokt richt</span>',
+'listgrouprights-group' => 'Groop',
+'listgrouprights-rights' => 'Richts',
+'listgrouprights-helppage' => 'Help:Groop richts',
 'listgrouprights-members' => '(leet o members)',
+'listgrouprights-addgroup' => 'Add {{PLURAL:$2|groop|groops}}: $1',
+'listgrouprights-removegroup' => 'Remuiv {{PLURAL:$2|grop|groops}}: $1',
+'listgrouprights-addgroup-all' => 'Add aw groops',
+'listgrouprights-removegroup-all' => 'Remui aw groops',
+'listgrouprights-addgroup-self' => 'Add {{PLURAL:$2|groop|groops}} til yer accoont: $1',
+'listgrouprights-removegroup-self' => 'Remuiv {{PLURAL:$2|groop|groops}} fae yer accoont: $1',
+'listgrouprights-addgroup-self-all' => 'Add aw groops til yer accoont',
+'listgrouprights-removegroup-self-all' => 'Remuiv aw groops fae yer accoont',
 
 # Email user
 'mailnologin' => 'Nae send address',
-'mailnologintext' => 'Ye maun be [[Special:UserLogin|loggit in]] an hae a valid e-mail address in yer [[Special:Preferences|preferences]] tae send e-mail til ither uisers.',
+'mailnologintext' => 'Ye maun be [[Special:UserLogin|loggit in]] n hae ae valid wab-mail address in yer [[Special:Preferences|preferences]] tae send Wab-mail til ither uisers.',
 'emailuser' => 'E-mail this uiser',
+'emailuser-title-target' => 'Wab-mail this {{GENDER:$1|uiser}}',
+'emailuser-title-notarget' => 'Wab-mail uiser',
+'emailpage' => 'Wab-mail uiser',
+'emailpagetext' => 'Ye can uise the form ablo tae send ae wab-mail message til this {{GENDER:$1|uiser}}.
+The wab-mail address that ye entered in [[Special:Preferences|yer uiser preeferances]] will kith aes the "Fae" address o the wab-mail, sae that the receepient will be able tae replie directlie til ye.',
+'usermailererror' => 'Mail object returned mistak:',
+'defemailsubject' => '{{SITENAME}} wab-mail fae uiser "$1"',
+'usermaildisabled' => 'Uiser wab-mail disablit',
+'usermaildisabledtext' => 'Ye canna send wab-mail til ither uisers oan this wiki',
 'noemailtitle' => 'Nae e-mail address',
 'noemailtext' => 'This uiser haesna speceefied ae valid wab-mail address.',
+'nowikiemailtitle' => 'Naw wab-mail permitit',
+'nowikiemailtext' => 'This uiser haes choosen tae naw receeve wab-mail fae ither uisers.',
+'emailnotarget' => 'Non-exeestent or onvalit uisername fer receepeeant.',
+'emailtarget' => 'Enter uisername o reeceepeeant',
+'emailusername' => 'Uisername:',
+'emailusernamesubmit' => 'Haun-in',
+'email-legend' => 'Send ae wab-mail til anither {{SITENAME}} uiser',
+'emailfrom' => 'Fae:',
+'emailto' => 'Til:',
+'emailsubject' => 'Aneat:',
 'emailmessage' => 'Message:',
+'emailccme' => 'Wab-mail me ae copie o ma message.',
+'emailccsubject' => 'Copie o yer message til $1: $2',
+'emailsent' => 'Wab-mail sent',
+'emailsenttext' => 'Yer wab-mail message haes been sent.',
+'emailuserfooter' => 'This wab-mail wis sent bi $1 til $2 bi the "Wab-mail uiser" function at {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Leain seestem message.',
+'usermessage-editor' => 'Seestem messenger',
 
 # Watchlist
 'watchlist' => 'Ma watchleet',
 'mywatchlist' => 'Ma watchleet',
 'watchlistfor2' => 'For $1 $2',
-'nowatchlist' => 'Ye hivna onie eitems on yer watchleet.',
+'nowatchlist' => "Ye'v nae eitems oan yer watchleet.",
+'watchlistanontext' => 'Please $1 tae see or eedit eetems oan yer watchlet.',
 'watchnologin' => 'Nae loggit in',
 'watchnologintext' => 'Ye maun be [[Special:UserLogin|loggit in]] tae modify yer watchleet.',
+'addwatch' => 'Add til watchleet',
 'addedwatchtext' => 'The page "[[:$1]]" haes been added til yer [[Special:Watchlist|watchleet]].
-Future chynges til this page an its associated tauk page will be leeted there.',
+Futur chynges til this page n its associated tauk page will be leeted thaur.',
+'removewatch' => 'Remuiv fae watchleet',
 'removedwatchtext' => 'The page "[[:$1]]" haes been remuied fae [[Special:Watchlist|yer watchleet]].',
 'watch' => 'Watch',
 'watchthispage' => 'Leuk ower this page',
 'unwatch' => 'Unwatch',
-'notanarticle' => 'No a content page',
-'watchlist-details' => '{{PLURAL:$1|$1 page|$1 pages}} on yer watchleet, no countin talk pages.',
+'unwatchthispage' => 'Stap watchin',
+'notanarticle' => 'Naw ae content page',
+'notvisiblerev' => 'The last reeveesion bi ae differant uiser haes been delytit',
+'watchlist-details' => '{{PLURAL:$1|$1 page|$1 pages}} oan yer watchleet, na coontin tauk pages.',
+'wlheader-enotif' => 'Wab-mail annooncemant is enabled.',
+'wlheader-showupdated' => "Pages that hae been chynged sin ye last veesitit thaim ar shawn in '''baud'''.",
+'watchmethod-recent' => 'checkin recent eedits fer watched pages',
+'watchmethod-list' => 'checking watched pages fer recent eedits',
 'watchlistcontains' => 'Yer watchleet contains $1 {{PLURAL:$1|page|pages}}.',
 'iteminvalidname' => "Trouble wi eitem '$1', invalid name...",
 'wlnote2' => 'Ablow ar the chynges in the hainmaist {{PLURAL:$1|hour|<strong>$1</strong> hours}}, as of $3, $2.',
@@ -1497,121 +2129,265 @@ Future chynges til this page an its associated tauk page will be leeted there.',
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Watchin...',
 'unwatching' => 'Unwatchin...',
+'watcherrortext' => 'Ae mistak occurred while chyngin yer watchleet settins fer "$1".',
 
+'enotif_mailer' => '{{SITENAME}} annooncemant mailer',
 'enotif_reset' => 'Merk aa pages visitit',
-'enotif_lastvisited' => 'Hae a leuk at $1 for aa chynges sin yer last visit.',
+'enotif_impersonal_salutation' => '{{SITENAME}} uiser',
+'enotif_subject_deleted' => '{{SITENAME}} page $1 haes been {{GENDER:$2|delytit}} bi $2',
+'enotif_subject_created' => '{{SITENAME}} page $1 haes been {{GENDER:$2|cræftit}} bi $2',
+'enotif_subject_moved' => '{{SITENAME}} page $1 haes been {{GENDER:$2|muived}} bi $2',
+'enotif_subject_restored' => '{{SITENAME}} page $1 haes been {{GENDER:$2|restored}} bi $2',
+'enotif_subject_changed' => '{{SITENAME}} page $1 haes been {{GENDER:$2|chynged}} bi $2',
+'enotif_body_intro_deleted' => 'The {{SITENAME}} page $1 haes been {{GENDER:$2|delytit}} oan $PAGEEDITDATE bi $2, see $3.',
+'enotif_body_intro_created' => 'The {{SITENAME}} page $1 haes been {{GENDER:$2|cræftit}} oan $PAGEEDITDATE bi $2, see $3 fer the Nou reeveesion.',
+'enotif_body_intro_moved' => 'The {{SITENAME}} page $1 haes been {{GENDER:$2|muived}} oan $PAGEEDITDATE bi $2, see $3 fer the Nou reeveesion.',
+'enotif_body_intro_restored' => 'The {{SITENAME}} page $1 haes been {{GENDER:$2|restored}} oan $PAGEEDITDATE bi $2, see $3 fer the Nou reveesion.',
+'enotif_body_intro_changed' => 'The {{SITENAME}} page $1 haes been {{GENDER:$2|chynged}} oan $PAGEEDITDATE bi $2, see $3 fer the Nou reeveesion.',
+'enotif_lastvisited' => 'Hae ae leuk at $1 fer aa chynges sin yer laist veesit.',
+'enotif_lastdiff' => 'See $1 tae see this chynge.',
+'enotif_anon_editor' => 'anonymoos uiser $1',
+'enotif_body' => 'Dear $WATCHINGUSERNAME,
+
+$PAGEINTRO $NEWPAGE
+
+Eediter\'s ootline: $PAGESUMMARY $PAGEMINOREDIT
+
+Contact the eediter:
+mail: $PAGEEDITOR_EMAIL
+wiki: $PAGEEDITOR_WIKI
+
+Thaur\'ll be naw ither annooncemants in case o further acteevitie onless ye veesit this page while loggit in. Ye coud forby reset the annooncemant flags fer aw yer watched pages oan yer watchleet.
+
+Yer freendlie {{SITENAME}} annooncemant system
+
+--
+Taae chynge yer wab-mail annooncemant settins, veesit
+{{canonicalurl:{{#special:Preferences}}}}
+
+Tae chynge yer watchleet settins, veesit
+{{canonicalurl:{{#special:EditWatchlist}}}}
+
+Tae delyte the page fae yer watchleet, veesit
+$UNWATCHURL
+
+Feedback n further asseestance:
+{{canonicalurl:{{MediaWiki:Helppage}}}}',
 'created' => 'creatit',
 'changed' => 'chynged',
 
 # Delete
-'deletepage' => 'Delete page',
+'deletepage' => 'Delyte page',
 'excontent' => "content wis: '$1'",
-'excontentauthor' => "content wis: '$1' (an the ae contreibutor wis '[[Special:Contributions/$2|$2]]')",
+'excontentauthor' => "content wis: '$1' (n the ae contreebuter wis '[[Special:Contributions/$2|$2]]')",
 'exbeforeblank' => "content afore blankin wis: '$1'",
 'exblank' => 'page wis tuim',
-'delete-confirm' => 'Delete "$1"',
-'delete-legend' => 'Delete',
-'historywarning' => "<strong>Warnishment:</strong> The page ye'r aboot tae delete haes ae histerie wi approximately $1 {{PLURAL:$1|revision|revisions}}:",
-'confirmdeletetext' => "Ye'r aboot tae permanently delete a page or eimage alang wi aa its history frae the database.
+'delete-confirm' => 'Delyte "$1"',
+'delete-legend' => 'Delyte',
+'historywarning' => "<strong>Warnishment:</strong> The page that ye'r aboot tae delyte haes ae histerie wi approximatelie $1 {{PLURAL:$1|reveesion|reveesions}}:",
+'confirmdeletetext' => "Ye'r aboot tae delyte ae page or eemage alang wi aw its histerie fae the database.
 Please confirm that ye intend tae dae this, that ye unnerstaun the consequences,
-an that ye'r daein this in accord wi [[{{MediaWiki:Policy-url}}]].",
+n that ye'r daein this in accord wi [[{{MediaWiki:Policy-url}}]].",
 'actioncomplete' => 'Action duin',
 'actionfailed' => 'Action failed',
-'deletedtext' => '"$1" haes been delete. See $2 for a record o recent deletions.',
-'dellogpage' => 'Deletion log',
+'deletedtext' => '"$1" haes been delytit. See $2 fer ae record o recent delytions.',
+'dellogpage' => 'Delytion log',
 'dellogpagetext' => 'Ablo is a leet o the maist recent deletions.',
-'deletionlog' => 'deletion log',
+'deletionlog' => 'delytion log',
 'reverted' => 'Revertit tae aulder reveision',
 'deletecomment' => 'Raeson:',
+'deleteotherreason' => 'Ither/addeetional raison:',
 'deletereasonotherlist' => 'Ither raeson',
+'deletereason-dropdown' => '* Commyn delyte raisons
+** Spam
+** Vandaleesm
+** Copiericht violation
+** Writer request
+** Broken reguidal',
+'delete-edit-reasonlist' => 'Eedit delytion raisons',
+'delete-toobig' => 'This page haes ae muckle eedit histerie, ower $1 {{PLURAL:$1|reveesion|reveesions}}.
+Delytion o sic pages haes been restrictit tae stap accidental disruption o {{SITENAME}}.',
+'delete-warning-toobig' => 'This page haes ae muckle eedit histerie, ower $1 {{PLURAL:$1|reveesion|reveesions}}.
+Delytin it micht disrupt database operations o {{SITENAME}};
+proceed wi caution.',
+'deleting-backlinks-warning' => "'''Warnishment:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Ither pages]] link til or transcluide the page ye'r aboot tae delyte.",
 
 # Rollback
 'rollback' => 'Row back edits',
 'rollback_short' => 'Rowback',
 'rollbacklink' => 'rowback',
+'rollbacklinkcount' => 'rowback $1 {{PLURAL:$1|eedit|eedits}}',
+'rollbacklinkcount-morethan' => 'rowback mair than $1 {{PLURAL:$1|eedit|eedits}}',
 'rollbackfailed' => 'Rowback failed',
-'cantrollback' => 'Canna revert edit; last contreibutor is the ae author o this page.',
+'cantrollback' => 'Canna revert eidit; laist contreebuter is the ae auther o this page.',
 'alreadyrolled' => 'Canna rollback laist eidit o [[:$1]] bi [[User:$2|$2]] ([[User talk:$2|tauk]]{{int:pipe-separater}}[[Special:Contributions/$2|{{int:contribslink}}]]);
 some ither bodie haes eidited or rolled back the page awreadie.
 
 The laist eidit til the page wis bi [[User:$3|$3]] ([[User talk:$3|tauk]]{{int:pipe-separater}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "The eidit summarie wis: \"''\$1''\".",
-'revertpage' => 'Reverted eidits bi [[Special:Contributions/$2|$2]] ([[User talk:$2|tauk]]) til laist revision bi [[User:$1|$1]]',
+'revertpage' => 'Reverted eidits bi [[Special:Contributions/$2|$2]] ([[User talk:$2|tauk]]) til laist reveesion bi [[User:$1|$1]]',
+'revertpage-nouser' => 'Reverted eedits bi ae skaukt uiser til laist revesion bi {{GENDER:$1|[[User:$1|$1]]}}',
+'rollback-success' => 'Reverted eedits b $1;
+chynged back til the laist reveesion bi $2.',
+
+# Edit tokens
+'sessionfailure' => 'Thaur seems tae be ae proablem wi yer login session;
+this action haes been canceled aes ae precaution again session hijackin.
+Gang back til the preeveeoos page, relaid that page n than gie it anither gae.',
 
 # Protect
 'protectlogpage' => 'Fend log',
 'protectlogtext' => 'Ablow is ae leet o chynges til page protections.
 See the [[Special:ProtectedPages|protected pages leet]] fer the leet o currently operational page protections.',
 'protectedarticle' => 'protectit "[[$1]]"',
+'modifiedarticleprotection' => 'chynged protection level fer "[[$1]]"',
 'unprotectedarticle' => 'remuied protection fae "[[$1]]"',
+'movedarticleprotection' => 'muived protection settins fae "[[$2]]" til "[[$1]]"',
 'protect-title' => 'Protectin "$1"',
+'protect-title-notallowed' => 'See protection level o "$1"',
 'prot_1movedto2' => '[[$1]] flittit til [[$2]]',
+'protect-badnamespace-text' => 'Pages in this namespace canna be protected.',
+'protect-norestrictiontypes-text' => "This page canna be protected aes thaur's naw restreection types available.",
 'protectcomment' => 'Raeson:',
 'protectexpiry' => 'Expires:',
-'protect-text' => "Ye can see an chynge the protection level here for the page '''$1'''.",
+'protect_expiry_invalid' => 'Expirie time is onvalit.',
+'protect_expiry_old' => 'Expirie time is in the past.',
+'protect-unchain-permissions' => 'Lowse mair protect opties',
+'protect-text' => 'Ye can see n chynge the protection level here fer the page <strong>$1</strong>.',
+'protect-locked-blocked' => 'Ye canna chynge protection levels while blockt.
+Here ar the settins fer the page <strong>$1</strong> the nou:',
+'protect-locked-dblock' => 'Protection levels canna be chynged cause o aen acteeve database lock.
+Here ar the settins fer the page <strong>$1</strong> nou:',
+'protect-locked-access' => 'Yer accont disna hae permeession tae chynge page protection levels.
+Here ar the settins fer the page <strong>$1</strong> the nou:',
+'protect-cascadeon' => "This page is nou protected cause it is incluided in the follaein {{PLURAL:$1|page, this haes|pages, thir hae}} cascadin protection turned oan.
+Ye can chynge this page's protection level, but it will na affect the cascadin protection.",
 'protect-default' => 'Allow aw uisers',
+'protect-fallback' => 'permit yinlie uisers wi "$1" permission',
 'protect-level-autoconfirmed' => 'Allou yinly autæconfirmed uisers',
 'protect-level-sysop' => 'Allou admeenistraters yinly',
+'protect-summary-cascade' => 'cascadin',
+'protect-expiry-indefinite' => 'indefineet',
+'protect-cascade' => 'Protect pages incluided in this page (cascadin protection)',
+'protect-cantedit' => 'Ye canna chynge the protection levels o this page cause ye dinna hae permeession tae eedit it.',
 'protect-othertime' => 'Ither time:',
 'protect-othertime-op' => 'ither time',
+'protect-existing-expiry' => 'Exeestin expirie time: $3, $2',
+'protect-otherreason' => 'Ither/addeetional raison:',
+'protect-otherreason-op' => 'Ither raison',
+'protect-dropdown' => '*Commyn protection raisons
+** Excesseeve vandaleesm
+** Excesseeve spammin
+** Coonter-producteeve eedit warrin
+** Hei traffeec page',
+'protect-edit-reasonlist' => 'Eedit protection raisons',
 'protect-expiry-options' => '1 hoor:1 hour,1 day:1 day,1 week:1 week,2 weeks:2 weeks,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year,eenfinite:infinite',
+'restriction-type' => 'Permeession:',
+'restriction-level' => 'Restreection level:',
+'minimum-size' => 'Smaaest size',
+'maximum-size' => 'Mucklest size:',
 
 # Restrictions (nouns)
-'restriction-edit' => 'Edit',
+'restriction-edit' => 'Eidit',
 'restriction-move' => 'Flit',
 'restriction-create' => 'Mak',
 'restriction-upload' => 'Uplaid',
 
+# Restriction levels
+'restriction-level-sysop' => 'fulie protected',
+'restriction-level-autoconfirmed' => 'semie protected',
+'restriction-level-all' => 'onie level',
+
 # Undelete
-'undelete' => 'Restore delete page',
-'undeletepage' => 'View an restore delete pages',
-'viewdeletedpage' => 'View delete pages',
-'undeletepagetext' => 'The follaeing {{PLURAL:$1|page haes been deletit but is|$1 pages hae been deletit but ar}} still in the archive an can be restored.
-The archive micht be cleaned oot nou an then.',
-'undeleteextrahelp' => "In order tae restore the page's entire histerie, lea aw checkboxes onselected an clap on <strong><em>{{int:undeletebtn}}</em></strong>.
-Tae perform ae selective restoration, check the boxes corresponding til the revisions tae be restored, an clap on <strong><em>{{int:undeletebtn}}</em></strong>.",
-'undeletehistory' => 'Gif ye restore the page, aw revisions will be restored til the histerie.
-Gif ae new page wi the same name haes been creatit syne the deletion, the restored revisions will appear in the prior histerie.',
-'undeletehistorynoadmin' => 'This airticle haes been delete. The raeson for deletion is
-shawn in the summary ablo, alang wi parteeculars o the uisers that haed editit this page
-afore it wis delete. The actual text o thir deletit reveisions is available tae admeenistrators juist.',
+'undelete' => 'Restore delyte page',
+'undeletepage' => 'See n restore delytit pages',
+'undeletepagetitle' => '<strong>The follaein conseests o delytit reveesions o [[:$1|$1]]</strong>.',
+'viewdeletedpage' => 'View delyte pages',
+'undeletepagetext' => 'The follaein {{PLURAL:$1|page haes been delytit but is|$1 pages hae been delytit but ar}} still in the archive n can be restored.
+The archive micht be cleaned oot nou n than.',
+'undelete-fieldset-title' => 'Restore reveesions',
+'undeleteextrahelp' => "In order tae restore the page's entire histerie, lea aw checkkists onselected n clap oan <strong><em>{{int:undeletebtn}}</em></strong>.
+Tae perform ae selecteeve restoration, check the kists correspondin til the reveesions tae be restored, n clap oan <strong><em>{{int:undeletebtn}}</em></strong>.",
+'undeleterevisions' => '$1 {{PLURAL:$1|reveesion|reveesions}} archived',
+'undeletehistory' => 'Gif ye restore the page, aw reveesions will be restored til the histerie.
+Gif ae new page wi the same name haes been makit sin the delytion, the restored reveesions will kyth in the prior histerie.',
+'undeleterevdel' => 'Ondelytion will na be performed gif it will result in the tap page or file reveesion bein pairtlie delyted.
+In sic cases, ye maun oncheck or onskauk the newest delytit reveesion.',
+'undeletehistorynoadmin' => 'This airticle haes been delytit. The raeson fer delytion is
+shawn in the owerview ablo, alang wi parteeculars o the uisers that haed eiditit this page afore it wis delytit. The actual tex o thir delytit reveesions is available tae admeenistraters juist.',
+'undelete-revision' => 'Deleted reveesion o $1 (aes o $4, at $5) bi $3:',
+'undeleterevision-missing' => 'Onvalid or missin reveesion.
+Ye micht hae ae bad link, or the reveesion micht hae been restored or remuived fae the archive.',
+'undelete-nodiff' => 'Naw preeveeoos reveesion foond.',
 'undeletelink' => 'view/restore',
 'undeleteviewlink' => 'view',
+'undeletecomment' => 'Raison:',
 'undeletedrevisions' => '{{PLURAL:$1|1 reveision|$1 reveisions}} restored',
-'cannotundelete' => 'Ondelete failed:
+'undeletedrevisions-files' => '{{PLURAL:$1|1 reveesion|$1 reveesions}} n {{PLURAL:$2|1 file|$2 files}} restored',
+'cannotundelete' => 'Ondelyte failed:
 $1',
-'undeletedpage' => '<strong>$1 has been restored</strong>
+'undeletedpage' => '<strong>$1 haes been restored</strong>
+
+Consult the [[Special:Log/delete|delytion log]] fer ae record o recent delytions an restorâtions.',
+'undelete-header' => 'See [[Special:Log/delete|the delytion log]] fer recentlie delytit pages.',
+'undelete-search-title' => 'Rake delytit pages',
+'undelete-search-box' => 'Rake delytit pages',
+'undelete-search-prefix' => 'Shaw pages stairtin wi:',
+'undelete-search-submit' => 'Rake',
+'undelete-no-results' => 'Naw matchin pages foond in the delytion airchive.',
+'undelete-filename-mismatch' => 'Canna ondelyte file reveesion wi timestamp $1: Filename mismatch.',
+'undelete-bad-store-key' => 'Canna ondelyte file reveesion wi timestamp $1: File wis missin afore delytion.',
+'undelete-cleanup-error' => 'Mistak delytin onuised airchive file "$1".',
+'undelete-missing-filearchive' => "Onable tae restore file airchive ID $1 cause it's na in the database.
+It micht awreadie hae been ondelytit.",
+'undelete-error' => 'Mistak ondelytin page',
+'undelete-error-short' => 'Mistak ondelytin file: $1',
+'undelete-error-long' => 'Mistaks were encoontered while ondelytin the file:
 
-Consult the [[Special:Log/delete|deletion log]] fer ae record o recent deletions an restorations.',
+$1',
+'undelete-show-file-confirm' => 'Ar ye sair that ye want tae see the delytit reveesion o the file "<nowiki>$1</nowiki>" fae $2 at $3?',
+'undelete-show-file-submit' => 'Ay',
 
 # Namespace form on various pages
 'namespace' => 'Namespace:',
 'invert' => 'Invert selection',
+'tooltip-invert' => 'Check this kist tae skauk chynges til pages wiin the selectit namespace (n the associated namespace gif checked)',
+'tooltip-namespace_association' => 'Check this kist forby tae incluid the tauk or subject namespace associated wi the selectit namespace',
 'blanknamespace' => '(Main)',
 
 # Contributions
 'contributions' => '{{GENDER:$1|Uiser}} contributions',
-'contributions-title' => 'Uiser contreibutions fer $1',
-'mycontris' => 'Ma contreibutions',
+'contributions-title' => 'Uiser contreebutions fer $1',
+'mycontris' => 'Ma contreebutions',
 'contribsub2' => 'Fer {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Nae chynges wis funnd matchin thir criteria.',
 'uctop' => '(current)',
-'month' => 'Frae month (an afore):',
-'year' => 'Frae year (an afore):',
+'month' => 'Fae month (n afore):',
+'year' => 'Fae year (n afore):',
 
-'sp-contributions-newbies' => "Shaw contreibutions o' freish accounts ainlie",
+'sp-contributions-newbies' => 'Shaw contreebutions o freish accoonts ainlie',
+'sp-contributions-newbies-sub' => 'Fer new accoonts',
+'sp-contributions-newbies-title' => 'Uiser contreebutions fer new accoonts',
 'sp-contributions-blocklog' => 'block log',
+'sp-contributions-deleted' => 'delytit uiser contreebutions',
 'sp-contributions-uploads' => 'uploads',
 'sp-contributions-logs' => 'logs',
-'sp-contributions-talk' => 'talk',
-'sp-contributions-search' => 'Rake fur contreibutions',
+'sp-contributions-talk' => 'tauk',
+'sp-contributions-userrights' => 'uiser richts management',
+'sp-contributions-blocked-notice' => 'This uiser is nou blockit.
+The latest block log entrie is providit ablo fer referance:',
+'sp-contributions-blocked-notice-anon' => 'This IP address is blockit the nou.
+The latest block log entrie is providit ablo fer referance:',
+'sp-contributions-search' => 'Rake fer contreebutions',
+'sp-contributions-suppresslog' => 'suppressed uiser contreebutions',
 'sp-contributions-username' => 'IP address or uisername:',
-'sp-contributions-toponly' => 'Ainlie shaw edits that are latest revisions',
+'sp-contributions-toponly' => 'Ainlie shaw eedits that ar laitest reveesions',
+'sp-contributions-newonly' => 'Yinlie shaw eidits that ar page cræftins',
 'sp-contributions-submit' => 'Rake',
 
 # What links here
 'whatlinkshere' => 'Whit airts tae here',
-'whatlinkshere-title' => 'Pages that link to "$1"',
+'whatlinkshere-title' => 'Pages that link til "$1"',
 'whatlinkshere-page' => 'Page:',
 'linkshere' => "The follaein pages airts tae '''[[:$1]]''':",
 'nolinkshere' => "Nae pages airt tae '''[[:$1]]'''.",
@@ -1629,200 +2405,405 @@ Consult the [[Special:Log/delete|deletion log]] fer ae record o recent deletions
 'whatlinkshere-filters' => 'Filters',
 
 # Block/unblock
+'autoblockid' => 'Autæblock #$1',
+'block' => 'Block uiser',
+'unblock' => 'Onblock uiser',
 'blockip' => 'Block uiser',
+'blockip-legend' => 'Block uiser',
 'blockiptext' => 'Uise the form ablo tae block write access frae a specific IP address or uisername. This shuid be duin juist tae prevent vandalism, and in accord wi [[{{MediaWiki:Policy-url}}|policy]]. Fill in a specific raeson ablo (for exemplar, citin parteicular pages that wis damaged).',
 'ipadressorusername' => 'IP Address or uisername',
+'ipbexpiry' => 'Expirie:',
 'ipbreason' => 'Raeson:',
+'ipbreason-dropdown' => '*Commyn block raisons
+** Insertin false information
+** Remuivin content fae pages
+** Spammin links til external sites
+** Insertin nonsense/gibberish intil pages
+** Inteemidatin behavier/harassment
+** Abuisin multiple accoonts
+** Onacceptable uisername',
+'ipb-hardblock' => 'Stap loggit-in uisers fae eeditin fae this IP address',
+'ipbcreateaccount' => 'Stap accoont cræftin',
+'ipbemailban' => 'Stap uiser fae sendin wab-mail',
+'ipbenableautoblock' => 'Autæmateeclie block the laist IP address uised bi this uiser, n onie subsequent IP addresses that thay attempt tae eedit fae',
 'ipbsubmit' => 'Block this uiser',
 'ipbother' => 'Ither time',
 'ipboptions' => '2 hours:2 hours,1 day:1 day,3 days:3 days,1 week:1 week,2 weeks:2 weeks,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year,indefinite:infinite',
+'ipbhidename' => 'Skauk uisername fae eedits n leets',
+'ipbwatchuser' => "Watch this uiser's uiser n tauk pages",
+'ipb-disableusertalk' => 'Stap this uiser fae eeditin thair ain tauk page while blockit',
+'ipb-change-block' => 'Re-block the uiser wi thir settins',
 'badipaddress' => 'That IP address is nae guid',
 'blockipsuccesssub' => 'Block succeedit',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] haes been blockit.
 <br />See [[Special:BlockList|block leet]] tae review blocks.',
+'ipb-blockingself' => "Ye'r aboot tae block yersel! Ar ye sair that ye want tae dae that?",
+'ipb-confirmhideuser' => 'Ye\'r aboot tae block ae uiser wi "skauk uiser" enabled. This will suppress the uiser\'s name in aw leets n log entries. Ar ye sair that ye want tae dae that?',
+'ipb-confirmaction' => 'Gif ye\'r sair that ye reelie want tae dae it, please check the "{{int:ipb-confirm}}" field at the bottom.',
+'ipb-edit-dropdown' => 'Eedit block raisons',
 'ipb-unblock-addr' => 'Unblock $1',
+'ipb-unblock' => 'Onblock ae uisername or IP address',
+'ipb-blocklist' => 'See exeestin blocks',
+'ipb-blocklist-contribs' => 'Contreebutions fer $1',
 'unblockip' => 'Unblock uiser',
-'unblockiptext' => 'Uise the form ablo tae restore screivin richts
-tae an afore-blockit IP address or uisername.',
+'unblockiptext' => 'Uise the form ablo tae restore screevin richts
+til aen afore-blockit IP address or uisername.',
+'ipusubmit' => 'Remuive this block',
+'unblocked' => '[[User:$1|$1]] haes been onblockit.',
+'unblocked-range' => '$1 haes been onblockit.',
+'unblocked-id' => 'Block $1 haes been remuived.',
+'blocklist' => 'Blockit uisers',
 'ipblocklist' => 'Blockit uisers',
+'ipblocklist-legend' => 'Fynd ae blockit uiser',
+'blocklist-userblocks' => 'Skauk accoont blocks',
+'blocklist-tempblocks' => 'Skauk temparie blocks',
+'blocklist-addressblocks' => 'Skauk single IP blocks',
+'blocklist-rangeblocks' => 'Skauk range blocks',
+'blocklist-target' => 'Tairget',
+'blocklist-expiry' => 'Dies',
+'blocklist-by' => 'Blockin admeen',
+'blocklist-params' => 'Block boonds',
+'blocklist-reason' => 'Raison',
+'ipblocklist-submit' => 'Rake',
+'ipblocklist-otherblocks' => 'Ither {{PLURAL:$1|block|blocks}}',
+'infiniteblock' => 'infeenite',
+'expiringblock' => 'dies oan $1 at $2',
 'anononlyblock' => 'anon. juist',
+'noautoblockblock' => 'autæblock disabled',
 'createaccountblock' => 'accoont-makkin blockit',
+'emailblock' => 'wab-mail disabled',
+'blocklist-nousertalk' => 'canna eedit yer ain tauk page',
+'ipblocklist-empty' => 'The block leet is tuim.',
+'ipblocklist-no-results' => 'The requested IP address or uisername isna blockit.',
 'blocklink' => 'block',
 'unblocklink' => 'unblock',
 'change-blocklink' => 'chynge block',
 'contribslink' => 'contreibs',
-'autoblocker' => 'Autaematically blockit syne yer IP address haes been uised recently bi "[[User:$1|$1]]". The raeson gien fer $1\'s block is "$2"',
+'emaillink' => 'send wab-mail',
+'autoblocker' => 'Autaematicallie blockit sin yer IP address haes been uised recentlie bi "[[User:$1|$1]]". The raeson gien fer $1\'s block is "$2"',
 'blocklogpage' => 'Block log',
-'blocklogentry' => 'blockit [[$1]] wi an expiry time o $2 $3',
-'blocklogtext' => 'This is ae log o uiser blockin an onblockin actions. Autaematically blockit IP addresses isna leetit. See the [[Special:BlockList|block leet]] fer the leet o bans and blocks oan nou.',
+'blocklog-showlog' => 'This uiser haes been blockit afore.
+The block log is provided ablo fer reeferance:',
+'blocklog-showsuppresslog' => 'This uiser haes been blockit n skaukt afore.
+The suppress log is provided ablo fer reeferance:',
+'blocklogentry' => 'blockit [[$1]] wi aen expirie time o $2 $3',
+'reblock-logentry' => 'chynged block settins fer [[$1]] wi ae diein time o $2 $3',
+'blocklogtext' => 'This is ae log o uiser blockin n onblockin actions. Autaematiclie blockit IP addresses isna leetit. See the [[Special:BlockList|block leet]] fer the leet o bans n blocks oan the nou.',
 'unblocklogentry' => 'unblockit $1',
+'block-log-flags-anononly' => 'anonymos uisers yinlie',
 'block-log-flags-nocreate' => 'accoont-makkin blockit',
+'block-log-flags-noautoblock' => 'autæblock disabled',
+'block-log-flags-noemail' => 'wab-mail disabled',
+'block-log-flags-nousertalk' => 'canna eedit yer ain tauk page',
+'block-log-flags-angry-autoblock' => 'enhanced autæblock enabled',
+'block-log-flags-hiddenname' => 'uisername skaukt',
 'range_block_disabled' => 'The administrator abeility tae mak range blocks is disabled.',
-'proxyblockreason' => 'Yer IP address haes been blockit sith it is an open proxy. Please contact yer Internet service provider or tech support an inform them o this serious security problem.',
+'ipb_expiry_invalid' => 'Expirie time is onvalit.',
+'ipb_expiry_temp' => 'Skaukt uisername blocks maun be permanent.',
+'ipb_hide_invalid' => 'Onable tae suppress this accoont; it haes mair than {{PLURAL:$1|yin eedit|$1 eedits}}.',
+'ipb_already_blocked' => '"$1" is awreadie blockit.',
+'ipb-needreblock' => '$1 is awreadie blockit. Div ye want tae chynge the settins?',
+'ipb-otherblocks-header' => 'Ither {{PLURAL:$1|block|blocks}}',
+'unblock-hideuser' => 'Ye canna onblock this uiser, aes thair uisername haes been skaukt.',
+'ipb_cant_unblock' => 'Mistak: Block ID $1 na foond. It micht hae been onblockit awreadie.',
+'ipb_blocked_as_range' => 'Mistak: The IP address $1 isna blockit directlir n canna be onblockit.
+It is, houever, blockit aes pairt o the range $2, n this can be onblockit.',
+'ip_range_invalid' => 'Onvalid IP range.',
+'ip_range_toolarge' => 'Range blocks muckler than /$1 ar na permitit.',
+'proxyblocker' => 'Proxie blocker',
+'proxyblockreason' => "Yer IP address haes been blockit cause it's aen apen proxie. Please contact yer Internet service provider or tech support n inform them o this serious securitie problem.",
 'sorbsreason' => 'Yer IP address is leeted aes aen apen proxy in the DNSBL uised bi {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Yer IP address is leeted aes aen apen proxy in the DNSBL uised bi {{SITENAME}}.
 Ye canna mak aen accoont.',
+'xffblockreason' => "Aen IP address present in the X-Forwarded-For heider, either yers or that o ae proxie server that ye'r uisin, haes been block. The oreeginal block raison wis: $1",
+'cant-see-hidden-user' => "The uiser that ye'r attemptin tae block haes awreadie been blockit n skaukt.
+Aes ye dinna hae the skaukuiser richt, ye canna see or eedit the uiser's block.",
+'ipbblocked' => 'Ye canna block or onblock ither uisers cause ye yersel is blockit.',
+'ipbnounblockself' => 'Yer na permitit tae onblock yersel.',
 
 # Developer tools
 'unlockdb' => 'Lowse database',
-'lockdbtext' => "Lockin the database will suspend the abeility o aa uisers tae edit pages, chynge thair preferences, edit thair watchleets, an ither things requirin chynges in the database. Please confirm that this is whit ye intend tae dae, an that ye'll unlock the database whan yer maintenance is duin.",
-'unlockdbtext' => 'Lowsin the database will gie back the abeility for aa uisers tae edit pages, chynge their preferences, edit their watchleets, an ither things needin chynges in the database. Please confirm that this is whit ye ettle tae dae.',
-'lockconfirm' => 'Aye, A raellie want tae lock the database.',
-'unlockconfirm' => 'Aye, A raelly want tae lowse the database.',
-'locknoconfirm' => 'Ye didna tick the confirmation box.',
+'lockdbtext' => "Lockin the database will suspend the abeelitie o aw uisers tae eedit pages, chynge thair preeferences, eedit thair watchleets, n ither things needin chynges in the database. Please confirm that this is whit ye'r etlin tae dae, n that ye'll lowse the database whan yer maintenance is dun.",
+'unlockdbtext' => 'Lowsin the database will gie back the abeelitie fer aa uisers tae eidit pages, chynge their preeferences, eidit their watchleets, an ither things needin chynges in the database. Please confirm that this is whit ye ettle tae dae.',
+'lockconfirm' => 'Ai, Ah reellie want tae lock the database.',
+'unlockconfirm' => 'Ai, Ah reellie want tae lowse the database.',
+'unlockbtn' => 'Lowse database',
+'locknoconfirm' => 'Ye didna tick the confirmâtion kist.',
 'lockdbsuccesssub' => 'Database lock fine',
 'unlockdbsuccesssub' => 'Database lowsed',
 'lockdbsuccesstext' => 'The database haes been lockit. <br />Mynd an tak the lock aff efter yer maintenance is feinisht.',
 'unlockdbsuccesstext' => 'The database haes bin lowsed.',
+'lockfilenotwritable' => 'The database lock file isna writable.
+Tae lock or lowse the database, this needs tae be writable bi the wab server.',
 'databasenotlocked' => 'The database isna lockit.',
+'lockedbyandtime' => '(bi {{GENDER:$1|$1}} oan $2 at $3)',
 
 # Move page
+'move-page' => 'Muiv $1',
 'move-page-legend' => 'Flit page',
-'movepagetext' => "Uisin the form ablow will rename ae page, muiving aw o its histerie til the new name.
-The auld title will become ae redirect page til the new title.
-Ye can update redirects that point til the original title autaematicly.
-Gif ye chuis no tae, be sair tae check fer [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].
-Ye'r responsible fer making sair that airtins continue tae pynt til whaur they'r supposed to gae.
-
-Note that the page will <strong>no</strong> be muived gif there is awready ae page at the new title, onless the latter is ae redirect an has nae past edit history.
-This means that ye can rename ae page back til whaur it wis renamed fae gif ye mak ae mistak, an ye canna o'erwrite aen existing page.
-
-<strong>Warning!</strong>
-This can be ae drastic an onexpected chynge fer ae popular page;
-please be sair ye unnerstaun the consequences o this afore proceeding.",
-'movepagetext-noredirectfixer' => "Uising the form ablow will rename ae page, muiving aw o its histerie til the new name.
-The auld title will become ae redirect page til the new title.
-Be sair tae check fer [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].
-Ye'r responsible fer making sair that airtins continue tae pynt whaur thay'r supposed to gae.
-
-Note that the page will <strong>no</strong> be muived gif there's awready ae page at the new title, onless it is tuim an has naw past edit history.
-This means that you can rename a page back to whaur it wis renamed fae gif ye mak ae mistak, an ye canna o'erwrite an existin page.
-
-<strong>Warnin!</strong>
-This can be ae drastic an onexpectit chynge fer ae popular page;
-please be sair ye unnerstaun the consequences of this afore proceedin.",
-'movepagetalktext' => 'The associated talk page will be autaematically muived alang wi it <strong>onless:</strong>
-*A no-tuim talk page awreadie exists unner the new name, or
-*You oncheck the box ablow.
-
-In thae cases, ye will hae tae muiv or merge the page manually gif ye sae desire.',
+'movepagetext' => "Uisin the form ablo will rename ae page, muivin aw o its histerie til the new name.
+The auld title will become ae reguidal page til the new title.
+Ye can update reguidals that point til the oreeginal title autaematiclie.
+Gif ye chuis no tae, be sair tae check fer [[Special:DoubleRedirects|dooble]] or [[Special:BrokenRedirects|broken reguidals]].
+Ye'r responsible fer makin sair that airtins continue tae pynt til whaur they'r supposed to gae.
+
+Note that the page will <strong>no</strong> be muived gif there is awreadie ae page at the new title, onless the latter is ae reguidal n haes nae past eidit histerie.
+This means that ye can rename ae page back til whaur it wis renamed fae gif ye mak ae mistak, n ye canna owerwrite aen exeestin page.
+
+<strong>Warnishment!</strong>
+This can be ae drastic n onexpected chynge fer ae popular page;
+please be sair ye unnerstaun the consequences o this afore proceedin.",
+'movepagetext-noredirectfixer' => "Uising the form ablo will rename ae page, muivin aw o its histerie til the new name.
+The auld title will become ae reguidal page til the new title.
+Be sair tae check fer [[Special:DoubleRedirects|dooble]] or [[Special:BrokenRedirects|broken reguidals]].
+Ye'r responsible fer makin sair that airtins continue tae poynt whaur thay'r supposed tae gae.
+
+Tak tent that the page will <strong>naw</strong> be muived gif thaur's awreadie ae page at the new title, onless it is tuim n haes naw past eedit histerie.
+This means that ye can rename ae page back til whaur it wis renamed fae gif ye mak ae mistak, n ye canna owerwrite aen existin page.
+
+<strong>Warnishment!</strong>
+This can be ae drastic n onexpectit chynge fer ae popular page;
+please be sair that ye unnerstaun the consequences o this afore preceedin.",
+'movepagetalktext' => 'The associated tauk page will be autaematiclie muived alang wi it <strong>onless:</strong>
+*A no-tuim tauk page awreadie exeests unner the new name, or
+*Ye oncheck the kist ablo.
+
+In thae cases, ye will hae tae muiv or merge the page manuallie gif ye sae desire.',
 'movearticle' => 'Flit page:',
-'moveuserpage-warning' => "<strong>Warning:</strong> Ye'r aboot tae muiv ae uiser page. Please note that yinly the page will be muivd and the uiser will <em>no</em> be renamed.",
-'movenologintext' => 'Ye maun be a registert uiser an [[Special:UserLogin|loggit in]] tae flit a page.',
+'moveuserpage-warning' => "<strong>Warnishment:</strong> Ye'r aboot tae muiv ae uiser page. Please tak tent that yinlie the page will be muivd n the uiser will <em>naw</em> be renamed.",
+'movenologintext' => 'Ye maun be a registert uiser n [[Special:UserLogin|loggit in]] tae muiv ae page.',
+'movenotallowed' => 'Ye dinna hae permeession tae muiv pages.',
+'movenotallowedfile' => 'Ye dinna hae permeession tae muiv files.',
+'cant-move-user-page' => 'Ye dinna hae permeession tae muiv uiser pages (aside fae subpages).',
+'cant-move-to-user-page' => 'Ye dinna hae permeession tae muiv ae page til ae uiser page (except til ae uiser subpage).',
 'newtitle' => 'Tae new teitle',
+'move-watch' => 'Watch soorce page n tairget page',
 'movepagebtn' => 'Flit page',
 'pagemovedsub' => 'Flittin succeedit',
 'movepage-moved' => '<strong>"$1" has been muived til "$2"</strong>',
+'movepage-moved-redirect' => 'Ae reguidal haes been cræftit.',
+'movepage-moved-noredirect' => 'The cræftin o ae reguidal haes been suppressed.',
 'articleexists' => "A page o that name aareadies exists, or the name ye'v waled isna guid. Please wale anither name.",
-'movetalk' => 'Muiv associated talk page',
+'cantmove-titleprotected' => 'Ye canna muiv ae page til this location cause the new title haes been protected fae cræftin',
+'movetalk' => 'Muiv associated tauk page',
+'move-subpages' => 'Muiv subpages (up til $1)',
+'move-talk-subpages' => 'Muiv subpages o tauk page (up til $1)',
+'movepage-page-exists' => 'The page $1 awreadie exeests n canna be autæmateeclie owerwritten.',
+'movepage-page-moved' => 'The page $1 haes been muived til $2.',
+'movepage-page-unmoved' => 'The page $1 coudna be muived til $2.',
+'movepage-max-pages' => 'The mmucklest o $1 {{PLURAL:$1|page|pages}} haes been muived n naw mair will be muived autæmateeclie.',
 'movelogpage' => 'Flit log',
 'movelogpagetext' => "A leet o pages that's flitted is ablo.",
+'movesubpagetext' => 'This page haes $1 {{PLURAL:$1|subpage|subpages}} shawn ablo.',
+'movenosubpage' => 'This page haes naw subpages.',
 'movereason' => 'Raeson:',
 'revertmove' => 'revert',
-'delete_and_move' => 'Delete an flit',
-'delete_and_move_text' => '==Deletion caad for==
+'delete_and_move' => 'Delyte n muiv',
+'delete_and_move_text' => '==Delytion caad fer==
 
-The destination airticle "[[:$1]]" aareadies exists. Div ye want tae delete it for tae mak wey for the flittin?',
-'delete_and_move_confirm' => 'Aye, delete the page',
+The destination airticle "[[:$1]]" aareadies exists. Div ye want tae delyte it fer tae mak wey fer the muiv?',
+'delete_and_move_confirm' => 'Ai, delyte the page',
 'delete_and_move_reason' => 'Deletit fer tae mak way fer muiv fae "[[$1]]"',
-'selfmove' => 'Ootgaun an incomin teitles is the same; canna flit a page ower itsel.',
-'protectedpagemovewarning' => '<strong>Warning:</strong> This page has been protected sae that yinly uisers wi administrater preevileges can muiv it.
-The hainmaist log entry is provided ablow fer reference:',
+'selfmove' => 'Ootgaun n incomin teitles ar the same; canna flit ae page ower itsel.',
+'immobile-source-namespace' => 'Canna muiv pages in namespace "$1"',
+'immobile-target-namespace' => 'Canna muiv pages intil namespace "$1"',
+'immobile-target-namespace-iw' => 'Interwiki link isna ae valeed tairget fer page muiv.',
+'immobile-source-page' => 'This page is na muivable.',
+'immobile-target-page' => 'Canna muiv til that desteenation title.',
+'bad-target-model' => 'The desired desteenation uises ae differant content model. Canna convert fae $1 til $2.',
+'imagenocrossnamespace' => 'Canna muiv file til non-file namespace',
+'nonfile-cannot-move-to-file' => 'Canna muiv non-file til file namespace',
+'imagetypemismatch' => 'The new file extension disna match its type',
+'imageinvalidfilename' => 'The tairget filename is onvalit',
+'fix-double-redirects' => 'Update onie reguidals that poynt til the oreeginal title',
+'move-leave-redirect' => 'Lea ae reguidal ahint',
+'protectedpagemovewarning' => '<strong>Warnishment:</strong> This page haes been protected sae that yinly uisers wi admeenistrater preevileges can muiv it.
+The latest log entry is provided ablo fer reference:',
 'semiprotectedpagemovewarning' => '<strong>Note:</strong> This page has been protected sae that yinly registered uisers can muiv it.
 The hainmaist log entry is provided ablow fer reference:',
+'move-over-sharedrepo' => '== File exeests ==
+[[:$1]] exeests oan ae shaired reposeeterie. Muiving ae file til this title will owerride the shaired file.',
+'file-exists-sharedrepo' => 'The filename chosen is awreadie in uise oan ae shaired reposeeterie.
+Please chuise anither name.',
 
 # Export
 'export' => 'Export pages',
-'exporttext' => 'Ye can export the text an editin history o a parteicular page or set o pages wappit in some XML. In the futur, this micht can be importit intae anither wiki runnin MediaWiki saftware, altho the\'r nae support for this featur in the current version.
+'exporttext' => 'Ye can export the tex n eeditin histerie o ae parteecular page or set o pages wrapped in some XML.
+This can be imported intil anither wiki uisin MediaWiki bi waa o the [[Special:Import|import page]].
 
-Tae export airticle pages, enter the teitles in the text box ablo, ae teitle tae ilka line, an wale whither ye want the current version alang wi aa auld versions, wi the page history lines, or the current version juist, wi wittins anent the last edit.
+Tae export pages, enter the titles in the tex kist ablo, yin title per line, n select whether ye want the Nou reveesion  aw auld reveesions ava, wi the page histerie lines, or the Nou reveesion wi the info aneat the laist eedit.
 
-In the saicont case ye can uise an airtin forbye, for exemplar [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] for the airticle "[[{{MediaWiki:Mainpage}}]]".',
-'exportcuronly' => 'Include juist the current revision, no the fou history',
+In the latter case ye can uise ae link ava, fer example [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] fer the page "[[{{MediaWiki:Mainpage}}]]".',
+'exportall' => 'Export aw pages',
+'exportcuronly' => 'Inclæde juist the nou reveesion, naw the ful histerie',
 'exportnohistory' => '----
 <strong>Note:</strong> Exporting the ful histerie o pages through this form has been disabled caus o performance raisons.',
+'exportlistauthors' => 'Incluid ae ful leet o contreebuters fer ilka page',
+'export-addcattext' => 'Add pages fae categerie:',
+'export-addnstext' => 'Add pages fae namespace:',
+'export-download' => 'Hain aes file',
+'export-templates' => 'Incluid templates',
+'export-pagelinks' => 'Incluid linkt pages til ae depth o:',
 
 # Namespace 8 related
 'allmessages' => 'Aa seestem messages',
 'allmessagesname' => 'Name',
-'allmessagesdefault' => 'Defaut text',
-'allmessagescurrent' => 'Text the nou',
+'allmessagesdefault' => 'Defaut message tex',
+'allmessagescurrent' => 'Message tex the nou',
 'allmessagestext' => 'This is ae leet o system messages available in the MediaWiki namespace.
-Please visit [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] an [//translatewiki.net translatewiki.net] gif ye wish tae contreebute til the generic MediaWiki localisation.',
+Please veesit [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] n [//translatewiki.net translatewiki.net] gif ye wish tae contreebute til the generic MediaWiki localisation.',
 'allmessagesnotsupportedDB' => "'''{{ns:special}}:AllMessages''' nae supportit acause '''\$wgUseDatabaseMessages''' is aff.",
-'allmessages-filter-translate' => "O'erset",
+'allmessages-filter' => 'Filter b custymization state:',
+'allmessages-filter-unmodified' => 'Onmodified',
+'allmessages-filter-all' => 'Aw',
+'allmessages-filter-modified' => 'Modeefied',
+'allmessages-prefix' => 'Filter bi prefix:',
+'allmessages-language' => 'Leid:',
+'allmessages-filter-submit' => 'Gang',
+'allmessages-filter-translate' => 'Owerset',
 
 # Thumbnails
 'thumbnail-more' => 'Eik',
 'filemissing' => 'File missin',
-'thumbnail_error' => 'Error creating thumbnail: $1',
-'thumbnail_image-failure-limit' => "There hae been o'er mony recent failed attempts ($1 or more) tae render this thumbnail. Please try again later.",
+'thumbnail_error' => 'Mistak makin thummnail: $1',
+'thumbnail_error_remote' => 'Mistak message fae $1:
+$2',
+'djvu_page_error' => 'DjVu page oot o range',
+'djvu_no_xml' => 'Onable tae fetch XML fer DjVu file',
+'thumbnail-temp-create' => 'Onable tae cræft temparie thummnail file',
+'thumbnail-dest-create' => 'Onable tae hain thummnail til desteenation',
+'thumbnail_invalid_params' => 'Onvalit thummnail parameters',
+'thumbnail_dest_directory' => 'Onable tae cræft desteenation directerie',
+'thumbnail_image-type' => 'Eemage type na supported',
+'thumbnail_gd-library' => 'Oncompleate GD librie confeeguration: Missin function $1',
+'thumbnail_image-missing' => 'File seems tae be missin: $1',
+'thumbnail_image-failure-limit' => 'There hae been ower moni recent failed attempts ($1 or mair) tae render this thumbnail. Please try again later.',
 
 # Special:Import
-'importtext' => 'Please export the file fae the soorce wiki uising the [[Special:Export|export utility]].
-Hain it til yer computer an uplaid it here.',
-'importnotext' => 'Tuim or nae text',
+'import-interwiki-text' => "Select ae wiki n page title tae import.
+Reveesion dates n eediters' names will be preserved.
+Aw transwiki import actions ar loggit at the [[Special:Log/import|import log]].",
+'import-interwiki-source' => 'Soorce wiki/page:',
+'import-interwiki-history' => 'Copie aw histerie reveesions fer this page',
+'import-interwiki-templates' => 'Incluid aw templates',
+'import-interwiki-namespace' => 'Desteenation namespace:',
+'import-interwiki-rootpage' => 'Desteenation ruit page (aen optie):',
+'importtext' => 'Please export the file fae the soorce wiki uising the [[Special:Export|export utilitie]].
+Hain it til yer computer n uplaid it here.',
+'importstart' => 'Importin pages...',
+'import-revision-count' => '$1 {{PLURAL:$1|reveesion|reveesions}}',
+'importnopages' => 'Naw pages tae import.',
+'imported-log-entries' => 'Imported $1 {{PLURAL:$1|log entrie|log entries}}.',
+'importunknownsource' => 'Onkent import soorce type',
+'importcantopen' => 'Coudna apen import file',
+'importnotext' => 'Tuim or nae tex',
 'importsuccess' => 'Importit fine!',
-'importhistoryconflict' => 'Conflictin history revision exists (micht hae importit this page afore)',
-'importnosources' => 'Nae transwiki import soorces haes been defined an direct history uplaids is disabled.',
-'import-nonewrevisions' => 'Nae revisions imported (aw were either awready present, or skipped cause o errors).',
-'import-error-bad-location' => 'Revision $2 uising content model $3 canna be stored on "$1" on this wiki, syn that model isna supported on that page.',
+'importhistoryconflict' => 'Conflictin histerie reveesion exeests (micht hae importit this page afore)',
+'importnosources' => 'Nae transwiki import soorces haes been defined n direct histerie uplaids is disabled.',
+'importnofile' => 'Naw import file wis uplaided.',
+'importuploaderrorsize' => 'Uplaid o import file failed.
+The file is muckler than the permitit uplaid size.',
+'importuploaderrorpartial' => 'Uplaid o import file failed.
+The file wis yinlie pairtlie uplaided.',
+'importuploaderrortemp' => 'Uplaid o import file failed.
+Ae temparie fauder is missin.',
+'import-noarticle' => 'Naw page tae import!',
+'import-nonewrevisions' => 'Nae reveesions imported (aw were either awreadie present, or skipt cause o mistaks).',
+'import-upload' => 'Uplaid XML data',
+'import-token-mismatch' => 'Loss o session data.
+Please gie it anither gae.',
+'import-invalid-interwiki' => 'Canna import fae the speceefied wiki.',
+'import-error-edit' => 'Page "$1" isna importit cause ye\'r na permitit tae eedit it.',
+'import-error-create' => 'Page "$1" is na importit cause ye\'r na permitit tae cræft it.',
+'import-error-interwiki' => 'Page "$1" is na importit cause its name is reserved fer external linkin (interwiki).',
+'import-error-special' => 'Page "$1" is na importit cause it belangs til ae speecial namespace that disna permit pages.',
+'import-error-invalid' => 'Page "$1" is na importit cause its name is onvalit.',
+'import-error-unserialize' => 'Reveesion $2 o page "$1" coudna be onsereealized. The reveesion wis reported til uiss content model $3 sereealized aes $4.',
+'import-error-bad-location' => 'Reveesion $2 uisin content model $3 canna be stored oan "$1" oan this wiki, syn that model isna supported oan that page.',
+'import-options-wrong' => 'Wrang {{PLURAL:$2|optie|opties}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Gien ruit page is aen onvalit title.',
+'import-rootpage-nosubpage' => 'Namespace "$1" o the ruit page disna permit subpages.',
+
+# Import log
+'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|reveesion|reveesions}} fae $2',
+
+# JavaScriptTest
+'javascripttest' => 'JavaScript testin',
+'javascripttest-title' => 'Rinnin $1 tests',
+'javascripttest-pagetext-noframework' => 'This page is reserved fer rinnin JavaScript tests.',
+'javascripttest-pagetext-unknownframework' => 'Onkent testin framewairk "$1".',
+'javascripttest-pagetext-frameworks' => 'Please chuise yin o the follaein testin framewairks: $1',
+'javascripttest-pagetext-skins' => 'Chuise ae skin tae rin the tests wi:',
+'javascripttest-qunit-intro' => 'See [$1 testin documentation] oan mediawiki.org.',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Yer uiser page',
-'tooltip-pt-mytalk' => 'Yer talk page',
+'tooltip-pt-anonuserpage' => "The uiser page fer the IP address that ye'r eeditin aes",
+'tooltip-pt-mytalk' => 'Yer tauk page',
+'tooltip-pt-anontalk' => 'Discussion aneat eedits fae this IP address',
 'tooltip-pt-preferences' => 'Ma preferences',
-'tooltip-pt-watchlist' => "Th' leet o' pages yer monitoring fur changes",
-'tooltip-pt-mycontris' => 'Leet o yer contreibutions',
+'tooltip-pt-watchlist' => "Ae leet o pages ye'r moniterin fer chynges",
+'tooltip-pt-mycontris' => 'Leet o yer contreebutions',
 'tooltip-pt-login' => "It's a guid idea tae log i, but ye dinna hae tae.",
 'tooltip-pt-logout' => 'Log oot',
-'tooltip-ca-talk' => "Discussion aboot th' content page",
-'tooltip-ca-edit' => "Ye kin edit this page. Please uise th' preview button afore saving",
-'tooltip-ca-addsection' => 'Start a new section',
+'tooltip-ca-talk' => 'Discussion aneat the content page',
+'tooltip-ca-edit' => 'Ye can eedit this page. Please uise the luikower button afore hainin',
+'tooltip-ca-addsection' => 'Stairt a new section',
 'tooltip-ca-viewsource' => 'This page is protectit.
-You ken view its source',
-'tooltip-ca-history' => "Bygane revisions o' this page",
+Ye can view its soorce',
+'tooltip-ca-history' => 'Bygane reveesions o this page',
 'tooltip-ca-protect' => 'Fend this page',
-'tooltip-ca-delete' => 'Delete this page',
+'tooltip-ca-unprotect' => 'Chynge protection o this page',
+'tooltip-ca-delete' => 'Delyte this page',
+'tooltip-ca-undelete' => 'Restore the eedits dun oan this page afore it wis delytit',
 'tooltip-ca-move' => 'Flit this page',
 'tooltip-ca-watch' => 'Add this page tae yer watchleet',
 'tooltip-ca-unwatch' => 'Remove this page frum yer watchleet',
 'tooltip-search' => 'Rake {{SITENAME}}',
-'tooltip-search-go' => "Gang tae a page wi' this exact name if exists",
-'tooltip-search-fulltext' => "Search th' pages fur this text",
+'tooltip-search-go' => 'Gang til ae page wi this exact name gif exists',
+'tooltip-search-fulltext' => 'Rake the pages fer this tex',
 'tooltip-p-logo' => 'Gang tae the Main Page',
 'tooltip-n-mainpage' => 'Gang tae the Main Page',
 'tooltip-n-mainpage-description' => 'Gang tae the Main Page',
-'tooltip-n-portal' => "Aboot th' project, whit ye kin dae, whaur tae fin' things",
+'tooltip-n-portal' => 'Aneat the project, whit ye can dae, whaur tae fynd things',
 'tooltip-n-currentevents' => "Fin' background speirins oan current events",
 'tooltip-n-recentchanges' => 'The leet o recent chynges in the wiki',
-'tooltip-n-randompage' => 'Load a random page',
-'tooltip-n-help' => "Th' steid tae fin' oot",
+'tooltip-n-randompage' => 'Laid ae random page',
+'tooltip-n-help' => 'The steid tae fynd oot',
 'tooltip-t-whatlinkshere' => "List o' a' wiki pages that link 'ere",
 'tooltip-t-recentchangeslinked' => 'Recent changes in pages linked frae this page',
-'tooltip-feed-atom' => 'Atom feed fur this page',
-'tooltip-t-contributions' => "View this uiser's contreibutions",
-'tooltip-t-emailuser' => 'Send an e-mail to this uiser',
+'tooltip-feed-rss' => 'RSS feed fer this page',
+'tooltip-feed-atom' => 'Atom feed fer this page',
+'tooltip-t-contributions' => "View this uiser's contreebutions",
+'tooltip-t-emailuser' => 'Send ae wab-mail til this uiser',
 'tooltip-t-upload' => 'Uplaid files',
 'tooltip-t-specialpages' => 'Leet o byordinar pages',
 'tooltip-t-print' => "Printable version o' this page",
-'tooltip-t-permalink' => "Permanent link tae this revision o' th' page",
+'tooltip-t-permalink' => 'Permanent link til this reveesion o the page',
 'tooltip-ca-nstab-main' => 'Leuk at content page',
 'tooltip-ca-nstab-user' => 'View the uiser page',
-'tooltip-ca-nstab-special' => "This is a byordinar page, ye cannae edit th' page itself",
-'tooltip-ca-nstab-project' => 'View the project page',
+'tooltip-ca-nstab-media' => 'See the media page',
+'tooltip-ca-nstab-special' => 'This is ae byordinair page, ye canna eedit the page itsel',
+'tooltip-ca-nstab-project' => 'See the waurk page',
 'tooltip-ca-nstab-image' => 'View the file page',
+'tooltip-ca-nstab-mediawiki' => 'See the system message',
 'tooltip-ca-nstab-template' => 'View the template',
-'tooltip-ca-nstab-category' => "View th' category page",
+'tooltip-ca-nstab-help' => 'See the heelp page',
+'tooltip-ca-nstab-category' => 'View the categerie page',
 'tooltip-minoredit' => 'Mairk this as a smaa edit',
 'tooltip-save' => 'Hain yer chynges',
 'tooltip-preview' => 'Scance ower yer chynges, please uise this afore hainin!',
-'tooltip-diff' => 'Shaw the chynges that you made tae the text.',
+'tooltip-diff' => 'Shaw the chynges that ye makit til the tex.',
 'tooltip-compareselectedversions' => 'See the differs atween the twa selectit versions o this page.',
 'tooltip-watch' => 'Add this page tae yer watchleet',
-'tooltip-rollback' => '"Rowback" reverts edit(s) tae this page o\' th\' lest contributor in yin click',
-'tooltip-undo' => "\"Undo\" reverts this edit 'n' opens th' edit form in preview mode. It allows adding a reason in th' summary.",
-'tooltip-summary' => 'Enter a short summary',
+'tooltip-watchlistedit-normal-submit' => 'Remuiv titles',
+'tooltip-watchlistedit-raw-submit' => 'Update watchleet',
+'tooltip-recreate' => "Recræft the page even thoogh it's been delytit",
+'tooltip-upload' => 'Stairt uplaid',
+'tooltip-rollback' => '"Rowback" reverts eedit(s) til this page o the laist contreebuter in yin clap',
+'tooltip-undo' => '"Ondae" reverts this eedit n apens the eedit form in luikower mode. It permits addin ae raison in the owerview.',
+'tooltip-preferences-save' => 'Hain preeferances',
+'tooltip-summary' => 'Enter ae short owerview',
 
 # Metadata
 'notacceptable' => 'The wiki server canna provide data in a format yer client can read.',
@@ -1830,86 +2811,460 @@ You ken view its source',
 # Attribution
 'anonymous' => 'Nameless {{PLURAL:$1|uiser|uisers}} o {{SITENAME}}',
 'siteuser' => '{{SITENAME}} uiser $1',
-'othercontribs' => 'Based on wark bi $1.',
+'anonuser' => '{{SITENAME}} anonymoos uiser $1',
+'lastmodifiedatby' => 'This page wis laist modified $2, $1 bi $3.',
+'othercontribs' => 'Based oan wark bi $1.',
 'others' => 'ithers',
 'siteusers' => '{{SITENAME}} {{PLURAL:$2|uiser|uisers}} $1',
-'nocredits' => "The'r nae credit info available for this page.",
+'anonusers' => '{{SITENAME}} anonymoos {{PLURAL:$2|uiser|uisers}} $1',
+'creditspage' => 'Page creeedits',
+'nocredits' => "Thaur's nae creedit info available fer this page.",
 
 # Spam protection
 'spamprotectiontext' => 'The tex ye wished tae save wis blockit bi the spam filter.
 This is maistlikly caused bi aen airtin til ae blaickleeted external site.',
-'spamprotectionmatch' => 'The follaein text is whit triggered wir spam filter: $1',
+'spamprotectionmatch' => 'The follaein tex is whit triggered wir spam filter: $1',
+'spam_reverting' => 'Revertin til the laist reveesion na containin links til $1',
+'spam_blanking' => 'Aw reveesions contained links til $1, blankin',
+'spam_deleting' => 'Aw reveesions contained links til $1, delytin',
 'simpleantispam-label' => 'Anti-spam check.
-Dae <strong>NO</strong> ful this in!',
+Div <strong>NAW</strong> ful this in!',
+
+# Info page
+'pageinfo-title' => 'Information fer "$1"',
+'pageinfo-not-current' => "Sairrie, it's na possible tae provide this information fer auld reveesions.",
+'pageinfo-header-edits' => 'Eedit histerie',
+'pageinfo-display-title' => 'Displey title',
+'pageinfo-default-sort' => 'Defaut sort key',
+'pageinfo-language' => 'Page content leid',
+'pageinfo-robot-policy' => 'Indexin bi robots',
+'pageinfo-robot-index' => 'Permitit',
+'pageinfo-robot-noindex' => 'Na permitit',
+'pageinfo-views' => 'Nummer o luiks',
+'pageinfo-watchers' => 'Nummer o page watchers',
+'pageinfo-redirects-name' => 'Nummer o reguidals til this page',
+'pageinfo-subpages-name' => 'Nummer o subpages o this page',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|reguidal|reguidals}}; $3 {{PLURAL:$3|non-reguidal|non-reguidals}})',
+'pageinfo-firstuser' => 'Page cræfter',
+'pageinfo-firsttime' => 'Date o page cræftin',
+'pageinfo-lastuser' => 'Latest eediter',
+'pageinfo-lasttime' => 'Date o latest eedit',
+'pageinfo-edits' => 'Total nummer o eedits',
+'pageinfo-authors' => 'Total nummer o disteenct writers',
+'pageinfo-recent-edits' => 'Recent nummer o eedits (wiin past $1)',
+'pageinfo-recent-authors' => 'Recynt nummer o disteenct writers',
+'pageinfo-magic-words' => 'Magic {{PLURAL:$1|waird|wairds}} ($1)',
+'pageinfo-hidden-categories' => 'Skaukt {{PLURAL:$1|categerie|categeries}} ($1)',
+'pageinfo-templates' => 'Transcluided {{PLURAL:$1|template|templates}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Page|Pages}} transcluided oan ($1)',
+'pageinfo-redirectsto' => 'Reguidals til',
+'pageinfo-contentpage' => 'Coonted aes ae content page',
+'pageinfo-contentpage-yes' => 'Ay',
+'pageinfo-protect-cascading' => 'Protections ar cascadin fae here',
+'pageinfo-protect-cascading-yes' => 'Ay',
+'pageinfo-protect-cascading-from' => 'Protections ar cascadin fae here',
+'pageinfo-category-info' => 'Categerie information',
+'pageinfo-category-pages' => 'Nummer o pages',
+'pageinfo-category-subcats' => 'Nummer o subcategeries',
+'pageinfo-category-files' => 'Nummer o files',
 
 # Patrolling
 'markaspatrolleddiff' => 'Merk as patrolled',
 'markaspatrolledtext' => 'Merk this airticle as patrolled',
 'markedaspatrolled' => 'Merkit as patrolled',
-'markedaspatrolledtext' => 'The selected revision o [[:$1]] haes been maurked aes patrolled.',
+'markedaspatrolledtext' => 'The selected reveesion o [[:$1]] haes been maurked aes patrolled.',
+'rcpatroldisabled' => 'Recynt chynges patrol disabled',
 'rcpatroldisabledtext' => 'The Recent Changes Patrol feature is disabled the nou.',
+'markedaspatrollederror' => 'Canna maurk aes patrowed',
+'markedaspatrollederrortext' => 'Ye need tae speceefie ae reveesion tae maurk aes patrowed.',
+'markedaspatrollederror-noautopatrol' => "Ye'r na permitit tae maurk yer ain chynges aes patrowed.",
+'markedaspatrollednotify' => 'This chynge til $1 haes been maurked aes patrowed.',
+'markedaspatrollederrornotify' => 'Maurking aes patrowed failed.',
+
+# Patrol log
+'patrol-log-page' => 'Patrow log',
+'patrol-log-header' => 'This is ae log o patrowed reveesions.',
+'log-show-hide-patrol' => '$1 patrow log',
 
 # Image deletion
-'deletedrevision' => 'Deletit auld revision $1.',
+'deletedrevision' => 'Delytit auld reveesion $1.',
+'filedeleteerror-short' => 'Mistak delytin file: $1',
+'filedeleteerror-long' => 'mistaks were encoontered while delytin the file:
+
+$1',
+'filedelete-missing' => 'The file "$1" canna be delytit cause it disna exeest.',
+'filedelete-old-unregistered' => 'The speceefied file reveesion "$1" isna in the database.',
+'filedelete-current-unregistered' => 'The speceefied file "$1" isna in the database.',
+'filedelete-archive-read-only' => 'The archyve directerie "$1" isna writable bi the wabserver.',
 
 # Browsing diffs
-'previousdiff' => '← Aulder edit',
-'nextdiff' => 'Newer edit →',
+'previousdiff' => '← Aulder eedit',
+'nextdiff' => 'Newer eedit →',
 
 # Media information
-'mediawarning' => '<strong>Warning:</strong> This file type micht contain maleecious code.
-Bi executing it, yer system micht be compromised.',
+'mediawarning' => '<strong>Warnishment:</strong> This file type micht contain maleecious code.
+Bi executin it, yer system micht be compromised.',
 'imagemaxsize' => 'Eimage size limit:<br /><em>(fer file description pages)</em>',
+'thumbsize' => 'Thummnail size:',
 'file-info-size' => '$1 × $2 pixels, file size: $3, MIME type: $4',
 'file-nohires' => 'Na higher resolution available.',
 'svg-long-desc' => 'SVG file, nominally $1 × $2 pixels, file size: $3',
+'svg-long-desc-animated' => 'Animated SVG file, nominallie $1 × $2 pixels, file size: $3',
+'svg-long-error' => 'Onvalit SVG file: $1',
 'show-big-image' => 'Oreeginal file',
-'file-no-thumb-animation' => '<strong>Note: Due til technical limitations, thumbnails o this file will no be animated.</strong>',
+'show-big-image-preview' => 'Size o this luikower: $1.',
+'show-big-image-other' => 'Ither {{PLURAL:$2|resolution|resolutions}}: $1.',
+'file-info-gif-looped' => "luip't",
+'file-info-png-looped' => "luip't",
+'file-info-png-repeat' => 'pleyed $1 {{PLURAL:$1|time|times}}',
+'file-no-thumb-animation' => '<strong>Note: Due til techneecal limitations, thummnails o this file will naw be animated.</strong>',
 'file-no-thumb-animation-gif' => '<strong>Note: Due til technical limitations, thumbnails o hich resolution GIF eimages sic as this will no be animated.</strong>',
 
 # Special:NewFiles
 'newimages' => 'Gallery o new files',
 'imagelisttext' => 'Ablo is a leet o $1 {{PLURAL:$1|eimage|eimages}} sortit $2.',
+'newimages-summary' => 'This byordinair page shaws the last uplaidit files.',
+'newimages-label' => 'Filename (or ae pairt o it):',
 'noimages' => 'Naething tae see.',
 'ilsubmit' => 'Rake',
 'bydate' => 'bi date',
+'sp-newimages-showfrom' => 'Shaw new files stairtin fae $2, $1',
+
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 seicont|$1 seiconts}}',
+'hours' => '{{PLURAL:$1|$1 hoor|$1 hoors}}',
+'ago' => '$1 sin',
+'just-now' => 'richt nou',
+
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|hoor|hoors}} sin',
+'minutes-ago' => '$1 {{PLURAL:$1|minute|minutes}} sin',
+'seconds-ago' => '$1 {{PLURAL:$1|seicont|seiconts}} sin',
+'monday-at' => 'Monenday at $1',
+'wednesday-at' => 'Wedensday at $1',
+'friday-at' => 'Frisday at $1',
 
 # Bad image list
-'bad_image_list' => "Th' format is as follows:
+'bad_image_list' => 'The format is aes follaes:
 
-Ainlie list items (lines starting wi' *) are considered. Th' foremaist link oan a line mist be a link tae a ill image. Ony subsequent links oan th' same line are considered tae be exceptions, i,e., pages whaur th' image kin occur inline.",
+Ainlie leet items (lines stairtin wi *) ar considered. The foremaist link oan ae line maun be ae link til aen ill file. Oni subsequent links oan the same line ar considered tae be exceptions, i,e., pages whaur the eimage can occur inline.',
 
 # Metadata
 'metadata' => 'Metadata',
-'metadata-help' => "This file contains additional speirins, likelie added frae th' digital camera or scanner used tae create or digitize it. 
-If th' file haes bin modified frae tis original state, some details kin nae fully reflect th' modified file.",
-'metadata-fields' => "Image metadata fields listed in this message wull be included oan image page display whin th' metadata buird is collapsed. Others wull be hidden by default. 
-*mak
+'metadata-help' => 'This file contains addeetional speirins, likelie added fae the deegital camera or scanner uised tae cræft or deegitize it. 
+Gif the file haes bin modified fae its oreeginal state, some details micht naw fullie reflect the modified file.',
+'metadata-expand' => 'Shaw extendit details',
+'metadata-collapse' => 'Skauk extendit details',
+'metadata-fields' => "Image metadata fields leeted in this message wull be inclæded oan eimage page displey whan the metadata buird is collaps't. Ithers wull be skauk't bi defaut. 
+* mak
 * model
-* datetimeoriginal
+* datetimeoreeginal
 * exposuretime
-* fnumber
-* isospeedratings
+* fnummer
+* isospeedratins
 * focallength
-* artist
-* copyricht
-* imagedescription
+* airtist
+* copiericht
+* eimagedescreeption
 * gpslatitude
-* gpslongitude
+* gpslangitude
 * gpsaltitude",
 
 # Exif tags
+'exif-imagelength' => 'Heicht',
+'exif-samplesperpixel' => 'Nummer o components',
+'exif-ycbcrsubsampling' => 'Subsamplin ratio o Y til C',
+'exif-ycbcrpositioning' => 'Y n C poseetionin',
+'exif-yresolution' => 'Verteecal resolution',
+'exif-stripoffsets' => 'Eemage data location',
+'exif-rowsperstrip' => 'Nummer o raws per streep',
+'exif-stripbytecounts' => 'Bytes per compressed streep',
+'exif-jpeginterchangeformat' => 'Affset til JPEG SOI',
+'exif-jpeginterchangeformatlength' => 'Bytes o JPEG data',
+'exif-whitepoint' => 'White poynt chromateeceetie',
+'exif-primarychromaticities' => 'Chromateeceeties o primarities',
+'exif-ycbcrcoefficients' => 'Colour space transformation matrix coeffeecients',
+'exif-referenceblackwhite' => 'Pair o blaick n white referance values',
+'exif-datetime' => 'File chynge date n time',
+'exif-imagedescription' => 'Eemage title',
+'exif-software' => 'Saffware uised',
+'exif-artist' => 'Writer',
 'exif-copyright' => 'Copyricht hauder',
+'exif-flashpixversion' => 'Supportit Flashpix version',
 'exif-colorspace' => 'Colour space',
 'exif-componentsconfiguration' => 'Meanin o ilka component',
 'exif-compressedbitsperpixel' => 'Eimage compression mode',
+'exif-pixelydimension' => 'Eemage width',
+'exif-pixelxdimension' => 'Eemage heicht',
+'exif-usercomment' => 'Uiser comments',
+'exif-relatedsoundfile' => 'Relatit audío file',
+'exif-datetimeoriginal' => 'Date n time o data generation',
+'exif-datetimedigitized' => 'Date n time o deegeetizin',
+'exif-subsectime' => 'DateTime subseiconts',
+'exif-subsectimeoriginal' => 'DateTimeOreeginal subseiconts',
+'exif-subsectimedigitized' => 'DateTimeDeegeetized subseiconts',
+'exif-fnumber' => 'F Nummer',
+'exif-spectralsensitivity' => 'Spectral sensiteevitie',
+'exif-isospeedratings' => 'ISO speed ratin',
 'exif-brightnessvalue' => 'APEX brichtness',
+'exif-maxaperturevalue' => 'Mucklest launn aperture',
+'exif-meteringmode' => 'Meterin mode',
+'exif-lightsource' => 'Licht soorce',
+'exif-subjectarea' => 'Subject airt',
+'exif-flashenergy' => 'Flash energie',
+'exif-sensingmethod' => 'Sensin methyd',
+'exif-filesource' => 'File soorce',
+'exif-customrendered' => 'Custym eemage processin',
+'exif-digitalzoomratio' => 'Deegeetal zuim ratio',
+'exif-sharpness' => 'Shairpness',
+'exif-devicesettingdescription' => 'Device settins descreeption',
+'exif-subjectdistancerange' => 'Subject deestance range',
+'exif-imageuniqueid' => 'Uníque eemage ID',
+'exif-gpslatituderef' => 'Nort or sooth lateetude',
+'exif-gpslatitude' => 'Lateetude',
+'exif-gpslongituderef' => 'Aest or west langeetude',
+'exif-gpslongitude' => 'Langeetude',
+'exif-gpsaltituderef' => 'Altítude reference',
+'exif-gpsaltitude' => 'Altítude',
+'exif-gpstimestamp' => 'GPS time (atomeec clock)',
+'exif-gpssatellites' => 'Satellites uised fer measurement',
+'exif-gpsstatus' => 'Receever status',
+'exif-gpsdop' => 'Measurement preeceesion',
+'exif-gpsspeed' => 'Speed o GPS receever',
+'exif-gpstrackref' => 'Referance fer direction o muivement',
+'exif-gpstrack' => 'Direction o muivement',
+'exif-gpsimgdirectionref' => 'Referance fer direction o eemage',
+'exif-gpsimgdirection' => 'Direction o eemage',
+'exif-gpsmapdatum' => 'Geodeteec survey data uised',
+'exif-gpsdestlatituderef' => 'Referance fer lateetude o destination',
+'exif-gpsdestlatitude' => 'Lateetude destination',
+'exif-gpsdestlongituderef' => 'Reference fer langeetude o destination',
+'exif-gpsdestlongitude' => 'Langeetude o destination',
+'exif-gpsdestbearingref' => 'Referance fer bearin o destination',
+'exif-gpsdestbearing' => 'Bearin o destination',
+'exif-gpsdestdistanceref' => 'Reference fer distance til destination',
+'exif-gpsdestdistance' => 'Distance til destination',
+'exif-gpsprocessingmethod' => 'Name o GPS processin methyd',
+'exif-gpsareainformation' => 'Name o GPS airt',
+'exif-gpsdifferential' => 'GPS differantial correction',
+'exif-keywords' => 'Keywairds',
+'exif-worldregioncreated' => 'Region o the Yird that the picture wis taen in',
+'exif-countrycreated' => 'Kintra that the picture wis taen in',
+'exif-countrycodecreated' => 'Code fer the kintra that the picture wis taen in',
+'exif-provinceorstatecreated' => 'Provínce or state that the picture wis taen in',
+'exif-citycreated' => 'Ceetie that the picture wis taen in',
+'exif-sublocationcreated' => 'Sublocation o the ceetie that the picture wis taen in',
+'exif-worldregiondest' => 'Yird region shawn',
+'exif-countrydest' => 'Kintra shawn',
+'exif-countrycodedest' => 'Code fer kintra shawn',
+'exif-provinceorstatedest' => 'Provínce or state shawn',
+'exif-citydest' => 'Ceetie shawn',
+'exif-sublocationdest' => 'Sublocation o ceetie shawn',
+'exif-specialinstructions' => 'Byordiair insructions',
+'exif-headline' => 'Heidline',
+'exif-credit' => 'Creedit/Provider',
+'exif-source' => 'Soorce',
+'exif-editstatus' => 'Eediterial status o eemage',
+'exif-urgency' => 'Urgencie',
+'exif-fixtureidentifier' => 'Fixtur name',
+'exif-locationdest' => 'Location depeected',
+'exif-locationdestcode' => 'Code o location depeected',
+'exif-objectcycle' => 'Time o day that media is intended fer',
+'exif-languagecode' => 'Leid',
+'exif-iimcategory' => 'Categerie',
+'exif-iimsupplementalcategory' => 'Supplemental categeries',
+'exif-datetimeexpires' => 'Dinna uise efter',
+'exif-datetimereleased' => 'Released oan',
+'exif-originaltransmissionref' => 'Oreeginal transmeession location code',
+'exif-lens' => 'Lens uised',
+'exif-serialnumber' => 'Serial nummer o camera',
+'exif-cameraownername' => 'Ainer o camera',
+'exif-datetimemetadata' => 'Date metadata wis laist modeefied',
+'exif-nickname' => 'Informal name o eemage',
+'exif-rating' => 'Ratin (oot o 5)',
+'exif-rightscertificate' => 'Richts management certeeficate',
+'exif-copyrighted' => 'Copiericht status',
+'exif-copyrightowner' => 'Copiericht ainer',
+'exif-usageterms' => 'Uisage terms',
+'exif-webstatement' => 'Online copiericht statement',
+'exif-originaldocumentid' => 'Uníque ID o oreeginal document',
+'exif-licenseurl' => 'URL fer copiericht license',
+'exif-morepermissionsurl' => 'Alternative licensin information',
+'exif-attributionurl' => 'Whan re-uisin this wairk, please link til',
+'exif-preferredattributionname' => 'Whan re-uisin this wairk, please creedit',
+'exif-contentwarning' => 'Content warnishment',
+'exif-intellectualgenre' => 'Type o eetem',
+'exif-event' => 'Event depected',
+'exif-organisationinimage' => 'Organization depected',
+'exif-personinimage' => 'Person depected',
+'exif-originalimageheight' => 'Heicht o eemage afore it wis crappit',
+'exif-originalimagewidth' => 'Width o eemage afore it wis crappit',
+
+# Exif attributes
+'exif-compression-1' => "Oncompress't",
+'exif-compression-2' => 'CCITT Groop 3 1-Dimensional Modified Huffman rin length encodin',
+'exif-compression-3' => 'CCITT Groop 3 fax encodin',
+'exif-compression-4' => 'CCITT Groop 4 fax encodin',
+
+'exif-copyrighted-true' => 'Copierichted',
+'exif-copyrighted-false' => 'Copiericht status na set',
+
+'exif-unknowndate' => 'Onkent date',
+
+'exif-orientation-2' => 'Flipt horizontallie',
+'exif-orientation-3' => 'Rotatit 180°',
+'exif-orientation-4' => 'Flipt verticlie',
+'exif-orientation-5' => 'Rotatit 90° CCW n flip verticlie',
+'exif-orientation-6' => 'Rotatit 90° CCW',
+'exif-orientation-7' => 'Rotatit 90° CW n flipt verticlie',
+'exif-orientation-8' => 'Rotatit 90° CW',
+
+'exif-planarconfiguration-1' => 'chunkie format',
+
+'exif-colorspace-65535' => 'Oncalibratit',
 
 'exif-componentsconfiguration-0' => 'disna exist',
 
+'exif-exposureprogram-0' => 'Na defined',
+'exif-exposureprogram-3' => 'Apertur prioritie',
+'exif-exposureprogram-4' => 'Shutter prioritie',
+'exif-exposureprogram-5' => 'Cræftie program (biased thewaird the depth o field)',
+'exif-exposureprogram-6' => 'Action program (biased thewaird fast shutter speed)',
+'exif-exposureprogram-7' => 'Portrait mode (fer closeup photæs wi the backgroond oot o focus)',
+'exif-exposureprogram-8' => 'Launnscape mode (fer launnscape photæs wi the backgroonn in focus)',
+
+'exif-meteringmode-0' => 'Onkent',
+'exif-meteringmode-2' => 'Center weichtit average',
+'exif-meteringmode-4' => 'Multí-Spot',
+'exif-meteringmode-6' => 'Pairtial',
+'exif-meteringmode-255' => 'Ither',
+
+'exif-lightsource-0' => 'Onkent',
+'exif-lightsource-1' => 'Daylicht',
+'exif-lightsource-2' => 'Fluorescant',
+'exif-lightsource-3' => 'Tungsten (incandescant licht)',
+'exif-lightsource-10' => 'Cloodie weather',
+'exif-lightsource-12' => 'Daylicht fluorescant (D 5700 – 7100K)',
+'exif-lightsource-13' => 'Day white fluorescant (N 4600 – 5400K)',
+'exif-lightsource-14' => 'Cuil white fluorescant (W 3900 – 4500K)',
+'exif-lightsource-15' => 'White fluorescant (WW 3200 – 3700K)',
+'exif-lightsource-17' => 'Staunart licht A',
+'exif-lightsource-18' => 'Staunart licht B',
+'exif-lightsource-19' => 'Staunart licht C',
+'exif-lightsource-255' => 'Ither licht soorce',
+
+# Flash modes
+'exif-flash-fired-0' => 'Flash didna fire',
+'exif-flash-return-0' => 'naw flash return detection function',
+'exif-flash-return-2' => 'flash return licht na detectit',
+'exif-flash-return-3' => 'flash return licht detectit',
+'exif-flash-mode-1' => 'compulserie flash firin',
+'exif-flash-mode-2' => 'compulserie flash suppression',
+'exif-flash-mode-3' => 'autæ mode',
+'exif-flash-function-1' => 'Naw flash function',
+'exif-flash-redeye-1' => 'reid-ee reduction mode',
+
+'exif-sensingmethod-1' => 'Ondefined',
+'exif-sensingmethod-2' => 'Yin-chip colour airt senser',
+'exif-sensingmethod-3' => 'Twa-chip colour airt senser',
+'exif-sensingmethod-4' => 'Three-chip colour airt senser',
+'exif-sensingmethod-5' => 'Colour sequential airt senser',
+'exif-sensingmethod-7' => 'Trilinear senser',
+'exif-sensingmethod-8' => 'Colour sequential linear senser',
+
+'exif-filesource-3' => 'Deegeetal still camera',
+
+'exif-scenetype-1' => 'Ae directlie photægraphed eemage',
+
+'exif-customrendered-1' => 'Custym process',
+
+'exif-exposuremode-0' => 'Autæ exposure',
+'exif-exposuremode-2' => 'Autæ bracket',
+
+'exif-whitebalance-0' => 'Autæ white balance',
+
+'exif-scenecapturetype-0' => 'Staunart',
+'exif-scenecapturetype-1' => 'Launscape',
+'exif-scenecapturetype-3' => 'Nicht scene',
+
 'exif-gaincontrol-0' => 'Nane',
+'exif-gaincontrol-1' => 'Law gain up',
+'exif-gaincontrol-2' => 'Hei gain up',
+'exif-gaincontrol-3' => 'Law gain doon',
+'exif-gaincontrol-4' => 'Hei gain doon',
 
 'exif-contrast-1' => 'Saft',
+'exif-contrast-2' => 'Haurd',
+
+'exif-saturation-1' => 'Law saturation',
+'exif-saturation-2' => 'Hei saturation',
+
+'exif-sharpness-1' => 'Saff',
+'exif-sharpness-2' => 'Haurd',
+
+'exif-subjectdistancerange-0' => 'Onkent',
+'exif-subjectdistancerange-2' => 'Claise luik at',
+'exif-subjectdistancerange-3' => 'Distance sechtline',
+
+# Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef
+'exif-gpslatitude-n' => 'Nort lateetude',
+'exif-gpslatitude-s' => 'Sooth lateetude',
+
+# Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef
+'exif-gpslongitude-e' => 'Aest langeetude',
+'exif-gpslongitude-w' => 'West langeetude',
+
+# Pseudotags used for GPSAltitudeRef
+'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|meter|meters}} abuin sea level',
+'exif-gpsaltitude-below-sealevel' => '$1 {{PLURAL:$1|meter|meters}} ablo sea level',
+
+'exif-gpsstatus-v' => 'Measurement interoperabeelitie',
+
+# Pseudotags used for GPSSpeedRef
+'exif-gpsspeed-k' => 'Kilometers aen hoor',
+'exif-gpsspeed-m' => 'Miles aen hoor',
+
+# Pseudotags used for GPSDestDistanceRef
+'exif-gpsdestdistance-n' => 'Nauteecal miles',
+
+'exif-gpsdop-excellent' => 'Excellant ($1)',
+'exif-gpsdop-good' => 'Guid ($1)',
+'exif-gpsdop-poor' => 'Puir ($1)',
+
+'exif-objectcycle-a' => 'Mornin yinlie',
+'exif-objectcycle-p' => 'Evenin yinlie',
+'exif-objectcycle-b' => 'Baith mornin n evenin',
+
+# Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
+'exif-gpsdirection-m' => 'Magneteec direction',
+
+'exif-dc-contributor' => 'Contreebuters:',
+'exif-dc-coverage' => 'Spatial or tempral scope o media',
+'exif-dc-relation' => 'Relatit media',
+'exif-dc-rights' => 'Richts',
+'exif-dc-source' => 'Soorce media',
+'exif-dc-type' => 'Type o media',
+
+'exif-rating-rejected' => 'Rejectit',
+
+'exif-isospeedratings-overflow' => 'Muckler than 65535',
+
+'exif-iimcategory-ace' => 'Arts, cultur n entertainmant',
+'exif-iimcategory-clj' => 'Crime n law',
+'exif-iimcategory-dis' => 'Disasters n accidants',
+'exif-iimcategory-fin' => 'Economie n business',
+'exif-iimcategory-hth' => 'The Heal',
+'exif-iimcategory-lab' => 'Laber',
+'exif-iimcategory-lif' => 'Lifestyle n leisure',
+'exif-iimcategory-pol' => 'Poleeteecs',
+'exif-iimcategory-rel' => 'Releegion n truent',
+'exif-iimcategory-sci' => 'Sciance n technologie',
+'exif-iimcategory-soi' => 'Social eessues',
+'exif-iimcategory-war' => 'War, conflict n onrest',
+
+'exif-urgency-low' => 'Law ($1)',
+'exif-urgency-high' => 'Hei ($1)',
+'exif-urgency-other' => 'Uiser-defined prioritie ($1)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'aw',
@@ -1917,42 +3272,63 @@ If th' file haes bin modified frae tis original state, some details kin nae full
 'monthsall' => 'aw',
 
 # Email address confirmation
+'confirmemail' => 'Confirm wab-mail address',
 'confirmemail_noemail' => 'Ye dinna hae a valid email address set in yer [[Special:Preferences|uiser preferences]].',
-'confirmemail_text' => 'This wiki requires ye tae validate yer e-mail address
-afore uisin e-mail featurs. Activate the button ablo tae send a confirmation
-mail tae yer address. The mail will include an airtin containing a code; laid the
-airtin in yer brouser tae confirm that yer e-mail address is guid.',
+'confirmemail_text' => 'This wiki needs ye tae validate yer wab-mail address
+afore uisin wab-mail featurs. Acteevate the button ablo tae send a confirmation
+mail til yer address. The mail will incluide ae link containin ae code; laid the
+ link in yer brouser tae confirm that yer wab-mail address is guid.',
+'confirmemail_pending' => 'Ae confirmation code haes awreadie been wab-mailed til ye;
+gif ye recantlie cræftit yer accoont, ye micht wish tae wait ae few minutes fer it tae arrive afore speirin fer ae new code.',
+'confirmemail_send' => 'Mail ae confirmation code',
+'confirmemail_sent' => 'Confirmation wab-mail sent.',
+'confirmemail_oncreate' => "Ae confirmation code wis sent til yer wab-mail address.
+This code isna required tae log in, but ye'll need tae gie it afore enablin onie wab-mail-based featurs in the wiki.",
 'confirmemail_sendfailed' => '{{SITENAME}} coudna send yer confirmation mail.
 Please check yer wab-mail address fer onvalid chairacters.
 
 Mailer returned: $1',
 'confirmemail_invalid' => 'Confirmation code nae guid. The code haes mibbe expired.',
-'confirmemail_needlogin' => 'Ye maun $1 for tae confirm yer email address.',
-'confirmemail_success' => 'Yer e-mail address haes been confirmed. Ye can nou log in an enjoy the wiki.',
+'confirmemail_needlogin' => 'Please $1 fer tae confirm yer wab-mail address.',
+'confirmemail_success' => 'Yer wab-mail address haes been confirmed. Ye can nou [[Special:UserLogin|login]]  n enjoy the wiki.',
 'confirmemail_loggedin' => 'Yer e-mail address haes noo been confirmed.',
+'confirmemail_subject' => '{{SITENAME}} wab-mail address confirmation',
 'confirmemail_body' => 'Somebodie, maist likely ye, fae IP address $1,
 haes registered aen accoont "$2" wi this wab-mail address oan {{SITENAME}}.
 
-Tae confirm that this accont really is yers an activate
-wab-mail features oan {{SITENAME}}, apen this airtin in yer brouser:
+Tae confirm that this accoont reallie is yers n acteevate wab-mail featurs oan {{SITENAME}}, apen this link in yer brouser:
 
 $3
 
-Gif ye did *no* register the accoont, follae this airtin
+Gif ye div *naw* register the accoont, follae this link
 tae cancel the wab-mail address confirmation:
 
 $5
 
 This confirmation code will expire oan $4.',
+'confirmemail_body_changed' => 'Somebodie, proabablie ye, from IP address $1,
+haes chynged the wab-mail address o the accoont "$2" til this address oan {{SITENAME}}.
+
+Tae confirm that this accoont reallie dis belang til ye n reacteevate
+wab-mail featurs oan {{SITENAME}}, apen this link in yer brouser:
+
+$3
+
+Gif the account dis *na* belang til ye, follae this link
+tae cancel the wab-mail address confirmation:
+
+$5
+
+This confirmation code will die oan $4.',
 
 # Delete conflict
-'deletedwhileediting' => '<strong>Warning:</strong> This page wis deletit efter ye sterted editing!',
-'confirmrecreate' => 'Uiser [[User:$1|$1]] ([[User talk:$1|talk]]) deleted this page efter ye started eiditing wi raison:
+'deletedwhileediting' => '<strong>Warnishment:</strong> This page wis delytit efter ye stairted eeditin!',
+'confirmrecreate' => 'Uiser [[User:$1|$1]] ([[User talk:$1|tauk]]) delytit this page efter ye stairted eiditin wi raison:
 : <em>$2</em>
-Please confirm that ye really want te recreate this page.',
+Please confirm that ye reallie want tae recræft this page.',
 
 # action=purge
-'confirm_purge_button' => 'Aye',
+'confirm_purge_button' => 'OK',
 'confirm-purge-top' => 'Clair the cache o this page?',
 
 # Multipage image navigation
@@ -1971,8 +3347,8 @@ Please confirm that ye really want te recreate this page.',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'View relevant changes',
-'watchlisttools-edit' => 'View an edit watchleet',
-'watchlisttools-raw' => 'Edit raw watchleet',
+'watchlisttools-edit' => 'See n eedit watchleet',
+'watchlisttools-raw' => 'Eedit raw watchleet',
 
 # Core parser functions
 'duplicate-defaultsort' => '\'\'\'Wairnin:\'\'\' Default sort key "$2" overrides earlier default sort key "$1".',
@@ -1986,25 +3362,29 @@ Please confirm that ye really want te recreate this page.',
 
 # Special:SpecialPages
 'specialpages' => 'Byordinar pages',
-'specialpages-group-users' => 'Uisers an richts',
+'specialpages-group-users' => 'Uisers n richts',
 'specialpages-group-pages' => 'leet o pages',
 
 # External image whitelist
-'external_image_whitelist' => ' #Leave this line exactly as it is<pre>
-#Put regular expression fragments (just the part that goes between the //) below
-#These will be matched with the URLs of external (hotlinked) images
-#Those that match will be displayed as images, otherwise only a link to the image will be shown
-#Lines beginning with # are treated as comments
-#This is case-insensitive
+'external_image_whitelist' => ' #Lea this line exactlie aes it is<pre>
+#Put regulair expression fragments (juist the pairt that gaes atween the //) ablo
+#Thir will be matched wi the URLs o external (hotlinked) eimages
+#Thae that match will be displeyed aes eimages, itherwise yinlie ae link til the eimage will be shawn
+#Lines beginnin wi # ar treated aes comments
+#This is case-onsensiteeve
 
-#Put all regex fragments above this line. Leave this line exactly as it is</pre>',
+#Put aw regex fragments abuin this line. Lea this line exactlie aes it is</pre>',
 
 # Special:Tags
 'tag-filter' => '[[Special:Tags|Tag]] filter:',
 'tag-filter-submit' => 'Filter',
-'tags-edit' => 'edit',
+'tags-edit' => 'eedit',
 
 # HTML forms
+'htmlform-invalid-input' => 'Thau ar proablems wi some o yer input.',
+'htmlform-int-toolow' => 'The value that ye speceefied is ablo the smaaest o $1.',
+'htmlform-int-toohigh' => 'The value that ye speceefied is abuin the mucklest o $1.',
+'htmlform-required' => 'This value is needit.',
 'htmlform-selectorother-other' => 'Ither',
 
 );
index 0803427..36b883e 100644 (file)
@@ -229,7 +229,6 @@ $messages = array(
 'tog-ccmeonemails' => 'මා විසින් අනෙකුත් පරිශීලකයන් හට යවන විද්‍යුත්-තැපෑලයන්හි පිටපත් මාහට එවන්න',
 'tog-diffonly' => '“වෙනස් ”පදයන්ට පහළින්, පිටුවල අන්තර්ගතය   නොපෙන්වන්න',
 'tog-showhiddencats' => 'සැඟවුනු ප්‍රවර්ග පෙන්වන්න',
-'tog-noconvertlink' => 'සබැඳියන්ගේ ශීර්ෂ පෙරැළීම අක්‍රීය කරන්න',
 'tog-norollbackdiff' => 'පුනරාවර්තනයක් කිරීමෙන් පසු වෙනස්වීම් අත්හරින්න',
 'tog-useeditwarning' => 'මා සංස්කරණ පිටුවක් සුරකිනු නොලැබූ වෙනස්කිරීම් සමඟ අතහැර යන විට අවවාද කරන්න',
 'tog-prefershttps' => 'සැම විටම ඇතුළු වීමේදී ආරක්ෂාකාරී ජාලයක් භාවිතා කරන්න',
@@ -518,6 +517,9 @@ $1",
 # General errors
 'error' => 'දෝෂය',
 'databaseerror' => 'දත්ත-ගබඩා දෝෂය',
+'databaseerror-text' => 'දත්ත ගබඩාවේ විමසුමට දෝෂයක් මතු වී ඇත.මෙය මෘදුකාංගයේ දෝෂයක් ඇති බව පෙන්නුම් කරයි.',
+'databaseerror-textcl' => 'දත්ත ගබඩාවේ විමසුමට දෝෂයක් මතු වී ඇත.',
+'databaseerror-query' => 'විමසුම: $1',
 'databaseerror-function' => 'ශ්‍රිතය:$1',
 'databaseerror-error' => 'දෝෂය: $1',
 'laggedslavemode' => "'''අවවාදයයි:''' මෑත යාවත්කාලීන කිරීම් මෙම පිටුවෙහි අඩංගු නොවීමට ඉඩ ඇත.",
@@ -584,6 +586,9 @@ $2',
 'ns-specialprotected' => 'විශේෂ පිටු සංස්කරණය කිරීම සිදු කල නොහැක.',
 'titleprotected' => "මෙම ශීර්ෂ-නාමය තැනීම  [[User:$1|$1]] විසින් වාරණය කොට ඇත.
 මේ සඳහා  ''$2''  හේතුව දක්වා ඇත.",
+'filereadonlyerror' => '"$2"දත්ත ගොනුවේ කියවීමට පමණක් ඇති ආකාරයට ඇති නිසා "$1" ගොනුව සංස්කරණය කල නොහැක.
+
+මෙය අගුලු දැමූ පරිගණක පරිපාලක "$3" හේතුව ඉදිරිපත්කර ඇත.',
 'exception-nologin' => 'ප්‍රවිෂ්ට වී නොමැත',
 
 # Virus scanner
@@ -592,16 +597,16 @@ $2',
 'virus-unknownscanner' => 'නොහඳුනන ප්‍රතිවයිරසයක්:',
 
 # Login and logout pages
-'logouttext' => "'''ඔබ දැන් ගිණුමෙන් නික්මී ඇත.'''
+'logouttext' => '<strong>ඔබ දැන් ගිණුමෙන් නික්මී ඇත.</strong>
 
-ඔබට නිර්නාමිකව {{SITENAME}} කටයුතු කරගෙන යාහැක, නැතහොත් පෙර පරිශීලක ලෙස හෝ වෙනත් පරිශීලකයෙකු ලෙස <span class='plainlinks'>[$1 නැවත ගිණුමක‍ට පිවිසිය හැක]</span>.
-ඔබගේ බ්‍රවුසරයෙහි පූර්වාපේක්‍ෂී සංචිතය (කෑෂය) පිරිසිදුකරන තෙක්, සමහරක් පිටු විසින් ඔබ තවදුරටත් පිවිසී ඇති බවක් දිගටම පෙන්නුම් කිරීමට ඉඩ ඇත.",
+ඔබගේ බ්‍රවුසරයෙහි පූර්වාපේක්‍ෂී සංචිතය (කෑෂය) පිරිසිදුකරන තෙක්, සමහරක් පිටු විසින් ඔබ තවදුරටත් පිවිසී ඇති බවක් දිගටම පෙන්නුම් කිරීමට ඉඩ ඇත.',
 'welcomeuser' => 'ආයුබෝවන්, $1!',
 'welcomecreation-msg' => 'ඔබගේ ගිණුම තනා ඇත.
 ඔබගේ [[Special:Preferences|{{SITENAME}} අභිරුචීන්]] නෙස් කිරීමට අමතක නොකරන්න.',
 'yourname' => 'පරිශීලක නාමය:',
 'userlogin-yourname' => 'පරිශීලක නම',
 'userlogin-yourname-ph' => 'ඔබගේ පරිශීලක නම ඇතුළු කරන්න',
+'createacct-another-username-ph' => 'ඔබගේ පරිශීලක නම ඇතුළු කරන්න',
 'yourpassword' => 'මුරපදය:',
 'userlogin-yourpassword' => 'මුර පදය',
 'userlogin-yourpassword-ph' => 'ඔබගේ මුර පදය ඇතුළු කරන්න',
@@ -634,6 +639,8 @@ $2',
 'userlogin-resetpassword-link' => 'ඔබේ මුරපදය නැති වුනාද?',
 'helplogin-url' => 'Help:ප්‍රවිෂ්ට වීම',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|ප්‍රවිෂ්ට වීමට උදවු වන්න]]',
+'userlogin-loggedin' => 'ඔබ දැනටමත් {{GENDER:$1|}} ලෙස පිවිසී ඇත.
+නව පරිශීලකයෙකු ලෙස ඇතුළු වීමට පහත ආකෘතිය පුරවන්න.',
 'userlogin-createanother' => 'තවත් ගිණුමක් ආරම්භ කරන්න',
 'createacct-join' => 'ඔබගේ තොරතුරු පහත ඇතුළු කරන්න.',
 'createacct-another-join' => 'නව ගිණුමේ දත්ත පහත ඇතුළු කරන්න.',
@@ -713,7 +720,7 @@ $2',
 'cannotchangeemail' => 'මෙම විකියේ ගිණුම් විද්‍යුත් ලිපිනය වෙනස් කල නොහැකිය.',
 'emaildisabled' => 'මෙම අඩවියට විද්‍යුත්-තැපැල් යැවිය නොහැක.',
 'accountcreated' => 'ගිණුම තනන ලදි',
-'accountcreatedtext' => '[[{{ns:පරිශීලක}}:$1|$1]] ([[{{ns:පරිශීලක සාකච්ඡාව}}:$1|සාකච්ඡාව]]) සඳහා පරිශීලක ගිණුම තනා ඇත.',
+'accountcreatedtext' => '[[{{ns:User}}:$1|$1]]  ([[{{ns:User talk}}:$1|talk]]) සඳහා පරිශීලක ගිණුම තනා ඇත.',
 'createaccount-title' => '{{SITENAME}} සඳහා ගිණුම තැනීම',
 'createaccount-text' => 'කිසියම් අයෙකු, "$2" නමින් හා, "$3" යන මුර-පදය යොදමින්,  ඔබගේ විද්‍යුත්-තැපැල් ලිපිනය සඳහා {{SITENAME}} ($4) හි ගිණුමක් තනා ඇත.
 ඔබ දැන් ගිණුම‍ට පිවිස, ඔබගේ මුර-පදය වෙනස් කල යුතුව ඇත.
@@ -734,6 +741,7 @@ $2',
 # Email sending
 'php-mail-error-unknown' => 'php mail() ශ්‍රිතයේ හඳුනානොගත් ගැටළුවකි',
 'user-mail-no-addy' => 'විද්‍යුත් තැපැල් ලිපිනයක් නොමැතිව විද්‍යුත් තැපැල් පණිවුඩයක් යැවීමට උත්සහ දරා ඇත.',
+'user-mail-no-body' => 'හිස් හෝ ඉතා කෙටි පෙළක් සහිත ඊ-තැපෑලක් යැවීමට උත්සාහ කර ඇත.',
 
 # Change password dialog
 'changepassword' => 'මුරපදය වෙනස් කරන්න',
@@ -754,12 +762,18 @@ $2',
 'resetpass-submit-cancel' => 'අත් හරින්න',
 'resetpass-wrong-oldpass' => 'තාවකාලික හෝ වත්මන් මුර-පදය අනීතිකයි.
 ඔබ දැනටමත් සාර්ථක ලෙස ඔබගේ මුර-පදය වෙනස් කොට හෝ නව තාවකාලික මුර-පදයක් ඉල්ලා සිට හෝ ඇතිවා විය හැක.',
+'resetpass-recycled' => 'කරුණාකර දැනට පවතින මුරපදයට වෙනස් මුරපදයක් යොදන්න.',
+'resetpass-temp-emailed' => 'ඔබ තාවකාලික ඊ-තැපැල් කේතයක් මඟින් ඇතුළු වී ඇත.
+ඇතුළු වීම අවසන් කිරීමට නව මුරපදයක් මෙතන ඇතුළු කරන්න.',
 'resetpass-temp-password' => 'තාවකාලික මුර-පදය:',
+'resetpass-abort-generic' => 'මුරපදය වෙනස් කිරීම විස්තීරණය මඟින් වලකා ඇත.',
 'resetpass-expired' => 'ඔබගේ මුරපදය කල් ඉකුත්වී ඇත.කරුණාකර නව මුරපදයක් සකස් කරන්න.',
+'resetpass-expired-soft' => 'ඔබගේ මුරපදය කල් ඉකුත්වී ඇති අතර එය නැවත සකස් කල යුතුය.කරුණාකර දැන් මුරපදයක් තෝරන්න.නවත්තන්න click කිරීමෙන් එය පසුව සකස් කල හැකිය.',
 
 # Special:PasswordReset
 'passwordreset' => 'මුරපදය වෙනස් කරන්න',
 'passwordreset-text-one' => 'තාවකාලික මුර-පදයක් විද්‍යුත් තැපෑළ මගින් ලබා ගැනීම සඳහා මෙම පෝරමය සම්පූර්ණ කරන්න.',
+'passwordreset-text-many' => '{{PLURAL:$1|තාවකාලික මුරපදයක් ඊ-තැපෑල හරහා ගෙන්වා ගැනීමට එක් ක්ෂේත්‍රයක් පුරවන්න}}',
 'passwordreset-legend' => 'මුරපදය යළි පිහිටුවන්න',
 'passwordreset-disabled' => 'මෙම විකියෙහි මුර පද ප්‍රත්‍යාරම්භ කිරීම් අක්‍රීය කොට ඇත.',
 'passwordreset-emaildisabled' => 'විද්‍යුත්  තැපැල් පහසුකම මෙම විකි ය සඳහා අවලංගු කොට ඇත.',
@@ -776,11 +790,17 @@ $2
 
 {{PLURAL:$3|මෙම තාවකාලික මුරපදය|මෙම තාවකාලික මුරපද}} {{PLURAL:$5|එක් දිනයක්|දින $5 ක්}} ගෙවුනු විට ඉකුත් වනු ඇත.
 ඔබ දැන් ප්‍රවිෂ්ට වී නව මුරපදයක් තෝරාගත යුතුයි. වෙන යම් අයෙක් මෙම ඉල්ලීම කර ඇත්නම් හෝ, ඔබගේ මුල් මුරපදය ඔබගේ මතකයට පැමිණ ඇති නම් හා, එය වෙනස් කිරීමට ඔබ හට තවදුරටත් අවශ්‍ය නොවේ නම්, ඔබ විසින් මෙම පණිවුඩය නොසලකා හැර පැරණි මුරපදය තවදුරටත් පාවිච්චි කළ හැක.',
+'passwordreset-emailtext-user' => '{{SITENAME}} හි පරිශීලක $1,{{SITENAME}}($4)සඳහා මුරපදය යලි පිහිටුවීමට ඉල්ලා ඇත.
+
+$2
+
+{{PLURAL:$3|මෙම මුරපදය|මෙම මුරපද}}{{PLURAL:$5|එක් දිනකින්|දවස්$5කින්}}කල් ඉකුත් වනු ඇත.
+ඔබ දැන් ඇතුළු වී නව මුරපදයක් තේරිය යුතුය.මෙම ඉල්ලීම වෙන කෙනෙකු විසින් හෝ ඔබට ඔබගේ මුල් මුරපදය මතක නම් හෝ ඔබ තව දුරටත් එය වෙනස් කිරීමට අදහස් නොකරයි නම් හෝ ඔබ මෙම පනිවිඩය නොසලකාහැර ඔබගේ පැරණි මුරපදය භාවිතා කරන්න.',
 'passwordreset-emailelement' => 'පරිශීලක නාමය: $1
 තාවකාලික මුරපදය: $2',
 'passwordreset-emailsent' => 'මුර-පදය නැවත සකස් කිරීම පිළිබඳව විද්‍යුත් තැපෑලක් යවන ලදී.',
 'passwordreset-emailsent-capture' => 'මුර-පදය වෙනස් කිරීම පිළිබඳව විද්‍යුත් තැපෑලක් යවන ලදී, එය පහත දැක්වේ.',
-'passwordreset-emailerror-capture' => 'සිහිකැඳවුම් ඊ-තැපෑල ජනිත කරනු ලැබූ අතර, එය පහත දැක්වේ, නමුත් එය පරිශීලකයාට යැවීම අසාර්ථක වුනි: $1',
+'passwordreset-emailerror-capture' => 'සිහිකැඳවුම් ඊ-තැපෑල ජනිත කරනු ලැබූ අතර, එය පහත දැක්වේ, නමුත් එය {{GENDER:$2|}}පරිශීලකයාට යැවීම අසාර්ථක වුනි: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'විද්‍යුත් තැපැල් ලිපිනය වෙනස් කරන්න',
@@ -958,10 +978,10 @@ $2
 ''' හිමිකම් ඇවුරුණු දේ අනවසරයෙන් ප්‍රකාශ කිරිමෙන් වලකින්න!'''",
 'longpageerror' => "'''දෝෂය: ඔබ සපයා ඇති පෙළ  {{PLURAL:$1|එක් කිලෝ බයිටයක්|කිලෝ බයිට් $1 ක්}} දිගු වන අතර, අනුමත උපරිමය වන  {{PLURAL:$2|එක් කිලෝ බයිටය |කිලෝ බයිට $2  }} ඉක්මවයි.'''
 එය සුරැකිය නොහැක.",
-'readonlywarning' => "'''අවවාදයයි: නඩත්තු කටයුතු සඳහා දත්ත-සංචිතය අවහිරකර ඇති බැවින් ඔබගේ සංස්කරණයන් දැන්මම සුරැකීමට ඔබ හට නොහැක.
-à¶\94බ à¶­à·\94ටà·\94 à¶±à¶¸à·\8a, à¶\9aපà·\8f-පà·\83à·\94à·\80-à¶\87ලà·\80à·\93මà¶\9aà·\8a (cut-n-paste) à¶¸à¶\9cà·\92නà·\8a à¶´à·\99à·\85 à·\80à·\99නතà·\8a à¶´à·\99à·\85 à¶\9cà·\9cනà·\94à·\80à¶\9aට à¶±à¶\82à·\80à·\8f à¶´à·\83à·\94à·\80 à·\83à·\94රà·\90à¶\9aà·\93මට à·\84à·\90à¶\9a.'''
+'readonlywarning' => '<strong>අවවාදයයි: නඩත්තු කටයුතු සඳහා දත්ත-සංචිතය අවහිරකර ඇති බැවින් ඔබගේ සංස්කරණයන් දැන්මම සුරැකීමට ඔබ හට නොහැක.
+à¶\94බ à¶­à·\94ටà·\94 à¶±à¶¸à·\8a, à¶´à·\92ටපතà·\8a à¶\9aර -පà·\83à·\94à·\80-à¶\87ලà·\80à·\93මà¶\9aà·\8a (copy-n-paste) à¶¸à¶\9cà·\92නà·\8a à¶´à·\99à·\85 à·\80à·\99නතà·\8a à¶´à·\99à·\85 à¶\9cà·\9cනà·\94à·\80à¶\9aට à¶±à¶\82à·\80à·\8f à¶´à·\83à·\94à·\80 à·\83à·\94රà·\90à¶\9aà·\93මට à·\84à·\90à¶\9a.</strong>
 
-එය ඇවුරූ පරිපාලක විසින් ඒ සඳහා දී ඇති පැහැදිලි කිරීම මෙසේය: $1",
+එය ඇවුරූ පරිපාලක විසින් ඒ සඳහා දී ඇති පැහැදිලි කිරීම මෙසේය: $1',
 'protectedpagewarning' => "\"'අවවාදයයි: පරිපාලක වරප්‍රසාද හිමි අයට පමණක් සංස්කරණය කලහැකි වන පරිදි මෙම පිටුව අවහිරකර ඇත.'''
 පරිශීලනය සඳහා ආසන්නතම සටහන පහත දක්වා ඇත.",
 'semiprotectedpagewarning' => "'''සටහන:''' ලේඛනගත පරිශීලකයන්ට පමණක් සංස්කරණය කල හැකි පරිදි මෙම පිටුව අවහිරකර ඇත.
@@ -1123,8 +1143,8 @@ $3 විසින් සපයා ඇති හේතුව ''$2'' වේ",
 'revdelete-hide-text' => 'සංශෝධන පෙළ සඟවන්න',
 'revdelete-hide-image' => 'ගොනු අන්තර්ගතය සඟවන්න',
 'revdelete-hide-name' => 'ක්‍රියාව හා ඉලක්කය සඟවන්න',
-'revdelete-hide-comment' => 'සංස්කරණ පරිකථනය සඟවන්න',
-'revdelete-hide-user' => 'සංස්කාරකගේ පරිශීලක නාමය/IP ලිපිනය සඟවන්න',
+'revdelete-hide-comment' => 'සංස්කරණ පරිකථනය',
+'revdelete-hide-user' => 'සංස්කාරකගේ පරිශීලක නාමය/IP ලිපිනය',
 'revdelete-hide-restricted' => 'අනෙකුන් මෙන්ම පරිපාලකවරුන් ගෙන්ද මෙම දත්ත යටපත්කරන්න',
 'revdelete-radio-same' => '(වෙනස් නොකරන්න)',
 'revdelete-radio-set' => 'සඟවනලද',
@@ -1224,7 +1244,7 @@ $1",
 'shown-title' => 'එක් පිටුවකට {{PLURAL:$1|ප්‍රතිඵලයක්|ප්‍රතිඵල $1 ක්}} බැගින් පෙන්වන්න',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) නරඹන්න',
 'searchmenu-exists' => "'''මෙම විකියෙහි \"[[:\$1]]\" ලෙස නම් කර ඇති පිටුවක් ඇත.'''",
-'searchmenu-new' => "'''මෙම විකියෙහි \"[[:\$1]]\" පිටුව තනන්න!'''",
+'searchmenu-new' => '<strong>පිටුව තනන්න "[[:$1]]" මෙම විකියෙහි!</strong> {{PLURAL:$2|0=|ඔබගේ සෙවුමට හසුවූ පිටුව බලන්න.|සෙවූ ප්‍රතිපල බලන්න.}}',
 'searchprofile-articles' => 'අන්තර්ගත පිටු',
 'searchprofile-project' => 'උදවු හා ව්‍යාපෘති පිටු',
 'searchprofile-images' => 'බහුමාධ්‍ය',
@@ -1348,7 +1368,7 @@ HTML ටැගයන් පිරික්සන්න.',
 'gender-unknown' => 'හෙළි නොකරයි',
 'gender-male' => 'පුරුෂ',
 'gender-female' => 'ස්ත්‍රී',
-'prefs-help-gender' => 'අත්‍යවශ්‍ය නැත: මෘදුකාංග විසින් නිවැරැදි ආමන්ත්‍රනය සඳහා භාවිතා කෙරෙයි.
+'prefs-help-gender' => 'මà·\99ම à·\83à¶\82à·\83à·\8aà¶\9aරණය à¶\85තà·\8aâ\80\8dයà·\80à·\81à·\8aâ\80\8dය à¶±à·\90ත: à¶¸à·\98දà·\94à¶\9aà·\8fà¶\82à¶\9c à·\80à·\92à·\83à·\92නà·\8a à¶±à·\92à·\80à·\90රà·\90දà·\92 à¶\86මනà·\8aතà·\8aâ\80\8dරනය à·\83ඳà·\84à·\8f à¶·à·\8fà·\80à·\92තà·\8f à¶\9aà·\99රà·\99යà·\92.
 මෙම තොරතුර ප්‍රජාවට විවෘතය.',
 'email' => 'විද්‍යුත් තැපෑල',
 'prefs-help-realname' => 'සැබෑ නාමය හෙළි කිරීම වෛකල්පිකයි.
@@ -1547,11 +1567,23 @@ HTML ටැගයන් පිරික්සන්න.',
 'rcnotefrom' => "'''$2''' න් පසු සිදුවී ඇති වෙනස්කම් මෙහි පහත දැක්වේ ('''$1''' ක ප්‍රමාණයක උපරිමයක් පෙන්වා ඇත).",
 'rclistfrom' => '$1 සිට බලපැවැත්වෙන මෑත වෙනස්වීම් පෙන්වන්න',
 'rcshowhideminor' => 'සුළු සංස්කරණ $1',
+'rcshowhideminor-show' => 'පෙන්වන්න',
+'rcshowhideminor-hide' => 'සඟවන්න',
 'rcshowhidebots' => 'රොබෝ $1',
+'rcshowhidebots-show' => 'පෙන්වන්න',
+'rcshowhidebots-hide' => 'සඟවන්න',
 'rcshowhideliu' => 'ලේඛනගත පරිශීලකයෝ $1',
+'rcshowhideliu-show' => 'පෙන්වන්න',
+'rcshowhideliu-hide' => 'සඟවන්න',
 'rcshowhideanons' => 'නිර්නාමික පරිශීලකයන් $1',
+'rcshowhideanons-show' => 'පෙන්වන්න',
+'rcshowhideanons-hide' => 'සඟවන්න',
 'rcshowhidepatr' => 'පරික්‍ෂා කර බැලූ සංස්කරණයන් $1',
+'rcshowhidepatr-show' => 'පෙන්වන්න',
+'rcshowhidepatr-hide' => 'සඟවන්න',
 'rcshowhidemine' => 'මගේ සංස්කරණයන් $1',
+'rcshowhidemine-show' => 'පෙන්වන්න',
+'rcshowhidemine-hide' => 'සඟවන්න',
 'rclinks' => 'අවසන් දින $2 තුලදී සිදුවී ඇති අවසන් වෙනස්වීම් $1 පෙන්නුම් කරන්න<br />$3',
 'diff' => 'වෙනස',
 'hist' => 'ඉති',
@@ -1567,6 +1599,7 @@ HTML ටැගයන් පිරික්සන්න.',
 'newsectionsummary' => '/* $1 */ නව ඡේදය',
 'rc-enhanced-expand' => 'විස්තර පෙන්වන්න',
 'rc-enhanced-hide' => 'විස්තර සඟවන්න',
+'rc-old-title' => 'මුලින් "$1" ලෙස සකස් කර ඇත.',
 
 # Recent changes linked
 'recentchangeslinked' => 'සහසම්බන්ධිත වෙනස්වීම්',
@@ -1584,7 +1617,7 @@ HTML ටැගයන් පිරික්සන්න.',
 'reuploaddesc' => 'උඩුගත කිරීම අත්හැරදමා උඩුගත කිරීම් ආකෘති පත්‍රය වෙත යන්න',
 'upload-tryagain' => 'වෙනස් කරන ලද ගොනු විස්තරය ඉදිරිපත් කරන්න',
 'uploadnologin' => 'පිවිසී නැත (Not logged in)',
-'uploadnologintext' => 'ගොනු උඩුගත කිරීමට පෙර ඔබ  [[Special:UserLogin|ප්‍රවිෂ්ට වී]] සිටිය යුතුය.',
+'uploadnologintext' => 'ගොනු උඩුගත කිරීමට පෙර ඔබ $1ට ප්‍රවිෂ්ට වී සිටිය යුතුය.',
 'upload_directory_missing' => 'උඩුගත ඩිරෙක්ටරිය ($1) සොයාගත නොහැකි අතර එය වෙබ්-සේවාදායකය විමින් තැනිය නොහැකි විය.',
 'upload_directory_read_only' => 'වෙබ්-සේවාදායකය විසින් උඩුගත ඩිරෙක්ටරිය ($1) වෙත ලිවීමට නොහැකි විය.',
 'uploaderror' => 'උඩුගත කිරීම් දෝෂයක්',
@@ -1825,8 +1858,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization බලන්න.',
 'upload_source_file' => ' (ඔබගේ පරිගණකයේ ගොනුවකි)',
 
 # Special:ListFiles
-'listfiles-summary' => 'මෙම විශේෂ පිටුවෙහි දැක්වෙන්නේ සියළු උඩුගත කල ගොනුය.
-When filtered by user, only files where that user uploaded the most recent version of the file are shown.',
+'listfiles-summary' => 'මෙම විශේෂ පිටුවෙහි දැක්වෙන්නේ සියළු උඩුගත කල ගොනුය.',
 'listfiles_search_for' => 'මාධ්‍ය නාමය සඳහා ගවේෂණය කරන්න:',
 'imgfile' => 'ගොනුව',
 'listfiles' => 'ගොනු ලැයිස්තුව',
@@ -1837,6 +1869,8 @@ When filtered by user, only files where that user uploaded the most recent versi
 'listfiles_size' => 'විශාලත්වය',
 'listfiles_description' => 'විස්තරය',
 'listfiles_count' => 'සංස්කරනය',
+'listfiles-show-all' => 'පරණ වර්ගවල පින්තූර එක් කරන්න.',
+'listfiles-latestversion' => 'වත්මන් අනුවාදය',
 'listfiles-latestversion-yes' => 'ඔව්',
 'listfiles-latestversion-no' => 'නැත',
 
index 63ebd3b..d6d1f89 100644 (file)
@@ -320,7 +320,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Posielať mi kópie mojich emailov, ktoré pošlem ostatným používateľom',
 'tog-diffonly' => 'Nezobrazovať obsah stránky pod rozdielmi',
 'tog-showhiddencats' => 'Zobraziť skryté kategórie',
-'tog-noconvertlink' => 'Vypnúť konverziu názvov odkazov',
 'tog-norollbackdiff' => 'Vynechať rozdiel po vykonaní rollbacku',
 'tog-useeditwarning' => 'Upozorniť ma, keď opúšťam upravovaciu stránku s neuloženými zmenami',
 'tog-prefershttps' => 'Po prihlásení používať vždy zabezpečené pripojenie',
index 9130076..9d6e7de 100644 (file)
@@ -769,7 +769,7 @@ Morda ste že uspešno spremenili geslo ali pa ste zahtevali novo začasno geslo
 'resetpass-temp-password' => 'Začasno geslo:',
 'resetpass-abort-generic' => 'Razširitev je prekinila spremembo gesla.',
 'resetpass-expired' => 'Vaše geslo je poteklo. Prosimo, nastavite novo geslo za prijavo.',
-'resetpass-expired-soft' => 'Vaše geslo je poteklo in ga morate ponastaviti. Prosimo, izberite novo geslo zdaj ali kliknite Prekliči, da ga ponastavite pozneje.',
+'resetpass-expired-soft' => 'Vaše geslo je poteklo in ga morate ponastaviti. Prosimo, izberite novo geslo zdaj ali kliknite »{{int:resetpass-submit-cancel}}«, da ga ponastavite pozneje.',
 
 # Special:PasswordReset
 'passwordreset' => 'Ponastavitev gesla',
@@ -1625,14 +1625,26 @@ Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo ra
 'recentchanges-label-plusminus' => 'uporabnik je velikost strani spremenil za tolikšno število bajtov',
 'recentchanges-legend-heading' => "'''Legenda:'''",
 'recentchanges-legend-newpage' => '(glej tudi [[Special:NewPages|seznam novih strani]])',
-'rcnotefrom' => "Navedene so spremembe od '''$2''' dalje (prikazujem jih do '''$1''').",
+'rcnotefrom' => 'Navedene so spremembe od <strong>$2</strong> dalje (prikazujem jih do <strong>$1</strong>).',
 'rclistfrom' => 'Prikaži spremembe od $1 naprej',
 'rcshowhideminor' => '$1 manjša urejanja',
+'rcshowhideminor-show' => 'Prikaži',
+'rcshowhideminor-hide' => 'Skrij',
 'rcshowhidebots' => '$1 bote',
+'rcshowhidebots-show' => 'Prikaži',
+'rcshowhidebots-hide' => 'Skrij',
 'rcshowhideliu' => '$1 registrirane uporabnike',
+'rcshowhideliu-show' => 'Prikaži',
+'rcshowhideliu-hide' => 'Skrij',
 'rcshowhideanons' => '$1 brezimne uporabnike',
+'rcshowhideanons-show' => 'Prikaži',
+'rcshowhideanons-hide' => 'Skrij',
 'rcshowhidepatr' => '$1 pregledana urejanja',
+'rcshowhidepatr-show' => 'Prikaži',
+'rcshowhidepatr-hide' => 'Skrij',
 'rcshowhidemine' => '$1 moja urejanja',
+'rcshowhidemine-show' => 'Prikaži',
+'rcshowhidemine-hide' => 'Skrij',
 'rclinks' => 'Prikaži zadnjih $1 sprememb v zadnjih $2 dneh<br />$3',
 'diff' => 'prim',
 'hist' => 'zgod',
@@ -1764,6 +1776,8 @@ Poprosite koga, ki ima možnost ogleda podatkov zatrtih datotek, da preveri polo
 'php-uploaddisabledtext' => 'Nalaganje datotek je onemogočeno v PHP.
 Prosimo preverite file_uploads nastavitev.',
 'uploadscripted' => 'Datoteka vsebuje HTML- ali skriptno kodo, ki bi jo lahko brskalnik razlagal napačno.',
+'uploadscriptednamespace' => 'Datoteka SVG vsebuje nedovoljen imenski prostor »$1«',
+'uploadinvalidxml' => 'XML v naloženi datoteki ne moremo razčleniti.',
 'uploadvirus' => 'Datoteka vsebuje virus!
 Podrobnosti: $1',
 'uploadjava' => 'Datoteka je datoteka ZIP, ki vsebuje javansko datoteko .class.
@@ -2427,7 +2441,7 @@ Izbris takšnih strani je bil omejen v izogib neželenim motnjam {{GRAMMAR:dativ
 'delete-warning-toobig' => 'Ta stran ima obsežno zgodovino urejanja, tj. čez $1 {{PLURAL:$1|redakcijo|redakciji|redakcije|redakcij}}.
 Njeno brisanje lahko zmoti obratovanje zbirke podatkov {{GRAMMAR:dative|{{SITENAME}}}};
 nadaljujte s previdnostjo.',
-'deleting-backlinks-warning' => "'''Opozorilo:''' Druge strani se povezujejo na ali vključujejo stran, ki jo nameravate izbrisati.",
+'deleting-backlinks-warning' => "'''Opozorilo:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Druge strani]] se povezujejo na ali vključujejo stran, ki jo nameravate izbrisati.",
 
 # Rollback
 'rollback' => 'Vrni spremembe',
@@ -2606,8 +2620,10 @@ Najnovejši vnos v dnevniku blokad je naveden spodaj:',
 'sp-contributions-blocked-notice-anon' => 'Ta IP-naslov je trenutno blokiran.
 Najnovejši vnos v dnevniku blokad je naveden spodaj:',
 'sp-contributions-search' => 'Išči prispevke',
+'sp-contributions-suppresslog' => 'zatrti uporabnikovi prispevki',
 'sp-contributions-username' => 'IP-naslov ali uporabniško ime:',
 'sp-contributions-toponly' => 'Prikaži samo vrhnje redakcije',
+'sp-contributions-newonly' => 'Prikaži samo urejanja, ki so ustvarila nove strani',
 'sp-contributions-submit' => 'Išči',
 
 # What links here
@@ -4138,6 +4154,4 @@ Pravzaprav razširi skoraj vse v dvojnih zavitih oklepajih.',
 'expand_templates_generate_rawhtml' => 'Prikaži surovi HTML',
 'expand_templates_preview' => 'Predogled',
 
-# Unknown messages
-'uploadinvalidxml' => 'XML v naloženi datoteki ne moremo razčleniti.',
 );
index 49dfbc9..536882e 100644 (file)
@@ -1437,6 +1437,7 @@ Hadii faylka wax laga badalay sida oo markiisa hore ahaa, waxaa laga yaabaa in e
 # Auto-summaries
 'autosumm-blank' => 'Masaxay bogga',
 'autosumm-replace' => 'Wuxuu qoraalka ku badalay "$1"',
+'autoredircomment' => 'Bog loo bedeley [[$1]]',
 'autosumm-new' => 'Bog cusub: $1',
 
 # Watchlist editor
index d9375c9..9a20472 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Amire80
  * @author Andejkendej
  * @author Cradel
  * @author Dashohoxha
@@ -16,6 +17,7 @@
  * @author Ergon
  * @author Euriditi
  * @author FatosMorina
+ * @author GretaDoci
  * @author Kaganer
  * @author Marinari
  * @author Mdupont
@@ -734,6 +736,8 @@ Për të hyrë tërësisht duhet të vendosni një fjalëkalim të ri këtu:',
 'resetpass-submit-cancel' => 'Anulo',
 'resetpass-wrong-oldpass' => 'Fjalëkalimi momental ose i përkohshëm nuk është i vlefshëm. Ndoshta tanimë me sukses keni ndërruar fjalëkalimin, ose keni kërkuar fjalëkalim të përkohshëm.',
 'resetpass-temp-password' => 'Fjalëkalimi i përkohshëm:',
+'resetpass-expired' => 'Fjalëkalimin tuaj ka skaduar. Ju lutem vendosni një fjalëkalim të ri për të hyr.',
+'resetpass-expired-soft' => 'Fjalëkalimi juaj ka skaduar dhe duhet të rivendoset. Ju lutem zgjidhni një fjalëkalim të ri tani, ose klikoni "{{int:resetpass-submit-cancel}}" për ta rivendosur më vonë.',
 
 # Special:PasswordReset
 'passwordreset' => 'Ndrysho fjalkalimin',
@@ -1526,7 +1530,7 @@ Kjo informatë është publike.',
 'rc_categories_any' => 'Të gjitha',
 'rc-change-size-new' => '$1 {{PLURAL:$1|bajt|bajtë}} pas ndryshimit',
 'newsectionsummary' => '/* $1 */ seksion i ri',
-'rc-enhanced-expand' => 'Trego detajet (kërkon JavaScript)',
+'rc-enhanced-expand' => 'Trego detajet',
 'rc-enhanced-hide' => 'Fshih detajet',
 'rc-old-title' => 'fillimisht i krijuar si "$1"',
 
@@ -2401,7 +2405,7 @@ $1',
 'mycontris' => 'Kontributet',
 'contribsub2' => 'Për $1 ($2)',
 'nocontribs' => 'Nuk ka asnjë ndryshim që përputhet me këto kritere.',
-'uctop' => ' (sipër)',
+'uctop' => '(aktual)',
 'month' => 'Nga muaji (dhe më herët):',
 'year' => 'Nga viti (dhe më herët):',
 
@@ -2419,6 +2423,7 @@ Bllokimi i fundit është shfaqur më poshtë për referencë:',
 'sp-contributions-blocked-notice-anon' => 'Kjo adresë IP është e bllokuar aktualisht.
 Bllokimi i funditë është më poshtë për referencë:',
 'sp-contributions-search' => 'Kërko tek kontributet',
+'sp-contributions-suppresslog' => 'Anëtar me Kontribute të kufizuara',
 'sp-contributions-username' => 'IP Addresa ose Përdoruesi:',
 'sp-contributions-toponly' => 'Trego vetëm redaktimet që janë versionet më të fundit',
 'sp-contributions-submit' => 'Kërko',
index 055b222..132c506 100644 (file)
@@ -431,7 +431,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Пошаљи ми копије е-порука које пошаљем другим корисницима',
 'tog-diffonly' => 'Не приказуј садржај странице испод разлика',
 'tog-showhiddencats' => 'Прикажи скривене категорије',
-'tog-noconvertlink' => 'Онемогући претварање наслова веза',
 'tog-norollbackdiff' => 'Изостави разлику након извршеног враћања',
 'tog-useeditwarning' => 'Упозори ме када напуштам страницу са несачуваним променама',
 'tog-prefershttps' => 'Увек користи сигурну конекцију када сам пријављен.',
@@ -723,6 +722,7 @@ $1',
 # General errors
 'error' => 'Грешка',
 'databaseerror' => 'Грешка у бази података',
+'databaseerror-text' => 'Дошло је до грешке у упиту базе података. Можда је у питању програмска грешка.',
 'databaseerror-function' => 'Функција: $1',
 'databaseerror-error' => 'Грешка: $1',
 'laggedslavemode' => "'''Упозорење:''' страница је можда застарела.",
@@ -939,6 +939,9 @@ $2',
 'suspicious-userlogout' => 'Ваш захтев за одјаву је одбијен јер је послат од стране неисправног прегледача или посредника.',
 'createacct-another-realname-tip' => 'Право име није обавезно.
 Ако изаберете да га унесете, оно ће бити коришћено за приписивање вашег рада.',
+'pt-login' => 'Пријави ме',
+'pt-createaccount' => 'Отвори налог',
+'pt-userlogout' => 'Одјави ме',
 
 # Email sending
 'php-mail-error-unknown' => 'Непозната грешка у функцији PHP mail().',
@@ -962,8 +965,13 @@ $2',
 'resetpass-submit-cancel' => 'Откажи',
 'resetpass-wrong-oldpass' => 'Неисправна привремена или текућа лозинка.
 Можда сте већ променили лозинку или сте затражили нову привремену лозинку.',
+'resetpass-recycled' => 'Унели сте садашњу лозинку, да би сте ресетовали лозинку морате унети нову.',
+'resetpass-temp-emailed' => 'Пријавили сте се са привременим кодом из е-поште.
+Да бисте завршили пријављивање морате поставити нову лозинку овде:',
 'resetpass-temp-password' => 'Привремена лозинка:',
 'resetpass-abort-generic' => 'Промену лозинке је спречио додатак.',
+'resetpass-expired' => 'Ваша лозинка је истекла. Поставите нову лозинку да бисте се пријавили.',
+'resetpass-expired-soft' => 'Ваша лозинка је истекла и морате поставити нову. Поставите нову лозинку или кликните откажи да је поставите касније.',
 
 # Special:PasswordReset
 'passwordreset' => 'Обнављање лозинке',
@@ -1779,6 +1787,7 @@ $1",
 'recentchanges' => 'Скорашње измене',
 'recentchanges-legend' => 'Поставке скорашњих измена',
 'recentchanges-summary' => 'Пратите скорашње измене на овој страници.',
+'recentchanges-noresult' => 'Нема промена у задатом времену за задате критеријуме.',
 'recentchanges-feed-description' => 'Пратите скорашње измене уз помоћ овог довода.',
 'recentchanges-label-newpage' => 'Нова страница',
 'recentchanges-label-minor' => 'Мања измена',
@@ -1790,11 +1799,23 @@ $1",
 'rcnotefrom' => 'Испод су измене од <b>$3; $4</b> (до <b>$1</b> измена).',
 'rclistfrom' => 'Прикажи нове измене почев од $1',
 'rcshowhideminor' => '$1 мање измене',
+'rcshowhideminor-show' => 'Прикажи',
+'rcshowhideminor-hide' => 'Сакриј',
 'rcshowhidebots' => '$1 ботове',
+'rcshowhidebots-show' => 'Прикажи',
+'rcshowhidebots-hide' => 'Сакриј',
 'rcshowhideliu' => '$1 пријављене кориснике',
+'rcshowhideliu-show' => 'Прикажи',
+'rcshowhideliu-hide' => 'Сакриј',
 'rcshowhideanons' => '$1 анонимне кориснике',
+'rcshowhideanons-show' => 'Прикажи',
+'rcshowhideanons-hide' => 'Сакриј',
 'rcshowhidepatr' => '$1 патролиране измене',
+'rcshowhidepatr-show' => 'Прикажи',
+'rcshowhidepatr-hide' => 'Сакриј',
 'rcshowhidemine' => '$1 моје измене',
+'rcshowhidemine-show' => 'Прикажи',
+'rcshowhidemine-hide' => 'Сакриј',
 'rclinks' => 'Прикажи последњих $1 измена {{PLURAL:$2|претходни дан|у последња $2 дана|у последњих $2 дана}}<br />$3',
 'diff' => 'разл',
 'hist' => 'ист',
@@ -1928,6 +1949,7 @@ $1",
 'php-uploaddisabledtext' => 'Слање датотека је онемогућено у PHP-у.
 Проверите поставке file_uploads.',
 'uploadscripted' => 'Датотека садржи HTML или скриптни код који може бити погрешно протумачен од стране прегледача.',
+'uploadscriptednamespace' => 'Ова SVG датотека садржи погрешан именски простор „$1“',
 'uploadvirus' => 'Датотека садржи вирус!
 Детаљи: $1',
 'uploadjava' => 'Датотека је формата ZIP који садржи јава .class елемент.
@@ -2491,6 +2513,7 @@ $1',
 'watchmethod-list' => 'проверава се да ли има скорашњих измена у надгледаним страницама',
 'watchlistcontains' => 'Ваш списак надгледања садржи $1 {{PLURAL:$1|страницу|странице|страница}}.',
 'iteminvalidname' => 'Проблем са ставком „$1“. Неисправан назив.',
+'wlnote2' => 'Испод су приказане измене у {{PLURAL:$1|последњих један сат|последњих <strong>$1</strong> сата}} закључно са $2, $3.',
 'wlshowlast' => 'Прикажи последњих $1 сати, $2 дана, $3',
 'watchlist-options' => 'Поставке списка надгледања',
 
@@ -2636,7 +2659,7 @@ $UNWATCHURL
 Ово су тренутне поставке странице '''$1''':",
 'protect-cascadeon' => 'Ова страница је тренутно заштићена јер се налази на {{PLURAL:$1|страници која има|страницама које имају}} преносиву заштиту.
 Можете да промените степен заштите, али то неће утицати на преносиву заштиту.',
-'protect-default' => 'Ð\94озволи свим корисницима',
+'protect-default' => 'Ð\94опÑ\83Ñ\88Ñ\82ено свим корисницима',
 'protect-fallback' => 'Дозвољено само корисницима са дозволом „$1“',
 'protect-level-autoconfirmed' => 'Допуштено само аутоматски потврђеним корисницима',
 'protect-level-sysop' => 'Допуштено само администраторима',
@@ -2742,7 +2765,7 @@ $1',
 'contributions-title' => 'Доприноси {{GENDER:$1|корисника|кориснице}} $1',
 'mycontris' => 'Доприноси',
 'contribsub2' => 'За {{GENDER:$3|$1}} ($2)',
-'nocontribs' => 'Ð\98змене ÐºÐ¾Ñ\98е Ð¾Ð´Ð³Ð¾Ð²Ð°Ñ\80аÑ\98Ñ\83 Ð¾Ð²Ð¸Ð¼ Ñ\83Ñ\81ловима Ð½Ð¸Ñ\81Ñ\83 Ð¿Ñ\80онаÑ\92ене.',
+'nocontribs' => 'Ð\9dема Ð¸Ð·Ð¼ÐµÐ½Ð° ÐºÐ¾Ñ\98е Ð¾Ð´Ð³Ð¾Ð²Ð°Ñ\80аÑ\98Ñ\83 Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¸Ð¼ ÐºÑ\80иÑ\82еÑ\80иÑ\98Ñ\83мима.',
 'uctop' => '(последња)',
 'month' => 'од месеца (и раније):',
 'year' => 'од године (и раније):',
@@ -2762,6 +2785,7 @@ $1',
 'sp-contributions-search' => 'Претрага доприноса',
 'sp-contributions-username' => 'ИП адреса или корисничко име:',
 'sp-contributions-toponly' => 'Прикажи само најновије измене',
+'sp-contributions-newonly' => 'Прикажи само измене којима су креиране нове странице',
 'sp-contributions-submit' => 'Претражи',
 
 # What links here
@@ -3059,6 +3083,7 @@ $1',
 'allmessages-prefix' => 'Филтрирај по префиксу:',
 'allmessages-language' => 'Језик:',
 'allmessages-filter-submit' => 'Иди',
+'allmessages-filter-translate' => 'Преведи',
 
 # Thumbnails
 'thumbnail-more' => 'Повећај',
@@ -3275,11 +3300,12 @@ $1',
 'pageinfo-length' => 'Дужина странице (у бајтовима)',
 'pageinfo-article-id' => 'ИД странице',
 'pageinfo-language' => 'Језик садржаја странице',
+'pageinfo-content-model' => 'Модел садржаја странице',
 'pageinfo-robot-policy' => 'Индексирање од стране робота',
 'pageinfo-robot-index' => 'Дозвољено',
 'pageinfo-robot-noindex' => 'Није дозвољено',
 'pageinfo-views' => 'Број прегледа',
-'pageinfo-watchers' => 'Ð\91Ñ\80оÑ\98 Ð½Ð°Ð´Ð³Ð»ÐµÐ´Ð°Ñ\87а Ñ\81Ñ\82Ñ\80аниÑ\86а',
+'pageinfo-watchers' => 'Ð\91Ñ\80оÑ\98 Ð½Ð°Ð´Ð³Ð»ÐµÐ´Ð°Ñ\87а Ñ\81Ñ\82Ñ\80аниÑ\86е',
 'pageinfo-few-watchers' => 'Мање од $1 {{PLURAL:$1|пратиоца|пратилаца}}',
 'pageinfo-redirects-name' => 'Број преусмерења на ову страницу',
 'pageinfo-subpages-name' => 'Подстранице ове странице',
@@ -3705,7 +3731,7 @@ $8',
 'exif-compression-34712' => 'JPEG2000',
 
 'exif-copyrighted-true' => 'Заштићено ауторским правом',
-'exif-copyrighted-false' => 'СÑ\82аÑ\82Ñ\83Ñ\81 Ð°Ñ\83Ñ\82оÑ\80Ñ\81киÑ\85 Ð¿Ñ\80ава Ð½Ð¸Ñ\98е Ð¿Ð¾Ð´ÐµÑ\88ен',
+'exif-copyrighted-false' => 'СÑ\82аÑ\82Ñ\83Ñ\81 Ð°Ñ\83Ñ\82оÑ\80Ñ\81киÑ\85 Ð¿Ñ\80ава Ð½Ð¸Ñ\98е Ð´ÐµÑ\84иниÑ\81ан',
 
 'exif-photometricinterpretation-2' => 'RGB',
 'exif-photometricinterpretation-6' => 'YCbCr',
index 39b8f8b..29339f6 100644 (file)
@@ -342,7 +342,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Pošalji mi primerke e-poruka koje pošaljem drugim korisnicima',
 'tog-diffonly' => 'Ne prikazuj sadržaj stranice ispod razlika',
 'tog-showhiddencats' => 'Prikaži skrivene kategorije',
-'tog-noconvertlink' => 'Onemogući pretvaranje naslova veza',
 'tog-norollbackdiff' => 'Izostavi razliku nakon izvršenog vraćanja',
 'tog-useeditwarning' => 'Upozori me kada napuštam stranicu sa nesačuvanim promenama',
 'tog-prefershttps' => 'Uvek koristi sigurnu konekciju kada sam prijavljen.',
@@ -632,6 +631,7 @@ Spisak svih posebnih stranica nalazi se [[Special:SpecialPages|ovde]].',
 # General errors
 'error' => 'Greška',
 'databaseerror' => 'Greška u bazi podataka',
+'databaseerror-text' => 'Došlo je do greške u upitu baze podataka. Možda je u pitanju programska greška.',
 'laggedslavemode' => "'''Upozorenje:''' stranica je možda zastarela.",
 'readonly' => 'Baza podataka je zaključana',
 'enterlockreason' => 'Unesite razlog za zaključavanje, uključujući i vreme otključavanja',
@@ -1653,6 +1653,7 @@ Ako izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rad
 'recentchanges' => 'Skorašnje izmene',
 'recentchanges-legend' => 'Postavke skorašnjih izmena',
 'recentchanges-summary' => 'Pratite skorašnje izmene na ovoj stranici.',
+'recentchanges-noresult' => 'Nema promena u zadatom vremenu za zadate kriterijume.',
 'recentchanges-feed-description' => 'Pratite skorašnje izmene uz pomoć ovog dovoda.',
 'recentchanges-label-newpage' => 'Nova stranica',
 'recentchanges-label-minor' => 'Manja izmena',
@@ -2358,6 +2359,7 @@ Buduće izmene ove stranice i njene stranice za razgovor biće navedene ovde.',
 'watchmethod-list' => 'proverava se da li ima skorašnjih izmena u nadgledanim stranicama',
 'watchlistcontains' => 'Vaš spisak nadgledanja sadrži $1 {{PLURAL:$1|stranicu|stranice|stranica}}.',
 'iteminvalidname' => 'Problem sa stavkom „$1“. Neispravan naziv.',
+'wlnote2' => 'Ispod su prikazane izmene u {{PLURAL:$1|poslednjih jedan sat|poslednjih <strong>$1</strong> sata}} zaključno sa $2, $3.',
 'wlshowlast' => 'Prikaži poslednjih $1 sati, $2 dana, $3',
 'watchlist-options' => 'Postavke spiska nadgledanja',
 
@@ -2493,7 +2495,7 @@ Ovo su postavke stranice '''$1''':",
 Ovo su trenutne postavke stranice '''$1''':",
 'protect-cascadeon' => 'Ova stranica je trenutno zaštićena jer se nalazi na {{PLURAL:$1|stranici koja ima|stranicama koje imaju}} prenosivu zaštitu.
 Možete da promenite stepen zaštite, ali to neće uticati na prenosivu zaštitu.',
-'protect-default' => 'Dozvoli svim korisnicima',
+'protect-default' => 'Dopušteno svim korisnicima',
 'protect-fallback' => 'Dozvoljeno samo korisnicima sa dozvolom „$1“',
 'protect-level-autoconfirmed' => 'Dopušteno samo automatski potvrđenim korisnicima',
 'protect-level-sysop' => 'Dopušteno samo administratorima',
@@ -2599,7 +2601,7 @@ $1',
 'contributions-title' => 'Doprinosi {{GENDER:$1|korisnika|korisnice}} $1',
 'mycontris' => 'Doprinosi',
 'contribsub2' => 'Za {{GENDER:$3|$1}} ($2)',
-'nocontribs' => 'Izmene koje odgovaraju ovim uslovima nisu pronađene.',
+'nocontribs' => 'Nema izmena koje odgovaraju navedenim kriterijumima.',
 'uctop' => '(poslednja)',
 'month' => 'od meseca (i ranije):',
 'year' => 'od godine (i ranije):',
@@ -2916,6 +2918,7 @@ Posetite [https://www.mediawiki.org/wiki/Localisation Medijaviki lokalizaciju] i
 'allmessages-prefix' => 'Filtriraj po prefiksu:',
 'allmessages-language' => 'Jezik:',
 'allmessages-filter-submit' => 'Idi',
+'allmessages-filter-translate' => 'Prevedi',
 
 # Thumbnails
 'thumbnail-more' => 'Povećaj',
@@ -3131,11 +3134,12 @@ Ovo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnoj li
 'pageinfo-length' => 'Dužina stranice (u bajtovima)',
 'pageinfo-article-id' => 'ID stranice',
 'pageinfo-language' => 'Jezik sadržaja stranice',
+'pageinfo-content-model' => 'Model sadržaj stranice',
 'pageinfo-robot-policy' => 'Indeksiranje od strane robota',
 'pageinfo-robot-index' => 'Dozvoljeno',
 'pageinfo-robot-noindex' => 'Nije dozvoljeno',
 'pageinfo-views' => 'Broj pregleda',
-'pageinfo-watchers' => 'Broj nadgledača stranica',
+'pageinfo-watchers' => 'Broj nadgledača stranicе',
 'pageinfo-few-watchers' => 'Manje od $1 {{PLURAL:$1|pratioca|pratilaca}}',
 'pageinfo-redirects-name' => 'Broj preusmerenja na ovu stranicu',
 'pageinfo-subpages-name' => 'Podstranice ove stranice',
@@ -3549,7 +3553,7 @@ $8',
 'exif-compression-34712' => 'JPEG2000',
 
 'exif-copyrighted-true' => 'Zaštićeno autorskim pravom',
-'exif-copyrighted-false' => 'Status autorskih prava nije podešen',
+'exif-copyrighted-false' => 'Status autorskih prava nije definisan',
 
 'exif-photometricinterpretation-2' => 'RGB',
 'exif-photometricinterpretation-6' => 'YCbCr',
index 687b18c..8c8326c 100644 (file)
@@ -164,7 +164,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Kirimkeun ogé salinan surélékna ka alamat kuring',
 'tog-diffonly' => 'Ulah némbongkeun eusi kaca di handapeun béda éditan',
 'tog-showhiddencats' => 'Témbongkeun kategori nyumput',
-'tog-noconvertlink' => 'Non-aktifkeun konvérsi judul tumbu',
 'tog-norollbackdiff' => 'Liwat béda sanggeus malikkeun révisi',
 'tog-useeditwarning' => 'Béjaan kuring lamun ninggalkeun kaca édit anu parobahanana can disimpen',
 
index 94430e3..65951d1 100644 (file)
@@ -362,7 +362,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Skicka kopior till mig av e-post jag skickar till andra användare',
 'tog-diffonly' => 'Visa inte sidinnehåll under diffar',
 'tog-showhiddencats' => 'Visa dolda kategorier',
-'tog-noconvertlink' => 'Stäng av konvertering av sidtitlar',
 'tog-norollbackdiff' => 'Visa inte diff efter tillbakarullning',
 'tog-useeditwarning' => 'Varna mig om jag lämnar en redigeringssida där jag gjort ändringar men inte sparat.',
 'tog-prefershttps' => 'Använd alltid en säker anslutning när jag är inloggad',
@@ -897,7 +896,7 @@ För att slutföra inloggningen måste du välja ett nytt lösenord här:',
 'resetpass-temp-password' => 'Tillfälligt lösenord:',
 'resetpass-abort-generic' => 'Lösenordsändring av har avbrutits av ett tillägg.',
 'resetpass-expired' => 'Ditt lösenord har gått ut. Var god välj ett nytt lösenord för att logga in.',
-'resetpass-expired-soft' => 'Ditt lösenord har gått ut och behöver återställas. Var god välj ett nytt lösenord nu eller klicka på avbryt för att återställa det senare.',
+'resetpass-expired-soft' => 'Ditt lösenord har gått ut och behöver återställas. Var god välj ett nytt lösenord nu eller klicka på "{{int:resetpass-submit-cancel}}" för att återställa det senare.',
 
 # Special:PasswordReset
 'passwordreset' => 'Återställ lösenord',
@@ -1750,14 +1749,26 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
 'recentchanges-legend-heading' => "'''Teckenförklaring:'''",
 'recentchanges-legend-newpage' => '(se även [[Special:NewPages|listan över nya sidor]])',
 'recentchanges-legend-plusminus' => "(''±123'')",
-'rcnotefrom' => "Nedan visas ändringar sedan '''$2''' (upp till '''$1''' ändringar visas).",
+'rcnotefrom' => 'Nedan visas ändringar sedan <strong>$2</strong> (upp till <strong>$1</strong> ändringar visas).',
 'rclistfrom' => 'Visa ändringar från och med $1',
 'rcshowhideminor' => '$1 mindre ändringar',
+'rcshowhideminor-show' => 'Visa',
+'rcshowhideminor-hide' => 'Dölj',
 'rcshowhidebots' => '$1 robotar',
+'rcshowhidebots-show' => 'Visa',
+'rcshowhidebots-hide' => 'Dölj',
 'rcshowhideliu' => '$1 registrerade användare',
+'rcshowhideliu-show' => 'Visa',
+'rcshowhideliu-hide' => 'Dölj',
 'rcshowhideanons' => '$1 oinloggade användare',
+'rcshowhideanons-show' => 'Visa',
+'rcshowhideanons-hide' => 'Dölj',
 'rcshowhidepatr' => '$1 patrullerade redigeringar',
+'rcshowhidepatr-show' => 'Visa',
+'rcshowhidepatr-hide' => 'Dölj',
 'rcshowhidemine' => '$1 mina ändringar',
+'rcshowhidemine-show' => 'Visa',
+'rcshowhidemine-hide' => 'Dölj',
 'rclinks' => 'Visa senaste $1 ändringar under de senaste $2 dygnen<br />$3',
 'diff' => 'skillnad',
 'hist' => 'historik',
@@ -1885,6 +1896,8 @@ Du borde be någon som kan se undanhållen fildata att granska situationen innan
 'uploaddisabledtext' => 'Uppladdning av filer är avstängd.',
 'php-uploaddisabledtext' => 'PHP filuppladdningar är avaktiverade. Kolla inställningarna för file_uploads.',
 'uploadscripted' => 'Denna fil innehåller HTML eller script som felaktigt kan komma att tolkas av webbläsare.',
+'uploadscriptednamespace' => 'Denna SVG-fil innehåller den ogiltiga namnrymden "$1"',
+'uploadinvalidxml' => 'XML-koden i den uppladdade filen kunde inte tolkas.',
 'uploadvirus' => 'Filen innehåller virus! Detaljer: $1',
 'uploadjava' => 'Filen är en ZIP-fil som innehåller en Java .class fil.
 Uppladdning av Java filer tillåts inte, eftersom de kan orsaka att säkerhetsbegränsningar kan kringgås.',
@@ -2537,7 +2550,8 @@ Se $2 för noteringar om de senaste raderingarna.',
 'delete-edit-reasonlist' => 'Redigera anledningar för radering',
 'delete-toobig' => 'Denna sida har en lång redigeringshistorik med mer än $1 {{PLURAL:$1|sidversion|sidversioner}}. Borttagning av sådana sidor har begränsats för att förhindra oavsiktliga driftstörningar på {{SITENAME}}.',
 'delete-warning-toobig' => 'Denna sida har en lång redigeringshistorik med mer än $1 {{PLURAL:$1|sidversion|sidversioner}}. Att radera sidan kan skapa problem med hanteringen av databasen på {{SITENAME}}; var försiktig.',
-'deleting-backlinks-warning' => "'''Varning:''' Andra sidor länkar till eller inkluderar sidan som du är på väg att radera.",
+'deleting-backlinks-warning' => "'''Varning:'''
+[[Special:WhatLinksHere/{{FULLPAGENAME}}|Andra sidor]] länkar till eller inkluderar sidan som du är på väg att radera.",
 
 # Rollback
 'rollback' => 'Rulla tillbaka ändringar',
@@ -2713,6 +2727,7 @@ Den senaste posten i blockeringsloggen visas nedan som referens:',
 'sp-contributions-search' => 'Sök efter användarbidrag',
 'sp-contributions-username' => 'IP-adress eller användarnamn:',
 'sp-contributions-toponly' => 'Visa endast aktuella sidversioner',
+'sp-contributions-newonly' => 'Visa endast redigeringar där sidor skapas',
 'sp-contributions-submit' => 'Sök',
 
 # What links here
@@ -3124,7 +3139,7 @@ Vänligen använd förhandsgranskningsknappen innan du sparar.',
 'tooltip-n-currentevents' => 'Hitta bakgrundsinformation om aktuella händelser',
 'tooltip-n-recentchanges' => 'Lista över senaste ändringar i wikin',
 'tooltip-n-randompage' => 'Gå till en slumpmässigt vald sida',
-'tooltip-n-help' => 'Platsen för att hitta',
+'tooltip-n-help' => 'Platsen där du hittar hjälp',
 'tooltip-t-whatlinkshere' => 'Lista över alla wikisidor som länkar hit',
 'tooltip-t-recentchangeslinked' => 'Visa senaste ändringarna av sidor som den här sidan länkar till',
 'tooltip-feed-rss' => 'RSS-flöde för den här sidan',
@@ -4250,6 +4265,4 @@ Annars kan du använda det enkla formuläret nedan. Din kommentar kommer att lä
 'expand_templates_generate_rawhtml' => 'Visa rå HTML',
 'expand_templates_preview' => 'Förhandsvisning',
 
-# Unknown messages
-'uploadinvalidxml' => 'XML-koden i den uppladdade filen kunde inte tolkas.',
 );
index e36071a..2f3ca8b 100644 (file)
@@ -160,7 +160,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Nitumie nakala ya barua pepe nitakazo tuma kwa watumiaji wengine',
 'tog-diffonly' => 'Usionyeshe yaliyomo kwenye ukurasa chini ya faili za diff',
 'tog-showhiddencats' => 'Onyesha jamii zilizofichwa',
-'tog-noconvertlink' => 'Lemaza kiungo cha jina la badiliko',
 'tog-norollbackdiff' => 'Ondoa faili za diff baada ya kufanyakazi ya kurejesha',
 'tog-useeditwarning' => 'Unionyeshe ilani ninapotaka kutoka kwenye ukurasa ninouhariri, bila kuhifadhi mabadiliko',
 
index 9f41dbf..b4d1470 100644 (file)
@@ -605,6 +605,9 @@ $1',
 'suspicious-userlogout' => 'உங்கள் விடுபதிகை கோரிக்கை மறுக்கப்பட்டது ஏனென்றால் அது அறுபட்ட உலாவி அல்லது மாற்று இடைக்கிடங்கியால் அனுப்பப்பட்டுள்ளது.',
 'createacct-another-realname-tip' => 'உண்மையான பெயர் கட்டாயமற்றது.
 நீங்கள் இதை கொடுத்தால் உங்கள் ஆக்கங்களுக்கான உரிமையளிப்புகளின் போது இது பயன்படும்.',
+'pt-login' => 'புகுபதிகை',
+'pt-createaccount' => 'புதிய கணக்கை உருவாக்கவும்',
+'pt-userlogout' => 'விடுபதிகை',
 
 # Email sending
 'php-mail-error-unknown' => "PHP 's mail() செயல்பாட்டில் அறியப்படாத பிழை.",
@@ -613,7 +616,7 @@ $1',
 
 # Change password dialog
 'changepassword' => 'கடவுச்சொல்லை மாற்று',
-'resetpass_announce' => 'நà¯\80à®\99à¯\8dà®\95ளà¯\8d à®¤à®±à¯\8dà®\95ாலிà®\95 à®®à®¿à®©à¯\8dனà®\9eà¯\8dà®\9aலà¯\8d à®\95à¯\81றியà¯\80à®\9fà¯\8dà®\9fà¯\81à®\9fனà¯\8d à®ªà¯\81à®\95à¯\81பதிà®\95à¯\88 à®\9aà¯\86யà¯\8dதà¯\81ளà¯\8dளà¯\80à®°à¯\8dà®\95ளà¯\8d. à®ªà¯\81à®\95à¯\81பதிà®\95à¯\88யà¯\88 à®¨à®¿à®±à¯\88வà¯\81à®\9aà¯\8d à®\9aà¯\86யà¯\8dய à®ªà¯\81தியà®\95à¯\8d à®\95à®\9fவà¯\81à®\9aà¯\8d à®\9aà¯\8aலà¯\8dலà¯\8aனà¯\8dà®±à¯\88 à®\87à®\99à¯\8dà®\95à¯\87 à®¤à®\9fà¯\8dà®\9fà®\9aிà®\9fà¯\81à®\95:',
+'resetpass_announce' => 'பà¯\81à®\95à¯\81பதிà®\95à¯\88யà¯\88 à®¨à®¿à®±à¯\88வà¯\81à®\9aà¯\8d à®\9aà¯\86யà¯\8dய à®ªà¯\81தியà®\95à¯\8d à®\95à®\9fவà¯\81à®\9aà¯\8d à®\9aà¯\8aலà¯\8dலà¯\8aனà¯\8dà®±à¯\88 à®¤à¯\87à®°à¯\8dவà¯\81 à®\9aà¯\86யà¯\8dயவà¯\87ணà¯\8dà®\9fà¯\81à®®à¯\8d.',
 'resetpass_header' => 'கணக்கிற்கான கடவுச்சொல்லை மாற்றியமை',
 'oldpassword' => 'பழைய கடவுச்சொல்:',
 'newpassword' => 'புதிய கடவுச்சொல்:',
@@ -627,6 +630,7 @@ $1',
 'resetpass-wrong-oldpass' => 'செல்லுபடியற்ற தற்காலிகமான அல்லது நடப்புக் கடவுச்சொல்.
 உங்கள் கடவுச் சொல்லை நீங்கள் வெற்றிகரமாக மாற்றிவிட்டீர்கள் அல்லது புதிய தற்காலிகக் கடவுச்சொல்லைக் கோரியுள்ளீர்கள்.',
 'resetpass-temp-password' => 'தற்காலிக கடவுச்சொல்:',
+'resetpass-expired' => 'உங்கள் கடவுச்சொல் காலாவதியாகிவிட்டது. உள்நுழைய ஒரு புதிய கடவுச்சொல்லை தெரிவுசெய்யவும்.',
 
 # Special:PasswordReset
 'passwordreset' => 'கடவுச்சொல்லை மீட்டமை',
@@ -2270,6 +2274,7 @@ $1',
 'sp-contributions-blocked-notice-anon' => 'இந்த IP முகவரி தற்போது தடுக்கப்பட்டுள்ளது.
 சமீபத்திய தடுப்பு குறிப்பேடு  கீழே குறிப்பிற்காக வழங்கப்பட்டுள்ளது :',
 'sp-contributions-search' => 'பங்களிப்புகளைத் தேடு',
+'sp-contributions-suppresslog' => 'பயனரின் நீக்கப்பட்ட பங்களிப்புகள்',
 'sp-contributions-username' => 'ஐ.பி. அல்லது பயனர் பெயர்:',
 'sp-contributions-toponly' => 'சமீபத்திய பரிசீலனைகளுக்குட்பட்ட  திருத்தங்களை மட்டும் காண்பி',
 'sp-contributions-submit' => 'தேடுக',
index 4dc4ca2..79faa58 100644 (file)
@@ -304,7 +304,7 @@ $messages = array(
 'vector-action-delete' => 'తొలగించు',
 'vector-action-move' => 'తరలించు',
 'vector-action-protect' => 'సంరక్షించు',
-'vector-action-undelete' => 'తిరిà°\97à°¿ à°\9aà±\87à°°à±\8dà°\9aà±\81',
+'vector-action-undelete' => 'à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81à°¨à±\81 à°°à°¦à±\8dà°¦à±\81à°\9aà±\86à°¯à±\8dయి',
 'vector-action-unprotect' => 'సంరక్షణను మార్చు',
 'vector-view-create' => 'సృష్టించు',
 'vector-view-edit' => 'సవరించు',
@@ -338,7 +338,7 @@ $messages = array(
 'delete' => 'తొలగించు',
 'deletethispage' => 'ఈ పేజీని తొలగించండి',
 'undeletethispage' => 'ఈ పేజీ తొలగింపును ఆపు',
-'undelete_short' => '{{PLURAL:$1|ఒక్క రచనను|$1 రచనలను}} పునఃస్థాపించు',
+'undelete_short' => '{{PLURAL:$1|ఒక్క రచన|$1 రచనల}} తొలగింపును రద్దుచెయ్యి',
 'viewdeleted_short' => '{{PLURAL:$1|తొలగించిన ఒక మార్పు|$1 తొలగించిన మార్పుల}}ను చూడండి',
 'protect' => 'సంరక్షించు',
 'protect_change' => 'మార్చు',
@@ -365,12 +365,12 @@ $messages = array(
 'viewtalkpage' => 'చర్చను చూడు',
 'otherlanguages' => 'ఇతర భాషలలో',
 'redirectedfrom' => '($1 నుండి మళ్ళించబడింది)',
-'redirectpagesub' => 'దారిమారà±\8dà°ªà±\81 à°ªà±\81à°\9f',
+'redirectpagesub' => 'దారిమారà±\8dà°ªà±\81 à°ªà±\87à°\9cà±\80',
 'lastmodifiedat' => 'ఈ పేజీలో చివరి మార్పు $1 న $2 కు జరిగింది.',
 'viewcount' => 'ఈ పేజీ {{PLURAL:$1|ఒక్క సారి|$1 సార్లు}} దర్శించబడింది.',
 'protectedpage' => 'సంరక్షణలోని పేజీ',
 'jumpto' => 'ఇక్కడికి గెంతు:',
-'jumptonavigation' => 'à°ªà±\87à°\9cà±\80à°\95à°¿ à°¸à°\82à°¬à°\82ధిà°\82à°\9aà°¿à°¨ à°²à°¿à°\82à°\95à±\81à°²à±\81',
+'jumptonavigation' => 'మారà±\8dà°\97à°¸à±\82à°\9aà±\80',
 'jumptosearch' => 'వెతుకు',
 'view-pool-error' => 'క్షమించండి, ప్రస్తుతం సర్వర్లన్నీ ఓవర్‌లోడ్ అయిఉన్నాయి.
 చాలామంది వాడుకరులు ఈ పేజీని చూస్తున్నారు.
@@ -379,13 +379,13 @@ $messages = array(
 $1',
 'pool-timeout' => 'తాళం కొరకు వేచివుండడానికి కాలపరిమితి అయిపోయింది',
 'pool-queuefull' => 'సమూహపు వరుస నిండుగా ఉంది',
-'pool-errorunknown' => 'à°\97à±\81à°°à±\8dà°¤à±\81à°¤à±\86లియని à°ªà±\8aరపాà°\9fà±\81',
+'pool-errorunknown' => 'à°¤à±\86లియని à°²à±\8bà°ªà°\82',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} గురించి',
 'aboutpage' => 'Project:గురించి',
 'copyright' => 'విషయం $1 కి లోబడి లభ్యం, వేరుగా పేర్కొంటే తప్ప.',
-'copyrightpage' => '{{ns:project}}:à°ªà±\8dà°°à°\9aà±\81à°°à°£ హక్కులు',
+'copyrightpage' => '{{ns:project}}:à°\95ాపà±\80హక్కులు',
 'currentevents' => 'వర్తమాన ఘటనలు',
 'currentevents-url' => 'Project:వర్తమాన ఘటనలు',
 'disclaimers' => 'అస్వీకారములు',
@@ -393,7 +393,7 @@ $1',
 'edithelp' => 'దిద్దుబాటు సహాయం',
 'helppage' => 'Help:సూచిక',
 'mainpage' => 'మొదటి పేజీ',
-'mainpage-description' => 'తలపà±\81à°\9f',
+'mainpage-description' => 'à°®à±\8aà°¦à°\9fà°¿ à°ªà±\87à°\9cà±\80',
 'policy-url' => 'Project:విధానం',
 'portal' => 'సముదాయ పందిరి',
 'portal-url' => 'Project:సముదాయ పందిరి',
@@ -402,7 +402,7 @@ $1',
 
 'badaccess' => 'అనుమతి లోపం',
 'badaccess-group0' => 'మీరు చేయతలపెట్టిన పనికి మీకు హక్కులు లేవు.',
-'badaccess-groups' => 'మీరు చేయతలపెట్టిన పని ఈ {{PLURAL:$2|గుంపు|గుంపుల}} లోని వాడుకర్లకు మాత్రమే పరిమితం: $1.',
+'badaccess-groups' => 'మీరు చేయతలపెట్టిన పని ఈ {{PLURAL:$2|గుంపు|గుంపులలో ఒకదాని}} లోని వాడుకర్లకు మాత్రమే పరిమితం: $1.',
 
 'versionrequired' => 'మీడియావికీ సాఫ్టువేరు వెర్షను $1 కావాలి',
 'versionrequiredtext' => 'ఈ పేజీని వాడటానికి మీకు మీడియావికీ సాఫ్టువేరు వెర్షను $1 కావాలి. [[Special:Version|వెర్షను పేజీ]]ని చూడండి.',
@@ -410,15 +410,15 @@ $1',
 'ok' => 'సరే',
 'retrievedfrom' => '"$1" నుండి వెలికితీశారు',
 'youhavenewmessages' => 'మీకు $1 ఉన్నాయి ($2).',
-'youhavenewmessagesfromusers' => 'మీకు {{PLURAL:$3|మరో వాడుకరి|$3 వాడుకరుల}} నుండి $1 ($2).',
-'youhavenewmessagesmanyusers' => 'మీకు చాలా వాడుకరుల నుండి $1 ($2).',
-'newmessageslinkplural' => '{{PLURAL:$1|ఒక కొత్త సందేశం వచ్చింది|999=కొత్త సందేశాలు ఉన్నాయి}}',
+'youhavenewmessagesfromusers' => '{{PLURAL:$4|మీకు}} {{PLURAL:$3|మరో వాడుకరి|$3 వాడుకరుల}} నుండి  $1 ($2).',
+'youhavenewmessagesmanyusers' => 'మీకు చాలా వాడుకరుల నుండి $1 ఉన్నాయి ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|ఒక కొత్త సందేశం|999=కొత్త సందేశాలు}}',
 'newmessagesdifflinkplural' => 'చివరి {{PLURAL:$1|మార్పు|999=మార్పులు}}',
-'youhavenewmessagesmulti' => '$1లో మీకో సందేశం ఉంది',
+'youhavenewmessagesmulti' => '$1 లో మీకు కొత్త సందేశాలు ఉన్నాయి',
 'editsection' => 'మార్చు',
 'editold' => 'సవరించు',
 'viewsourceold' => 'మూలాన్ని చూడండి',
-'editlink' => 'సవరిà°\82చు',
+'editlink' => 'మారà±\8dచు',
 'viewsourcelink' => 'మూలాన్ని చూడండి',
 'editsectionhint' => 'విభాగాన్ని మార్చు: $1',
 'toc' => 'విషయ సూచిక',
@@ -431,10 +431,10 @@ $1',
 'restorelink' => '{{PLURAL:$1|ఒక తొలగించిన మార్పు|$1 తొలగించిన మార్పులు}}',
 'feedlinks' => 'ఫీడు:',
 'feed-invalid' => 'మీరు కోరిన ఫీడు సరైన రకం కాదు.',
-'feed-unavailable' => 'సిండికేషన్ ఫీడులేమీ అందుబాటులో లేవు.',
+'feed-unavailable' => 'సిండికేషన్ ఫీడులేమీ అందుబాటులో లేవు',
 'site-rss-feed' => '$1 RSS ఫీడు',
 'site-atom-feed' => '$1 ఆటమ్ ఫీడు',
-'page-rss-feed' => '"$1" ఆరెసెస్సు(RSS) ఫీడు',
+'page-rss-feed' => '"$1" RSS ఫీడు',
 'page-atom-feed' => '"$1" ఆటమ్ ఫీడు',
 'feed-atom' => 'యాటమ్',
 'red-link-title' => '$1 (పుట లేదు)',
@@ -450,7 +450,7 @@ $1',
 'nstab-image' => 'దస్త్రం',
 'nstab-mediawiki' => 'సందేశం',
 'nstab-template' => 'మూస',
-'nstab-help' => 'సహాయము',
+'nstab-help' => 'సహాయ పేజీ',
 'nstab-category' => 'వర్గం',
 
 # Main script and global functions
@@ -472,54 +472,54 @@ $1',
 'databaseerror-query' => 'క్వెరీ: $1',
 'databaseerror-function' => 'ఫంక్షన్: $1',
 'databaseerror-error' => 'లోపం: $1',
-'laggedslavemode' => 'హెచ్చరిక: పేజీలో ఇటీవల జరిగిన మార్పులు ఉండకపోవచ్చు.',
+'laggedslavemode' => '<strong>హెచ్చరిక:</strong> పేజీలో ఇటీవల జరిగిన మార్పులు ఉండకపోవచ్చు.',
 'readonly' => 'డేటాబేసు లాక్‌చెయ్యబడింది',
 'enterlockreason' => 'డేటాబేసుకు వేయబోతున్న లాకుకు కారణం తెలుపండి, దానితోపాటే ఎంతసమయం తరువాత ఆ లాకు తీసేస్తారో కూడా తెలుపండి',
 'readonlytext' => 'డేటాబేసు ప్రస్తుతం లాకు చేయబడింది. మార్పులు, చేర్పులు ప్రస్తుతం చెయ్యలేరు. మామూలుగా జరిగే నిర్వహణ కొరకు ఇది జరిగి ఉండవచ్చు; అది పూర్తి కాగానే తిరిగి మామూలుగా పనిచేస్తుంది.
 
 దీనిని లాకు చేసిన నిర్వాహకుడు ఇలా తెలియజేస్తున్నాడు: $1',
-'missing-article' => '"$1" $2 అనే పేజీ పాఠ్యం డేటాబేసులో దొరకలేదు.
+'missing-article' => '"$1" $2 à°\85à°¨à±\87 à°ªà±\87à°\9cà±\80 à°¯à±\8aà°\95à±\8dà°\95 à°ªà°¾à° à±\8dà°¯à°\82 à°¡à±\87à°\9fాబà±\87à°¸à±\81à°²à±\8b à°¦à±\8aà°°à°\95à°²à±\87à°¦à±\81.
 
-à°\95ాలదà±\8bà°·à°\82 à°ªà°\9fà±\8dà°\9fిన తేడా కోసం చూసినపుడుగానీ, తొలగించిన పేజీ చరితం కోసం చూసినపుడుగానీ ఇది సాధారణంగా జరుగుతుంది.
+à°\95ాలà°\82 à°\9aà±\86à°²à±\8dà°²ిన తేడా కోసం చూసినపుడుగానీ, తొలగించిన పేజీ చరితం కోసం చూసినపుడుగానీ ఇది సాధారణంగా జరుగుతుంది.
 
 ఒకవేళ అలా కాకపోతే, మీరో బగ్‌ను కనుక్కున్నట్టే.
-à°\88 URLà°¨à±\81 à°¸à±\82à°\9aà°¿à°¸à±\8dà°¤à±\82, à°¦à±\80à°¨à±\8dని à°\93 [[Special:ListUsers/sysop|నిరà±\8dవాహà°\95à±\81నిà°\95à°¿]] à°¤à±\86లియà°\9cà±\86à°¯à±\8dయండి.',
+à°\88 URLà°¨à±\81 à°¸à±\82à°\9aà°¿à°¸à±\8dà°¤à±\82, à°¦à±\80à°¨à±\8dని à°\93 [[Special:ListUsers/sysop|నిరà±\8dవాహà°\95à±\81నిà°\95à°¿]] à°¤à±\86లియà°\9cà±\87యండి.',
 'missingarticle-rev' => '(కూర్పు#: $1)',
 'missingarticle-diff' => '(తేడా: $1, $2)',
 'readonly_lag' => 'అనుచర (స్లేవ్) డేటాబేసు సర్వర్లు, ప్రధాన (మాస్టరు) సర్వరును అందుకునేందుకుగాను, డేటాబేసు ఆటోమాటిక్‌గా లాకు అయింది.',
 'internalerror' => 'అంతర్గత లోపం',
 'internalerror_info' => 'అంతర్గత లోపం: $1',
 'fileappenderrorread' => 'చేరుస్తున్నప్పుడు "$1"ని చదవలేకపోయాం.',
-'fileappenderror' => '"$1" à°¨à°¿ "$2" à°¤à±\8b à°\95à±\82à°°à±\8dà°\9aà°²à±\87à°\95à°ªà±\8bà°¤à±\81à°¨à±\8dà°¨ాం',
-'filecopyerror' => 'ఫైలు "$1"ని "$2"కు కాపీ చెయ్యటం కుదరలేదు.',
-'filerenameerror' => 'à°«à±\88à°²à±\81 "$1" à°ªà±\87à°°à±\81à°¨à±\81 "$2"à°\97à°¾ à°®à°¾à°°à±\8dà°\9aà°\9fà°\82 à°\95à±\81దరలà±\87à°¦à±\81.',
-'filedeleteerror' => 'à°«à±\88à°²à±\81 "$1"ని à°¤à±\80సివà±\87à°¯à°\9fà°\82 à°\95à±\81దరలà±\87à°¦à±\81.',
-'directorycreateerror' => '"$1" à°\85à°¨à±\87 à°¡à±\88à°°à±\86à°\95à±\8dà°\9fà°°à±\80ని à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aà°²à±\87à°\95 à°ªà±\8bà°¤à±\81à°¨à±\8dనానà±\81.',
+'fileappenderror' => '"$1" à°¨à°¿ "$2" à°¤à±\8b à°\95à±\82à°°à±\8dà°\9aà°²à±\87à°\95à°ªà±\8bà°¯ాం',
+'filecopyerror' => 'ఫైలు "$1" ను "$2" కు కాపీ చెయ్యలేకపోయాం.',
+'filerenameerror' => 'à°«à±\88à°²à±\81 "$1" à°ªà±\87à°°à±\81à°¨à±\81 "$2"à°\97à°¾ à°®à°¾à°°à±\8dà°\9aà°²à±\87à°\95à°ªà±\8bయాà°\82.',
+'filedeleteerror' => 'à°«à±\88à°²à±\81 "$1"ని à°¤à±\8aà°²à°\97à°¿à°\82à°\9aà°²à±\87à°\95à°ªà±\8bయాà°\82.',
+'directorycreateerror' => '"$1" à°\85à°¨à±\87 à°¡à±\88à°°à±\86à°\95à±\8dà°\9fà°°à±\80ని à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aà°²à±\87à°\95 à°ªà±\8bయాà°\82.',
 'filenotfound' => 'ఫైలు "$1" కనబడలేదు.',
-'fileexistserror' => '"$1" అనే ఫైలు ఉంది, కాని అందులోకి రాయలేకపోతున్నాను',
+'fileexistserror' => '"$1" అనే ఫైలులోకి రాయలేకపోతున్నాం. అది ఈసరికే ఉంది.',
 'unexpected' => 'అనుకోని విలువ: "$1"="$2".',
-'formerror' => 'à°²à±\8bà°ªà°\82: à°\88 à°«à°¾à°°à°¾à°¨à±\8dని à°ªà°\82పిà°\82à°\9aà°²à±\87à°\95à°ªà±\8bà°¤à±\81à°¨à±\8dనానà±\81',
+'formerror' => 'à°²à±\8bà°ªà°\82: à°\88 à°«à°¾à°°à°¾à°¨à±\8dని à°ªà°\82పిà°\82à°\9aà°²à±\87à°\95à°ªà±\8bయాà°\82.',
 'badarticleerror' => 'ఈ పేజీపై ఈ పని చేయడం కుదరదు.',
 'cannotdelete' => '"$1" అనే పేజీ లేదా ఫైలుని తొలగించలేకపోయాం.
 దాన్ని ఇప్పటికే ఎవరైనా తొలగించి ఉండవచ్చు.',
-'cannotdelete-title' => '"$1" పుటను తొలగించలేరు',
+'cannotdelete-title' => 'పేజీ "$1" ని తొలగించలేరు',
 'delete-hook-aborted' => 'తొలగింపును హుక్ ఆపేసింది.
 వివరణ ఏమీ ఇవ్వలేదు.',
 'no-null-revision' => '"$1" పేజీకి కొత్త శూన్య కూర్పు (నల్ రివిజన్) ను సృష్టించలేకపోయాం',
 'badtitle' => 'తప్పు శీర్షిక',
-'badtitletext' => 'à°®à±\80à°°à±\81 à°\95à±\8bà°°à°¿à°¨ à°ªà±\81à°\9f à°¯à±\8aà°\95à±\8dà°\95 à°ªà±\87à°°à±\81 à°\9aà±\86à°²à±\8dలనిది, à°\96ాళà±\80à°\97à°¾ à°\89à°\82ది, à°²à±\87దా à°¤à°ªà±\8dà°ªà±\81à°\97à°¾ à°\87à°\9aà±\8dà°\9aిన అంతర్వికీ లేదా అంతర-భాషా శీర్షిక అయివుండాలి.
+'badtitletext' => 'à°®à±\80à°°à±\81 à°\95à±\8bà°°à°¿à°¨ à°ªà±\87à°\9cà±\80 à°¯à±\8aà°\95à±\8dà°\95 à°ªà±\87à°°à±\81 à°\9aà±\86à°²à±\8dలనిది, à°\96ాళà±\80à°\97à°¾ à°\89à°\82ది, à°²à±\87దా à°¤à°ªà±\8dà°ªà±\81 à°²à°¿à°\82à°\95à±\81à°¤à±\8b à°\95à±\82à°¡ిన అంతర్వికీ లేదా అంతర-భాషా శీర్షిక అయివుండాలి.
 శీర్షికలలో ఉపయోగించకూడని అక్షరాలు దానిలో ఉండివుండొచ్చు.',
 'perfcached' => 'కింది డేటా ముందే సేకరించి పెట్టుకున్నది. కాబట్టి తాజా డేటాతో పోలిస్తే తేడాలుండవచ్చు. ఈ కాషెలో గరిష్టంగా {{PLURAL:$1|ఒక్క ఫలితం ఉంది|$1 ఫలితాలు ఉన్నాయి}}.',
 'perfcachedts' => 'కింది సమాచారం ముందే సేకరించి పెట్టుకున్నది. దీన్ని $1న చివరిసారిగా తాజాకరించారు. ఈ కాషెలో గరిష్టంగా {{PLURAL:$4|ఒక్క ఫలితం ఉంది|$4 ఫలితాలు ఉన్నాయి}}.',
-'querypage-no-updates' => 'à°ªà±\8dà°°à°¸à±\8dà°¤à±\81à°¤à°\82 à°\88 à°ªà±\81à°\9fకి తాజాకరణలని అచేతనం చేసారు.
-à°\87à°\95à±\8dà°\95à°¡à±\81à°¨à±\8dà°¨ à°­à±\8bà°\97à°\9fà±\8dà°\9fà°¾ à°\95à±\82à°¡à°¾ తాజాకరించబడదు.',
+'querypage-no-updates' => 'à°ªà±\8dà°°à°¸à±\8dà°¤à±\81à°¤à°\82 à°\88 à°ªà±\87à°\9cà±\80కి తాజాకరణలని అచేతనం చేసారు.
+à°\87à°\95à±\8dà°\95à°¡à±\81à°¨à±\8dà°¨ à°¡à±\87à°\9fà°¾ à°\95à±\82à°¡à°¾ à°ªà±\8dà°°à°¸à±\8dà°¤à±\81à°¤à°\82 తాజాకరించబడదు.',
 'viewsource' => 'మూలాన్ని చూపించు',
 'viewsource-title' => '$1 యొక్క సోర్సు చూడండి',
 'actionthrottled' => 'కార్యాన్ని ఆపేసారు',
-'actionthrottledtext' => 'à°¸à±\8dపామà±\81à°¨à±\81 à°¤à°\97à±\8dà°\97à°¿à°\82à°\9aà°\9fానిà°\95à°¿ à°¤à±\80à°¸à±\81à°\95à±\81à°¨à±\8dà°¨ à°¨à°¿à°°à±\8dణయాల à°µà°²à±\8dà°², à°®à±\80à°°à±\81 à°\88 à°\95ారà±\8dయానà±\8dని à°\85తి à°¤à°\95à±\8dà°\95à±\81à°µ à°¸à°®à°¯à°\82à°²à±\8b à°¬à±\8bà°²à±\86à°¡à°¨à±\8dని à°¸à°¾à°°à±\8dà°²à±\81 à°\9aà±\87à°¯à°\95à±\81à°\82à°¡à°¾ à°\85à°¡à±\8dà°¡à±\81à°\95à±\81à°\82à°\9fà±\81à°¨à±\8dనాము. కొన్ని నిమిషాలు ఆగి మరలా ప్రయత్నించండి.',
+'actionthrottledtext' => 'à°¸à±\8dపామà±\81à°¨à±\81 à°¨à°¿à°°à±\8bధిà°\82à°\9aà±\87à°\82à°¦à±\81à°\95à±\81 à°\97ానà±\81, à°¤à°\95à±\8dà°\95à±\81à°µ à°¸à°®à°¯à°\82à°²à±\8b à°®à°°à±\80 à°\8eà°\95à±\8dà°\95à±\81à°µ à°¸à°¾à°°à±\8dà°²à±\81 à°\88 à°ªà°¨à°¿ à°\9aà±\87à°¯à°\95à±\81à°\82à°¡à°¾ à°ªà°°à°¿à°®à°¿à°¤à°¿ à°µà°¿à°§à°¿à°\82à°\9aà°¾à°\82. à°®à±\80à°°à±\81 à°¦à°¾à°¨à±\8dని à°\85ధిà°\97మిà°\82à°\9aారు. కొన్ని నిమిషాలు ఆగి మరలా ప్రయత్నించండి.',
 'protectedpagetext' => 'ఈ పేజీలో మార్పులు వగైరాలు చెయ్యకుండా ఉండేందుకు గాను, సంరక్షించబడింది.',
 'viewsourcetext' => 'మీరీ పేజీ సోర్సును చూడవచ్చు, కాపీ చేసుకోవచ్చు:',
-'viewyourtext' => "ఈ పేజీకి '''మీ మార్పుల''' యొక్క మూలాన్ని చూడవచ్చు లేదా కాపీచేసుకోవచ్చు:",
+'viewyourtext' => 'ఈ పేజీలోని <strong>మీ మార్పుల</strong> యొక్క మూలాన్ని చూడవచ్చు, కాపీచేసుకోవచ్చు:',
 'protectedinterface' => 'ఈ పేజీ, ఈ వికీ యొక్క సాఫ్టువేరు ఇంటరుఫేసుకు చెందిన టెక్స్టును అందిస్తుంది. దుశ్చర్యల నివారణ కోసమై దీన్ని సంరక్షించాం. వికీలన్నిటిలోను అనువాదాలను చేర్చాలన్నా, మార్చాలన్నా మీడియావికీ స్థానికీకరణ ప్రాజెక్టైన [//translatewiki.net/ translatewiki.net] ను వాడండి.',
 'editinginterface' => '<strong>హెచ్చరిక:</strong> సాఫ్టువేరుకు ఇంటరుఫేసు టెక్స్టును అందించేందుకు పనికొచ్చే పేజీని మీరు సరిదిద్దుతున్నారు.
 ఈ పేజీలో చేసే మార్పుల వల్ల ఇతర వాడుకరులకు ఇంటరుఫేసు కనబడే విధానంలో తేడావస్తుంది.
@@ -534,19 +534,19 @@ $2',
 'myprivateinfoprotected' => 'మీ అంతరంగిక సమాచారాన్ని సవరించేందుకు మీకు అనుమతి లేదు.',
 'mypreferencesprotected' => 'మీ అభీష్టాలను సవరించేందుకు మీకు అనుమతి లేదు.',
 'ns-specialprotected' => 'ప్రత్యేక పేజీలపై దిద్దుబాట్లు చేయలేరు.',
-'titleprotected' => "సభ్యులు [[User:$1|$1]] ఈ పేజీని సృష్టించనివ్వకుండా నిరోదిస్తున్నారు.
-అందుకు ఇచ్చిన కారణం: ''$2''.",
+'titleprotected' => '[[User:$1|$1]] ఈ శీర్షికని సృష్టించకుండా ఇది సంరక్షించబడింది.
+అందుకు ఇచ్చిన కారణం: "<em>$2</em>".',
 'filereadonlyerror' => 'ఫైలు ఖజానా "$2" రీడ్-ఓన్లీ స్థితిలో ఉండటం చేత "$1" ఫైలులో మార్పులు చెయ్యలేకపోయాం.
 
 దానికి తాళం వేసిన అధికారి ఇచ్చిన వివరణ ఇది: "$3".',
 'invalidtitle-knownnamespace' => 'పేరుబరి "$2", పాఠ్యము "$3" తో కూడిన ఈ శీర్షిక చెల్లనిది',
 'invalidtitle-unknownnamespace' => 'అపరిచితమైన పేరుబరి సంఖ్య "$1", పాఠ్యము "$2" తో కూడిన ఈ శీర్షిక చెల్లనిది',
-'exception-nologin' => 'à°²à±\8bనిà°\95à°¿ à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aà°¿లేరు',
-'exception-nologin-text' => 'à°\88 à°ªà±\87à°\9cà±\80ని à°\9aà±\82డడానిà°\95à°¿ à°²à±\87దా à°\88 à°\9aà°°à±\8dయనà±\81 à°\9aà±\86à°¯à±\8dయడానిà°\95à°¿ à°¦à°¯à°\9aà±\87సి [[Special:Userlogin|à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aండి]].',
+'exception-nologin' => 'లాà°\97à°¿à°¨à±\88 లేరు',
+'exception-nologin-text' => 'à°\88 à°ªà±\87à°\9cà±\80ని à°\9aà±\82డడానిà°\95à°¿ à°²à±\87దా à°\88 à°ªà°¨à°¿ à°\9aà±\86à°¯à±\8dయడానిà°\95à°¿ [[Special:Userlogin|లాà°\97ినవండి]].',
 'exception-nologin-text-manual' => 'ఈ పేజీ చూసేందుకు లేదా ఈ పని చేసేందుకు $1.',
 
 # Virus scanner
-'virus-badscanner' => "తప్పుడు స్వరూపణం: తెలియని వైరస్ స్కానర్: ''$1''",
+'virus-badscanner' => 'తప్పుడు స్వరూపణం: తెలియని వైరస్ స్కానర్: <em>$1</em>',
 'virus-scanfailed' => 'స్కాన్ విఫలమైంది (సంకేతం $1)',
 'virus-unknownscanner' => 'అజ్ఞాత యాంటీవైరస్:',
 
@@ -564,7 +564,7 @@ $2',
 'yourname' => 'వాడుకరి పేరు:',
 'userlogin-yourname' => 'వాడుకరి పేరు',
 'userlogin-yourname-ph' => 'మీ వాడుకరి పేరును ఇవ్వండి',
-'createacct-another-username-ph' => 'à°®à±\80 à°µà°¾à°¡à±\81à°\95à°°à°¿ à°ªà±\87à°°à±\81à°¨à±\81 à°ªà±\8dà°°à°µà±\87శపà±\86à°\9fà±\8dà°\9fండి',
+'createacct-another-username-ph' => 'à°®à±\80 à°µà°¾à°¡à±\81à°\95à°°à°¿ à°ªà±\87à°°à±\81à°¨à±\81 à°\87à°µà±\8dà°µండి',
 'yourpassword' => 'సంకేతపదం:',
 'userlogin-yourpassword' => 'సంకేతపదం',
 'userlogin-yourpassword-ph' => 'మీ సంకేతపదాన్ని ఇవ్వండి',
@@ -573,30 +573,30 @@ $2',
 'createacct-yourpasswordagain' => 'సంకేతపదాన్ని నిర్ధారించండి',
 'createacct-yourpasswordagain-ph' => 'సంకేతపదాన్ని మళ్ళీ ఇవ్వండి',
 'remembermypassword' => 'ఈ కంప్యూటరులో నా ప్రవేశాన్ని గుర్తుంచుకో (గరిష్ఠంగా $1 {{PLURAL:$1|రోజు|రోజుల}}కి)',
-'userlogin-remembermypassword' => 'ననà±\8dà°¨à±\81 à°ªà±\8dà°°à°µà±\87శిà°\82à°ªà°\9cà±\87సి ఉంచు',
+'userlogin-remembermypassword' => 'ననà±\8dà°¨à±\81 à°²à°¾à°\97à°¿à°¨à±\8d à°\9aà±\87à°¸à±\87 ఉంచు',
 'userlogin-signwithsecure' => 'సురక్షిత కనెక్షను వాడు',
 'yourdomainname' => 'మీ డోమైను',
 'password-change-forbidden' => 'ఈ వికీలో మీరు సంకేతపదాలను మార్చలేరు.',
-'externaldberror' => 'à°¡à±\87à°\9fాబà±\87à°¸à±\81 à°\85à°§à±\80à°\95రణలà±\8b à°ªà±\8aరపాà°\9fà±\81 à°\9cà°°à°¿à°\97à°¿à°\82ది à°²à±\87దా à°®à±\80 à°¬à°¯à°\9fà°¿ à°\96ాతాని తాజాకరించడానికి మీకు అనుమతి లేదు.',
-'login' => 'à°²à±\8bనిà°\95à°¿ à°°ండి',
-'nav-login-createaccount' => 'à°²à±\8bనిà°\95à°¿ à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aండి / ఖాతాని సృష్టించుకోండి',
+'externaldberror' => 'à°¡à±\87à°\9fాబà±\87à°¸à±\81 à°\85à°§à±\80à°\95రణలà±\8b à°²à±\8bà°ªà°\82 à°\9cà°°à°¿à°\97à°¿à°\82ది à°²à±\87దా à°®à±\80 à°¬à°¯à°\9fà°¿ à°\96ాతానà±\81 తాజాకరించడానికి మీకు అనుమతి లేదు.',
+'login' => 'లాà°\97ినవండి',
+'nav-login-createaccount' => 'లాà°\97ినవండి / ఖాతాని సృష్టించుకోండి',
 'loginprompt' => '{{SITENAME}}లోకి ప్రవేశించాలంటే మీ విహారిణిలో కూకీలు చేతనమై ఉండాలి.',
-'userlogin' => 'à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aండి / ఖాతాను సృష్టించుకోండి',
-'userloginnocreate' => 'à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aండి',
+'userlogin' => 'లాà°\97ినవండి / ఖాతాను సృష్టించుకోండి',
+'userloginnocreate' => 'లాà°\97ినవండి',
 'logout' => 'నిష్క్రమించు',
-'userlogout' => 'నిషà±\8dà°\95à±\8dరమిà°\82à°\9aà±\81',
-'notloggedin' => 'à°²à±\8bనిà°\95à°¿ à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aà°¿ లేరు',
+'userlogout' => 'లాà°\97à±\8cà°\9fà±\8d',
+'notloggedin' => 'లాà°\97à°¿à°¨à±\8dâ\80\8c à°\85యిలేరు',
 'userlogin-noaccount' => 'మీకు ఖాతా లేదా?',
 'userlogin-joinproject' => '{{SITENAME}}లో చేరండి',
 'nologin' => 'ఖాతా లేదా? $1.',
 'nologinlink' => 'ఖాతాని సృష్టించుకోండి',
 'createaccount' => 'ఖాతాని సృష్టించు',
 'gotaccount' => 'ఇప్పటికే మీకు ఖాతా ఉందా? $1.',
-'gotaccountlink' => 'à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aండి',
-'userlogin-resetlink' => 'à°®à±\80 à°ªà±\8dà°°à°µà±\87à°¶ వివరాలను మరచిపోయారా?',
+'gotaccountlink' => 'లాà°\97ినవండి',
+'userlogin-resetlink' => 'à°®à±\80 à°²à°¾à°\97à°¿à°¨à±\8d వివరాలను మరచిపోయారా?',
 'userlogin-resetpassword-link' => 'మీ సంకేతపదాన్ని మర్చిపోయారా?',
-'helplogin-url' => 'Help:à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aడం',
-'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aడానిà°\95à°¿ సహాయం]]',
+'helplogin-url' => 'Help:లాà°\97ినవడం',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|లాà°\97ినవడà°\82à°²à±\8b సహాయం]]',
 'userlogin-loggedin' => 'మీరు ఈసరికే {{GENDER:$1|$1}} గా లాగిన్ అయి ఉన్నారు.
 వేరే వాడుకరిగా లాగినయేందుకు కింది ఫారమును వాడండి.',
 'userlogin-createanother' => 'మరొక ఖాతాను సృష్టించండి',
@@ -615,16 +615,16 @@ $2',
 'createacct-imgcaptcha-ph' => 'పైన కనబడే మాటలను ఇక్కడ ఇవ్వండి',
 'createacct-submit' => 'మీ ఖాతాను సృష్టించుకోండి',
 'createacct-another-submit' => 'మరొక ఖాతాను సృష్టించు',
-'createacct-benefit-heading' => '{{SITENAME}}à°¨à±\81 à°¤à°¯à°¾à°°à±\81à°\9aà±\87à°¸à±\87ది à°®à±\80లాà°\82à°\9fà°¿ à°ªà±\8dà°°à°\9cà°²ే.',
+'createacct-benefit-heading' => '{{SITENAME}}à°¨à±\81 à°¤à°¯à°¾à°°à±\81à°\9aà±\87à°¸à±\8dà°¤à±\81à°¨à±\8dనది à°®à±\80లాà°\82à°\9fà°¿ à°µà°¾à°°ే.',
 'createacct-benefit-body1' => '{{PLURAL:$1|మార్పు|మార్పులు}}',
 'createacct-benefit-body2' => '{{PLURAL:$1|పేజీ|పేజీలు}}',
 'createacct-benefit-body3' => 'ఇటీవలి {{PLURAL:$1|సమర్పకుడు|సమర్పకులు}}',
 'badretype' => 'మీరు ఇచ్చిన రెండు సంకేతపదాలు ఒకదానితో మరొకటి సరిపోలడం లేదు.',
 'userexists' => 'ఇచ్చిన వాడుకరిపేరు ఇప్పటికే వాడుకలో ఉంది.
 వేరే పేరును ఎంచుకోండి.',
-'loginerror' => 'à°ªà±\8dà°°à°µà±\87à°¶à°\82à°²à±\8b à°ªà±\8aరపాà°\9fà±\81',
-'createacct-error' => 'పదà±\8dà°¦à±\81 à°¤à±\86రవడమà±\81à°²à±\8b à°¤à°ªà±\8dà°ªà±\81',
-'createaccounterror' => 'à°\96ాతాని సృష్టించలేకపోయాం: $1',
+'loginerror' => 'లాà°\97à°¿à°¨à±\8d à°²à±\8bà°ªà°\82',
+'createacct-error' => 'à°\96ాతా à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aà°¡à°\82à°²à±\8b à°²à±\8bà°ªà°\82',
+'createaccounterror' => 'à°\96ాతానà±\81 సృష్టించలేకపోయాం: $1',
 'nocookiesnew' => 'ఖాతాని సృష్టించాం, కానీ మీరు ఇంకా లోనికి ప్రవేశించలేదు.
 వాడుకరుల ప్రవేశానికి {{SITENAME}} కూకీలను వాడుతుంది.
 మీరు కూకీలని అచేతనం చేసివున్నారు.
@@ -635,40 +635,40 @@ $2',
 'nocookiesfornew' => 'మూలాన్ని కనుక్కోలేకపోయాం కాబట్టి, ఈ వాడుకరి ఖాతాను సృష్టించలేకపోయాం.
 మీ కంప్యూటర్లో కూకీలు చేతనమై ఉన్నాయని నిశ్చయించుకొని, ఈ పేజీని తిరిగి లోడు చేసి, మళ్ళీ ప్రయత్నించండి.',
 'noname' => 'మీరు సరైన వాడుకరిపేరు ఇవ్వలేదు.',
-'loginsuccesstitle' => 'à°ªà±\8dà°°à°µà±\87à°¶à°\82 à°µà°¿à°\9cయవà°\82తమà±\88à°¨ది',
-'loginsuccess' => "'''మీరు ఇప్పుడు {{SITENAME}}లోనికి \"\$1\"గా ప్రవేశించారు.'''",
+'loginsuccesstitle' => 'à°ªà±\8dà°°à°µà±\87à°¶à°\82 à°µà°¿à°\9cయవà°\82తమà±\88à°\82ది',
+'loginsuccess' => '<strong>మీరు ఇప్పుడు {{SITENAME}}లోనికి "$1"గా ప్రవేశించారు.</strong>',
 'nosuchuser' => '"$1" అనే పేరుతో వాడుకరులు లేరు.
 వాడుకరి పేర్లు కేస్ సెన్సిటివ్.
 అక్షరక్రమం సరిచూసుకోండి, లేదా [[Special:UserLogin/signup|కొత్త ఖాతా సృష్టించుకోండి]].',
-'nosuchusershort' => '"$1" à°\85à°¨à±\87 à°ªà±\87à°°à±\81à°¤à±\8b à°¸à°­à±\8dà°¯à±\81à°²à±\81 లేరు. పేరు సరి చూసుకోండి.',
-'nouserspecified' => 'సభà±\8dయనామానà±\8dని à°¤à°ªà±\8dపనిసరిà°\97à°¾ à°\8eà°\82à°\9aà±\81à°\95à±\8bవాలి.',
+'nosuchusershort' => '"$1" à°ªà±\87à°°à±\81à°¤à±\8b à°µà°¾à°¡à±\81à°\95à°°à°¿ à°\8eవరà±\82 లేరు. పేరు సరి చూసుకోండి.',
+'nouserspecified' => 'వాడà±\81à°\95à°°à°¿ à°ªà±\87à°°à±\81à°¨à±\81 à°¤à°ªà±\8dపనిసరిà°\97à°¾ à°\87à°µà±\8dవాలి.',
 'login-userblocked' => 'ఈ వాడుకరిని నిరోధించారు. ప్రవేశానికి అనుమతి లేదు.',
 'wrongpassword' => 'ఈ సంకేతపదం సరైనది కాదు. దయచేసి మళ్లీ ప్రయత్నించండి.',
 'wrongpasswordempty' => 'ఖాళీ సంకేతపదం ఇచ్చారు. మళ్ళీ ప్రయత్నించండి.',
-'passwordtooshort' => 'à°®à±\80 à°¸à°\82à°\95à±\87తపదà°\82 à°\95à°¨à±\80à°¸à°\82 {{PLURAL:$1|1 à°\85à°\95à±\8dà°·à°°à°\82|$1 à°\85à°\95à±\8dషరాల}} à°ªà±\8aà°¡à°µà±\81 ఉండాలి.',
+'passwordtooshort' => 'à°¸à°\82à°\95à±\87తపదà°\82 à°\95à°¨à±\80à°¸à°\82 {{PLURAL:$1|1 à°\85à°\95à±\8dà°·à°°à°\82|$1 à°\85à°\95à±\8dషరాల}} à°¨à°¿à°¡à°¿à°µà°¿ ఉండాలి.',
 'password-name-match' => 'మీ సంకేతపదం మీ వాడుకరిపేరుకి భిన్నంగా ఉండాలి.',
 'password-login-forbidden' => 'ఈ వాడుకరిపేరు మరియు సంకేతపదాలను ఉపయోగించడం నిషిద్ధం.',
 'mailmypassword' => 'సంకేతపదాన్ని మార్చు',
 'passwordremindertitle' => '{{SITENAME}} కోసం కొత్త తాత్కాలిక సంకేతపదం',
 'passwordremindertext' => '{{SITENAME}} ($4) లో కొత్త సంకేతపదం పంపించమని ఎవరో (బహుశ మీరే, ఐ.పీ. చిరునామా $1 నుండి) అడిగారు. వాడుకరి "$2" కొరకు "$3" అనే తాత్కాలిక సంకేతపదం సిద్ధంచేసి ఉంచాం. మీ ఉద్దేశం అదే అయితే, ఇప్పుడు మీరు సైటులోనికి ప్రవేశించి కొత్త సంకేతపదాన్ని ఎంచుకోవచ్చు. మీ తాత్కాలిక సంకేతపదం {{PLURAL:$5|ఒక రోజు|$5 రోజుల}}లో కాలంచెల్లుతుంది.
 
-à°\92à°\95à°µà±\87à°³ à°\88 à°\85à°­à±\8dయరà±\8dథన à°®à±\80à°°à±\81à°\95à°¾à°\95 à°®à°°à±\86వరà±\8b à°\9aà±\87సారనà±\81à°\95à±\81à°¨à±\8dనా à°²à±\87దా à°®à±\80 à°¸à°\82à°\95à±\87తపదà°\82 à°®à±\80à°\95à±\81 à°\97à±\81à°°à±\8dà°¤à±\81à°\95à±\81à°µà°\9aà±\8dà°\9aà°¿ à°¦à°¾à°¨à±\8dని à°®à°¾à°°à±\8dà°\9aà°\95à±\82à°¡à°¦à±\81 à°\85à°¨à±\81à°\95à±\81à°\82à°\9fà±\81à°¨à±\8dనా, à°\88 à°¸à°\82à°¦à±\87శానà±\8dని à°®à°°à±\8dà°\9aà°¿à°ªà±\8bà°¯ి మీ పాత సంకేతపదాన్ని వాడడం కొనసాగించవచ్చు.',
-'noemail' => 'సభà±\8dà°¯à±\81à°²à±\81 "$1"à°\95à±\81 à°\88-మెయిలు చిరునామా నమోదయి లేదు.',
+à°\92à°\95à°µà±\87à°³ à°\88 à°\85à°­à±\8dయరà±\8dథన à°®à±\80à°°à±\81à°\95à°¾à°\95 à°®à°°à±\86వరà±\8b à°\9aà±\87సారనà±\81à°\95à±\81à°¨à±\8dనా à°²à±\87దా à°®à±\80 à°¸à°\82à°\95à±\87తపదà°\82 à°®à±\80à°\95à±\81 à°\97à±\81à°°à±\8dà°¤à±\81à°\95à±\81à°µà°\9aà±\8dà°\9aà°¿ à°¦à°¾à°¨à±\8dని à°®à°¾à°°à±\8dà°\9aà°\95à±\82à°¡à°¦à±\81 à°\85à°¨à±\81à°\95à±\81à°\82à°\9fà±\81à°¨à±\8dనా, à°\88 à°¸à°\82à°¦à±\87శానà±\8dని à°µà°¿à°¸à±\8dమరిà°\82à°\9aి మీ పాత సంకేతపదాన్ని వాడడం కొనసాగించవచ్చు.',
+'noemail' => 'వాడà±\81à°\95à°°à°¿ "$1" à°\95à±\81 à°\88మెయిలు చిరునామా నమోదయి లేదు.',
 'noemailcreate' => 'మీరు సరైన ఈమెయిల్ చిరునామాని ఇవ్వాలి',
 'passwordsent' => '"$1" కొరకు నమోదైన ఈ-మెయిలు చిరునామాకి కొత్త సంకేతపదాన్ని పంపించాం.
 అది అందిన తర్వాత ప్రవేశించి చూడండి.',
-'blocked-mailpassword' => 'దిదà±\8dà°¦à±\81బాà°\9fà±\8dà°²à±\81 à°\9aà±\86à°¯à±\8dà°¯à°\95à±\81à°\82à°¡à°¾ à°\88 à°\90à°ªà±\80à°\85à°¡à±\8dà°°à°¸à±\81à°¨à±\81 à°¨à°¿à°°à±\8bధిà°\82à°\9aà°¾à°\82. à°\85à°\82à°\9aà±\87à°¤, à°¦à±\81à°¶à±\8dà°\9aà°°à±\8dయల à°¨à°¿à°µà°¾à°°à°£ à°\95à±\8bà°¸à°\82 à°\97ానà±\81, à°®à°°à°\9aà°¿à°ªà±\8bయిన à°¸à°\82à°\95à±\87తపదానà±\8dని à°ªà±\8aà°\82à°¦à±\87 à°\85à°\82శానà±\8dని à°\85à°¨à±\81మతిà°\82à°\9aà°®ు.',
+'blocked-mailpassword' => 'దిదà±\8dà°¦à±\81బాà°\9fà±\8dà°²à±\81 à°\9aà±\86à°¯à±\8dà°¯à°\95à±\81à°\82à°¡à°¾ à°®à±\80 à°\90à°ªà±\80à°\85à°¡à±\8dà°°à°¸à±\81à°¨à±\81 à°¨à°¿à°°à±\8bధిà°\82à°\9aà°¾à°\82. à°\85à°\82à°\9aà±\87à°¤, à°¦à±\81à°¶à±\8dà°\9aà°°à±\8dయల à°¨à°¿à°µà°¾à°°à°£ à°\95à±\8bà°¸à°\82 à°\97ానà±\81, à°®à°°à°\9aà°¿à°ªà±\8bయిన à°¸à°\82à°\95à±\87తపదానà±\8dని à°ªà±\8aà°\82à°¦à±\87 à°µà±\80à°²à±\81 à°\88 à°\90à°ªà±\80à°\95à°¿ à°²à±\87à°¦ు.',
 'eauthentsent' => 'ఇచ్చిన ఈ-మెయిలు అడ్రసుకు ధృవీకరణ మెయిలు పంపించాం.
 ఇకపై మేము ఆ ఖాతాకు మెయిలు పంపాలంటే, ముందుగా మీరు ఆ మెయిల్లో సూచించినట్లుగా చేసి, ఈ చిరునామా మీదేనని ధృవీకరించాలి.',
-'throttled-mailpassword' => 'à°\97à°¡à°\9aà°¿à°¨ {{PLURAL:$1|à°\92à°\95 à°\97à°\82à°\9fà°²à±\8b|$1 à°\97à°\82à°\9fà°²à±\8dà°²à±\8b}} à°\87à°ªà±\8dà°ªà°\9fà°¿à°\95à±\87  à°¦à°¾à°\9fà±\81మాà°\9f à°®à°¾à°°à±\8dà°\9aà°¿à°¨à°\9fà±\8dà°²à±\81à°\97à°¾ à°\92à°\95 à°®à±\86యిలà±\8d  పంపించివున్నాం.
-à°¦à±\81à°¶à±\8dà°\9aà°°à±\8dయలనà±\81 à°¨à°¿à°µà°¾à°°à°¿à°\82à°\9aà±\87à°\82à°¦à±\81à°\95à±\81 à°\97ానà±\81, {{PLURAL:$1|à°\92à°\95 à°\97à°\82à°\9fà°\95à°¿|$1 à°\97à°\82à°\9fà°²à°\95à°¿}} à°\92à°\95à±\8dà°\95సారి à°®à°¾à°¤à±\8dà°°à°®à±\87 à°¦à°¾à°\9fà±\81మాà°\9f à°®à°¾à°°à±\8dà°ªà±\81 à°®à±\86యిలà±\8d పంపిస్తాము.',
+'throttled-mailpassword' => 'à°\97à°¡à°\9aà°¿à°¨ {{PLURAL:$1|à°\92à°\95 à°\97à°\82à°\9fà°²à±\8b|$1 à°\97à°\82à°\9fà°²à±\8dà°²à±\8b}} à°¸à°\82à°\95à±\87తపదà°\82 à°®à°¾à°°à±\8dà°\9aà°¿à°¨à°\9fà±\8dà°²à±\81à°\97à°¾ à°\92à°\95 à°®à±\86యిలà±\81 పంపించివున్నాం.
+à°¦à±\81à°¶à±\8dà°\9aà°°à±\8dయలనà±\81 à°¨à°¿à°µà°¾à°°à°¿à°\82à°\9aà±\87à°\82à°¦à±\81à°\95à±\81 à°\97ానà±\81, {{PLURAL:$1|à°\92à°\95 à°\97à°\82à°\9fà°\95à±\81|$1 à°\97à°\82à°\9fà°²à°\95à±\81}} à°\92à°\95à±\8dà°\95సారి à°®à°¾à°¤à±\8dà°°à°®à±\87 à°¸à°\82à°\95à±\87తపదà°\82 à°®à°¾à°°à±\8dà°ªà±\81 à°®à±\86యిలà±\81 పంపిస్తాము.',
 'mailerror' => 'మెయిలు పంపించడంలో లోపం: $1',
 'acct_creation_throttle_hit' => 'మీ ఐపీ చిరునామా వాడుతున్న ఈ వికీ సందర్శకులు గత ఒక్క రోజులో {{PLURAL:$1|1 ఖాతాని|$1 ఖాతాలను}} సృష్టించారు, ఈ కాల వ్యవధిలో అది గరిష్ఠ పరిమితి.
 అందువల్ల, ఈ ఐపీని వాడుతున్న సందర్శకులు ప్రస్తుతానికి ఇంక ఖాతాలని సృష్టించలేరు.',
 'emailauthenticated' => 'మీ ఈ-మెయిలు చిరునామా $2న $3కి ధృవీకరింపబడింది.',
 'emailnotauthenticated' => 'మీ ఈ-మెయిలు చిరునామాను ఇంకా ధృవీకరించలేదు. 
 కింద పేర్కొన్న అంశాలకు సంబంధించి ఎటువంటి ఈ-మెయిలునూ పంపించము.',
-'noemailprefs' => 'à°\95à°¿à°\82ది à°\85à°\82శాలà±\81 à°ªà°¨à°¿ à°\9aà±\86à°¯à±\8dà°¯à°\9fానిà°\95à°¿ à°\88-à°®à±\86యిలà±\81 à°\9aà°¿à°°à±\81నామానà±\81 à°¨à°®à±\8aà°¦à±\81à°\9aà°¯à±\8dà°¯ండి.',
+'noemailprefs' => 'à°\88 à°\85à°\82శాలà±\81 à°ªà°¨à°¿ à°\9aà±\86à°¯à±\8dయడానిà°\95à°¿ à°®à±\80 à°\85à°­à°¿à°°à±\81à°\9aà±\81à°²à±\8dà°²à±\8b à°\88à°®à±\86యిలà±\81 à°\9aà°¿à°°à±\81నామా à°\87à°µà±\8dà°µండి.',
 'emailconfirmlink' => 'మీ ఈ-మెయిలు చిరునామాను ధృవీకరించండి',
 'invalidemailaddress' => 'మీరు ఇచ్చిన ఈ-మెయిలు చిరునామా సరైన రీతిలో లేనందున అంగీకరించటంలేదు.
 దయచేసి ఈ-మెయిలు చిరునామాను సరైన రీతిలో ఇవ్వండి లేదా ఖాళీగా వదిలేయండి.',
@@ -689,38 +689,38 @@ $2',
 'suspicious-userlogout' => 'సరిగా పనిచేయని విహారిణి లేదా కాషింగ్ ప్రాక్సీ వల్ల పంపబడడం చేత, నిష్క్రమించాలనే మీ అభ్యర్థనని నిరాకరించారు.',
 'createacct-another-realname-tip' => 'అసలు పేరు ఐచ్ఛికం.
 మీరు దాన్ని ఇస్తే, వాడుకరి పనుల శ్రేయస్సు ఆ పేరుకు ఆపాదించబడుతుంది.',
-'pt-login' => 'à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aండి',
+'pt-login' => 'లాà°\97ినవండి',
 'pt-createaccount' => 'ఖాతా సృష్టించు',
-'pt-userlogout' => 'నిషà±\8dà°\95à±\8dరమిà°\82à°\9aà±\81',
+'pt-userlogout' => 'లాà°\97à±\8cà°\9fà°µà°\82à°¡à°¿',
 
 # Email sending
 'php-mail-error-unknown' => 'PHP యొక్క mail() ఫంక్షన్‍లో ఏదో తెలియని లోపం దొర్లింది',
-'user-mail-no-addy' => 'ఈ-మెయిలు చిరునామాని ఇవ్వకుండానే ఈ-మెయిలు పంపడానికి ప్రయత్నించారు.',
+'user-mail-no-addy' => 'ఈమెయిలు చిరునామా ఇవ్వకుండానే ఈమెయిలు పంపడానికి ప్రయత్నించారు.',
 'user-mail-no-body' => 'ఈమెయిలును ఖాళీగానో, మరీ తక్కువ విషయంతోనో పంపేందుకు ప్రయత్నించారు.',
 
 # Change password dialog
 'changepassword' => 'సంకేతపదాన్ని మార్చండి',
-'resetpass_announce' => 'à°ªà±\8dà°°à°µà±\87శానà±\8dని à°ªà±\82à°°à±\8dతిà°\9aà±\87à°¸à±\87à°\82à°¦à±\81à°\95à±\81, à°®à±\80à°°à±\81 à°¤à°ªà±\8dపనిసరిà°\97à°¾ à°\87à°\95à±\8dà°\95à°¡ à°\95à±\8aà°¤à±\8dà°¤ à°¸à°\82à°\95à±\87తపదానà±\8dని à°\85మరà±\8dà°\9aà±\81à°\95à±\8bవాలి:',
+'resetpass_announce' => 'లాà°\97à°¿à°¨à±\8dà°¨à±\81 à°ªà±\82à°°à±\8dతిà°\9aà±\87à°¸à±\87à°\82à°¦à±\81à°\95à±\81, à°¤à°ªà±\8dపనిసరిà°\97à°¾ à°\95à±\8aà°¤à±\8dà°¤ à°¸à°\82à°\95à±\87తపదానà±\8dని à°\87à°µà±\8dవాలి:',
 'resetpass_header' => 'ఖాతా సంకేతపదం మార్పు',
 'oldpassword' => 'పాత సంకేతపదం:',
 'newpassword' => 'కొత్త సంకేతపదం:',
 'retypenew' => 'సంకేతపదం, మళ్ళీ',
-'resetpass_submit' => 'à°¸à°\82à°\95à±\87తపదానà±\8dని à°®à°¾à°°à±\8dà°\9aà°¿ à°²à±\8bనిà°\95à°¿ à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aండి',
+'resetpass_submit' => 'à°¸à°\82à°\95à±\87తపదానà±\8dని à°®à°¾à°°à±\8dà°\9aà°¿ à°²à°¾à°\97ినవండి',
 'changepassword-success' => 'మీ సంకేతపదం విజయవంతంగా మార్చబడింది.',
 'changepassword-throttled' => 'కొద్దిసేపటిగా మీరు చాలా లాగిన్ ప్రయత్నాలు చేసారు.
 మళ్ళీ ప్రయత్నించే ముందు $1 ఆగండి.',
 'resetpass_forbidden' => 'సంకేతపదాలను మార్చటం కుదరదు',
-'resetpass-no-info' => 'à°\88 à°ªà±\87à°\9cà±\80ని à°¨à±\87à°°à±\81à°\97à°¾ à°\9aà±\82à°¡à°\9fానిà°\95à°¿ à°®à±\80à°°à±\81 à°²à±\8bనిà°\95à°¿ à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aà°¿వుండాలి.',
+'resetpass-no-info' => 'à°\88 à°ªà±\87à°\9cà±\80ని à°¨à±\87à°°à±\81à°\97à°¾ à°\9aà±\82à°¡à°\9fానిà°\95à°¿ à°®à±\80à°°à±\81 à°²à°¾à°\97ినయి వుండాలి.',
 'resetpass-submit-loggedin' => 'సంకేతపదాన్ని మార్చు',
 'resetpass-submit-cancel' => 'రద్దుచేయి',
 'resetpass-wrong-oldpass' => 'తప్పుడు తాత్కాలిక లేదా ప్రస్తుత సంకేతపదం.
 మీరు మీ సంకేతపదాన్ని ఇప్పటికే విజయవంతంగా మార్చుకొనివుండవచ్చు లేదా కొత్త తాత్కాలిక సంకేతపదం కోసం అభ్యర్థించారు.',
-'resetpass-recycled' => 'దయà°\9aà±\87సి à°®à±\80 à°ªà±\8dà°°à°¸à±\8dà°¤à±\81à°¤ à°¸à°\82à°\95à±\87తపదà°\82 à°\95à°¾à°\95à±\81à°\82à°¡à°¾ à°µà±\87à°°à±\87 à°¸à°\82à°\95à±\87తపదà°\82 à°\87à°µà±\8dà°µà°\82à°¡à°¿.',
-'resetpass-temp-emailed' => 'à°®à±\80à°°à±\81 à°®à±\80 à°\88à°®à±\86యిలà±\81à°\95à±\81 à°ªà°\82పిà°\82à°\9aà°¿à°¨ à°¤à°¾à°¤à±\8dà°\95ాలిà°\95 à°\95à±\8bà°¡à±\81à°¤à±\8b à°²à±\8bపలిà°\95à°¿ à°µà°\9aà±\8dà°\9aారà±\81. à°ªà±\8dà°°à°µà±\87à°¶à°\82 à°ªà±\82à°°à±\8dతి à°\95ావడానిà°\95à°¿, à°\87à°\95à±\8dà°\95à°¡ à°®à±\80à°°à±\81 à°¤à°ªà±\8dపనిసరిà°\97à°¾ à°\95à±\8aà°¤à±\8dà°¤ à°¸à°\82à°\95à±\87తపదà°\82 à°\87à°µà±\8dవాలి:',
+'resetpass-recycled' => 'à°®à±\80 à°ªà±\8dà°°à°¸à±\8dà°¤à±\81à°¤ à°¸à°\82à°\95à±\87తపదానà±\8dని à°µà±\87à°°à±\87 à°¸à°\82à°\95à±\87తపదà°\82à°¤à±\8b à°®à°¾à°°à±\8dà°\9aà±\81à°\95à±\8bà°\82à°¡à°¿',
+'resetpass-temp-emailed' => 'à°®à±\80à°°à±\81 à°®à±\80 à°\88à°®à±\86యిలà±\81à°\95à±\81 à°ªà°\82పిà°\82à°\9aà°¿à°¨ à°¤à°¾à°¤à±\8dà°\95ాలిà°\95 à°\95à±\8bà°¡à±\81à°¤à±\8b à°²à°¾à°\97ినయà±\8dయారà±\81. à°²à°¾à°\97à°¿à°¨à±\8dà°¨à±\81 à°ªà±\82à°°à±\8dతి à°\9aà±\87à°¸à±\87à°\82à°¦à±\81à°\95à±\81, à°\87à°\95à±\8dà°\95à°¡ à°®à±\80à°°à±\81 à°¤à°ªà±\8dపనిసరిà°\97à°¾ à°¸à°\82à°\95à±\87తపదà°\82 à°®à°¾à°°à±\8dà°\9aà±\81à°\95à±\8bవాలి:',
 'resetpass-temp-password' => 'తాత్కాలిక సంకేతపదం:',
 'resetpass-abort-generic' => 'ఓ పొడిగింత (ఎక్స్టెన్‍షన్) సంకేతపదం మార్పిడిని ఆపేసింది.',
-'resetpass-expired' => 'à°®à±\80 à°¸à°\82à°\95à±\87తపదà°\82 à°\95ాలà°\82 à°\9aà±\86à°²à±\8dలినది. à°¦à°¯à°\9aà±\87సి à°\95à±\8aà°¤à±\8dà°¤ à°ªà°¦à°\82 à°\87à°\9aà±\8dà°\9aà°¿ à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aండి.',
-'resetpass-expired-soft' => 'à°®à±\80 à°¸à°\82à°\95à±\87తపదà°\82 à°\95ాలà°\82 à°\9aà±\86à°²à±\8dలినది, à°\95ాబà°\9fà±\8dà°\9fà°¿ à°\95à±\8aà°¤à±\8dతది à°\87à°µà±\8dవాలి. à°\95à±\8aà°¤à±\8dతది à°\87à°ªà±\8dà°ªà±\81à°¡à±\87 à°\87à°µà±\8dà°µà°\82à°¡à°¿ à°²à±\87దా à°°à°¦à±\8dà°¦à±\81à°\9aà±\87సి à°¤à°°à±\81వాత à°°à±\80à°¸à±\86à°\9fà±\8d à°\9aà±\87à°¯ండి.',
+'resetpass-expired' => 'à°®à±\80 à°¸à°\82à°\95à±\87తపదానిà°\95à°¿ à°\95ాలà°\82 à°\9aà±\86à°²à±\8dలిà°\82ది. à°\95à±\8aà°¤à±\8dà°¤ à°¸à°\82à°\95à±\87తపదà°\82 à°\87à°\9aà±\8dà°\9aà°¿ à°²à°¾à°\97ినవండి.',
+'resetpass-expired-soft' => 'à°®à±\80 à°¸à°\82à°\95à±\87తపదానిà°\95à°¿ à°\95ాలà°\82 à°\9aà±\86à°²à±\8dలిà°\82ది, à°\95ాబà°\9fà±\8dà°\9fà°¿ à°\95à±\8aà°¤à±\8dతది à°\87à°µà±\8dవాలి. à°\95à±\8aà°¤à±\8dతది à°\87à°ªà±\8dà°ªà±\81à°¡à±\87 à°\87à°µà±\8dà°µà°\82à°¡à°¿ à°²à±\87దా "{{int:resetpass-submit-cancel}}" à°¨à±\8aà°\95à±\8dà°\95à°¿, à°¤à°°à±\81వాత à°®à°¾à°°à±\8dà°\9aà±\81à°\95à±\8bండి.',
 
 # Special:PasswordReset
 'passwordreset' => 'సంకేతపదాన్ని మార్చుకోండి',
@@ -759,7 +759,7 @@ $2
 'changeemail' => 'ఈ-మెయిలు చిరునామా మార్పు',
 'changeemail-header' => 'ఖాతా ఈ-మెయిల్ చిరునామాని మార్చండి',
 'changeemail-text' => 'మీ ఈమెయిలు చిరునామాని మార్చుకోడానికి ఈ ఫారాన్ని నింపండి. ఈ మార్పుని నిర్ధారించడానికి మీ సంకేతపదాన్ని ఇవ్వాల్సివస్తుంది.',
-'changeemail-no-info' => 'à°\88 à°ªà±\87à°\9cà±\80ని à°¨à±\87à°°à±\81à°\97à°¾ à°\9aà±\82à°¡à°\9fానిà°\95à°¿ à°®à±\80à°°à±\81 à°²à±\8bనిà°\95à°¿ à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aà°¿వుండాలి.',
+'changeemail-no-info' => 'à°\88 à°ªà±\87à°\9cà±\80ని à°¨à±\87à°°à±\81à°\97à°¾ à°\9aà±\82à°¡à°\9fానిà°\95à°¿ à°®à±\80à°°à±\81 à°²à°¾à°\97ినయి వుండాలి.',
 'changeemail-oldemail' => 'ప్రస్తుత ఈ-మెయిలు చిరునామా:',
 'changeemail-newemail' => 'కొత్త ఈ-మెయిలు చిరునామా:',
 'changeemail-none' => '(ఏమీలేదు)',
@@ -793,9 +793,9 @@ $2
 'extlink_tip' => 'బయటి లింకు (దీనికి ముందు http:// ఇవ్వటం మరువకండి)',
 'headline_sample' => 'శీర్షిక పాఠ్యం',
 'headline_tip' => '2వ స్థాయి శీర్షిక',
-'nowiki_sample' => 'ఫారà±\8dమాà°\9fà±\81 à°\9aà±\87à°¯à°\95à±\82డని à°ªà°¾à° à±\8dయానà±\8dని à°\87à°\95à±\8dà°\95à°¡ à°\9aà±\87à°°à±\8dà°\9aà°\82à°¡à°¿',
+'nowiki_sample' => 'ఫార్మాటు చేయని పాఠ్యాన్ని ఇక్కడ చేర్చండి',
 'nowiki_tip' => 'వికీ ఫార్మాటును పట్టించుకోవద్దు',
-'image_tip' => 'à°ªà±\8aదిà°\97ిన ఫైలు',
+'image_tip' => 'à°\87మిడà±\8dà°\9aిన ఫైలు',
 'media_tip' => 'దస్త్రపు లంకె',
 'sig_tip' => 'సమయంతో సహా మీ సంతకం',
 'hr_tip' => 'అడ్డగీత (అరుదుగా వాడండి)',
@@ -807,36 +807,36 @@ $2
 'watchthis' => 'ఈ పుట మీద కన్నేసి ఉంచు',
 'savearticle' => 'పేజీని భద్రపరచు',
 'preview' => 'మునుజూపు',
-'showpreview' => 'మునుజూపు',
-'showlivepreview' => 'తాà°\9cà°¾ మునుజూపు',
+'showpreview' => 'మునుజూపు చూపు',
+'showlivepreview' => 'à°¤à°\95à±\8dà°·à°£ మునుజూపు',
 'showdiff' => 'తేడాలను చూపించు',
-'anoneditwarning' => "'''హెచ్చరిక:''' మీరు లోనికి ప్రవేశించలేదు.
-ఈ పేజీ దిద్దుబాటు చరిత్రలో మీ ఐపీ చిరునామా నమోదవుతుంది.",
-'anonpreviewwarning' => "''మీరు లోనికి ప్రవేశించలేదు. భద్రపరిస్తే ఈ పేజీ యొక్క దిద్దుబాటు చరిత్రలో మీ ఐపీ చిరునామా నమోదవుతుంది.''",
-'missingsummary' => "'''గుర్తు చేస్తున్నాం:''' మీరు దిద్దుబాటు సారాంశమేమీ ఇవ్వలేదు. పేజీని మళ్ళీ భద్రపరచమని చెబితే సారాంశమేమీ లేకుండానే దిద్దుబాటును భద్రపరుస్తాం.",
+'anoneditwarning' => '<strong>హెచ్చరిక:</strong> మీరు లాగినవలేదు.
+ఈ పేజీ దిద్దుబాటు చరిత్రలో మీ ఐపీ చిరునామా నమోదవుతుంది.',
+'anonpreviewwarning' => '<em>మీరు లాగినవలేదు. భద్రపరిస్తే ఈ పేజీ యొక్క దిద్దుబాటు చరిత్రలో మీ ఐపీ చిరునామా నమోదవుతుంది.</em>',
+'missingsummary' => '<strong>గుర్తు చేస్తున్నాం:</strong> మీరు దిద్దుబాటు సారాంశమేమీ ఇవ్వలేదు. పేజీని మళ్ళీ భద్రపరచమని చెబితే సారాంశమేమీ లేకుండానే దిద్దుబాటును భద్రపరుస్తాం.',
 'missingcommenttext' => 'కింద ఓ వ్యాఖ్య రాయండి.',
-'missingcommentheader' => "'''గుర్తు చేస్తున్నాం''': ఈ వ్యాఖ్యకు మీరు విషయం/శీర్షిక పెట్టలేదు.
-\"{{int:savearticle}}\"ని మళ్ళీ నొక్కితే, మీ మార్పుకి విషయం/శీర్షిక ఏమీ లేకుండానే భద్రపరుస్తాం.",
-'summary-preview' => 'à°®à±\80à°°à±\81 à°°à°¾à°¸à°¿à°¨ à°¸à°¾à°°à°¾à°\82à°¶à°\82:',
+'missingcommentheader' => '<strong>గుర్తు చేస్తున్నాం:</strong> ఈ వ్యాఖ్యకు మీరు విషయం/శీర్షిక పెట్టలేదు.
+"{{int:savearticle}}"ని మళ్ళీ నొక్కితే, అది లేకుండానే మీ మార్పును భద్రపరుస్తాం.',
+'summary-preview' => 'సారాà°\82à°¶à°\82 à°®à±\81à°¨à±\81à°\9cà±\82à°ªà±\81:',
 'subject-preview' => 'విషయం/శీర్షిక మునుజూపు:',
-'blockedtitle' => 'సభà±\8dà°¯à±\81నిపà±\88 à°¨à°¿à°°à±\8bà°§à°\82 à°\85మలయిà°\82ది',
-'blockedtext' => "'''మీ వాడుకరి పేరుని లేదా ఐ.పీ. చిరునామాని నిరోధించారు.'''
+'blockedtitle' => 'వాడà±\81à°\95à°°à°¿ à°¨à°¿à°°à±\8bధిà°\82à°\9aబడà±\8dడారà±\81',
+'blockedtext' => "<strong>మీ వాడుకరి పేరు లేదా ఐ.పీ. చిరునామా నిరోధించబడింది.</strong>
 
 నిరోధించినది $1.
-అందుకు ఇచ్చిన కారణం: ''$2''
+అందుకు ఇచ్చిన కారణం: <em>$2</em>.
 
 * నిరోధం మొదలైన సమయం: $8
 * నిరోధించిన కాలం: $6
 * నిరోధానికి గురైనవారు: $7
 
-ఈ నిరోధంపై చర్చించేందుకు మీరు $1ను గాని, మరెవరైనా [[{{MediaWiki:Grouppage-sysop}}|నిర్వాహకులను]] గాని సంప్రదించవచ్చు.
+ఈ నిరోధంపై చర్చించేందుకు మీరు $1 ను గాని, మరెవరైనా [[{{MediaWiki:Grouppage-sysop}}|నిర్వాహకులను]] గాని సంప్రదించవచ్చు.
 మీ [[Special:Preferences|ఖాతా అభిరుచులలో]] సరైన ఈ-మెయిలు చిరునామా ఇచ్చివుండకపోయినా లేదా మిమ్మల్ని  'ఈ వాడుకరికి ఈ-మెయిలు పంపు' సౌలభ్యాన్ని వాడుకోవడం నుండి నిరోధించివున్నా మీరు ఈమెయిలు ద్వారా సంప్రదించలేరు.
 మీ ప్రస్తుత ఐ.పీ. చిరునామా $3, మరియు నిరోధపు ID #$5.
 మీ సంప్రదింపులన్నిటిలోనూ వీటిని పేర్కొనండి.",
 'autoblockedtext' => 'మీ ఐపీ చిరునామా ఆటోమాటిగ్గా నిరోధించబడింది. ఎందుకంటే ఇదే ఐపీ చిరునామాని ఓ నిరోధిత వాడుకరి ఉపయోగించారు. ఆ వాడుకరిని $1 నిరోధించారు.
 అందుకు ఇచ్చిన కారణం ఇదీ:
 
-:\'\'$2\'\'
+:<em>$2</em>
 
 * నిరోధం మొదలైన సమయం: $8
 * నిరోధించిన కాలం: $6
@@ -849,20 +849,24 @@ $2
 మీ ప్రస్తుత ఐపీ చిరునామా $3, మరియు నిరోధపు ఐడీ: $5.
 మీ సంప్రదింపులన్నిటిలోను అన్ని పై వివరాలను ఉదహరించండి.',
 'blockednoreason' => 'కారణమేమీ ఇవ్వలేదు',
-'whitelistedittext' => 'పుటలలో మార్పులు చెయ్యడానికి మీరు $1 ఉండాలి.',
-'confirmedittext' => 'పేజీల్లో మార్పులు చేసేముందు మీ ఈ-మెయిలు చిరునామా ధృవీకరించాలి. [[Special:Preferences|మీ అభిరుచుల]]లో మీ ఈ-మెయిలు చిరునామా రాసి, ధృవీకరించండి.',
+'whitelistedittext' => 'పుటలలో మార్పులు చెయ్యడానికి $1.',
+'confirmedittext' => 'పేజీల్లో మార్పులు చేసేముందు మీ ఈమెయిలు చిరునామాను ధృవీకరించాలి. [[Special:Preferences|మీ అభిరుచుల]]లో మీ ఈమెయిలు చిరునామా రాసి, ధృవీకరించండి.',
 'nosuchsectiontitle' => 'విభాగాన్ని కనగొనలేకపోయాం',
-'nosuchsectiontext' => 'à°®à±\80à°°à±\81 à°²à±\87ని à°µà°¿à°­à°¾à°\97ానà±\8dని à°®à°¾à°°à±\8dà°\9aడానిà°\95à°¿ ప్రయత్నించారు.
+'nosuchsectiontext' => 'à°\85సలà±\81 à°²à±\87à°¨à±\87 à°²à±\87ని à°µà°¿à°­à°¾à°\97ానà±\8dని à°®à°¾à°°à±\8dà°\9aడానిà°\95à°¿ à°®à±\80à°°à±\81 ప్రయత్నించారు.
 మీరు పేజీని చూస్తూన్నప్పుడు దాన్ని ఎవరైనా తరలించి లేదా తొలగించి ఉండవచ్చు.',
-'loginreqtitle' => 'à°ªà±\8dà°°à°µà±\87శమà±\81 తప్పనిసరి',
+'loginreqtitle' => 'లాà°\97ినవడà°\82 తప్పనిసరి',
 'loginreqlink' => 'లాగినవండి',
-'loginreqpagetext' => 'ఇతర పుటలను చూడడానికి మీరు $1 ఉండాలి.',
+'loginreqpagetext' => 'ఇతర పుటలను చూడడానికి $1.',
 'accmailtitle' => 'సంకేతపదం పంపించబడింది.',
 'accmailtext' => "[[User talk:$1|$1]] కొరకు ఒక యాదృచ్ఛిక సంకేతపదాన్ని $2కి పంపించాం. లాగినయ్యాక, ''[[Special:ChangePassword|సంకేతపదాన్ని మార్చుకోండి]]'' అనే పేజీలో ఈ సంకేతపదాన్ని మార్చుకోవచ్చు.",
 'newarticle' => '(కొత్తది)',
-'newarticletext' => "ఈ లింకుకు సంబంధించిన పేజీ ఉనికిలొ లేదు.
-కింది పెట్టెలో మీ రచనను టైపు చేసి ఆ పేజీని సృష్టించండి (దీనిపై సమాచారం కొరకు [[{{MediaWiki:Helppage}}|సహాయం]] పేజీ చూడండి). మీరిక్కడికి పొరపాటున వచ్చి ఉంటే, మీ బ్రౌజరు '''back''' మీట నొక్కండి.",
-'anontalkpagetext' => "----''ఇది ఒక అజ్ఞాత వాడుకరి చర్చా పేజీ. ఆ వాడుకరి ఇంకా తనకై ఖాతాను సృష్టించుకోలేదు, లేదా ఖాతా ఉన్నా దానిని ఉపయోగించడం లేదు. అజ్ఞాత వాడుకరులను గుర్తించడానికి అంకెలతో ఉండే ఐ.పీ. చిరునామాను వాడుతాం. కానీ, ఒకే ఐ.పీ. చిరునామాని చాలా మంది వాడుకరులు ఉపయోగించే అవకాశం ఉంది. మీరు అజ్ఞాత వాడుకరి అయితే మరియు సంబంధంలేని వ్యాఖ్యలు మిమ్మల్ని ఉద్దేశించినట్టుగా అనిపిస్తే, భవిష్యత్తులో ఇతర అజ్ఞాత వాడుకరులతో అయోమయం లేకుండా ఉండటానికి, దయచేసి [[Special:UserLogin/signup|ఖాతాను సృష్టించుకోండి]] లేదా [[Special:UserLogin|లోనికి ప్రవేశించండి]].''",
+'newarticletext' => 'ఈ లింకుకు సంబంధించిన పేజీ లేనే లేదు.
+కింది పెట్టెలో మీ రచనను టైపు చేసి ఆ పేజీని సృష్టించండి (దీనిపై సమాచారం కొరకు [[{{MediaWiki:Helppage}}|సహాయం పేజీ]] చూడండి). మీరిక్కడికి పొరపాటున వచ్చి ఉంటే, మీ బ్రౌజరు <strong>back</strong> మీట నొక్కండి.',
+'anontalkpagetext' => "----
+<em>ఇది ఒక అజ్ఞాత వాడుకరి చర్చా పేజీ. ఆ వాడుకరి ఇంకా తనకై ఖాతాను సృష్టించుకోలేదు, లేదా ఖాతా ఉన్నా దానిని ఉపయోగించడం లేదు.</em>
+అంచేత, అతణ్ణి/ఆమెను గుర్తించడానికి ఐ.పీ. చిరునామాను వాడాల్సి వచ్చింది. 
+ఒకే ఐ.పీ. చిరునామాని చాలా మంది వాడుకరులు ఉపయోగించే అవకాశం ఉంది. 
+మీరూ అజ్ఞాత వాడుకరి అయితే, మీకు సంబంధంలేని వ్యాఖ్యలు మిమ్మల్ని ఉద్దేశించినట్టుగా అనిపిస్తే, భవిష్యత్తులో ఇతర అజ్ఞాత వాడుకరులతో అయోమయం లేకుండా ఉండటానికి, [[Special:UserLogin/signup|ఖాతాను సృష్టించుకోండి]] లేదా [[Special:UserLogin|లాగినవండి]].''",
 'noarticletext' => 'ప్రస్తుతం ఈ పేజీలో పాఠ్యమేమీ లేదు.
 వేరే పేజీలలో [[Special:Search/{{PAGENAME}}|ఈ పేజీ శీర్షిక కోసం వెతకవచ్చు]],
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} సంబంధిత చిట్టాలు చూడవచ్చు],
@@ -870,7 +874,7 @@ $2
 'noarticletext-nopermission' => 'ప్రస్తుతం ఈ పేజీలో పాఠ్యమేమీ లేదు.
 మీరు ఇతర పేజీలలో [[Special:Search/{{PAGENAME}}|ఈ పేజీ శీర్షిక కోసం వెతకవచ్చు]], లేదా <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} సంబంధిత చిట్టాలలో వెతకవచ్చు]</span>, కానీ ఈ పేజీని సృష్టించడానికి మీకు అనుమతి లేదు.',
 'missing-revision' => '"{{PAGENAME}}" అనే పేజీ యొక్క కూర్పు #$1 ఉనికిలో లేదు. సాధారణంగా ఏదైనా తొలగించబడిన పేజీ యొక్క కాలం చెల్లిన చరితం లింకును నొక్కినపుడు ఇది జరుగుతుంది. వివరాలు [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} తొలగింపు లాగ్] లో దొరుకుతాయి.',
-'userpage-userdoesnotexist' => '"<nowiki>$1</nowiki>" అనే వాడుకరి ఖాతా నమోదయిలేదు. మీరు ఈ పేజీని సృష్టించ/సరిదిద్దాలనుకుంటే, సరిచూసుకోండి.',
+'userpage-userdoesnotexist' => '"$1" అనే వాడుకరి ఖాతా నమోదయిలేదు. మీరు ఈ పేజీని సృష్టించాలని/సరిదిద్దాలని అనుకుంటున్నారేమో చూడండి.',
 'userpage-userdoesnotexist-view' => 'వాడుకరి ఖాతా "$1" నమోదుకాలేదు.',
 'blocked-notice-logextract' => 'ప్రస్తుతం ఈ వాడుకరిని నిరోధించారు.
 నిరోధపు చిట్టాలోని చివరి పద్దుని మీ సమాచారం కోసం ఈ క్రింద ఇస్తున్నాం:',
@@ -879,37 +883,37 @@ $2
 * <strong>గూగుల్ క్రోమ్:</strong> <em>Ctrl-Shift-R</em> (మాక్ లో <em>⌘-Shift-R</em>) నొక్కండి
 *<strong>ఇంటర్నెట్ ఎక్ప్లోరర్:</strong> <em>Ctrl</em> ను నొక్కిపట్టి <em>Refresh</em> నొక్కండి లేదా <em>Ctrl-F5</em> నొక్కండి.
 *<em>ఒపెరా:</em> <em>Tools → Preferences</em> ద్వారా కోశాన్ని ఖాళీ చెయ్యండి',
-'usercssyoucanpreview' => "'''చిట్కా:''' భద్రపరిచేముందు మీ కొత్త CSSని పరీక్షించడానికి \"{{int:showpreview}}\" అనే బొత్తాన్ని వాడండి.",
-'userjsyoucanpreview' => "'''చిట్కా:''' భద్రపరిచేముందు మీ కొత్త జావాస్క్రిప్టుని పరీక్షించడానికి \"{{int:showpreview}}\" అనే బొత్తాన్ని వాడండి.",
-'usercsspreview' => "'''మీరు వాడుకరి CSSను కేవలం సరిచూస్తున్నారని గుర్తుంచుకోండి.'''
-'''దాన్నింకా భద్రపరచలేదు!'''",
-'userjspreview' => "'''గుర్తుంచుకోండి, మీరింకా మీ వాడుకరి జావాస్క్రిప్ట్&zwnj;ను భద్రపరచలేదు, కేవలం పరీక్షిస్తున్నారు/సరిచూస్తున్నారు!'''",
+'usercssyoucanpreview' => '<strong>చిట్కా:</strong> భద్రపరిచేముందు మీ కొత్త CSSని పరీక్షించడానికి "{{int:showpreview}}" బొత్తాన్ని వాడండి.',
+'userjsyoucanpreview' => '<strong>చిట్కా:</strong> భద్రపరిచేముందు మీ కొత్త జావాస్క్రిప్టుని పరీక్షించడానికి "{{int:showpreview}}" బొత్తాన్ని వాడండి.',
+'usercsspreview' => '<strong>మీరు వాడుకరి CSSను కేవలం సరిచూస్తున్నారని గుర్తుంచుకోండి.
+దాన్నింకా భద్రపరచలేదు!</strong>',
+'userjspreview' => '<strong>గుర్తుంచుకోండి, మీరింకా మీ వాడుకరి జావాస్క్రిప్ట్&zwnj;ను భద్రపరచలేదు, కేవలం పరీక్షిస్తున్నారు/సరిచూస్తున్నారు!</strong>',
 'sitecsspreview' => "'''మీరు చూస్తున్నది ఈ CSS మునుజూపును మాత్రమేనని గుర్తుంచుకోండి.'''
 '''దీన్నింకా భద్రపరచలేదు!'''",
 'sitejspreview' => "'''మీరు చూస్తున్నది ఈ JavaScript మునుజూపును మాత్రమేనని గుర్తుంచుకోండి.''' 
 '''దీన్నింకా భద్రపరచలేదు!'''",
-'userinvalidcssjstitle' => "'''హెచ్చరిక:''' \"\$1\" అనే అలంకారం లేదు.
-అభిమత .css మరియు .js పుటల శీర్షికలు ఇంగ్లీషు చిన్నబడి అక్షరాల లోనే ఉండాలని గుర్తుంచుకోండి, ఉదాహరణకు ఇలా {{ns:user}}:Foo/vector.css అంతేగానీ, {{ns:user}}:Foo/Vector.css ఇలా కాదు.",
+'userinvalidcssjstitle' => '<strong>హెచ్చరిక:</strong> "$1" అనే రూపు లేదు.
+అభిమత .css మరియు .js పుటల శీర్షికలు ఇంగ్లీషు చిన్నబడి అక్షరాల లోనే ఉండాలని గుర్తుంచుకోండి, ఉదాహరణకు ఇలా {{ns:user}}:Foo/vector.css అంతేగానీ, {{ns:user}}:Foo/Vector.css ఇలా కాదు.',
 'updated' => '(నవీకరించబడింది)',
-'note' => "'''గమనిక:'''",
-'previewnote' => "'''ఇది మునుజూపు మాత్రమేనని గుర్తుంచుకోండి.'''
-మీ మార్పులు ఇంకా భద్రమవ్వలేదు!",
+'note' => '<strong>గమనిక:</strong>',
+'previewnote' => '<strong>ఇది మునుజూపు మాత్రమేనని గుర్తుంచుకోండి.</strong>
+మీ మార్పులు ఇంకా భద్రమవ్వలేదు!',
 'continue-editing' => 'సరిదిద్దే చోటుకి వెళ్ళండి',
 'previewconflict' => 'భద్రపరచిన తరువాత పై టెక్స్ట్‌ ఏరియాలోని టెక్స్టు ఇలాగ కనిపిస్తుంది.',
-'session_fail_preview' => "'''క్షమించండి! సెషను డేటా పోవడం వలన మీ మార్పులను స్వీకరించలేకపోతున్నాం.'''
-దయà°\9aà±\87సి à°®à°³à±\8dà°³à±\80 à°ªà±\8dరయతà±\8dనిà°\82à°\9aà°\82à°¡à°¿.
-à°\85యినా à°ªà°¨à°¿ à°\9cà°°à°\95à±\8dà°\95à°ªà±\8bà°¤à±\87, à°\93సారి [[Special:UserLogout|నిషà±\8dà°\95à±\8dరమిà°\82à°\9aà°¿]] à°®à°³à±\8dà°³à±\80 à°²à±\8bనిà°\95à°¿ à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aà°¿ à°ªà±\8dరయతà±\8dనిà°\82à°\9aà°\82à°¡à°¿.",
-'session_fail_preview_html' => "'''సారీ! సెషను డేటా పోవడం వలన మీ దిద్దుబాటును ప్రాసెస్ చెయ్యలేలేక పోతున్నాం.'''
+'session_fail_preview' => '<strong>క్షమించండి! సెషను డేటా పోవడం వలన మీ మార్పులను స్వీకరించలేకపోతున్నాం.</strong>
+మళ్ళీ ప్రయత్నించండి.
+à°\85యినా à°ªà°¨à°¿ à°\9cà°°à°\95à±\8dà°\95à°ªà±\8bà°¤à±\87, à°\93సారి [[Special:UserLogout|లాà°\97à±\8cà°\9fà±\88]] à°®à°³à±\8dà°³à±\80 à°²à°¾à°\97ినయి à°ªà±\8dరయతà±\8dనిà°\82à°\9aà°\82à°¡à°¿.',
+'session_fail_preview_html' => "<strong>సారీ! సెషను డేటా పోవడం వలన మీ దిద్దుబాటును ప్రాసెస్ చెయ్యలేలేక పోతున్నాం.</strong>
 
 ''{{SITENAME}}లో ముడి HTML సశక్తమై ఉంది కాబట్టి, జావాస్క్రిప్టు దాడుల నుండి రక్షణగా మునుజూపును దాచేశాం.''
 
-'''మీరు చేసినది సరైన దిద్దుబాటే అయితే, మళ్ళీ ప్రయత్నించండి. అయినా పనిచెయ్యకపోతే, ఓ సారి లాగౌటయ్యి, మళ్ళీ లాగినయి చూడండి.'''",
+<strong>మీరు చేసినది సరైన దిద్దుబాటే అయితే, మళ్ళీ ప్రయత్నించండి. అయినా పనిచెయ్యకపోతే, ఓ సారి [[Special:UserLogout|లాగౌటై]], మళ్ళీ లాగినయి చూడండి.</strong>",
 'token_suffix_mismatch' => "'''మీ క్లయంటు, దిద్దుబాటు టోకెన్‌లోని వ్యాకరణ గుర్తులను గజిబిజి చేసింది కాబట్టి మీ దిద్దుబాటును తిరస్కరించాం. పేజీలోని పాఠ్యాన్ని చెడగొట్టకుండా ఉండేందుకు గాను, ఆ దిద్దుబాటును రద్దు చేశాం. వెబ్‌లో ఉండే లోపభూయిష్టమైన అజ్ఞాత ప్రాక్సీ సర్వీసులను వాడినపుడు ఒక్కోసారి ఇలా జరుగుతుంది.'''",
 'edit_form_incomplete' => '’’’ఈ ఎడిట్ ఫారంలోని కొన్ని భాగాలు సర్వరును చేరలేదు; మీ మార్పుచేర్పులు భద్రంగా ఉన్నాయని ధృవపరచుకుని, మళ్ళీ ప్రయత్నించండి.’’’',
-'editing' => '$1కి మార్పులు',
+'editing' => '$1 ని సవరిస్తున్నారు',
 'creating' => '$1 పేజీని సృష్టిస్తున్నారు',
-'editingsection' => '$1కు మార్పులు (విభాగం)',
-'editingcomment' => '$1 à°¦à°¿à°¦à±\8dà°¦à±\81బాà°\9fు (కొత్త విభాగం)',
+'editingsection' => '$1 ని సవరిస్తున్నారు (విభాగం)',
+'editingcomment' => '$1 à°¨à°¿ à°¸à°µà°°à°¿à°¸à±\8dà°¤à±\81à°¨à±\8dనారు (కొత్త విభాగం)',
 'editconflict' => 'దిద్దుబాటు ఘర్షణ: $1',
 'explainconflict' => "మీరు మార్పులు చెయ్యడం మొదలుపెట్టిన తరువాత, వేరే ఎవరో ఈ పుటని మార్పారు.
 పైన ఉన్న పాఠ్య పేటికలో ఈ పుట యొక్క ప్రస్తుతపు పాఠ్యం ఉంది.
@@ -918,26 +922,27 @@ $2
 మీరు \"{{int:savearticle}}\"ను నొక్కినపుడు, పై పాఠ్య పేటికలో ఉన్న పాఠ్యం '''మాత్రమే''' భద్రపరచబడుతుంది.",
 'yourtext' => 'మీ పాఠ్యం',
 'storedversion' => 'భద్రపరచిన కూర్పు',
-'nonunicodebrowser' => "'''WARNING: Your browser is not unicode compliant. A workaround is in place to allow you to safely edit pages: non-ASCII characters will appear in the edit box as hexadecimal codes.'''",
-'editingold' => "'''హెచ్చ రిక: ఈ పేజీ యొక్క కాలం చెల్లిన సంచికను మీరు మరుస్తున్నారు. దీనిని భద్రపరిస్తే, ఆ సంచిక తరువాత ఈ పేజీలో జరిగిన మార్పులన్నీ పోతాయి.'''",
+'nonunicodebrowser' => '<strong>హెచ్చరిక: మీ బ్రౌజరు యూనికోడుకు అనుకూలంగా లేదు.</strong>
+పేజీలను క్షేమంగా సవరించేందుకు ఓ దారి ఉంది: ASCII యేతర కారెక్టర్లు ఎడిట్ పెట్టెలో హెక్సాడెసిమల్ కోడ్‍లుగా కనిపిస్తాయి.',
+'editingold' => '<strong>హెచ్చ రిక: ఈ పేజీ యొక్క కాలం చెల్లిన సంచికను మీరు మరుస్తున్నారు.</strong> దీనిని భద్రపరిస్తే, ఆ సంచిక తరువాత జరిగిన మార్పులన్నీ పోతాయి.',
 'yourdiff' => 'తేడాలు',
-'copyrightwarning' => "{{SITENAME}}కు సమర్పించే అన్ని రచనలూ $2కు లోబడి ప్రచురింపబడినట్లుగా భావించబడతాయి (వివరాలకు $1 చూడండి). మీ రచనలను ఎవ్వరూ మార్చ రాదనీ లెదా వేరే ఎవ్వరూ వాడుకో రాదని మీరు భావిస్తే, ఇక్కడ ప్రచురించకండి.<br /> మీ స్వీయ రచనను గాని, సార్వజనీనమైన రచననుగాని, ఇతర ఉచిత వనరుల నుండి సేకరించిన రచననుగాని మాత్రమే ప్రచురిస్తున్నానని కూడా మీరు ప్రమాణం చేస్తున్నారు. '''కాపీహక్కులుగల రచనను తగిన అనుమతి లేకుండా సమర్పించకండి!'''",
-'copyrightwarning2' => "{{SITENAME}}లో ప్రచురించే రచనలన్నిటినీ ఇతర రచయితలు సరిదిద్దడం, మార్చడం, తొలగించడం చేసే అవకాశం ఉంది. మీ రచనలను అలా నిర్దాక్షిణ్యంగా దిద్దుబాట్లు చెయ్యడం మీకిష్టం లేకపోతే, వాటిని ఇక్కడ ప్రచురించకండి. <br />
-à°\88 à°°à°\9aననà±\81 à°®à±\80à°°à±\87 à°\9aà±\87సారని, à°²à±\87దా à°\8fà°¦à±\88నా à°¸à°¾à°°à±\8dà°µà°\9cనిà°\95 à°µà°¨à°°à±\81 à°¨à±\81à°\82à°¡à°¿ à°\95ాపà±\80 à°\9aà±\87సి à°¤à±\86à°\9aà±\8dà°\9aారని, à°²à±\87దా à°\85లాà°\82à°\9fà°¿ à°\89à°\9aà°¿à°¤, à°¸à±\8dà°µà±\87à°\9aà±\8dà°\9bà°¾ à°µà°¨à°°à±\81 à°¨à±\81à°\82à°¡ి తెచ్చారని మాకు వాగ్దానం చేస్తున్నారు. (వివరాలకు $1 చూడండి).
-'''తగు అనుమతులు లేకుండా కాపీ హక్కులు గల రచనలను సమర్పించకండి!'''",
-'longpageerror' => "'''పొరపాటు: మీరు సమర్పించిన పాఠ్యం, గరిష్ఠ పరిమితి అయిన {{PLURAL:$2|ఒక కిలోబైటుని|$2 కిలోబైట్లను}} మించి {{PLURAL:$1|ఒక కిలోబైటు|$1 కిలోబైట్ల}} పొడవుంది.'''
- దీన్ని భద్రపరచలేము.",
+'copyrightwarning' => '{{SITENAME}}కు సమర్పించే అన్ని రచనలూ $2కు లోబడి ప్రచురింపబడినట్లుగా భావించబడతాయి (వివరాలకు $1 చూడండి). మీ రచనలను ఎవ్వరూ మార్చ రాదనీ లెదా వేరే ఎవ్వరూ వాడుకో రాదని మీరు భావిస్తే, ఇక్కడ ప్రచురించకండి.<br /> మీ స్వీయ రచనను గాని, సార్వజనీనమైన రచననుగాని, ఇతర ఉచిత వనరుల నుండి సేకరించిన రచననుగాని మాత్రమే ప్రచురిస్తున్నానని కూడా మీరు ప్రమాణం చేస్తున్నారు. <strong>కాపీహక్కులుగల రచనను తగిన అనుమతి లేకుండా సమర్పించకండి!</strong>',
+'copyrightwarning2' => '{{SITENAME}}లో ప్రచురించే రచనలన్నిటినీ ఇతర రచయితలు సరిదిద్దడం, మార్చడం, తొలగించడం జరగవచ్చు. మీ రచనలను అలా నిర్దాక్షిణ్యంగా దిద్దుబాట్లు చెయ్యడం మీకిష్టం లేకపోతే, వాటిని ఇక్కడ ప్రచురించకండి. <br />
+à°\85లాà°\97à±\87, à°\88 à°°à°\9aననà±\81 à°®à±\80à°°à±\87 à°\9aà±\87సారని, à°²à±\87దా à°\8fà°¦à±\88నా à°¸à°¾à°°à±\8dà°µà°\9cనిà°\95 à°µà°¨à°°à±\81 à°¨à±\81à°\82à°¡à°¿ à°\97ానà±\80, à°\85లాà°\82à°\9fà°¿ à°\89à°\9aà°¿à°¤, à°¸à±\8dà°µà±\87à°\9aà±\8dà°\9bà°¾ à°µà°¨à°°à±\81 à°¨à±\81à°\82à°¡à°¿ à°\97ానà±\80 à°\95ాపà±\80 à°\9aà±\87à°¸ి తెచ్చారని మాకు వాగ్దానం చేస్తున్నారు. (వివరాలకు $1 చూడండి).
+<strong>తగు అనుమతులు లేకుండా కాపీ హక్కులు గల రచనలను సమర్పించకండి!</strong>',
+'longpageerror' => '<strong>లోపం: మీరు సమర్పించిన పాఠ్యం {{PLURAL:$1|ఒక కిలోబైటు|$1 కిలోబైట్ల}} నిడివి కలిగి ఉంది. ఇది గరిష్ఠ పరిమితి అయిన {{PLURAL:$2|ఒక కిలోబైటుని|$2 కిలోబైట్లను}} మించింది.</strong>
+ దీన్ని భద్రపరచలేము.',
 'readonlywarning' => '<strong>హెచ్చరిక: నిర్వహణ కొరకు డేటాబేసుకి తాళం వేసారు. కాబట్టి మీ మార్పుచేర్పులను ఇప్పుడు భద్రపరచలేరు.</strong> 
 మీ మార్పులను ఒక ఫాఠ్య ఫైలులోకి కాపీ చేసి భద్రపరచుకొని, తరువాత సమర్పించండి.
 
 తాళం వేసిన నిర్వాహకుడి వివరణ ఇదీ: $1',
-'protectedpagewarning' => "'''హెచ్చరిక: ఈ పేజీ సంరక్షించబడినది, కనుక నిర్వాహక అనుమతులు ఉన్న వాడుకరులు మాత్రమే మార్చగలరు.'''
-à°\9aివరి à°\9aà°¿à°\9fà±\8dà°\9fà°¾ à°ªà°¦à±\8dà°¦à±\81ని à°®à±\80 à°¸à°®à°¾à°\9aారà°\82 à°\95à±\8bà°¸à°\82 à°\87à°\95à±\8dà°\95à°¡ à°\87à°¸à±\8dà°¤à±\81à°¨à±\8dనాà°\82:",
-'semiprotectedpagewarning' => "'''గమనిక:''' నమోదయిన వాడుకరులు మాత్రమే మార్పులు చెయ్యగలిగేలా ఈ పేజీకి సంరక్షించారు.
-à°®à±\80 à°¸à°®à°¾à°\9aారà°\82 à°\95à±\8bà°¸à°\82 à°\9aివరి à°\9aà°¿à°\9fà±\8dà°\9fà°¾ à°ªà°¦à±\8dà°¦à±\81ని à°\87à°\95à±\8dà°\95à°¡ à°\87à°¸à±\8dà°¤à±\81à°¨à±\8dనాà°\82:",
-'cascadeprotectedwarning' => "'''హెచ్చరిక:''' ఈ పేజీ, కాస్కేడింగు రక్షణలో ఉన్న కింది {{PLURAL:$1|పేజీ|పేజీల్లో}} ఇంక్లూడు అయి ఉంది కాబట్టి, నిర్వాహకులు తప్ప ఇతరులు దిద్దుబాటు చేసే వీలు లేకుండా పేజీని లాకు చేసాం:",
-'titleprotectedwarning' => "హెచ్చరిక:  ఈ పేజీని సంరక్షించారు కాబట్టి దీన్ని సృష్టించడానికి [[Special:ListGroupRights|ప్రత్యేక హక్కులు]] ఉండాలి.'''
-మీ సమాచారం కోసం చివరి చిట్టా పద్దుని ఇక్కడ ఇస్తున్నాం:",
+'protectedpagewarning' => '<strong>హెచ్చరిక: ఈ పేజీ సంరక్షించబడింది. కాబట్టి నిర్వాహక అనుమతులు ఉన్న వాడుకరులు మాత్రమే మార్చగలరు.</strong>
+à°\9aివరి à°²à°¾à°\97à±\8d à°ªà°¦à±\8dà°¦à±\81à°¨à±\81 à°®à±\80 à°¸à°®à°¾à°\9aారà°\82 à°\95à±\8bà°¸à°\82 à°\87à°\95à±\8dà°\95à°¡ à°\87à°¸à±\8dà°¤à±\81à°¨à±\8dనాà°\82:',
+'semiprotectedpagewarning' => '<strong>గమనిక:</strong> నమోదయిన వాడుకరులు మాత్రమే మార్పులు చెయ్యగలిగేలా ఈ పేజీకి సంరక్షించారు.
+à°®à±\80 à°¸à°®à°¾à°\9aారà°\82 à°\95à±\8bà°¸à°\82 à°\9aివరి à°²à°¾à°\97à±\8d à°ªà°¦à±\8dà°¦à±\81ని à°\87à°\95à±\8dà°\95à°¡ à°\87à°¸à±\8dà°¤à±\81à°¨à±\8dనాà°\82:',
+'cascadeprotectedwarning' => "'''హెచ్చరిక:''' ఈ పేజీ, కాస్కేడింగు రక్షణలో ఉన్న కింది {{PLURAL:$1|పేజీ|పేజీల్లో}} ఇంక్లూడు అయి ఉంది కాబట్టి, నిర్వాహకులు తప్ప ఇతరులు దిద్దుబాటు చేసే వీలు లేకుండా {{PLURAL:$1|పేజీని|పేజీలను}} లాకు చేసాం:",
+'titleprotectedwarning' => '<strong>హెచ్చరిక: ఈ పేజీని సంరక్షించారు కాబట్టి దీన్ని సృష్టించడానికి [[Special:ListGroupRights|ప్రత్యేక హక్కులు]] ఉండాలి.</strong>
+మీ సమాచారం కోసం చివరి చిట్టా పద్దుని ఇక్కడ ఇస్తున్నాం:',
 'templatesused' => 'ఈ పేజీలో వాడిన {{PLURAL:$1|మూస|మూసలు}}:',
 'templatesusedpreview' => 'ఈ మునుజూపులో వాడిన {{PLURAL:$1|మూస|మూసలు}}:',
 'templatesusedsection' => 'ఈ విభాగంలో వాడిన {{PLURAL:$1|మూస|మూసలు}}:',
@@ -947,30 +952,30 @@ $2
 'nocreatetext' => '{{SITENAME}}లో కొత్త పేజీలు సృష్టించడాన్ని నియంత్రించారు.
 మీరు వెనక్కి వెళ్ళి వేరే పేజీలు మార్చవచ్చు, లేదా [[Special:UserLogin|లోనికి ప్రవేశించండి లేదా ఖాతా సృష్టించుకోండి]].',
 'nocreate-loggedin' => 'కొత్త పేజీలను సృష్టించేందుకు మీకు అనుమతి లేదు.',
-'sectioneditnotsupported-title' => 'విభాà°\97à°ªà±\81 à°¦à°¿à°¦à±\8dదిబాà°\9fà±\8dà°²à°\95à°¿ à°¤à±\8aడ్పాటు లేదు',
+'sectioneditnotsupported-title' => 'విభాà°\97à°ªà±\81 à°¦à°¿à°¦à±\8dà°¦à±\81బాà°\9fà±\8dà°²à°\95à±\81 à°¤à±\8bడ్పాటు లేదు',
 'sectioneditnotsupported-text' => 'ఈ పేజీలో విభాగాల దిద్దుబాటుకి తోడ్పాటు లేదు.',
 'permissionserrors' => 'అనుమతి లోపం',
 'permissionserrorstext' => 'కింద పేర్కొన్న {{PLURAL:$1|కారణం|కారణాల}} మూలంగా, ఆ పని చెయ్యడానికి మీకు అనుమతిలేదు:',
 'permissionserrorstext-withaction' => 'ఈ క్రింది {{PLURAL:$1|కారణం|కారణాల}} వల్ల, $2 అనుమతి మీకు లేదు:',
-'recreate-moveddeleted-warn' => "'''హెచ్చరిక: ఇంతకు మునుపు ఒకసారి తొలగించిన పేజీని మళ్లీ సృష్టిద్దామని మీరు ప్రయత్నిస్తున్నారు.'''
+'recreate-moveddeleted-warn' => '<strong>హెచ్చరిక: ఇంతకు మునుపు ఒకసారి తొలగించిన పేజీని మళ్లీ సృష్టిద్దామని మీరు ప్రయత్నిస్తున్నారు.</strong>
 
 ఈ పేజీపై మార్పులు చేసేముందు, అవి ఇక్కడ ఉండతగినవేనా కాదా అని ఒకసారి ఆలోచించండి.
-మీ సౌలభ్యం కొరకు ఈ పేజీ యొక్క తొలగింపు మరియు తరలింపు చిట్టా ఇక్కడ ఇచ్చాము:",
+మీ సౌలభ్యం కొరకు ఈ పేజీ యొక్క తొలగింపు మరియు తరలింపు చిట్టా ఇక్కడ ఇచ్చాము:',
 'moveddeleted-notice' => 'ఈ పేజీని తొలగించారు.
 సమాచారం కొరకు ఈ పేజీ యొక్క తొలగింపు మరియు తరలింపు చిట్టాని క్రింద ఇచ్చాం.',
 'log-fulllog' => 'పూర్తి చిట్టాని చూడండి',
-'edit-hook-aborted' => 'కొక్కెం మార్పుని విచ్ఛిన్నం చేసింది.
+'edit-hook-aborted' => 'à°\95à±\8aà°\95à±\8dà°\95à±\86à°\82 à°\88 à°®à°¾à°°à±\8dà°ªà±\81ని à°µà°¿à°\9aà±\8dà°\9bà°¿à°¨à±\8dà°¨à°\82 à°\9aà±\87సిà°\82ది.
 అది ఎటువంటి వివరణా ఇవ్వలేదు.',
-'edit-gone-missing' => 'à°ªà±\87à°\9cà±\80ని à°®à°¾à°°à±\8dà°\9aà°²à±\87à°®à±\81.
-à°¦à±\80న్ని తొలగించినట్టున్నారు.',
-'edit-conflict' => 'మారà±\8dà°ªà±\81 à°¸à°\82ఘర్షణ.',
-'edit-no-change' => 'పాఠà±\8dà°¯à°\82à°²à±\8b à°\8fà°®à±\80 à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81 à°²à±\87à°µà±\81 à°\97à°¨à°\95, à°®à±\80 à°®à°¾à°°à±\8dà°ªà±\81ని పట్టించుకోవట్లేదు.',
+'edit-gone-missing' => 'à°ªà±\87à°\9cà±\80ని à°¤à°¾à°\9cà°¾à°\95à°°à°¿à°\82à°\9aà°²à±\87à°\95à°ªà±\8bయాà°\82.
+దాన్ని తొలగించినట్టున్నారు.',
+'edit-conflict' => 'దిదà±\8dà°¦à±\81బాà°\9fà±\81 ఘర్షణ.',
+'edit-no-change' => 'పాఠà±\8dà°¯à°\82à°²à±\8b à°®à°¾à°°à±\8dà°ªà±\81à°²à±\87à°®à±\80 à°\9aà±\86à°¯à±\8dయలà±\87à°¦à±\81 à°\95ాబà°\9fà±\8dà°\9fà°¿, à°®à±\80 à°®à°¾à°°à±\8dà°ªà±\81à°¨à±\81 పట్టించుకోవట్లేదు.',
 'postedit-confirmation' => 'మీ మార్పు భద్రమయ్యింది.',
-'edit-already-exists' => 'à°\95à±\8aà°¤à±\8dà°¤ à°ªà±\87à°\9cà±\80ని à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aà°²à±\87à°®à±\81.
+'edit-already-exists' => 'à°\95à±\8aà°¤à±\8dà°¤ à°ªà±\87à°\9cà±\80ని à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aà°²à±\87à°\95à°ªà±\8bయాà°\82.
 అది ఇప్పటికే ఉంది.',
 'defaultmessagetext' => 'అప్రమేయ సందేశపు పాఠ్యం',
 'content-failed-to-parse' => '$1 మోడల్ కొరకు $2 పాఠ్యాన్ని పార్స్ చెయ్యలేకపోయాం: $3',
-'invalid-content-data' => 'తపà±\8dà°ªà±\81à°¡à±\81 à°µà°¿à°·à°¯à°\82',
+'invalid-content-data' => 'à°\9aà±\86à°²à±\8dలని à°\95à°\82à°\9fà±\86à°\82à°\9fà±\81 à°¡à±\87à°\9fà°¾',
 'content-not-allowed-here' => '[[$2]] పేజీలో పాఠ్యం "$1" కి అనుమతి లేదు',
 'editwarning-warning' => 'ఈ పేజీని వదిలివెళ్ళడం వల్ల మీరు చేసిన మార్పులను కోల్పోయే అవకాశం ఉంది.
 మీరు లాగిన్ అయివుంటే, ఈ హెచ్చరికని మీ అభిరుచులలోని "{{int:prefs-editing}}"  విభాగంలో అచేతనం చేసుకోవచ్చు.',
@@ -984,25 +989,33 @@ $2
 'content-model-css' => 'CSS',
 
 # Parser/template warnings
-'expensive-parserfunction-warning' => 'హెచ్చరిక: ఈ పేజీలో ఖరీదైన పార్సరు పిలుపులు చాలా ఉన్నాయి.
+'expensive-parserfunction-warning' => '<strong>హెచ్చరిక:</strong> ఈ పేజీలో ఖరీదైన పార్సరు పిలుపులు చాలా ఉన్నాయి.
 
 పార్సరు {{PLURAL:$2|పిలుపు|పిలుపులు}} $2 కంటే తక్కువ ఉండాలి,  ప్రస్తుతం {{PLURAL:$1|$1 పిలుపు ఉంది|$1  పిలుపులు ఉన్నాయి}}.',
 'expensive-parserfunction-category' => 'పార్సరు సందేశాలు అధికంగా ఉన్న పేజీలు',
 'post-expand-template-inclusion-warning' => '<strong>హెచ్చరిక:</strong> మూస ఇముడ్పు సైజు చాలా పెద్దదిగా ఉంది.
 కొన్ని మూసలు ఇమడ్చబడవు.',
 'post-expand-template-inclusion-category' => 'మూస చేర్పు సైజును అధిగమించిన పేజీలు',
-'post-expand-template-argument-warning' => 'హెచ్చరిక: చాల పెద్ద సైజున్న మూస ఆర్గ్యుమెంటు, కనీసం ఒకటి, ఈ పేజీలో ఉంది.
+'post-expand-template-argument-warning' => '<strong>హెచ్చరిక:</strong> చాల పెద్ద సైజున్న మూస ఆర్గ్యుమెంటు, కనీసం ఒకటి, ఈ పేజీలో ఉంది.
 ఈ ఆర్గ్యుమెంట్లను వదలివేసాం.',
 'post-expand-template-argument-category' => 'తొలగించిన మూస ఆర్గ్యుమెంట్లు ఉన్న పేజీలు',
 'parser-template-loop-warning' => 'మూస లూపు కనబడింది: [[$1]]',
 'parser-template-recursion-depth-warning' => 'మూస రికర్షను లోతు అధిగమించబడింది ($1)',
 'language-converter-depth-warning' => 'భాషా మార్పిడి లోతు పరిమితిని అధిగమించారు ($1)',
+'node-count-exceeded-category' => 'నోడ్-కౌంటును మించిన పేజీలు',
+'node-count-exceeded-warning' => 'పేజీ నోడ్-కౌంటును మించింది',
+'expansion-depth-exceeded-category' => 'విస్తరణ లోతును మించిన పేజీలు',
+'expansion-depth-exceeded-warning' => 'పేజీ విస్తరణ లోతును మించింది',
+'parser-unstrip-loop-warning' => 'Unstrip లూపును కనుక్కున్నాం',
+'parser-unstrip-recursion-limit' => 'Unstrip రికర్షన్ పరిమితిని దాటింది ($1)',
+'converter-manual-rule-error' => 'మానవిక భాషాంతరీకరణ పరికరంలో లోపాన్ని కనుక్కున్నాం',
 
 # "Undo" feature
 'undo-success' => 'దిద్దుబాటును రద్దు చెయ్యవచ్చు. కింది పోలికను చూసి, మీరు చెయ్యదలచినది ఇదేనని నిర్ధారించుకోండి. ఆ తరువాత మార్పులను భద్రపరచి దిద్దుబాటు రద్దును పూర్తి చెయ్యండి.',
 'undo-failure' => 'మధ్యలో జరిగిన దిద్దుబాట్లతో తలెత్తిన ఘర్షణ కారణంగా ఈ దిద్దుబాటును రద్దు చెయ్యలేక పోయాం.',
-'undo-norev' => 'ఈ దిద్దుబాటును అసలు లేకపోవటం వలన, లేదా తొలగించేయడం వలన రద్దుచేయలేకపోతున్నాం.',
-'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|చర్చ]]) దిద్దుబాటు చేసిన కూర్పు $1 ను రద్దు చేసారు',
+'undo-norev' => 'ఈ దిద్దుబాటు అసలు లేకపోవటం వలన గానీ, లేదా తొలగించేయడం వలన గానీ దాన్ని రద్దుచేయలేకపోతున్నాం.',
+'undo-nochange' => 'ఆ మార్పును ఈసరికే రద్దు చేసినట్లుగా కనిపిస్తోంది.',
+'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|చర్చ]]) యొక్క కూర్పు $1 ను రద్దుచెయ్యి',
 'undo-summary-username-hidden' => 'దాచబడిన వాడుకరి చేసిన కూర్పు $1 ని వెనక్కి తిప్పండి',
 
 # Account creation failure
@@ -1018,30 +1031,30 @@ $3 ఇచ్చిన కారణం: ''$2''",
 'viewpagelogs' => 'ఈ పేజీకి సంబంధించిన లాగ్‌లను చూడండి',
 'nohistory' => 'ఈ పేజీకి మార్పుల చరిత్ర లేదు.',
 'currentrev' => 'ప్రస్తుతపు సంచిక',
-'currentrev-asof' => '$1 à°¨à°¾à°\9fà°¿ à°ªà±\8dà°°à°¸à±\8dà°¤à±\81à°¤ కూర్పు',
-'revisionasof' => '$1 à°¨à°¾à°\9fà°¿ à°¸à°\82à°\9aà°¿à°\95',
+'currentrev-asof' => '$1 à°¨à°¾à°\9fà°¿ à°\9aà°¿à°\9fà±\8dà°\9fà°\9aివరి కూర్పు',
+'revisionasof' => '$1 à°¨à°¾à°\9fà°¿ à°\95à±\82à°°à±\8dà°ªà±\81',
 'revision-info' => '$1 నాటి కూర్పు. రచయిత: $2',
 'previousrevision' => '← పాత కూర్పు',
-'nextrevision' => 'à°¦à±\80ని à°¤à°°à±\81వాతి à°¸à°\82à°\9aà°¿à°\95→',
-'currentrevisionlink' => 'ప్రస్తుతపు సంచిక',
+'nextrevision' => 'తరà±\81వాతి à°\95à±\82à°°à±\8dà°ªà±\81 →',
+'currentrevisionlink' => 'ప్రస్తుత కూర్పు',
 'cur' => 'ప్రస్తుత',
-'next' => 'తరà±\8dవాతి',
+'next' => 'తరà±\81వాతి',
 'last' => 'గత',
 'page_first' => 'మొదటి',
 'page_last' => 'చివరి',
 'histlegend' => 'తేడా ఎంపిక: సంచికల యొక్క రేడియో బాక్సులను ఎంచుకొని ఎంటర్‌ నొక్కండి, లేదా పైన/ కింద ఉన్న మీటను నొక్కండి.<br />
-సూచిక: (ప్రస్తుత) = ప్రస్తుత సంచికతో కల తేడాలు, (గత) = ఇంతకు ముందరి సంచికతో గల తేడాలు, చి = చిన్న మార్పు',
-'history-fieldset-title' => 'చరిత్రలో చూడండి',
+సూచిక: <strong>({{int:cur}})</strong> = ప్రస్తుత సంచికతో కల తేడాలు, <strong>({{int:last}})</strong> = ఇంతకు ముందరి సంచికతో గల తేడాలు, <strong>{{int:minoreditletter}}</strong> = చిన్న మార్పు',
+'history-fieldset-title' => 'చరిత్ర చూడండి',
 'history-show-deleted' => 'తొలగించినవి మాత్రమే',
-'histfirst' => 'à°¤à±\8aà°\9fà±\8dà°\9fà°¤à±\8aà°²ి',
-'histlast' => 'à°\9aà°¿à°\9fà±\8dà°\9fà°\9aివరి',
+'histfirst' => 'à°\85తి à°ªà°¾à°¤à°µి',
+'histlast' => 'సరిà°\95à±\8aà°¤à±\8dà°¤',
 'historysize' => '({{PLURAL:$1|ఒక బైటు|$1 బైట్లు}})',
 'historyempty' => '(ఖాళీ)',
 
 # Revision feed
 'history-feed-title' => 'కూర్పుల చరిత్ర',
 'history-feed-description' => 'ఈ పేజీకి వికీలో కూర్పుల చరిత్ర',
-'history-feed-item-nocomment' => '$2 à°µà°¦à±\8dà°¦ à°\89à°¨à±\8dà°¨ $1',
+'history-feed-item-nocomment' => '$2 న $1',
 'history-feed-empty' => 'మీరడిగిన పేజీ లేదు.
 దాన్ని వికీలోంచి తొలగించి ఉండొచ్చు, లేదా పేరు మార్చి ఉండొచ్చు.
 సంబంధిత కొత్త పేజీల కోసం [[Special:Search|వికీలో వెతికి చూడండి]].',
@@ -1051,8 +1064,8 @@ $3 ఇచ్చిన కారణం: ''$2''",
 'rev-deleted-user' => '(వాడుకరి పేరుని తొలగించారు)',
 'rev-deleted-event' => '(దినచర్యని తొలగించాం)',
 'rev-deleted-user-contribs' => '[వాడుకరిపేరు లేదా ఐపీ చిరునామాని తొలగించారు  - మార్పుచేర్పుల నుండి మార్పుని దాచారు]',
-'rev-deleted-text-permission' => "ఈ పేజీ కూర్పుని '''తొలగించారు'''.
-[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81 à°\9aà°¿à°\9fà±\8dà°\9fà°¾]à°²à±\8b à°ªà±\82à°°à±\8dతి à°µà°¿à°µà°°à°¾à°²à±\81 à°\89à°\82à°¡à°µà°\9aà±\8dà°\9aà±\81.",
+'rev-deleted-text-permission' => 'ఈ పేజీ కూర్పుని <strong>తొలగించారు</strong>.
+[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81 à°\9aà°¿à°\9fà±\8dà°\9fà°¾]à°²à±\8b à°ªà±\82à°°à±\8dతి à°µà°¿à°µà°°à°¾à°²à±\81 à°\9aà±\82à°¡à°µà°\9aà±\8dà°\9aà±\81.',
 'rev-deleted-text-unhide' => "పేజీ యొక్క ఈ కూర్పును '''తొలగించాం'''.
 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} తొలగింపు చిట్టా]లో వివరాలు చూడవచ్చు.
 మీరు కావాలనుకుంటే, [$1 ఈ కూర్పుని చూడవచ్చు].",
@@ -1063,8 +1076,8 @@ $3 ఇచ్చిన కారణం: ''$2''",
 మీరు దాన్ని చూడవచ్చు; [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} తొలగింపు చిట్టా]లో వివరాలు దొరుకుతాయి.',
 'rev-suppressed-text-view' => 'ఈ పేజీకూర్పును <strong>అణచి పెట్టాం</strong>.
 మీరు దాన్ని చూడవచ్చు; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} అణచివేత చిట్టా]లోవివరాలు ఉంటాయి.',
-'rev-deleted-no-diff' => "మీరు తేడాలను చూడలేదు ఎందుకంటే ఒక కూర్పుని '''తొలగించారు'''.
-[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81 à°\9aà°¿à°\9fà±\8dà°\9fà°¾]à°²à±\8b à°µà°¿à°µà°°à°¾à°²à±\81 à°\89à°\82à°¡à°µà°\9aà±\8dà°\9aà±\81.",
+'rev-deleted-no-diff' => 'మీరు ఈ తేడాను చూడలేరు. ఎందుకంటే ఒక కూర్పు <strong>తొలగించబడింది</strong>.
+[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81 à°\9aà°¿à°\9fà±\8dà°\9fà°¾]à°²à±\8b à°µà°¿à°µà°°à°¾à°²à±\81 à°\9aà±\82à°¡à°µà°\9aà±\8dà°\9aà±\81.',
 'rev-suppressed-no-diff' => "ఈ తేడాని మీరు చూడలేరు ఎందుకంటే ఒక కూర్పుని '''తొలగించారు'''.",
 'rev-deleted-unhide-diff' => 'ఈ తేడాల యొక్క కూర్పులలో ఒకదాన్ని <strong>తొలగించారు</strong>.
 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} తొలగింపు చిట్టా]లో వివరాలు ఉంటాయి.
@@ -1076,29 +1089,29 @@ $3 ఇచ్చిన కారణం: ''$2''",
 మీరు ఈ తేడాను చూడవచ్చు; [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} తొలగింపు చిట్టా]లోవివరాలు ఉంటాయి.',
 'rev-suppressed-diff-view' => 'ఈ తేడా లోని ఒక కూర్పును <strong>అణచి పెట్టాం</strong>.
 మీరు ఈ తేడాను చూడవచ్చు; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} అణచివేత చిట్టా]లోవివరాలు ఉంటాయి.',
-'rev-delundel' => 'à°\9aà±\82పిà°\82à°\9aà±\81/దాచు',
+'rev-delundel' => 'à°¦à±\83à°¶à±\8dయతనà±\81 à°®à°¾à°°à±\8dచు',
 'rev-showdeleted' => 'చూపించు',
 'revisiondelete' => 'కూర్పులను తొలగించు/తొలగింపును రద్దుచెయ్యి',
 'revdelete-nooldid-title' => 'తప్పుడు లక్ష్యపు కూర్పు',
 'revdelete-nooldid-text' => 'ఈ పని ఏ కూర్పు లేదా కూర్పుల మీద చెయ్యాలో మీరు సూచించలేదు, లేదా మీరు సూచించిన కూర్పు లేదు, లేదా ప్రస్తుత కూర్పునే దాచాలని ప్రయత్నిస్తున్నారు.',
-'revdelete-no-file' => 'à°\86 à°ªà±\87à°°à±\8dà°\95à±\8aà°¨à±\8dà°¨ à°«à±\88à°²à±\81 à°\89నిà°\95à°¿à°²à±\8b à°²à±\87à°¦à±\81.',
+'revdelete-no-file' => 'పేర్కొన్న ఫైలు ఉనికిలో లేదు.',
 'revdelete-show-file-confirm' => 'మీరు నిజంగానే "<nowiki>$1</nowiki>"  ఫైలు యొక్క $2 $3 నాటి తొలగించిన కూర్పుని చూడాలనుకుంటున్నారా?',
 'revdelete-show-file-submit' => 'అవును',
-'revdelete-selected' => "'''[[:$1]] యొక్క {{PLURAL:$2|ఎంచుకున్న కూర్పు|ఎంచుకున్న కూర్పులు}}:'''",
-'logdelete-selected' => "'''{{PLURAL:$1|ఎంచుకున్న చిట్టా ఘటన|ఎంచుకున్న చిట్టా ఘటనలు}}:'''",
-'revdelete-text' => "'''తొలగించిన కూర్పులు, ఘటనలూ పేజీ చరితం లోనూ, చిట్టాలలోనూ కనిపిస్తాయి, కానీ వాటిలో కొన్ని భాగాలు సార్వజనికంగా అందుబాటులో ఉండవు.'''
-{{SITENAME}} à°²à±\8bని à°\87తర à°¨à°¿à°°à±\8dవాహà°\95à±\81à°²à±\81 à°\86 à°¦à°¾à°\9aà°¿à°¨ à°­à°¾à°\97ాలనà±\81 à°\9aà±\82à°¡à°\97లరà±\81 à°®à°°à°¿à°¯à±\81 (à°\8fవిధమà±\88à°¨ à°¨à°¿à°¯à°\82à°¤à±\8dరణలà±\82 à°²à±\87à°\95à±\81à°\82à°\9fà±\87) à°\87à°¦à±\87 à°\85à°\82తరవరà±\8dతి à°¦à±\8dవారా à°µà°¾à°\9fిని à°ªà±\81నసà±\8dథాపిà°\82à°\9aà°\97లరà±\81.",
-'revdelete-confirm' => 'à°®à±\80à°°à±\81 à°¦à±\80à°¨à±\8dని à°\9aà±\87à°¯à°\97à±\8bà°°à±\81à°¤à±\81à°¨à±\8dనారనà±\80, à°¦à±\80ని à°ªà°°à±\8dయవసానాలà±\81 à°®à±\80à°\95à±\81 à°¤à±\86à°²à±\81à°¸à±\81ననà±\80, à°®à°°à°¿à°¯à±\81 à°®à±\80à°°à±\81 à°¦à±\80à°¨à±\8dని [[{{MediaWiki:Policy-url}}|విధానà°\82]] à°ªà±\8dà°°à°\95ారమà±\87 à°\9aà±\87à°¸à±\8dà°¤à±\81à°¨à±\8dనారనà±\80 à°¦à°¯à°\9aà±\87సి నిర్ధారించండి.',
+'revdelete-selected' => '<strong>[[:$1]] యొక్క {{PLURAL:$2|ఎంచుకున్న కూర్పు|ఎంచుకున్న కూర్పులు}}:</strong>',
+'logdelete-selected' => '<strong>{{PLURAL:$1|ఎంచుకున్న చిట్టా ఘటన|ఎంచుకున్న చిట్టా ఘటనలు}}:</strong>',
+'revdelete-text' => '<strong>తొలగించిన కూర్పులు, ఘటనలూ పేజీ చరితం లోనూ, చిట్టాలలోనూ కనిపిస్తాయి, కానీ వాటిలో కొన్ని భాగాలు సార్వజనికంగా అందుబాటులో ఉండవు.</strong>
+{{SITENAME}} à°²à±\8bని à°\87తర à°¨à°¿à°°à±\8dవాహà°\95à±\81à°²à±\81 à°\86 à°¦à°¾à°\9aà°¿à°¨ à°­à°¾à°\97ాలనà±\81 à°\9aà±\82à°¡à°\97లరà±\81 à°®à°°à°¿à°¯à±\81 (à°\87తర à°¨à°¿à°¯à°\82à°¤à±\8dరణలà±\87à°®à±\80 à°²à±\87à°\95à°ªà±\8bà°¤à±\87) à°\85à°¦à±\87 à°\85à°\82తరవరà±\8dతి à°¦à±\8dవారా à°µà°¾à°\9fిని à°ªà±\81నసà±\8dథాపిà°\82à°\9aà°\97లరà±\81.',
+'revdelete-confirm' => 'à°®à±\80à°°à±\81 à°¦à±\80à°¨à±\8dని à°\9aà±\87à°¯à°\97à±\8bà°°à±\81à°¤à±\81à°¨à±\8dనారనà±\80, à°¦à±\80ని à°ªà°°à±\8dయవసానాలà±\81 à°®à±\80à°\95à±\81 à°¤à±\86à°²à±\81à°¸à±\81ననà±\80, à°¦à±\80à°¨à±\8dని à°¸à°\82à°¬à°\82ధిత [[{{MediaWiki:Policy-url}}|విధానà°\82]] à°ªà±\8dà°°à°\95ారమà±\87 à°\9aà±\87à°¸à±\8dà°¤à±\81à°¨à±\8dనారనà±\80 నిర్ధారించండి.',
 'revdelete-suppress-text' => 'అణచివేతను కింది సందర్భాలలో <strong>మాత్రమే</strong> వాడాలి:
 * బురదజల్లే ధోరణిలో ఉన్న సమాచారం
 * అనుచితమైన వ్యక్తిగత సమాచారం
 *<em>ఇంటి చిరునామాలు, టెలిఫోను నంబర్లు, జాతీయ ఐడీ నంబర్లు, వగైరాలు</em>',
 'revdelete-legend' => 'సందర్శక నిబంధనలు అమర్చు',
-'revdelete-hide-text' => 'à°ªà±\81à°¨à°\83పరిశà±\80లన పాఠ్యం',
+'revdelete-hide-text' => 'à°\95à±\82à°°à±\8dà°ªà±\81 పాఠ్యం',
 'revdelete-hide-image' => 'ఫైలులోని విషయాన్ని దాచు',
 'revdelete-hide-name' => 'చర్యను, లక్ష్యాన్నీ దాచు',
 'revdelete-hide-comment' => 'దిద్దుబాటు సారాంశం',
-'revdelete-hide-user' => 'దిద్దుబాటు చేసినవారి వాడుకరి పేరు/ఐపీ చిరునామా',
+'revdelete-hide-user' => 'దిద్దుబాటు చేసిన వాడుకరి పేరు/ఐపీ చిరునామా',
 'revdelete-hide-restricted' => 'డేటాను అందరిలాగే నిర్వాహకులకు కూడా కనబడనివ్వకు',
 'revdelete-radio-same' => '(మార్చకు)',
 'revdelete-radio-set' => 'దాచు',
@@ -1107,10 +1120,10 @@ $3 ఇచ్చిన కారణం: ''$2''",
 'revdelete-unsuppress' => 'పునస్థాపిత కూర్పులపై నిబంధనలను తీసివెయ్యి',
 'revdelete-log' => 'కారణం:',
 'revdelete-submit' => 'ఎంచుకున్న {{PLURAL:$1|కూర్పుకు|కూర్పులకు}} ఆపాదించు',
-'revdelete-success' => "'''కూర్పు కనబడే విధానాన్ని జయప్రదంగా తాజాకరించాం.'''",
-'revdelete-failure' => "'''కూర్పు కనబడే పద్ధతిని తాజాపరచలేకపోయాం:'''
-$1",
-'logdelete-success' => "'''ఘటన కనబడే విధానాన్ని జయప్రదంగా సెట్ చేసాం.'''",
+'revdelete-success' => '<strong>కూర్పు కనబడే విధానాన్ని జయప్రదంగా తాజాకరించాం.</strong>',
+'revdelete-failure' => '<strong>కూర్పు కనబడే పద్ధతిని తాజాపరచలేకపోయాం:</strong>
+$1',
+'logdelete-success' => '<strong>ఘటన కనబడే విధానాన్ని జయప్రదంగా సెట్ చేసాం.</strong>',
 'logdelete-failure' => "'''చిట్టా కనబడే పద్ధతిని అమర్చలేకపోయాం:'''
 $1",
 'revdel-restore' => 'దృశ్యతని మార్చు',
@@ -1125,7 +1138,7 @@ $1",
 'revdelete-modify-missing' => '$1 అంశాన్ని మార్చడంలో లోపం దొర్లింది: ఇది డేటాబేసులో కనబడలేదు!',
 'revdelete-no-change' => "'''హెచ్చరిక:''' $2, $1 నాటి అంశానికి మీరడిగిన చూపు అమరికలన్నీ ఈసరికే ఉన్నాయి.",
 'revdelete-concurrent-change' => '$2, $1 నాటి అంశాన్ని మార్చడంలో లోపం దొర్లింది: మీరు మార్చడానికి ప్రయత్నించిన సమయంలోనే వేరొకరు దాని స్థితిని మార్చినట్లుగా కనిపిస్తోంది. ఓసారి లాగ్‌లను చూడండి.',
-'revdelete-only-restricted' => '$2, $1 తేదీ గల అంశాన్ని దాచడంలో పొరపాటు: ఇతర దృశ్యత వికల్పాల్లోంచి ఒకదాన్ని ఎంచుకోకుండా అంశాలని నిర్వాహకులకు కనబడకుండా అణచివెయ్యలేరు.',
+'revdelete-only-restricted' => '$1 $2 తేదీ గల అంశాన్ని దాచడంలో లోపం: ఇతర దృశ్యత వికల్పాల్లోంచి ఒకదాన్ని ఎంచుకోకుండా నిర్వాహకులకు కనబడకుండా అంశాలను అణచిపెట్టలేరు.',
 'revdelete-reason-dropdown' => '*సాధారణ తొలగింపు కారణాలు
 ** కాపీహక్కుల ఉల్లంఘన
 ** అసంబద్ధ వ్యాఖ్య లేదా వ్యక్తిగత సమాచారం
@@ -1165,43 +1178,43 @@ $1",
 'mergehistory-reason' => 'కారణం:',
 
 # Merge log
-'mergelog' => 'à°µà±\80లీనాల చిట్టా',
+'mergelog' => 'విలీనాల చిట్టా',
 'pagemerge-logentry' => '[[$1]] ను [[$2]] లోకి విలీనం చేసాం ($3 కూర్పు దాకా)',
 'revertmerge' => 'విలీనాన్ని రద్దుచెయ్యి',
 'mergelogpagetext' => 'ఒక పేజీ చరితాన్ని మరో పేజీ చరితం లోకి ఇటీవల చేసిన విలీనాల జాబితా ఇది.',
 
 # Diffs
 'history-title' => '"$1" యొక్క కూర్పుల చరిత్ర',
-'difference-title' => '"$1" à°¯à±\8aà°\95à±\8dà°\95 à°¤à°¿à°°à°¿à°\97à°¿à°\9aà±\82à°ªà±\81à°² à°¨à°¡à±\81à°® తేడాలు',
+'difference-title' => '"$1" à°¯à±\8aà°\95à±\8dà°\95 à°\95à±\82à°°à±\8dà°ªà±\81à°² à°®à°§à±\8dà°¯ తేడాలు',
 'difference-title-multipage' => '"$1" మరియు "$2" పేజీల మధ్య తేడా',
 'difference-multipage' => '(పేజీల మధ్య తేడా)',
 'lineno' => 'పంక్తి $1:',
 'compareselectedversions' => 'ఎంచుకున్న సంచికలను పోల్చిచూడు',
 'showhideselectedversions' => 'ఎంచుకున్న కూర్పులను చూపించు/దాచు',
-'editundo' => 'మారà±\8dà°ªà±\81ని à°°à°¦à±\8dà°¦à±\81à°\9aà±\86à°¯à±\8dయి',
+'editundo' => 'రద్దుచెయ్యి',
 'diff-empty' => '(తేడా లేదు)',
 'diff-multi-sameuser' => '(ఇదే వాడుకరి యొక్క {{PLURAL:$1|ఒక మధ్యంతర కూర్పును|$1 మధ్యంతర కూర్పులను}} చూపించలేదు)',
 'diff-multi-otherusers' => '({{PLURAL:$2|మరో వాడుకరి|$2 వాడుకరుల}} యొక్క {{PLURAL:$1|ఒక మధ్యంతర కూర్పును|$1 మధ్యంతర కూర్పులను}} చూపించలేదు)',
-'diff-multi-manyusers' => '$2 à°®à°\82ది à°ªà±\88à°¨ ({{PLURAL:$2|ఒక వాడుకరి|వాడుకరుల}} యొక్క {{PLURAL:$1|ఒక మధ్యంతర కూర్పును|$1 మధ్యంతర కూర్పులను}} చూపించట్లేదు)',
+'diff-multi-manyusers' => '$2 à°\95à°\82à°\9fà±\87 à°\8eà°\95à±\8dà°\95à±\81à°µ ({{PLURAL:$2|ఒక వాడుకరి|వాడుకరుల}} యొక్క {{PLURAL:$1|ఒక మధ్యంతర కూర్పును|$1 మధ్యంతర కూర్పులను}} చూపించట్లేదు)',
 'difference-missing-revision' => 'ఈ తేడా ($1) యొక్క {{PLURAL:$2|ఒక కూర్పు|$2 కూర్పులు}} {{PLURAL:$2|కనబడలేదు}}.
 
 సాధారణంగా, తొలగించబడిన పేజీ యొక్క కాలం చెల్లిన ’తేడా’ లింకును నొక్కినపుడు ఇది జరుగుతుంది. 
 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} తొలగింపు లాగ్] లో వివరాలు ఉంటాయి.',
 
 # Search results
-'searchresults' => 'à°µà±\86à°¦ుకులాట ఫలితాలు',
-'searchresults-title' => '"$1"కి అన్వేషణ ఫలితాలు',
-'toomanymatches' => 'à°\9aాలా పోలికలు వచ్చాయి, దయచేసి మరో ప్రశ్నని ప్రయత్నించండి',
+'searchresults' => 'à°µà±\86à°¤ుకులాట ఫలితాలు',
+'searchresults-title' => '"$1" కి వెతుకులాట ఫలితాలు',
+'toomanymatches' => 'మరà±\80 à°\8eà°\95à±\8dà°\95à±\81à°µ పోలికలు వచ్చాయి, దయచేసి మరో ప్రశ్నని ప్రయత్నించండి',
 'titlematches' => 'వ్యాస శీర్షిక సరిపోయింది',
 'textmatches' => 'పేజిలోని పాఠం సరిపోలింది',
 'notextmatches' => 'పేజీ పాఠ్యమేదీ సరిపోలడం లేదు',
-'prevn' => 'à°\95à±\8dà°°à°¿à°¤à°\82 {{PLURAL:$1|$1}}',
+'prevn' => 'à°\97à°¤ {{PLURAL:$1|$1}}',
 'nextn' => 'తరువాతి {{PLURAL:$1|$1}}',
 'prevn-title' => 'గత $1 {{PLURAL:$1|ఫలితం|ఫలితాలు}}',
 'nextn-title' => 'తరువాతి $1 {{PLURAL:$1|ఫలితం|ఫలితాలు}}',
 'shown-title' => 'పేజీకి $1 {{PLURAL:$1|ఫలితాన్ని|ఫలితాలను}} చూపించు',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) చూపించు.',
-'searchmenu-exists' => "'''ఈ వికీలో \"[[:\$1]]\" అనే పేజీ ఉంది'''",
+'searchmenu-exists' => '<strong>ఈ వికీలో "[[:$1]]" అనే పేజీ ఉంది.</strong> {{PLURAL:$2|0=|ఇతర ఫలితాలను కూడా చూడండి.}}',
 'searchmenu-new' => '<strong>ఈ వికీలో "[[:$1]]" అనే పేరుతో పేజీని సృష్టించండి!</strong> {{PLURAL:$2|0=|మీ వెతుకులాటలో దొరికిన పేజీని కూడా చూడండి.|వెతుకులాట ఫలితాలను కూడా చూడండి.}}',
 'searchprofile-articles' => 'విషయపు పేజీలు',
 'searchprofile-project' => 'సహాయం మరియు ప్రాజెక్టు పేజీలు',
@@ -1227,18 +1240,19 @@ $1",
 'searcheverything-enable' => 'అన్ని పేరుబరుల్లో వెతుకు',
 'searchrelated' => 'సంబంధించినవి',
 'searchall' => 'అన్నీ',
-'showingresults' => "కింద ఉన్న {{PLURAL:$1|'''ఒక్క''' ఫలితం|'''$1''' ఫలితాలు}}, #'''$2''' నుండి మొదలుకొని చూపిస్తున్నాం.",
-'showingresultsnum' => "కింద ఉన్న {{PLURAL:$3|'''ఒక్క''' ఫలితం|'''$3''' ఫలితాలు}}, #'''$2''' నుండి మొదలుకొని చూపిస్తున్నాం.",
-'showingresultsheader' => "'''$4''' కొరకై {{PLURAL:$5|'''$3'''లో '''$1''' ఫలితం|'''$3''' ఫలితాల్లో '''$1 - $2''' వరకు}}",
+'showingresults' => '#<strong>$2</strong> నుండి మొదలుకొని {{PLURAL:$1|</strong>ఒక్క</strong> ఫలితాన్ని|<strong>$1</strong> ఫలితాలను}} కింద చూపించాం.',
+'showingresultsinrange' => '#<strong>$2</strong> నుండి  #<strong>$3</strong> వరకు ఉన్న ఫలితాల శ్రేణి నుండి {{PLURAL:$1|<strong>ఒక్క</strong> ఫలితం|<strong>$1</strong> ఫలితాల}} వరకు కింద చూపించాం.',
+'showingresultsnum' => '#<strong>$2</strong> నుండి మొదలుకొని {{PLURAL:$3|<strong>ఒక్క</strong> ఫలితాన్ని|<strong>$3</strong> ఫలితాలను}} కింద చూపించాం.',
+'showingresultsheader' => '<strong>$4</strong> కోసం వచ్చిన ఫలితాలు {{PLURAL:$5|<strong>$3</strong> లో <strong>$1</strong>|</strong>$3</strong> లో <strong>$1 - $2</strong>}}',
 'search-nonefound' => 'మీ ప్రశ్నకి సరిపోలిన ఫలితాలేమీ లేవు.',
 'powersearch-legend' => 'నిశితమైన అన్వేషణ',
 'powersearch-ns' => 'ఈ పేరుబరుల్లో వెతుకు:',
 'powersearch-redir' => 'దారిమార్పులను చూపించు',
-'powersearch-togglelabel' => 'à°\8eà°\82à°\9aà±\81à°\95à±\8bవాలà±\8dసినవి:',
+'powersearch-togglelabel' => 'à°\8eà°\82à°\9aà±\81à°\95à±\8bà°\82à°¡ి:',
 'powersearch-toggleall' => 'అన్నీ',
 'powersearch-togglenone' => 'ఏదీకాదు',
 'search-external' => 'బయటి అన్వేషణ',
-'searchdisabled' => '{{SITENAME}} à°\85à°¨à±\8dà°µà±\87à°·à°£ à°¤à°¾à°¤à±\8dà°\95ాలిà°\95à°\82à°\97à°¾ à°ªà°¨à°¿ à°\9aà±\86à°¯à±\8dయడà°\82 à°²à±\87à°¦à±\81. à°\88à°²à±\8bà°\97à°¾ à°®à±\80à°°à±\81 à°\97à±\82à°\97à±\81à°²à±\8dâ\80\8c à°\89పయà±\8bà°\97à°¿à°\82à°\9aà°¿ à°\85à°¨à±\8dà°µà±\87à°·à°¿à°\82à°\9aà°µà°\9aà±\8dà°\9aà±\81. à°\92à°\95 à°\97మనిà°\95: à°\97à±\82à°\97à±\81à°²à±\8dâ\80\8c à°¦à±\8dవారా à°\95ాలదà±\8bà°·à°\82 à°ªà°\9fà±\8dà°\9fà°¿à°¨ à°«à°²à°¿à°¤à°¾à°²à±\81 à°°à°¾à°µà°¡à°¾à°¨à°¿à°\95à°¿ అవకాశం ఉంది.',
+'searchdisabled' => '{{SITENAME}} à°\85à°¨à±\8dà°µà±\87à°·à°£ à°¤à°¾à°¤à±\8dà°\95ాలిà°\95à°\82à°\97à°¾ à°ªà°¨à°¿ à°\9aà±\86à°¯à±\8dయడà°\82 à°²à±\87à°¦à±\81. à°\88à°²à±\8bà°\97à°¾ à°®à±\80à°°à±\81 à°\97à±\82à°\97à±\81à°²à±\8dâ\80\8c à°\89పయà±\8bà°\97à°¿à°\82à°\9aà°¿ à°\85à°¨à±\8dà°µà±\87à°·à°¿à°\82à°\9aà°µà°\9aà±\8dà°\9aà±\81. à°\97మనిà°\95: à°\97à±\82à°\97à±\81à°²à±\8dâ\80\8c à°µà°¾à°°à°¿ {{SITENAME}} à°«à°²à°¿à°¤à°¾à°²à±\81 à°\95ాలదà±\8bà°·à°\82 à°ªà°\9fà±\8dà°\9fà°¿ à°\89à°\82à°¡à±\87 అవకాశం ఉంది.',
 'search-error' => '$1 కోసం వెతికేటపుడు లోపమేదో దొర్లింది.',
 
 # Preferences page
@@ -1246,37 +1260,37 @@ $1",
 'mypreferences' => 'అభిరుచులు',
 'prefs-edits' => 'దిద్దుబాట్ల సంఖ్య:',
 'prefsnologintext2' => 'మీ అభిరుచులను మార్చుకునేందుకు $1.',
-'prefs-skin' => 'à°\85à°²à°\82à°\95ారà°\82',
-'skin-preview' => 'à°®à±\81à°¨à±\81à°\9cà±\82à°ªà±\81/సరిà°\9aà±\82à°¡à±\81',
+'prefs-skin' => 'à°°à±\82à°ªà±\81',
+'skin-preview' => 'మునుజూడు',
 'datedefault' => 'ఏదైనా పరవాలేదు',
 'prefs-beta' => 'బీటా సౌలభ్యాలు',
 'prefs-datetime' => 'తేదీ, సమయం',
 'prefs-labs' => 'ప్రయోగాత్మక సౌలభ్యాలు',
 'prefs-user-pages' => 'వాడుకరి పేజీలు',
-'prefs-personal' => 'వాడà±\81à°\95à°°à°¿ à°µà°¿à°µà°°à°¾à°²à±\81',
+'prefs-personal' => 'వాడà±\81à°\95à°°à°¿ à°ªà±\8dరవర',
 'prefs-rc' => 'ఇటీవలి మార్పులు',
 'prefs-watchlist' => 'వీక్షణ జాబితా',
 'prefs-watchlist-days' => 'వీక్షణ జాబితాలో చూపించవలసిన రోజులు:',
-'prefs-watchlist-days-max' => '$1 {{PLURAL:$1|రోజు|రోజులు}} గరిష్ఠం',
+'prefs-watchlist-days-max' => 'గరిష్ఠంగా $1 {{PLURAL:$1|రోజు|రోజులు}}',
 'prefs-watchlist-edits' => 'విస్తృత వీక్షణ జాబితాలో చూపించవలసిన దిద్దుబాట్లు:',
 'prefs-watchlist-edits-max' => 'గరిష్ఠ సంఖ్య: 1000',
 'prefs-watchlist-token' => 'వీక్షణాజాబితా టోకెను:',
-'prefs-misc' => 'à°\87తరాలà±\81',
+'prefs-misc' => 'à°\87తరతà±\8dà°°à°¾',
 'prefs-resetpass' => 'సంకేతపదాన్ని మార్చుకోండి',
 'prefs-changeemail' => 'ఈ-మెయిలు చిరునామా మార్పు',
-'prefs-setemail' => 'à°\92à°\95 à°\88-à°®à±\86యిలà±\8d à°\9aà°¿à°°à±\81నామాని à°\85మరà±\8dà°\9aండి',
+'prefs-setemail' => 'à°\93 à°\88à°®à±\86యిలà±\8d à°\9aà°¿à°°à±\81నామా à°\87à°µà±\8dà°µండి',
 'prefs-email' => 'ఈ-మెయిల్ ఎంపికలు',
 'prefs-rendering' => 'రూపురేఖలు',
 'saveprefs' => 'భద్రపరచు',
 'restoreprefs' => 'అప్రమేయ అమరికలను పునఃస్థాపించు (అన్ని విభాగాల్లోనూ)',
-'prefs-editing' => 'మారà±\8dà°ªà±\81à°²ు',
-'rows' => 'వరà±\81సలà±\81',
-'columns' => 'వరుసలు:',
-'searchresultshead' => 'à°\85à°¨à±\8dà°µà±\87à°·à°£',
+'prefs-editing' => 'సవరిసà±\8dà°¤à±\81à°¨à±\8dనారు',
+'rows' => 'à°\85à°¡à±\8dà°¡à±\81 à°µà°°à±\81సలà±\81:',
+'columns' => 'నిలà±\81à°µà±\81 à°µà°°à±\81సలà±\81:',
+'searchresultshead' => 'à°µà±\86à°¤à±\81à°\95à±\81',
 'stub-threshold' => '<a href="#" class="stub">మొలక లింకు</a> ఫార్మాటింగు కొరకు హద్దు (బైట్లు):',
 'stub-threshold-disabled' => 'అచేతనం',
 'recentchangesdays' => 'ఇటీవలి మార్పులు లో చూపించవలసిన రోజులు:',
-'recentchangesdays-max' => '($1 {{PLURAL:$1|రోజు|రోజులు}} గరిష్ఠం)',
+'recentchangesdays-max' => 'గరిష్ఠంగా $1 {{PLURAL:$1|రోజు|రోజులు}}',
 'recentchangescount' => 'అప్రమేయంగా చూపించాల్సిన దిద్దుబాట్ల సంఖ్య:',
 'prefs-help-recentchangescount' => 'ఇది ఇటీవలి మార్పులు, పేజీ చరిత్రలు, మరియు చిట్టాలకు వర్తిస్తుంది.',
 'prefs-help-watchlist-token2' => 'మీ వీక్షణజాబితా యొక్క జాలవడ్డింపుకు చెందిన రహస్య తాళమిది.
@@ -1295,7 +1309,7 @@ $1",
 'timezoneregion-arctic' => 'ఆర్కిటిక్',
 'timezoneregion-asia' => 'ఆసియా',
 'timezoneregion-atlantic' => 'అట్లాంటిక్ మహాసముద్రం',
-'timezoneregion-australia' => 'à°\86à°·్ట్రేలియా',
+'timezoneregion-australia' => 'à°\86à°¸్ట్రేలియా',
 'timezoneregion-europe' => 'ఐరోపా',
 'timezoneregion-indian' => 'హిందూ మహాసముద్రం',
 'timezoneregion-pacific' => 'పసిఫిక్ మహాసముద్రం',
@@ -1307,10 +1321,10 @@ $1",
 'prefs-files' => 'ఫైళ్ళు',
 'prefs-custom-css' => 'ప్రత్యేక CSS',
 'prefs-custom-js' => 'ప్రత్యేక JS',
-'prefs-common-css-js' => 'à°\85à°¨à±\8dని à°\85à°²à°\82à°\95ారాలà°\95à±\88 à°ªà°\82à°\9aà±\81à°\95à±\8bబడిన CSS/JS:',
+'prefs-common-css-js' => 'à°\85à°¨à±\8dని à°°à±\82à°ªà±\81లలà±\8bà°¨à±\82 à°\89à°¨à±\8dన CSS/JS:',
 'prefs-reset-intro' => 'ఈ పేజీలో, మీ అభిరుచులను సైటు డిఫాల్టు విలువలకు మార్చుకోవచ్చు. మళ్ళీ వెనక్కి తీసుకుపోలేరు.',
 'prefs-emailconfirm-label' => 'ఈ-మెయిల్ నిర్ధారణ:',
-'youremail' => 'à°®à±\80 à°\88-à°®à±\86యిలà±\81*',
+'youremail' => 'à°\88à°®à±\86యిలà±\81:',
 'username' => '{{GENDER:$1|వాడుకరి పేరు}}:',
 'uid' => '{{GENDER:$1|వాడుకరి}} ID:',
 'prefs-memberingroups' => 'ఈ {{PLURAL:$1|గుంపులో|గుంపులలో}} {{GENDER:$2|సభ్యుడు|సభ్యురాలు}}:',
@@ -1319,12 +1333,13 @@ $1",
 'yourlanguage' => 'భాష:',
 'yourvariant' => 'విషయపు భాషా వైవిధ్యం:',
 'prefs-help-variant' => 'ఈ వికీ లోని విషయపు పేజీలను చూపించడానికి మీ అభిమత వైవిధ్యం లేదా ఆర్ధోగ్రఫీ.',
-'yournick' => 'à°®à±\81à°¦à±\8dà°¦à±\81 à°ªà±\87à°°à±\81',
+'yournick' => 'à°\95à±\8aà°¤à±\8dà°¤ à°¸à°\82à°¤à°\95à°\82:',
 'prefs-help-signature' => 'చర్చా పేజీల లోని వ్యాఖ్యలకు "<nowiki>~~~~</nowiki>"తో సంతకం చేస్తే అది మీ సంతకం మరియు కాలముద్రగా మారుతుంది.',
-'badsig' => 'సంతకాన్ని సరిగ్గా ఇవ్వలేదు; HTML ట్యాగులను ఒకసారి పరిశీలించండి.',
+'badsig' => 'సంతకం చెల్లనిది.
+HTML ట్యాగులను ఒకసారి సరిచూసుకోండి.',
 'badsiglength' => 'మీ సంతకం చాలా పెద్దగా ఉంది.
 ఇది తప్పనిసరిగా $1 {{PLURAL:$1|అక్షరం|అక్షరాల}} లోపులోనే ఉండాలి.',
-'yourgender' => 'మిమà±\8dమలà±\8dని à°\8eలా à°¸à°\82à°¬à±\8bధిà°\82à°\9aడానిà°\95à°¿ à°\87à°·à±\8dà°\9fపడతారు?',
+'yourgender' => 'మిమà±\8dమలà±\8dని à°®à±\80à°°à±\81 à°\8eలా à°µà°°à±\8dణిà°\82à°\9aà±\81à°\95à±\81à°\82à°\9fారు?',
 'gender-unknown' => 'వెల్లడించడానికి నేను ఇష్టపడట్లేదు',
 'gender-male' => 'అతను వికీ పేజీలను సరిదిద్దుతాడు',
 'gender-female' => 'ఆమె వికీ పేజీలను సరిదిద్దుతుంది',
@@ -1332,18 +1347,19 @@ $1",
 మిమ్మల్ని సంబోధించేప్పుడూ మిమ్మల్ని పేర్కొనేప్పుడూ వ్యాకరణపరంగా సరైన లింగాన్ని  వాడటానికి ఈ విలువ ఉపయోగపడుతుంది.
 ఈ సమాచారం బహిరంగం.',
 'email' => 'ఈ-మెయిలు',
-'prefs-help-realname' => 'అసలు పేరు (తప్పనిసరి కాదు), మీ అసలు పేరు ఇస్తేగనక, మీ రచనలన్నీ మీ అసలు పేరుతోనే గుర్తిస్తూ ఉంటారు.',
-'prefs-help-email' => 'ఈ-మెయిలు చిరునామా ఐచ్చికం, కానీ మీరు సంకేతపదాన్ని మర్చిపోతే కొత్త సంకేతపదాన్ని మీకు పంపించడానికి అవసరమవుతుంది.',
+'prefs-help-realname' => 'అసలు పేరు తప్పనిసరి కాదు. 
+అసలు పేరు ఇస్తే, మీ రచనల శ్రేయస్సు మీ అసలు పేరుకే ఆపాదించబడుతుంది.',
+'prefs-help-email' => 'ఈమెయిలు చిరునామా ఐచ్చికం. కానీ మీరు సంకేతపదాన్ని మర్చిపోతే కొత్త సంకేతపదాన్ని మీకు పంపించడానికి ఇది అవసరం.',
 'prefs-help-email-others' => 'మీ వాడుకరి లేదా చర్చా పేజీలలో ఉండే లంకె ద్వారా ఇతరులు మిమ్మల్ని ఈ-మెయిలు ద్వారా సంప్రదించే వీలుకల్పించవచ్చు.
 ఇతరులు మిమ్మల్ని సంప్రదించినప్పుడు మీ ఈ-మెయిలు చిరునామా బహిర్గతమవదు.',
 'prefs-help-email-required' => 'ఈ-మెయిలు చిరునామా తప్పనిసరి.',
 'prefs-info' => 'ప్రాథమిక సమాచారం',
-'prefs-i18n' => 'అంతర్జాతీకరణ',
+'prefs-i18n' => 'à°\85à°\82తరà±\8dà°\9cాతà±\80à°¯à°\95à°°à°£',
 'prefs-signature' => 'సంతకం',
 'prefs-dateformat' => 'తేదీ ఆకృతి',
-'prefs-timeoffset' => 'సమయ సవరణ',
+'prefs-timeoffset' => 'సమయపు తేడా',
 'prefs-advancedediting' => 'సాధారణ ఎంపికలు',
-'prefs-editor' => 'à°\95à±\82à°°à±\8dపరి',
+'prefs-editor' => 'à°°à°\9aయిత',
 'prefs-preview' => 'మునుజూపు',
 'prefs-advancedrc' => 'ఉన్నత ఎంపికలు',
 'prefs-advancedrendering' => 'ఉన్నత ఎంపికలు',
@@ -1363,22 +1379,22 @@ $1",
 
 # User rights
 'userrights' => 'వాడుకరి హక్కుల నిర్వహణ',
-'userrights-lookup-user' => 'వాడà±\81à°\95à°°à°¿ à°¸à°®à±\82హాలనà±\81 à°¸à°\82భాళించండి',
-'userrights-user-editname' => 'సభà±\8dయనామానà±\8dని ఇవ్వండి:',
+'userrights-lookup-user' => 'వాడà±\81à°\95à°°à°¿ à°¸à°®à±\82హాలనà±\81 à°¨à°¿à°°à±\8dవహించండి',
+'userrights-user-editname' => 'వాడà±\81à°\95à°°à°¿à°ªà±\87à°°à±\81à°¨à±\81 ఇవ్వండి:',
 'editusergroup' => 'వాడుకరి గుంపులను మార్చు',
 'editinguser' => "వాడుకరి '''[[User:$1|$1]]''' $2 యొక్క వాడుకరి హక్కులను మారుస్తున్నారు",
 'userrights-editusergroup' => 'వాడుకరి సమూహాలను మార్చండి',
 'saveusergroups' => 'వాడుకరి గుంపులను భద్రపరచు',
 'userrights-groupsmember' => 'సభ్యులు:',
 'userrights-groupsmember-auto' => 'సంభావిత సభ్యులు:',
-'userrights-groups-help' => 'à°\88 à°µà°¾à°¡à±\81à°\95à°°à°¿ à°\8fà°¯à±\87 à°\97à±\81à°\82à°ªà±\81లలà±\8b à°\89à°\82à°¡à°µà°\9aà±\8dà°\9aో మీరు మార్చవచ్చు.
+'userrights-groups-help' => 'à°\88 à°µà°¾à°¡à±\81à°\95à°°à°¿ à°\8fà°¯à±\87 à°\97à±\81à°\82à°ªà±\81లలà±\8b à°\89à°\82డాలో మీరు మార్చవచ్చు.
 * టిక్కు పెట్టివుంటే ఆ గుంపులో ఈ వాడుకరి ఉన్నట్టు.
 * టిక్కు లేకుంటే ఆ గుంపులో ఈ వాడుకరి లేనట్టు.
-* <nowiki>*</nowiki> ఉంటే ఒకసారి ఆ గుంపుని చేర్చాకా మీరు తీసివేయలేరు, లేదా తీసివేసాకా తిరిగి చేర్చలేరు.',
+* * ఉంటే ఒకసారి ఆ గుంపుని చేర్చాక మీరు తీసివేయలేరు, లేదా తీసివేసాక తిరిగి చేర్చలేరు.',
 'userrights-reason' => 'కారణం:',
 'userrights-no-interwiki' => 'ఇతర వికీలలో వాడుకరి హక్కులను మార్చడానికి మీకు అనుమతి లేదు.',
 'userrights-nodatabase' => '$1 అనే డేటాబేసు లేదు లేదా అది స్థానికం కాదు.',
-'userrights-nologin' => 'వాడà±\81à°\95à°°à°¿ à°¹à°\95à±\8dà°\95à±\81లనà±\81 à°\87à°µà±\8dవడానిà°\95à°¿ à°®à±\80à°°à±\81 à°¤à°ªà±\8dపనిసరిà°\97à°¾ à°\93 à°¨à°¿à°°à±\8dవాహà°\95 à°\96ాతాతà±\8b [[Special:UserLogin|à°²à±\8bనిà°\95à°¿ à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aాలి]].',
+'userrights-nologin' => 'వాడà±\81à°\95à°°à°¿ à°¹à°\95à±\8dà°\95à±\81లనà±\81 à°\87à°µà±\8dవడానిà°\95à°¿ à°®à±\80à°°à±\81 à°¤à°ªà±\8dపనిసరిà°\97à°¾ à°\93 à°¨à°¿à°°à±\8dవాహà°\95 à°\96ాతాతà±\8b [[Special:UserLogin|లాà°\97ినవà±\8dà°µాలి]].',
 'userrights-notallowed' => 'వాడుకరి హక్కులను చేర్చే మరియు తొలగించే అనుమతి మీకు లేదు.',
 'userrights-changeable-col' => 'మీరు మార్చదగిన గుంపులు',
 'userrights-unchangeable-col' => 'మీరు మార్చలేని గుంపులు',
@@ -1406,7 +1422,7 @@ $1",
 'grouppage-autoconfirmed' => '{{ns:project}}:ఆటోమాటిగ్గా నిర్ధారించబడిన వాడుకరులు',
 'grouppage-bot' => '{{ns:project}}:బాట్లు',
 'grouppage-sysop' => '{{ns:project}}:నిర్వాహకులు',
-'grouppage-bureaucrat' => '{{ns:project}}:à°\85ధిà°\95ారà±\8dలు',
+'grouppage-bureaucrat' => '{{ns:project}}:à°\85ధిà°\95ారà±\81లు',
 'grouppage-suppress' => '{{ns:project}}:పూర్తి తొలగింపు',
 
 # Rights
@@ -1425,19 +1441,20 @@ $1",
 'right-reupload' => 'ఇప్పటికే ఉన్న ఫైలును తిరగరాయి',
 'right-reupload-own' => 'తానే ఇదివరలో అప్‌లోడు చేసిన ఫైలును తిరగరాయి',
 'right-reupload-shared' => 'స్థానికంగా ఉమ్మడి మీడియా సొరుగులోని ఫైళ్ళను అధిక్రమించు',
-'right-upload_by_url' => 'URL à°\85à°¡à±\8dà°°à°¸à±\81à°¨à±\81à°\82à°¡à°¿ à°«à±\88à°²à±\81à°¨à±\81 à°\85à°ªà±\8dâ\80\8cà°²à±\8bà°¡à±\81 à°\9aà±\86à°¯à±\8dయి',
+'right-upload_by_url' => 'URL à°\85à°¡à±\8dà°°à°¸à±\81à°¨à±\81à°\82à°¡à°¿ à°«à±\88à°²à±\81à°¨à±\81 à°\85à°ªà±\8dâ\80\8cà°²à±\8bà°¡à±\81 à°\9aà±\86à°¯à±\8dయడà°\82',
 'right-purge' => 'పేజీకి సంబంధించిన సైటు కాషెను, నిర్ధారణ కోరకుండానే తొలగించు',
 'right-autoconfirmed' => 'ఐపీ ఆధారిత రేటు పరిమితులు ప్రభావం చూపవు',
 'right-bot' => 'ఆటోమాటిక్ ప్రాసెస్ లాగా భావించబడు',
-'right-nominornewtalk' => 'à°\9aà°°à±\8dà°\9aà°¾ à°ªà±\87à°\9cà±\80à°²à±\8dà°²à±\8b à°\9cà°°à°¿à°\97à°¿à°¨ à°\85తి à°\9aà°¿à°¨à±\8dà°¨ à°®à°¾à°°à±\8dà°ªà±\81à°²à°\95à±\81 à°\95à±\8aà°¤à±\8dతసà°\82à°¦à±\87శమà±\81 à°µà°\9aà±\8dà°\9aà°¿à°\82దనà±\8dà°¨ à°¸à±\82à°\9aà°¨ à°\9aà±\86à°¯à±\8dయవదà±\8dదు',
-'right-apihighlimits' => 'API à°ªà±\8dà°°à°¶à±\8dనలà±\8dà°²à±\8b à°\89à°¨à±\8dనత à°ªà°°à°¿à°®à°¿à°¤à±\81లనà±\81 à°µà°¾à°¡à±\81',
+'right-nominornewtalk' => 'à°\9aà°°à±\8dà°\9aà°¾ à°ªà±\87à°\9cà±\80à°²à±\8dà°²à±\8b à°\9aà±\87à°¸à±\87 à°\9aà°¿à°¨à±\8dà°¨ à°®à°¾à°°à±\8dà°ªà±\81à°²à°\95à±\81 à°\95à±\8aà°¤à±\8dతసà°\82à°¦à±\87శపà±\81 à°¸à±\82à°\9aà°¨ à°ªà°\82à°ªà°\95à±\82à°¡దు',
+'right-apihighlimits' => 'API à°ªà±\8dà°°à°¶à±\8dనలà±\8dà°²à±\8b à°\89à°¨à±\8dనత à°ªà°°à°¿à°®à°¿à°¤à±\81లనà±\81 à°µà°¾à°¡à°¡à°\82',
 'right-writeapi' => 'రైట్ API వినియోగం',
 'right-delete' => 'పేజీలను తొలగించడం',
 'right-bigdelete' => 'చాలా పెద్ద చరితం ఉన్న పేజీలను తొలగించు',
+'right-deletelogentry' => 'లాగ్ ఎంట్రీలను తొలగించడం, తొలగింపులను రద్దు చెయ్యడం',
 'right-deleterevision' => 'పేజీల ప్రత్యేకించిన కూర్పులను తొలగించు, తొలగింపును నివారించు',
 'right-deletedhistory' => 'తొలగింపులను, వాటి పాఠ్యం లేకుండా, చరితంలో చూడు',
 'right-deletedtext' => 'తొలగించిన పాఠ్యాన్ని మరియు తొలగించిన కూర్పుల మధ్య మార్పలని చూడగలగడం',
-'right-browsearchive' => 'à°¤à±\8aà°²à°\97à°¿à°\82à°\9aà°¿à°¨ à°ªà±\87à°\9cà±\80లనà±\81 à°µà±\86à°¤à±\81à°\95à±\81',
+'right-browsearchive' => 'à°¤à±\8aà°²à°\97à°¿à°\82à°\9aà°¿à°¨ à°ªà±\87à°\9cà±\80à°²à±\8dà°²à±\8b à°µà±\86à°¤à°\95à°¡à°\82',
 'right-undelete' => 'పేజీ తొలగింపును రద్దు చెయ్యి',
 'right-suppressrevision' => 'నిర్వాహకులకు కనబడకుండా ఉన్న కూర్పులను సమీక్షించి పునస్థాపించడం',
 'right-suppressionlog' => 'గోప్యంగా ఉన్న లాగ్‌లను చూడడం',
@@ -1452,8 +1469,8 @@ $1",
 'right-editsemiprotected' => '"{{int:protect-level-autoconfirmed}}" గా సంరక్షించబడ్డ పేజీలను మార్చు',
 'right-editinterface' => 'యూజరు ఇంటరుఫేసులో దిద్దుబాటు చెయ్యి',
 'right-editusercssjs' => 'ఇతర వాడుకరుల CSS, JS ఫైళ్ళలో దిద్దుబాటు చెయ్యి',
-'right-editusercss' => 'à°\87తర à°µà°¾à°¡à±\81à°\95à°°à±\81à°² CSS à°«à±\88à°³à±\8dళలà±\8b à°¦à°¿à°¦à±\8dà°¦à±\81బాà°\9fà±\81 à°\9aà±\86à°¯à±\8dయి',
-'right-edituserjs' => 'à°\87తర à°µà°¾à°¡à±\81à°\95à°°à±\81à°² JS à°«à±\88à°³à±\8dళలà±\8b à°¦à°¿à°¦à±\8dà°¦à±\81బాà°\9fà±\81 à°\9aà±\86à°¯à±\8dయి',
+'right-editusercss' => 'à°\87తర à°µà°¾à°¡à±\81à°\95à°°à±\81à°² CSS à°«à±\88à°³à±\8dళలà±\8b à°¦à°¿à°¦à±\8dà°¦à±\81బాà°\9fà±\81 à°\9aà±\86à°¯à±\8dయడà°\82',
+'right-edituserjs' => 'à°\87తర à°µà°¾à°¡à±\81à°\95à°°à±\81à°² JS à°«à±\88à°³à±\8dళలà±\8b à°¦à°¿à°¦à±\8dà°¦à±\81బాà°\9fà±\81 à°\9aà±\86à°¯à±\8dయడà°\82',
 'right-editmyusercss' => 'మీ స్వంత వాడుకరి CSS ఫైళ్ళను సరిదిద్దండి',
 'right-editmyuserjs' => 'మీ స్వంత JavaScript దస్త్రాలను మార్చండి',
 'right-viewmywatchlist' => 'మీ స్వంత వీక్షణజాబితాను చూడండి',
@@ -1461,22 +1478,22 @@ $1",
 'right-viewmyprivateinfo' => 'మీ స్వంత గోపనీయ డేటాను చూడండి (ఉదా: ఈమెయిలు చిరునామా, అసలు పేరు)',
 'right-editmyprivateinfo' => 'మీ స్వంత గోపనీయ డేటాను మార్చుకోండి (ఉదా: ఈమెయిలు చిరునామా, అసలు పేరు)',
 'right-editmyoptions' => 'మీ స్వంత అభిరుచులను మార్చుకోండి',
-'right-rollback' => 'à°\92à°\95ానà±\8aà°\95 à°ªà±\87à°\9cà±\80à°²à±\8b à°\9aివరి à°¦à°¿à°¦à±\8dà°¦à±\81బాà°\9fà±\81 à°\9aà±\87సిన à°µà°¾à°¡à±\81à°\95à°°à°¿ à°\9aà±\87సిన à°¦à°¿à°¦à±\8dà°¦à±\81బాà°\9fà±\8dలనà±\81 à°°à°¦à±\8dà°¦à±\81à°\9aà±\87యి',
+'right-rollback' => 'à°\92à°\95ానà±\8aà°\95 à°ªà±\87à°\9cà±\80à°²à±\8b à°\9aివరి à°¦à°¿à°¦à±\8dà°¦à±\81బాà°\9fà±\81 à°\9aà±\87సిన à°µà°¾à°¡à±\81à°\95à°°à°¿ à°\9aà±\87సిన à°¦à°¿à°¦à±\8dà°¦à±\81బాà°\9fà±\8dలనà±\81 à°°à°¦à±\8dà°¦à±\81à°\9aà±\87యడà°\82',
 'right-markbotedits' => 'వెనక్కి తెచ్చిన దిద్దుబాట్లను బాట్ దిద్దుబాట్లుగా గుర్తించు',
 'right-noratelimit' => 'రేటు పరిమితులు ప్రభావం చూపవు',
-'right-import' => 'ఇతర వికీల నుండి పేజీలను దిగుమతి చేసుకో',
-'right-importupload' => 'à°«à±\88à°²à±\81 à°\85à°ªà±\8dâ\80\8cà°²à±\8bà°¡à±\81 à°¨à±\81à°\82à°¡à°¿ à°ªà±\87à°\9cà±\80లనà±\81 à°¦à°¿à°\97à±\81మతి à°\9aà±\87à°¸à±\81à°\95à±\8b',
+'right-import' => 'ఇతర వికీల నుండి పేజీలను దిగుమతి చేసుకోవడం',
+'right-importupload' => 'à°«à±\88à°²à±\81 à°\8eà°\95à±\8dà°\95à°¿à°\82à°ªà±\81 à°¨à±\81à°\82à°¡à°¿ à°ªà±\87à°\9cà±\80లనà±\81 à°¦à°¿à°\97à±\81మతి à°\9aà±\87à°¸à±\81à°\95à±\8bవడà°\82',
 'right-patrol' => 'ఇతరుల దిద్దుబాట్లను నిఘాలో ఉన్నట్లుగా గుర్తించు',
 'right-autopatrol' => 'తానే చేసిన మార్పులను నిఘాలో ఉన్నట్లుగా ఆటోమాటిగా గుర్తించు',
 'right-patrolmarks' => 'ఇటీవలి మార్పుల నిఘా గుర్తింపులను చూడు',
 'right-unwatchedpages' => 'వీక్షణలో లేని పేజీల జాబితాను చూడు',
-'right-mergehistory' => 'à°ªà±\87à°\9cà±\80à°² à°¯à±\8aà°\95à±\8dà°\95 à°\9aà°°à°¿à°¤à±\8dరలని à°µà°¿à°²à±\80à°¨à°\82 à°\9aà±\87à°¯à°\97à°²à°\97à°¡à°\82',
+'right-mergehistory' => 'పేజీల యొక్క చరిత్రలని విలీనం చేయడం',
 'right-userrights' => 'వాడుకరులందరి హక్కులను మార్చు',
 'right-userrights-interwiki' => 'ఇతర వికీల్లోని వాడుకరుల హక్కులను మార్చు',
 'right-siteadmin' => 'డేటాబేసును లాక్, అన్‌లాక్ చెయ్యి',
 'right-override-export-depth' => '5 లింకుల లోతు వరకు ఉన్న పేజీలతో సహా, పేజీలను ఎగుమతి చెయ్యి',
-'right-sendemail' => 'à°\87తర à°µà°¾à°¡à±\81à°\95à°°à±\81à°²à°\95à±\81 à°\88-à°®à±\86యిలà±\81 à°ªà°\82పిà°\82à°\9aà°\97à°²à°\97à°¡à°\82',
-'right-passwordreset' => 'à°¸à°\82à°\95à±\87తపదానà±\8dని à°ªà±\81నరà±\81à°¦à±\8dధరిà°\82à°\9aà°¿à°¨ à°\88-à°®à±\86యిళà±\8dà°³à±\81',
+'right-sendemail' => 'ఇతర వాడుకరులకు ఈ-మెయిలు పంపించడం',
+'right-passwordreset' => 'à°¸à°\82à°\95à±\87తపదà°\82 à°®à°¾à°°à±\8dà°ªà±\81 à°\88à°®à±\86యిళà±\8dళనà±\81 à°\9aà±\82à°¡à°¡à°\82',
 
 # Special:Log/newusers
 'newuserlogpage' => 'కొత్త వాడుకరుల చిట్టా',
@@ -1487,15 +1504,15 @@ $1",
 'rightslogtext' => 'ఇది వాడుకరుల హక్కులకు జరిగిన మార్పుల చిట్టా.',
 
 # Associated actions - in the sentence "You do not have permission to X"
-'action-read' => 'à°\88 à°ªà±\87à°\9cà±\80ని à°\9aదవà°\82à°¡à°¿',
+'action-read' => 'à°\88 à°ªà±\87à°\9cà±\80ని à°\9aదివà±\87',
 'action-edit' => 'ఈ పేజీని సవరించే',
 'action-createpage' => 'పేజీలను సృష్టించే',
 'action-createtalk' => 'చర్చాపేజీలను సృష్టించే',
 'action-createaccount' => 'ఈ వాడుకరి ఖాతాని సృష్టించే',
-'action-minoredit' => 'à°\88 à°®à°¾à°°à±\8dà°ªà±\81ని à°\9aà°¿à°¨à±\8dనదానిà°\97à°¾ à°\97à±\81à°°à±\8dతిà°\82à°\9aà±\87',
+'action-minoredit' => 'ఈ మార్పుని చిన్నదిగా గుర్తించే',
 'action-move' => 'ఈ పేజీని తరలించే',
-'action-move-subpages' => 'ఈ పేజీని మరియు దీని ఉపపేజీలను తరలించే',
-'action-move-rootuserpages' => 'à°ªà±\8dరధాన à°µà°¾à°¡à±\81à°\95à°°à°¿ à°ªà±\87à°\9cà±\80లని à°¤à°°à°²à°¿à°\82à°\9aà°\97à°¡à°\97à°¡à°\82',
+'action-move-subpages' => 'ఈ పేజీని, దీని ఉపపేజీలనూ తరలించే',
+'action-move-rootuserpages' => 'à°ªà±\8dరధాన à°µà°¾à°¡à±\81à°\95à°°à°¿ à°ªà±\87à°\9cà±\80లని à°¤à°°à°²à°¿à°\82à°\9aà±\87',
 'action-movefile' => 'ఈ ఫైలుని తరలించే',
 'action-upload' => 'ఈ దస్త్రాన్ని ఎక్కించే',
 'action-reupload' => 'ఈ ఫైలుని తిరగవ్రాసే',
@@ -1521,7 +1538,7 @@ $1",
 'action-userrights' => 'అందరు వాడుకరుల హక్కులను మార్చే',
 'action-userrights-interwiki' => 'ఇతర వికీలలో వాడుకరుల యొక్క హక్కులను మార్చే',
 'action-siteadmin' => 'డాటాబేసుకి తాళం వేసే లేదా తీసే',
-'action-sendemail' => 'ఈ-మెయిల్స్ పంపించు',
+'action-sendemail' => 'ఈమెయిళ్ళు పంపించే',
 'action-editmywatchlist' => 'మీ వీక్షణ జాబితాను సరిదిద్దండి',
 'action-viewmywatchlist' => 'మీ వీక్షణ జాబితాను చూడండి',
 'action-viewmyprivateinfo' => 'మీ గోపనీయ సమాచారాన్ని చూడండి',
@@ -1529,7 +1546,7 @@ $1",
 
 # Recent changes
 'nchanges' => '{{PLURAL:$1|ఒక మార్పు|$1 మార్పులు}}',
-'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|చివరి దర్శనం నుండి}}',
+'enhancedrc-since-last-visit' => '{{PLURAL:$1|చివరి సందర్శన తరువాత}}, $1',
 'enhancedrc-history' => 'చరితం',
 'recentchanges' => 'ఇటీవలి మార్పులు',
 'recentchanges-legend' => 'ఇటీవలి మార్పుల ఎంపికలు',
@@ -1543,14 +1560,26 @@ $1",
 'recentchanges-label-plusminus' => 'ఈ పేజి పరిమాణంలో  జరిగిన మార్పుల  బైట్ల సంఖ్య',
 'recentchanges-legend-heading' => "'''సూచిక :'''",
 'recentchanges-legend-newpage' => '([[Special:NewPages|కొత్త పేజీల జాబితా]]ను కూడా చూడండి)',
-'rcnotefrom' => '<b>$2</b> నుండి జరిగిన మార్పులు (<b>$1</b> వరకు చూపబడ్డాయి).',
-'rclistfrom' => '$1 నుండి జరిగిన మార్పులను చూపించు',
+'rcnotefrom' => '<strong>$2</strong> నుండి జరిగిన మార్పులు (<strong>$1</strong> వరకు) కింద చూపబడ్డాయి.',
+'rclistfrom' => '$3, $2 నుండి జరిగిన మార్పులను చూపించు',
 'rcshowhideminor' => 'చిన్న మార్పులను $1',
+'rcshowhideminor-show' => 'చూపించు',
+'rcshowhideminor-hide' => 'దాచు',
 'rcshowhidebots' => 'బాట్లను $1',
+'rcshowhidebots-show' => 'చూపించు',
+'rcshowhidebots-hide' => 'దాచు',
 'rcshowhideliu' => 'నమోదైన వాడుకరులను $1',
+'rcshowhideliu-show' => 'చూపించు',
+'rcshowhideliu-hide' => 'దాచు',
 'rcshowhideanons' => 'అజ్ఞాత వాడుకరులను $1',
+'rcshowhideanons-show' => 'చూపించు',
+'rcshowhideanons-hide' => 'దాచు',
 'rcshowhidepatr' => 'నిఘాలో ఉన్న మార్పులను $1',
+'rcshowhidepatr-show' => 'చూపించు',
+'rcshowhidepatr-hide' => 'దాచు',
 'rcshowhidemine' => 'నా మార్పులను $1',
+'rcshowhidemine-show' => 'చూపించు',
+'rcshowhidemine-hide' => 'దాచు',
 'rclinks' => 'గత  $2 రోజుల లోని చివరి $1 మార్పులను చూపించు <br />$3',
 'diff' => 'తేడాలు',
 'hist' => 'చరిత్ర',
@@ -1571,11 +1600,11 @@ $1",
 # Recent changes linked
 'recentchangeslinked' => 'సంబంధిత మార్పులు',
 'recentchangeslinked-feed' => 'సంబంధిత మార్పులు',
-'recentchangeslinked-toolbox' => 'à°ªà±\8aà°\82తనà°\97à°² మార్పులు',
-'recentchangeslinked-title' => '$1 కు సంబంధించిన మార్పులు',
-'recentchangeslinked-summary' => "దీనికి లింకై ఉన్న పేజీల్లో జరిగిన చివరి మార్పులు ఇక్కడ చూడవచ్చు. మీ వీక్షణ జాబితాలో ఉన్న పేజీలు '''బొద్దు'''గా ఉంటాయి.",
+'recentchangeslinked-toolbox' => 'à°¸à°\82à°¬à°\82ధిత మార్పులు',
+'recentchangeslinked-title' => '"$1" కు సంబంధించిన మార్పులు',
+'recentchangeslinked-summary' => 'ఏదైనా పేజీకి లింకై ఉన్న పేజీల్లో (లేదా ఏదైనా వర్గంలోని పేజీల్లో) జరిగిన ఇటీవలి మార్పుల జాబితా ఇది.  [[Special:Watchlist|మీ వీక్షణ జాబితా]]లో ఉన్న పేజీలు <strong>బొద్దు</strong>గా ఉంటాయి.',
 'recentchangeslinked-page' => 'పేజీ పేరు:',
-'recentchangeslinked-to' => 'ఇచ్చిన పేజీకి లింకయివున్న పేజీలలో జరిగిన మార్పులను చూపించు',
+'recentchangeslinked-to' => 'à°²à±\87à°¦à°\82à°\9fà±\87, à°\87à°\9aà±\8dà°\9aà°¿à°¨ à°ªà±\87à°\9cà±\80à°\95à°¿ à°²à°¿à°\82à°\95యివà±\81à°¨à±\8dà°¨ à°ªà±\87à°\9cà±\80లలà±\8b à°\9cà°°à°¿à°\97à°¿à°¨ à°®à°¾à°°à±\8dà°ªà±\81లనà±\81 à°\9aà±\82పిà°\82à°\9aà±\81',
 
 # Upload
 'upload' => 'దస్త్రపు ఎక్కింపు',
@@ -1584,12 +1613,12 @@ $1",
 'upload-tryagain' => 'మార్చిన ఫైలు వివరణని దాఖలుచేయండి',
 'uploadnologin' => 'లాగిన్‌ అయిలేరు',
 'uploadnologintext' => 'దస్త్రాలను ఎక్కించడానికి మీరు $1 ఉండాలి.',
-'upload_directory_missing' => 'à°\8eà°\97à±\81మతి à°¡à±\88à°°à±\86à°\95à±\8dà°\9fà°°à±\80 ($1) à°¤à°ªà±\8dపిà°\82ది à°®à°°à°¿à°¯à±\81 à°µà±\86à°¬à±\8d à°¸à°°à±\8dవరà±\8d à°¦à°¾à°¨à±\8dని à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aà°²à±\87à°\95à±\81à°¨à±\8dà°¨ది.',
-'upload_directory_read_only' => 'à°\85à°ªà±\8dâ\80\8cà°²à±\8bà°¡ు డైరెక్టరీ ($1), వెబ్‌సర్వరు రాసేందుకు అనుకూలంగా లేదు.',
-'uploaderror' => 'à°\8eà°\95à±\8dà°\95à°¿à°\82à°ªà±\81 à°ªà±\8aరపాà°\9fà±\81',
-'upload-recreate-warning' => "'''హెచ్చరిక: ఆ పేరుతో ఉన్న దస్త్రాన్ని తరలించి లేదా తొలగించి ఉన్నారు.'''
+'upload_directory_missing' => 'à°\8eà°\95à±\8dà°\95à°¿à°\82à°ªà±\81 à°¡à±\88à°°à±\86à°\95à±\8dà°\9fà°°à±\80 ($1) à°\95నబడలà±\87à°¦à±\81. à°ªà±\88à°\97à°¾ à°µà±\86à°¬à±\8d à°¸à°°à±\8dవరà±\8d à°¦à°¾à°¨à±\8dని à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aà°²à±\87à°\95à°ªà±\8bయిà°\82ది.',
+'upload_directory_read_only' => 'à°\8eà°\95à±\8dà°\95à°¿à°\82à°ªు డైరెక్టరీ ($1), వెబ్‌సర్వరు రాసేందుకు అనుకూలంగా లేదు.',
+'uploaderror' => 'à°\8eà°\95à±\8dà°\95à°¿à°\82à°ªà±\81 à°²à±\8bà°ªà°\82',
+'upload-recreate-warning' => '<strong>హెచ్చరిక: ఆ పేరుతో ఉన్న దస్త్రాన్ని తరలించడం లేదా తొలగించడం జరిగింది.</strong>
 
-à°®à±\80 à°¸à±\8cà°\95à°°à±\8dà°¯à°\82 à°\95à±\8bà°¸à°\82 à°\88 à°ªà±\81à°\9f à°¯à±\8aà°\95à±\8dà°\95 à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81 à°®à°°à°¿à°¯à±\81 à°¤à°°à°²à°¿à°\82à°ªà±\81 à°\9aà°¿à°\9fà±\8dà°\9fాని à°\87à°\95à±\8dà°\95à°¡ à°\87à°¸à±\8dà°¤à±\81à°¨à±\8dనాà°\82:",
+à°®à±\80 à°¸à±\8cà°\95à°°à±\8dà°¯à°\82 à°\95à±\8bà°¸à°\82 à°\88 à°ªà±\87à°\9cà±\80 à°¯à±\8aà°\95à±\8dà°\95 à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81 à°®à°°à°¿à°¯à±\81 à°¤à°°à°²à°¿à°\82à°ªà±\81 à°\9aà°¿à°\9fà±\8dà°\9fాని à°\87à°\95à±\8dà°\95à°¡ à°\87à°¸à±\8dà°¤à±\81à°¨à±\8dనాà°\82:',
 'uploadtext' => "దస్త్రాలను ఎక్కించడానికి ఈ కింది ఫారాన్ని ఉపయోగించండి.
 గతంలో ఎక్కించిన దస్త్రాలను చూడడానికి లేదా వెతకడానికి [[Special:FileList|ఎక్కించిన దస్త్రాల యొక్క జాబితా]]కు వెళ్ళండి, (పునః)ఎక్కింపులు [[Special:Log/upload|ఎక్కింపుల చిట్టా]] లోనూ తొలగింపులు [[Special:Log/delete|తొలగింపుల చిట్టా]] లోనూ కూడా నమోదవుతాయి.
 
@@ -1602,29 +1631,30 @@ $1",
 'upload-prohibited' => 'నిషేధించిన ఫైలు రకాలు: $1.',
 'uploadlog' => 'ఎక్కింపుల చిట్టా',
 'uploadlogpage' => 'ఎక్కింపుల చిట్టా',
-'uploadlogpagetext' => 'ఇటీవల జరిగిన ఫైలు అప్‌లోడుల జాబితా ఇది.',
+'uploadlogpagetext' => 'ఇటీవల జరిగిన ఫైలు అప్‌లోడుల జాబితా ఇది.
+మరింత దృశ్యాత్మకంగా చూడటం కోసం [[Special:NewFiles|కొత్త ఫైళ్ళ కొలువు]]కు వెళ్ళండి.',
 'filename' => 'ఫైలు పేరు',
 'filedesc' => 'సారాంశం',
 'fileuploadsummary' => 'సారాంశం:',
 'filereuploadsummary' => 'ఫైలు మార్పులు:',
 'filestatus' => 'కాపీహక్కు స్థితి:',
 'filesource' => 'మూలం:',
-'uploadedfiles' => 'à°\8eà°\97à±\81మతయిన ఫైళ్ళు',
+'uploadedfiles' => 'à°\8eà°\95à±\8dà°\95à°¿à°\82à°\9aిన ఫైళ్ళు',
 'ignorewarning' => 'హెచ్చరికను పట్టించుకోకుండా ఫైలును భద్రపరచు',
 'ignorewarnings' => 'హెచ్చరికలను పట్టించుకోవద్దు',
-'minlength1' => 'పైలు పేర్ల కనీసం ఒక్క అక్షరమైనా ఉండాలి.',
+'minlength1' => 'పైలు పేర్ల నిడివి కనీసం ఒక్క అక్షరమైనా ఉండాలి.',
 'illegalfilename' => '"$1" అనే దస్త్రపుపేరు పేజీ శీర్షికలలో వాడకూడని అక్షరాలను కలిగివుంది.
 దస్త్రపు పేరుని మార్చి మళ్ళీ ఎక్కించడానికి ప్రయత్నించండి.',
 'filename-toolong' => 'దస్త్రపు పేరు 240 బైట్ల కంటే పొడవు ఉండకూడదు.',
 'badfilename' => 'ఫైలు పేరు "$1"కి మార్చబడినది.',
-'filetype-mime-mismatch' => 'దసà±\8dà°¤à±\8dà°°à°ªà±\81 à°ªà±\8aà°¡à°\97à°¿à°\82à°ªà±\81 ".$1" ఆ దస్త్రం యొక్క MIME రకం ($2) తో సరిపోలలేదు.',
+'filetype-mime-mismatch' => 'దసà±\8dà°¤à±\8dà°°à°ªà±\81 à°\8eà°\95à±\8dà°¸à±\8dà°\9fà±\86à°¨à±\8dà°·à°¨à±\81 ".$1", ఆ దస్త్రం యొక్క MIME రకం ($2) తో సరిపోలలేదు.',
 'filetype-badmime' => '"$1" MIME రకం ఉన్న ఫైళ్ళను ఎగుమతికి అనుమతించం.',
-'filetype-bad-ie-mime' => 'ఈ ఫైలుని ఎగుమతి చేయలేరు ఎందుకంటే ఇంటర్నెట్ ఎక్స్‌ప్లోరర్ దీన్ని "$1" గా చూపిస్తుంది, ఇది అనుమతి లేని మరియు ప్రమాదకారమైన ఫైలు రకం.',
-'filetype-unwanted-type' => "'''\".\$1\"''' అనేది అవాంఛిత ఫైలు రకం.
-\$2 {{PLURAL:\$3|అనేది వాడదగ్గ ఫైలు రకం|అనేవి వాడదగ్గ ఫైలు రకాలు}}.",
+'filetype-bad-ie-mime' => 'ఈ ఫైలుని ఎగుమతి చేయలేరు. ఎందుకంటే ఇంటర్నెట్ ఎక్స్‌ప్లోరర్ దీన్ని "$1" గా చూపిస్తుంది. ఇది అనుమతి లేని మరియు ప్రమాదకరమైన ఫైలు రకం.',
+'filetype-unwanted-type' => '<strong>".$1"</strong> అనేది అవాంఛిత ఫైలు రకం.
+$2 {{PLURAL:$3|అనేది వాడదగ్గ ఫైలు రకం|అనేవి వాడదగ్గ ఫైలు రకాలు}}.',
 'filetype-banned-type' => '\'\'\'".$1"\'\'\' {{PLURAL:$4|అనేది అనుమతించబడిన ఫైలు రకం కాదు|అనేవి అనుమతించబడిన ఫైలు రకాలు కాదు}}.
 అనుమతించబడిన {{PLURAL:$3|ఫైలు రకం|ఫైలు రకాలు}} $2.',
-'filetype-missing' => 'à°«à±\88à°²à±\81à°\95à°¿ à°ªà±\8aà°¡à°\97à°¿à°\82à°ªు (".jpg" లాంటిది) లేదు.',
+'filetype-missing' => 'à°«à±\88à°²à±\81à°\95à°¿ à°\8eà°\95à±\8dà°¸à±\8dà°\9fà±\86à°¨à±\8dà°·à°¨ు (".jpg" లాంటిది) లేదు.',
 'empty-file' => 'మీరు సమర్పించిన దస్త్రం ఖాళీగా ఉంది.',
 'file-too-large' => 'మీరు సమర్పించిన దస్త్రం చాలా పెద్దగా ఉంది.',
 'filename-tooshort' => 'దస్త్రపు పేరు మరీ చిన్నగా ఉంది.',
@@ -1632,23 +1662,24 @@ $1",
 'verification-error' => 'దస్త్రపు తనిఖీలో ఈ దస్త్రం ఉత్తీర్ణమవలేదు.',
 'hookaborted' => 'మీరు చేయప్రత్నించిన మార్పుని ఒక పొడగింత కొక్కెం విచ్ఛిన్నం చేసింది.',
 'illegal-filename' => 'ఆ దస్త్రపుపేరు అనుమతించబడదు.',
-'overwrite' => 'à°\87à°ªà±\8dà°ªà°\9fà°¿à°\95à±\87 à°\89à°¨à±\8dà°¨ à°¦à°¸à±\8dà°¤à±\8dరానà±\8dని à°¤à°¿à°°à°¿à°\97రాయడà°\82 à°\85à°¨à±\81మతిà°\82à°\9aబడదు.',
-'unknown-error' => 'à°\8fà°¦à±\8b à°¤à±\86లియని à°ªà±\8aరపాà°\9fà±\81 à°\9cà°°à°¿à°\97ింది.',
+'overwrite' => 'à°\87à°ªà±\8dà°ªà°\9fà°¿à°\95à±\87 à°\89à°¨à±\8dà°¨ à°¦à°¸à±\8dà°¤à±\8dరానà±\8dని à°¤à°¿à°°à°\97రాయడానిà°\95à°¿ à°\85à°¨à±\81మతి à°²à±\87దు.',
+'unknown-error' => 'à°\8fà°¦à±\8b à°¤à±\86లియని à°²à±\8bà°ªà°\82 à°¦à±\8aà°°à±\8dà°²ింది.',
 'tmp-create-error' => 'తాత్కాలిక దస్త్రాన్ని సృష్టించలేకపోయాం.',
 'tmp-write-error' => 'తాత్కాలిక దస్త్రాన్ని రాయడంలో పొరపాటు.',
 'large-file' => 'ఫైళ్ళు $1 కంటే పెద్దవిగా ఉండకుండా ఉంటే మంచిది; ఈ ఫైలు $2 ఉంది.',
 'largefileserver' => 'ఈ ఫైలు సైజు సర్వరులో విధించిన పరిమితి కంటే ఎక్కువగా ఉంది.',
 'emptyfile' => 'మీరు అప్‌లోడు చేసిన ఫైలు ఖాళీగా ఉన్నట్లుంది. ఫైలు పేరును ఇవ్వడంలో స్పెల్లింగు తప్పు దొర్లి ఉండొచ్చు. మీరు అప్‌లోడు చెయ్యదలచింది ఇదో కాదో నిర్ధారించుకోండి.',
-'windows-nonascii-filename' => 'దస్త్రాల పేర్లలో ప్రత్యేక అక్షరాలకు ఈ వికీలో తోడ్పాటు లేదు.',
-'fileexists' => 'ఈ పేరుతో ఒక ఫైలు ఇప్పటికే ఉంది.
-దీనిని మీరు మార్చాలో లేదో తెలియకపోతె ఫైలు <strong>[[:$1]]</strong>ని చూడండి.
+'windows-nonascii-filename' => 'దస్త్రాల పేర్లలో ప్రత్యేక అక్షరాలకు ఈ వికీలో అనుకూలత లేదు.',
+'fileexists' => 'ఈ పేరుతో ఒక ఫైలు ఇప్పటికే ఉంది. దీనిని మార్చాలో లేదో తెలియకపోతే ఫైలు <strong>[[:$1]]</strong>ను చూడండి.
 [[$1|thumb]]',
-'filepageexists' => 'ఈ ఫైలు కొరకు వివరణ పేజీని <strong>[[:$1]]</strong> వద్ద ఈసరికే సృష్టించారు, కానీ ఆ పేరుతో ప్రస్తుతం ఏ ఫైలూ లేదు. మీరు ఇస్తున్న సంగ్రహం ఆ వివరణ పేజీలో కనబడదు. మీ సంగ్రహం అక్కడ కనబడాలంటే, నేరుగా అక్కడే చేర్చాలి.
+'filepageexists' => 'ఈ ఫైలు కొరకు వివరణ పేజీని <strong>[[:$1]]</strong> వద్ద ఈసరికే సృష్టించారు, కానీ ఆ పేరుతో ప్రస్తుతం ఫైలేదీ లేదు.
+మీరు ఇస్తున్న సంగ్రహం ఆ వివరణ పేజీలో కనబడదు. 
+మీ సంగ్రహం అక్కడ కనబడాలంటే, నేరుగా అక్కడే చేర్చాలి.
 [[$1|thumb]]',
-'fileexists-extension' => 'ఇటువంటి పేరుతో మరో ఫైలు ఉంది: [[$2|thumb]]
-* à°\8eà°\97à±\81మతి à°\9aà±\87స్తున్న ఫైలు పేరు: <strong>[[:$1]]</strong>
+'fileexists-extension' => 'ఇటువంటి పేరుతోటే మరో ఫైలు ఉంది: [[$2|thumb]]
+* à°\8eà°\95à±\8dà°\95à°¿స్తున్న ఫైలు పేరు: <strong>[[:$1]]</strong>
 * ప్రస్తుతం ఉన్న ఫైలు పేరు: <strong>[[:$2]]</strong>
-దయà°\9aà±\87సి à°®à°°à±\8b à°ªà±\87à°°à±\81 à°\8eà°\82à°\9aà±\81à°\95à±\8bà°\82à°¡à°¿.',
+మరో పేరు ఎంచుకోండి.',
 'fileexists-thumbnail-yes' => "ఈ ఫైలు కుదించిన బొమ్మ లాగా ఉంది ''(థంబ్‌నెయిలు)''. [[$1|thumb]]
 <strong>[[:$1]]</strong> ఫైలు చూడండి.
 గుర్తు పెట్టబడిన ఫైలు అసలు సైజే అది అయితే, మరో థంబ్‌నెయిలును అప్‌లోడు చెయ్యాల్సిన అవసరం లేదు.",
@@ -1659,22 +1690,24 @@ $1",
 మీరు ఇప్పటికీ ఈ ఫైలుని ఎగుమతి చేయాలనుకుంటే, వెనక్కి వెళ్ళి మరో పేరుతో ఎగుమతి చేయండి. [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'ఈ పేరుతో ఇప్పటికే ఒక ఫైలు అందరి ఫైళ్ళ ఖజానాలో ఉంది.
 ఇప్పటికీ మీ ఫైలుని ఎగుమతి చేయాలనుకుంటే, వెనక్కివెళ్ళి మరో పేరు వాడండి. [[File:$1|thumb|center|$1]]',
-'file-exists-duplicate' => 'à°\88 à°«à±\88à°²à±\81 à°\95à±\8dà°°à°¿à°\82à°¦ à°ªà±\87à°°à±\8dà°\95à±\8aà°¨à±\8dà°¨ {{PLURAL:$1|à°«à±\88à°²à±\81à°\95à°¿|à°«à±\88à°³à±\8dà°³à°\95à°¿}} నకలు:',
-'file-deleted-duplicate' => 'à°\97à°¤à°\82à°²à±\8b à°\88 à°«à±\88à°²à±\81 à°²à°¾à°\82à°\9fà°¿à°¦à±\87 à°\92à°\95 à°«à±\88à°²à±\81ని ([[:$1]]) à°¤à±\8aà°²à°\97à°¿à°\82à°\9aà°¿à°µà±\81à°¨à±\8dనారà±\81. à°®à±\80à°°à±\81 à°¦à±\80à°¨à±\8dని à°\8eà°\97à±\81మతి à°\9aà±\87à°¸à±\87à°®à±\81à°\82à°¦à±\81 à°\86 à°«à±\88à°²à±\81 à°¯à±\8aà°\95à±\8dà°\95 à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81 à°\9aà°°à°¿à°¤à±\8dరని à°\92à°\95à±\8dà°\95సారి చూడండి.',
+'file-exists-duplicate' => 'à°\88 à°«à±\88à°²à±\81 à°\95à±\8dà°°à°¿à°\82à°¦ à°ªà±\87à°°à±\8dà°\95à±\8aà°¨à±\8dà°¨ {{PLURAL:$1|à°«à±\88à°²à±\81à°\95à±\81|à°«à±\88à°³à±\8dà°³à°\95à±\81}} నకలు:',
+'file-deleted-duplicate' => 'à°\97à°¤à°\82à°²à±\8b à°\88 à°«à±\88à°²à±\81 à°²à°¾à°\82à°\9fà°¿à°¦à±\87 à°\92à°\95 à°«à±\88à°²à±\81ని ([[:$1]]) à°¤à±\8aà°²à°\97à°¿à°\82à°\9aà°¿à°µà±\81à°¨à±\8dనారà±\81. à°®à±\80à°°à±\81 à°¦à±\80à°¨à±\8dని à°¤à°¿à°°à°¿à°\97à°¿ à°\8eà°\95à±\8dà°\95à°¿à°\82à°\9aà±\87 à°®à±\81à°\82à°¦à±\81 à°\86 à°«à±\88à°²à±\81 à°¯à±\8aà°\95à±\8dà°\95 à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81 à°\9aà°°à°¿à°¤à±\8dà°°à°¨à±\81 చూడండి.',
 'file-deleted-duplicate-notitle' => 'సరిగ్గా ఈ ఫైలునే పోలిన మరో ఫైలును గతంలో తొలగించాం. దాని పేరును అణచిపెట్టాం.
 దాన్ని తిరిగి ఎక్కించే ముందు, పరిస్థితిని సమీక్షించేందుకు గాను, అణచబడిన ఫైళ్ళ డేటాను చూడగలిగే వారిని అడగండి.',
 'uploadwarning' => 'ఎక్కింపు హెచ్చరిక',
-'uploadwarning-text' => 'à°«à±\88à°²à±\81 à°µà°¿à°µà°°à°£à°¨à°¿ à°\95à±\8dà°°à°¿à°\82à°¦ à°®à°¾à°°à±\8dà°\9aà°¿ మళ్ళీ ప్రయత్నించండి.',
+'uploadwarning-text' => 'à°\95à°¿à°\82à°¦ à°\88 à°«à±\88à°²à±\81 à°µà°¿à°µà°°à°£à°¨à±\81 à°®à°¾à°°à±\8dà°\9aà°¿, మళ్ళీ ప్రయత్నించండి.',
 'savefile' => 'దస్త్రాన్ని భద్రపరచు',
 'uploadedimage' => '"[[$1]]"ని ఎక్కించారు',
 'overwroteimage' => '"[[$1]]" యొక్క కొత్త కూర్పును ఎక్కించారు',
-'uploaddisabled' => 'à°\95à±\8dషమిà°\82à°\9aà°\82à°¡à°¿, à°\85à°ªà±\8dâ\80\8cà°²à±\8bà°¡à±\81 à°\9aà±\86à°¯à±\8dయడà°\82 à°ªà±\8dà°°à°¸à±\8dà°¤à±\81తానిà°\95à°¿ à°\86పబడిà°\82ది',
+'uploaddisabled' => 'à°\8eà°\95à±\8dà°\95à°¿à°\82à°ªà±\81à°²à±\81 à°\85à°\9aà±\87తనà°\82 à°\9aà±\86à°¯à±\8dయబడà±\8dడాయి.',
 'copyuploaddisabled' => 'URL ద్వారా ఎక్కింపుని అశక్తం చేసారు.',
 'uploadfromurl-queued' => 'మీ ఎక్కింపు వరుసలో ఉంది.',
-'uploaddisabledtext' => 'à°«à±\88à°³à±\8dà°³ à°\8eà°\97à±\81మతులను అచేతనం చేసారు.',
+'uploaddisabledtext' => 'à°«à±\88à°³à±\8dà°³ à°\8eà°\95à±\8dà°\95à°¿à°\82à°ªులను అచేతనం చేసారు.',
 'php-uploaddisabledtext' => 'PHPలో ఫైలు ఎక్కింపులు అచేతనమై ఉన్నాయి.
 దయచేసి file_uploads అమరికని చూడండి.',
 'uploadscripted' => 'ఈ ఫైల్లో HTML కోడు గానీ స్క్రిప్టు కోడు గానీ ఉంది. వెబ్ బ్రౌజరు దాన్ని పొరపాటుగా అనువదించే అవకాశం ఉంది.',
+'uploadscriptednamespace' => 'ఈ SVG ఫైలులోని పేరుబరి "$1" చెల్లనిది',
+'uploadinvalidxml' => 'ఎక్కించిన ఫైలులోని XML ను పార్సు చెయ్యలేకపోయాం.',
 'uploadvirus' => 'ఈ ఫైలులో వైరస్‌ ఉంది! వివరాలు: $1',
 'uploadjava' => 'ఇదొక ZIP ఫైలు, ఇందులో ఒక Java .class ఫైలు ఉంది.
 Java ఫైళ్ళ వలన భద్రతకు తూట్లు పడే అవకాశం ఉంది కాబట్టి, వాటిని ఎక్కించడానికి అనుమతి లేదు.',
@@ -1686,9 +1719,9 @@ Java ఫైళ్ళ వలన భద్రతకు తూట్లు పడ
 'upload-description' => 'దస్త్రపు వివరణ',
 'upload-options' => 'ఎక్కింపు వికల్పాలు',
 'watchthisupload' => 'ఈ ఫైలుని గమనించు',
-'filewasdeleted' => 'à°\87à°¦à±\87 à°ªà±\87à°°à±\81à°¤à±\8b à°\89à°¨à±\8dà°¨ à°\92à°\95 à°«à±\88à°²à±\81à°¨à±\81 à°\97à°¤à°\82à°²à±\8b à°\85à°ªà±\8dà°²à±\8bà°¡à±\81 à°\9aà±\87సారà±\81, à°¤à°°à±\81వాతి à°\95ాలà°\82à°²à±\8b à°¦à°¾à°¨à±\8dని à°¤à±\8aà°²à°\97à°¿à°\82à°\9aారà±\81. à°¦à°¾à°¨à±\8dà°¨à±\80 à°®à°³à±\8dà°³à±\80 à°\85à°ªà±\8dà°²à±\8bà°¡à±\81 à°\9aà±\87à°¸à±\87 à°®à±\81à°\82à°¦à±\81, à°®à±\80à°°à±\81 $1 à°¨à±\81 à°\9aà±\82డాలి',
-'filename-bad-prefix' => "మీరు అప్లోడు చేస్తున్న ఫైలు పేరు '''\"\$1\"''' తో మొదలవుతుంది. ఇది డిజిటల్ కెమెరాలు ఆటోమాటిగ్గా ఇచ్చే పేరు. మరింత వివరంగా ఉండే పేరును ఎంచుకోండి.",
-'upload-success-subj' => 'à°\85à°ªà±\8dâ\80\8cà°²à±\8bà°¡à±\81 à°\9cయపà±\8dà°°à°¦à°\82',
+'filewasdeleted' => 'à°\87à°¦à±\87 à°ªà±\87à°°à±\81à°¤à±\8b à°\89à°¨à±\8dà°¨ à°\92à°\95 à°«à±\88à°²à±\81à°¨à±\81 à°\97à°¤à°\82à°²à±\8b à°\8eà°\95à±\8dà°\95à°¿à°\82à°\9aారà±\81. à°¤à°°à±\81వాతి à°\95ాలà°\82à°²à±\8b à°¦à°¾à°¨à±\8dని à°¤à±\8aà°²à°\97à°¿à°\82à°\9aారà±\81. à°¦à°¾à°¨à±\8dà°¨à±\80 à°®à°³à±\8dà°³à±\80 à°\8eà°\95à±\8dà°\95à°¿à°\82à°\9aà±\87 à°®à±\81à°\82à°¦à±\81, à°®à±\80à°°à±\81 $1 à°¨à±\81 à°\9aà±\82డాలి.',
+'filename-bad-prefix' => 'మీరు అప్లోడు చేస్తున్న ఫైలు పేరు <strong>"$1"</strong> తో మొదలవుతుంది. ఇది డిజిటల్ కెమెరాలు ఆటోమాటిగ్గా ఇచ్చే పేరు. మరింత వివరంగా ఉండే పేరును ఎంచుకోండి.',
+'upload-success-subj' => 'విà°\9cయవà°\82తమà±\88à°¨ à°\8eà°\95à±\8dà°\95à°¿à°\82à°ªà±\81',
 'upload-success-msg' => '[$2] నుండి మీ ఎక్కింపు సఫలమైంది. అది ఇక్కడ అందుబాటులో ఉంది: [[:{{ns:file}}:$1]]',
 'upload-failure-subj' => 'ఎక్కింపు సమస్య',
 'upload-failure-msg' => '[$2] నుండి మీ ఎక్కింపుతో ఏదో సమస్య ఉంది:
@@ -1701,8 +1734,8 @@ $1',
 'upload-proto-error-text' => 'రిమోట్ అప్‌లోడులు చెయ్యాలంటే URLలు <code>http://</code> లేదా <code>ftp://</code> తో మొదలు కావాలి.',
 'upload-file-error' => 'అంతర్గత లోపం',
 'upload-file-error-text' => 'సర్వరులో తాత్కాలిక ఫైలును సృష్టించబోగా ఏదో అంతర్గత లోపం తలెత్తింది. ఎవరైనా [[Special:ListUsers/sysop|నిర్వాహకుడిని]] సంప్రదించండి.',
-'upload-misc-error' => 'à°¤à±\86లియని à°\85à°ªà±\8dâ\80\8cà°²à±\8bà°¡ు లోపం',
-'upload-misc-error-text' => 'à°\85à°ªà±\8dâ\80\8cà°²à±\8bà°¡à±\81 à°\9aà±\87à°¸à±\8dà°¤à±\82à°\82à°¡à°\97à°¾ à°\8fà°¦à±\8b à°¤à±\86లియని à°²à±\8bà°ªà°\82 à°¤à°²à±\86à°¤à±\8dతిà°\82ది. URL à°¸à°°à±\88నదà±\87నని, à°\85ది à°\85à°\82à°¦à±\81బాà°\9fà±\81à°²à±\8bà°¨à±\87 à°\89à°\82దని à°¨à°¿à°°à±\8dధారిà°\82à°\9aà±\81à°\95à±\81ని à°®à°³à±\8dà°³à±\80 à°ªà±\8dరయతà±\8dనిà°\82à°¦ండి. సమస్య అలాగే ఉంటే, సిస్టము నిర్వాహకుని సంప్రదించండి.',
+'upload-misc-error' => 'à°¤à±\86లియని à°\8eà°\95à±\8dà°\95à°¿à°\82à°ªు లోపం',
+'upload-misc-error-text' => 'à°\8eà°\95à±\8dà°\95à°¿à°¸à±\8dà°¤à±\82à°\82à°¡à°\97à°¾ à°\8fà°¦à±\8b à°¤à±\86లియని à°²à±\8bà°ªà°\82 à°¤à°²à±\86à°¤à±\8dతిà°\82ది. URL à°¸à°°à±\88నదà±\87నని, à°\85ది à°\85à°\82à°¦à±\81బాà°\9fà±\81à°²à±\8bà°¨à±\87 à°\89à°\82దని à°¨à°¿à°°à±\8dధారిà°\82à°\9aà±\81à°\95à±\81ని à°®à°³à±\8dà°³à±\80 à°ªà±\8dరయతà±\8dనిà°\82à°\9aండి. సమస్య అలాగే ఉంటే, సిస్టము నిర్వాహకుని సంప్రదించండి.',
 'upload-too-many-redirects' => 'ఆ URLలో చాలా దారిమార్పులు ఉన్నాయి',
 'upload-unknown-size' => 'సైజు తెలియదు',
 'upload-http-error' => 'ఒక HTTP పొరపాటు జరిగింది: $1',
@@ -1721,19 +1754,24 @@ $1',
 'backend-fail-store' => '"$1" ఫైలును "$2" వద్ద భద్రపరచలేకపోయాం.',
 'backend-fail-copy' => '"$1" నుండి "$2" కి ఫైలును కాపీ చెయ్యలేకపోయాం.',
 'backend-fail-move' => '"$1" నుండి "$2" కి ఫైలును తరలించలేకపోయాం.',
-'backend-fail-opentemp' => 'తాతà±\8dà°\95ాలిà°\95 à°¦à°¸à±\8dà°¤à±\8dరానà±\8dని à°¤à±\86రవలà±\87à°\95à°ªà±\8bà°¤à±\81à°¨à±\8dà°¨ాం.',
+'backend-fail-opentemp' => 'తాతà±\8dà°\95ాలిà°\95 à°¦à°¸à±\8dà°¤à±\8dరానà±\8dని à°¤à±\86రవలà±\87à°\95à°ªà±\8bà°¯ాం.',
 'backend-fail-writetemp' => 'తాత్కాలిక ఫైలులో రాయలేకపోయాం.',
 'backend-fail-closetemp' => 'తాత్కాలిక దస్త్రాన్ని మూసివేయలేకపోయాం.',
-'backend-fail-read' => '$1 దస్త్రము చదువలేకపోతిమి.',
-'backend-fail-create' => '$1 ఫైలులో రాయలేకున్నాం.',
+'backend-fail-read' => 'దస్త్రము "$1" ని చదువలేకపోయాం.',
+'backend-fail-create' => 'ఫైలు "$1" లో రాయలేకపోయాం.',
 'backend-fail-maxsize' => '"$1" ఫైలు {{PLURAL:$2|ఒక బైట్|$2 బైట్ల}} కంటే పెద్దది కావడం చేత దాన్ని రాయలేకపోయాం.',
 'backend-fail-readonly' => 'స్టోరేజి బ్యాక్‍ఎండ్ "$1" ప్రస్తుతం రీడ్-ఓన్లీ స్థితిలో ఉంది. దానికి కారణం: "<em>$2</em>"',
+'backend-fail-synced' => 'ఫైలు "$1" అంతర్గత స్టోరేజి బ్యాక్‍ఎండ్లలో అసమ స్థితిలో ఉంది',
 'backend-fail-connect' => 'స్టోరేజీ బ్యాక్‍ఎండ్ "$1" కి కనెక్టు కాలేక పోయాం.',
 'backend-fail-internal' => 'స్టోరేజీ బ్యాక్‍ఎండ్ "$1" లో ఏదో తెలియని లోపం దొర్లింది.',
 'backend-fail-contenttype' => '"$1" లో దాచాల్సిన ఫైలు యొక్క కంటెంటు రకమేంటో నిర్ధారించలేకపోయాం.',
 'backend-fail-batchsize' => 'స్టోరేజీ బ్యాక్‍ఎండ్ కు $1 ఫైలు {{PLURAL:$1|ఆపరేషన్|ఆపరేషన్ల}} తో కూడిన బ్యాచ్ ఒకటి ఇవ్వబడింది; పరిమితి: $2 {{PLURAL:$2|ఆపరేషన్|ఆపరేషన్లు}}.',
 'backend-fail-usable' => 'సరిపడా అనుమతులు లేకపోవడం వలన గానీ, అవసరమైన డైరెక్టరీలు/కంటెయినర్లు లేకపోవడం వలనగానీ "$1" ఫైలును చదవడం, రాయడం చెయ్యలేకపోయాం.',
 
+# File journal errors
+'filejournal-fail-dbconnect' => 'స్టోరేజి బ్యాక్‍ఎండ్ "$1" కోసం జర్నల్ డేటాబేసుకు కనెక్టు కాలేకపోయాం..',
+'filejournal-fail-dbquery' => 'స్టోరేజి బ్యాక్‍ఎండ్ "$1" కోసం జర్నల్ డేటాబేసును తాజాకరించలేకపోయాం.',
+
 # Lock manager
 'lockmanager-notlocked' => '"$1" తాళం తియ్యలేకపోయాం; అదసలు లాక్ అయ్యేలేదు..',
 'lockmanager-fail-closelock' => '"$1" యొక్క లాక్ ఫైలును మూయలేకపోయాం.',
@@ -1741,6 +1779,7 @@ $1',
 'lockmanager-fail-acquirelock' => '"$1" కోసం లాక్ ను పొందలేకపోయాం.',
 'lockmanager-fail-openlock' => '"$1" కోసం లాక్ ఫైలును తెరవలేకపోయాం.',
 'lockmanager-fail-releaselock' => '"$1" యొక్క లాక్ ను విడుదల చెయ్యలేకపోయాం.',
+'lockmanager-fail-db-bucket' => 'బకెట్ $1 లోని లాక్ డేటాబేసులు సరిపోయినన్నిటిని కాంటాక్టు చెయ్యలేకపోయాం.',
 'lockmanager-fail-db-release' => 'డేటాబేసు $1 పై లాకులను విడుదల చెయ్యలేకపోయాం.',
 'lockmanager-fail-svr-acquire' => 'సర్వరు $1 పై లాకులను పొందలేకపోయాం.',
 'lockmanager-fail-svr-release' => 'సర్వరు $1 పై లాకులను విడుదల చెయ్యలేకపోయాం.',
@@ -1761,6 +1800,7 @@ $1',
 'uploadstash-badtoken' => 'ఆ చర్య విఫలమైంది. బహుశా మీ ఎడిటింగు అనుమతులకు కాలం చెల్లిందేమో. మళ్ళీ ప్రయత్నించండి.',
 'uploadstash-errclear' => 'ఫైళ్ళ తీసివేత విఫలమైంది.',
 'uploadstash-refresh' => 'దస్త్రాల జాబిజాను తాజాకరించు',
+'invalid-chunk-offset' => 'చెల్లని చంక్ ఆఫ్‍సెట్',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'అనుమతిని నిరాకరించారు',
@@ -1770,7 +1810,7 @@ $1',
 https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'img-auth-notindir' => 'అభ్యర్థించిన తోవ ఎక్కింపు సంచయంలో లేదు.',
 'img-auth-badtitle' => '"$1" నుండి సరైన శీర్షికని నిర్మించలేకపోయాం.',
-'img-auth-nologinnWL' => 'à°®à±\80à°°à±\81 à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aà°¿ à°²à±\87à°°à±\81 à°®à°°à°¿à°¯à±\81 "$1" అనేది తెల్లజాబితాలో లేదు.',
+'img-auth-nologinnWL' => 'à°®à±\80à°°à±\81 à°²à°¾à°\97ినయి à°²à±\87à°°à±\81. à°ªà±\88à°\97à°¾ "$1" అనేది తెల్లజాబితాలో లేదు.',
 'img-auth-nofile' => '"$1" అనే ఫైలు ఉనికిలో లేదు.',
 'img-auth-isdir' => 'మీరు "$1" అనే సంచయాన్ని చూడడానికి ప్రయత్నిస్తున్నారు.
 ఫైళ్ళను చూడడానికి మాత్రమే అనుమతివుంది.',
@@ -1782,18 +1822,18 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'img-auth-bad-query-string' => 'ఈ URL లో తప్పుడు క్వెరీ స్ట్రింగు ఉంది.',
 
 # HTTP errors
-'http-invalid-url' => 'తపà±\8dà°ªà±\81à°¡à±\81 URL: $1',
+'http-invalid-url' => 'à°\9aà±\86à°²à±\8dలని URL: $1',
 'http-invalid-scheme' => '"$1" ప్రణాళికలో ఉన్న URLలకు తోడ్పాటులేదు',
-'http-request-error' => 'à°¤à±\86లియని à°ªà±\8aరపాà°\9fà±\81 వల్ల HTTP అభ్యర్థన విఫలమైంది.',
+'http-request-error' => 'à°¤à±\86లియని à°²à±\8bà°ªà°\82 వల్ల HTTP అభ్యర్థన విఫలమైంది.',
 'http-read-error' => 'HTTP చదువుటలో పొరపాటు.',
 'http-timed-out' => 'HTTP అభ్యర్థనకి కాలం చెల్లింది.',
-'http-curl-error' => 'URLని à°¤à±\87వడà°\82à°²à±\8b à°ªà±\8aరపాà°\9fà±\81: $1',
+'http-curl-error' => 'URLని à°¤à±\87వడà°\82à°²à±\8b à°²à±\8bà°ªà°\82: $1',
 'http-bad-status' => 'HTTP అభ్యర్ధన చేస్తున్నప్పుడు సమస్య ఉంది: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'URL కు వెళ్ళలేకపోయాం',
 'upload-curl-error6-text' => 'ఇచ్చిన URL కు వెళ్ళలేకపోయాం. URL సరైనదేనని, సైటు పనిచేస్తూనే ఉన్నదనీ నిర్ధారించుకోండి.',
-'upload-curl-error28' => 'à°\85à°ªà±\8dà°²à±\8bà°¡ు కాలాతీతం',
+'upload-curl-error28' => 'à°\8eà°\95à±\8dà°\95à°¿à°\82à°ªు కాలాతీతం',
 'upload-curl-error28-text' => 'చాలా సమయం తరువాత కూడా సైటు స్పందించలేదు. సైటు పనిచేస్తూనే ఉందని నిర్ధారించుకుని, కాస్త ఆగి మళ్ళీ ప్రయత్నించండి. రద్దీ కాస్త తక్కువగా ఉన్నపుడు ప్రయత్నిస్తే నయం.',
 
 'license' => 'లైసెన్సు వివరాలు:',
@@ -1839,24 +1879,24 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'filehist-missing' => 'ఫైలు కనిపించుటలేదు',
 'imagelinks' => 'దస్త్రపు వాడుక',
 'linkstoimage' => 'కింది {{PLURAL:$1|పేజీ|$1 పేజీల}} నుండి ఈ ఫైలుకి లింకులు ఉన్నాయి:',
-'linkstoimage-more' => '$1 కంటే ఎక్కువ {{PLURAL:$1|పేజీలు|పేజీలు}} ఈ ఫైలుకి లింకుని కలిగివున్నాయి.
-à°\88 à°«à±\88à°²à±\81à°\95à°¿ à°²à°¿à°\82à°\95à±\81à°¨à±\8dà°¨ {{PLURAL:$1|à°®à±\8aà°¦à°\9fà°¿ à°\92à°\95 పేజీని|మొదటి $1 పేజీలను}} ఈ క్రింది జాబితా చూపిస్తుంది.
+'linkstoimage-more' => 'ఈ ఫైలుకు $1 కంటే ఎక్కువ {{PLURAL:$1|పేజీ లింకై ఉంది|పేజీలు లింకై ఉన్నాయి}}.
+à°\88 à°«à±\88à°²à±\81à°\95à°¿ à°®à°¾à°¤à±\8dà°°à°®à±\87 à°²à°¿à°\82à°\95à±\88 à°\89à°¨à±\8dà°¨ {{PLURAL:$1|à°®à±\8aà°¦à°\9fà°¿ పేజీని|మొదటి $1 పేజీలను}} ఈ క్రింది జాబితా చూపిస్తుంది.
 [[Special:WhatLinksHere/$2|పూర్తి జాబితా]] కూడా ఉంది.',
 'nolinkstoimage' => 'ఈ ఫైలుకు లింకున్న పేజీలు లేవు.',
-'morelinkstoimage' => 'à°\88 à°«à±\88à°²à±\81à°\95à±\81 à°\87à°\82à°\95à°¾ [[Special:WhatLinksHere/$1| à°²à°¿à°\82à°\95à±\81లనà±\81]] à°\9aà±\82à°¡ు',
+'morelinkstoimage' => 'à°\88 à°«à±\88à°²à±\81à°\95à±\81 à°\89à°¨à±\8dà°¨ à°®à°°à°¿à°¨à±\8dని [[Special:WhatLinksHere/$1| à°²à°¿à°\82à°\95à±\81లనà±\81]] à°\9aà±\82పిà°\82à°\9aు',
 'linkstoimage-redirect' => '$1 (దస్త్రపు దారిమార్పు) $2',
 'duplicatesoffile' => 'క్రింద పేర్కొన్న {{PLURAL:$1|ఫైలు ఈ ఫైలుకి నకలు|$1 ఫైళ్ళు ఈ ఫైలుకి నకళ్ళు}} ([[Special:FileDuplicateSearch/$2|మరిన్ని వివరాలు]]):',
-'sharedupload' => 'à°\88 à°«à±\88à°²à±\81 $1 à°¨à±\81à°\82à°¡à°¿ à°®à°°à°¿à°¯à±\81 à°¦à±\80నిని à°\87తర à°ªà±\8dà°°à°¾à°\9cà±\86à°\95à±\8dà°\9fà±\81లలà±\8b à°\95à±\82à°¡à°¾ à°\89పయà±\8bà°\97à°¿à°¸à±\8dà°¤à±\82à°µà±\81ండవచ్చు.',
-'sharedupload-desc-there' => 'à°\88 à°«à±\88à°²à±\81 $1 à°¨à±\81à°\82à°¡à°¿ à°µà°\9aà±\8dà°\9aà°¿à°\82ది à°\85లానà±\87 à°\87తర à°ªà±\8dà°°à°¾à°\9cà±\86à°\95à±\8dà°\9fà±\81లలà±\8b à°\95à±\82à°¡à°¾ à°\89పయà±\8bà°\97à°¿à°¸à±\8dà°¤à±\82 ఉండవచ్చు.
+'sharedupload' => 'à°\88 à°«à±\88à°²à±\81 $1 à°²à±\8bనిది. à°¦à±\80నిని à°\87తర à°ªà±\8dà°°à°¾à°\9cà±\86à°\95à±\8dà°\9fà±\81లలà±\8b à°\95à±\82à°¡à°¾ à°\89పయà±\8bà°\97à°¿à°¸à±\8dà°¤à±\82 à°\89à°\82à°¡à°¿ à°\89ండవచ్చు.',
+'sharedupload-desc-there' => 'à°\88 à°«à±\88à°²à±\81 $1 à°²à±\8bనిది. à°\85లానà±\87 à°\87తర à°ªà±\8dà°°à°¾à°\9cà±\86à°\95à±\8dà°\9fà±\81లలà±\8b à°\95à±\82à°¡à°¾ à°\89పయà±\8bà°\97à°¿à°¸à±\8dà°¤à±\82 à°\89à°\82à°¡à°¿ ఉండవచ్చు.
 మరింత సమాచారం కోసం, దయచేసి [$2 ఫైలు వివరణ పేజీ]ని చూడండి.',
-'sharedupload-desc-here' => 'à°\88 à°«à±\88à°²à±\81 $1 à°¨à±\81à°\82à°¡à°¿ à°®à°°à°¿à°¯à±\81 à°¦à±\80నిని à°\87తర à°ªà±\8dà°°à°¾à°\9cà±\86à°\95à±\8dà°\9fà±\81లలà±\8b కూడా ఉపయోగిస్తూ ఉండవచ్చు.
-à°¦à±\80ని [$2 à°«à±\88à°²à±\81 à°µà°¿à°µà°°à°£ à°ªà±\87à°\9cà±\80] à°²à±\8b à°\89à°¨à±\8dà°¨ à°µà°¿à°µà°°à°£à°¨à°¿ à°\95à±\8dà°°ింద చూపించాం.',
+'sharedupload-desc-here' => 'à°\88 à°«à±\88à°²à±\81 $1 à°²à±\8bనిది. à°¦à±\80నిని à°\87తర à°ªà±\8dà°°à°¾à°\9cà±\86à°\95à±\8dà°\9fà±\81à°²à±\81 కూడా ఉపయోగిస్తూ ఉండవచ్చు.
+à°\85à°\95à±\8dà°\95à°¡ à°¦à±\80ని [$2 à°«à±\88à°²à±\81 à°µà°¿à°µà°°à°£ à°ªà±\87à°\9cà±\80] à°²à±\8b à°\89à°¨à±\8dà°¨ à°µà°¿à°µà°°à°£à°¨à°¿ à°\95ింద చూపించాం.',
 'sharedupload-desc-edit' => 'ఈ ఫైలు $1 లోనిది. దాన్ని ఇతర ప్రాజెక్టులు కూడా వాడుతూ ఉండి ఉండవచ్చు.
 దాని [$2 ఫైలు వివరణ పేజీ] లోని వివరణను మారుస్తారేమో చూడండి.',
 'sharedupload-desc-create' => 'ఈ ఫైలు $1 లోనిది. దాన్ని ఇతర ప్రాజెక్టులు కూడా వాడుతూ ఉండి ఉండవచ్చు.
 దాని [$2 ఫైలు వివరణ పేజీ] లోని వివరణను మారుస్తారేమో చూడండి.',
-'filepage-nofile' => 'à°\88 à°ªà±\87à°°à±\81à°¤à±\8b à°\8f à°«à±\88à°²à±\81 లేదు.',
-'filepage-nofile-link' => 'à°\88 à°ªà±\87à°°à±\81à°¤à±\8b à°\8f à°«à±\88à°²à±\82 à°²à±\87à°¦à±\81, à°\95ానà±\80 à°®à±\80à°°à±\81 $1 à°¨à±\81 à°\85à°ªà±\8dâ\80\8cà°²à±\8bà°¡à±\8d à°\9aà±\86à°¯à±\8dయవà°\9aà±\8dà°\9aà±\81.',
+'filepage-nofile' => 'à°\88 à°ªà±\87à°°à±\81à°¤à±\8b à°«à±\88à°²à±\87à°¦à±\80 లేదు.',
+'filepage-nofile-link' => 'à°\88 à°ªà±\87à°°à±\81à°¤à±\8b à°«à±\88à°²à±\87à°¦à±\80 à°²à±\87à°¦à±\81, à°®à±\80à°°à±\81 [$1 à°¦à°¾à°¨à±\8dని à°\8eà°\95à±\8dà°\95à°¿à°\82à°\9aà°µà°\9aà±\8dà°\9aà±\81].',
 'uploadnewversion-linktext' => 'ఈ దస్త్రపు కొత్త కూర్పును ఎక్కించండి',
 'shared-repo-from' => '$1 నుండి',
 'shared-repo' => 'సామూహిక నిక్షేపం',
@@ -1870,14 +1910,14 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'filerevert-comment' => 'కారణం:',
 'filerevert-defaultcomment' => '$2, $1 నాటి కూర్పుకు తీసుకువెళ్ళాం',
 'filerevert-submit' => 'వెనక్కు తీసుకువెళ్ళు',
-'filerevert-success' => "'''[[Media:$1|$1]]''' ను  [$3, $2 నాటి $4 కూర్పు]కు తీసుకువెళ్ళాం.",
+'filerevert-success' => '<strong>[[Media:$1|$1]]</strong> ను  [$4 $2 $3 నాటి కూర్పు]కు తీసుకువెళ్ళాం.',
 'filerevert-badversion' => 'మీరిచ్చిన టైముస్టాంపుతో ఈ ఫైలుకు స్థానిక కూర్పేమీ లేదు.',
 
 # File deletion
 'filedelete' => '$1ని తొలగించు',
 'filedelete-legend' => 'ఫైలుని తొలగించు',
-'filedelete-intro' => "మీరు '''[[Media:$1|$1]]''' ఫైలుని దాని చరిత్రతో సహా తొలగించబోతున్నారు.",
-'filedelete-intro-old' => "మీరు '''[[Media:$1|$1]]''' యొక్క  [$4 $3, $2] నాటి కూర్పును తొలగిస్తున్నారు.",
+'filedelete-intro' => 'మీరు <strong>[[Media:$1|$1]]</strong> ఫైలును దాని చరిత్రతో సహా తొలగించబోతున్నారు.',
+'filedelete-intro-old' => 'మీరు <strong>[[Media:$1|$1]]</strong> యొక్క  [$4 $2, $3 నాటి కూర్పును] తొలగిస్తున్నారు.',
 'filedelete-comment' => 'కారణం:',
 'filedelete-submit' => 'తొలగించు',
 'filedelete-success' => "'''$1'''ని తొలగించాం.",
@@ -1890,7 +1930,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 ** కాపీహక్కుల ఉల్లంఘన
 ** వేరొక దస్త్రానికి నకలు',
 'filedelete-edit-reasonlist' => 'తొలగింపు కారణాలని మార్చండి',
-'filedelete-maintenance' => 'à°¸à°\82à°°à°\95à±\8dà°·à°£ à°¨à°¿à°®à°¿à°¤à±\8dà°¤à°\82 à°«à±\88à°³à±\8dà°³ à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81 à°®à°°à°¿à°¯à±\81 à°ªà±\81నసà±\8dథాపనలనà±\81 à°¤à°¾à°¤à±\8dà°\95ాలిà°\95à°\82à°\97à°¾ à°\85à°\9aà±\87యతనà°\82 à°\9aà±\87సారà±\81.',
+'filedelete-maintenance' => 'నిరà±\8dవహణ à°¸à°\82దరà±\8dà°­à°\82à°\97à°¾ à°«à±\88à°³à±\8dà°³ à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81, à°ªà±\81నసà±\8dథాపనలనà±\81 à°¤à°¾à°¤à±\8dà°\95ాలిà°\95à°\82à°\97à°¾ à°\85à°\9aà±\87తనà°\82 à°\9aà±\87సాà°\82.',
 'filedelete-maintenance-title' => 'దస్త్రాన్ని తొలగించలేకపోయాం',
 
 # MIME search
@@ -1942,9 +1982,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'statistics-views-total' => 'మొత్తం వీక్షణలు',
 'statistics-views-total-desc' => 'ఉనికిలో లేని పుటలకు మరియు ప్రత్యేక పుటలకు వచ్చిన సందర్శనలని కలుపలేదు',
 'statistics-views-peredit' => 'ఒక మార్పుకి వీక్షణలు',
-'statistics-users' => 'నమà±\8bà°¦à±\88à°¨ [[Special:ListUsers|వాడà±\81à°\95à°°à±\8dలు]]',
-'statistics-users-active' => 'à°\95à±\8dరియాశà±\80à°² à°µà°¾à°¡à±\81à°\95à°°à±\8dలు',
-'statistics-users-active-desc' => 'à°\97à°¤ {{PLURAL:$1|à°°à±\8bà°\9cà±\81|$1 à°°à±\8bà°\9cà±\81à°²}}à°²à±\8b à°\92à°\95à±\8dà°\95 à°\9aà°°à±\8dà°¯à±\88నా చేసిన వాడుకరులు',
+'statistics-users' => 'నమà±\8bà°¦à±\88à°¨ [[Special:ListUsers|వాడà±\81à°\95à°°à±\81లు]]',
+'statistics-users-active' => 'à°\95à±\8dరియాశà±\80à°² à°µà°¾à°¡à±\81à°\95à°°à±\81లు',
+'statistics-users-active-desc' => 'à°\97à°¤ {{PLURAL:$1|à°°à±\8bà°\9cà±\81|$1 à°°à±\8bà°\9cà±\81à°²}}à°²à±\8b à°ªà°¨à°¿ చేసిన వాడుకరులు',
 'statistics-mostpopular' => 'ఎక్కువగా చూసిన పేజీలు',
 
 'pageswithprop' => 'ఒక పేజీ లక్షణం కలిగిన పేజీలు',
@@ -1964,7 +2004,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'double-redirect-fixer' => 'దారిమార్పు సరిద్దువారు',
 
 'brokenredirects' => 'తెగిపోయిన దారిమార్పులు',
-'brokenredirectstext' => 'à°\95à°¿à°\82ది à°¦à°¾à°°à°¿à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81 à°²à±\87ని-à°ªà±\87à°\9cà±\80à°²à°\95à±\81 à°®à°³à±\8dళిà°\82à°\9aà±\81తున్నాయి:',
+'brokenredirectstext' => 'à°\95à°¿à°\82ది à°¦à°¾à°°à°¿à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81 à°\89నిà°\95à°¿à°²à±\8bà°¨à±\87 à°²à±\87ని à°ªà±\87à°\9cà±\80à°²à°\95à±\81 à°µà±\86à°³à±\8dతున్నాయి:',
 'brokenredirects-edit' => 'సవరించు',
 'brokenredirects-delete' => 'తొలగించు',
 
@@ -1980,10 +2020,10 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'ncategories' => '$1 {{PLURAL:$1|వర్గం|వర్గాలు}}',
 'ninterwikis' => '$1 {{PLURAL:$1|అంతర్వికీ|అంతర్వికీలు}}',
 'nlinks' => '$1 {{PLURAL:$1|లింకు|లింకులు}}',
-'nmembers' => '{{PLURAL:$1|ఒక ఉపవర్గం/పేజీ/ఫైలు|$1 ఉపవర్గాలు/పేజీలు/ఫైళ్లు}}',
+'nmembers' => '$1 {{PLURAL:$1|సభ్యుడు|సభ్యులు}}',
 'nmemberschanged' => '$1 → $2 {{PLURAL:$2|సభ్యుడు|సభ్యులు}}',
-'nrevisions' => '{{PLURAL:$1|à°\92à°\95 à°¸à°\82à°\9aà°¿à°\95|$1 à°¸à°\82à°\9aà°¿à°\95లు}}',
-'nviews' => '$1 {{PLURAL:$1|దరà±\8dశనమà±\81|దర్శనలు}}',
+'nrevisions' => '{{PLURAL:$1|à°\95à±\82à°°à±\8dà°ªà±\81|$1 à°\95à±\82à°°à±\8dà°ªà±\81లు}}',
+'nviews' => '$1 {{PLURAL:$1|à°¸à°\82దరà±\8dశన|à°¸à°\82దర్శనలు}}',
 'nimagelinks' => '$1 {{PLURAL:$1|పుట|పుటల}}లో ఉపయోగించారు',
 'ntransclusions' => '$1 {{PLURAL:$1|పుట|పుటల}}లో ఉపయోగించారు',
 'specialpage-empty' => 'ఈ పేజీ ఖాళీగా ఉంది.',
@@ -1994,7 +2034,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'uncategorizedimages' => 'వర్గీకరించని బొమ్మలు',
 'uncategorizedtemplates' => 'వర్గీకరించని మూసలు',
 'unusedcategories' => 'ఉపయోగించని వర్గాలు',
-'unusedimages' => 'à°\89పయà±\8bà°\97à°¿à°\82à°\9aబడని à°«à±\88à°³à±\8dà°³à±\81',
+'unusedimages' => 'ఉపయోగించని ఫైళ్ళు',
 'popularpages' => 'ప్రజాదరణ పొందిన పేజీలు',
 'wantedcategories' => 'కోరిన వర్గాలు',
 'wantedpages' => 'కోరిన పేజీలు',
@@ -2019,6 +2059,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'deadendpagestext' => 'కింది పేజీల నుండి ఈ వికీ లోని ఏ ఇతర పేజీకీ లింకులు లేవు.',
 'protectedpages' => 'సంరక్షిత పేజీలు',
 'protectedpages-indef' => 'అనంత సంరక్షణ మాత్రమే',
+'protectedpages-summary' => 'ప్రస్తుతం సంరక్షణలో ఉన్న పేజీల జాబితాను ఈ పేజీ చూపిస్తుంది. అసలు సృష్టించకుండా సంరక్షించబడిన పేజీశీర్షికల కోసం [[{{#special:ProtectedTitles}}]] చూడండి.',
 'protectedpages-cascade' => 'కాస్కేడింగు రక్షణలు మాత్రమే',
 'protectedpages-noredirect' => 'దారిమార్పులను దాచు',
 'protectedpagesempty' => 'ఈ పరామితులతో ప్రస్తుతం ఏ పేజీలు కూడా సంరక్షించబడి లేవు.',
@@ -2082,11 +2123,11 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'allpagesfrom' => 'ఇక్కడ మొదలు పెట్టి పేజీలు చూపించు:',
 'allpagesto' => 'ఇక్కడవరకు ఉన్న పేజీలు చూపించు:',
 'allarticles' => 'అన్ని పేజీలు',
-'allinnamespace' => 'అన్ని పేజీలు ($1 namespace)',
+'allinnamespace' => 'అన్ని పేజీలు ($1 పేరుబరి)',
 'allpagessubmit' => 'వెళ్లు',
 'allpagesprefix' => 'ఈ ఆదిపదం కలిగిన పేజీలను చూపించు:',
 'allpagesbadtitle' => 'మీరిచ్చిన పేజీ పేరు సరైనది కాకపోయి ఉండాలి లేదా దానికి భాషాంతర లేదా అంతర్వికీ ఆదిపదమైనా ఉండి ఉండాలి. పేర్లలో వాడకూడని కారెక్టర్లు ఆ పేరులో ఉండి ఉండవచ్చు.',
-'allpages-bad-ns' => '{{SITENAME}} à°²à±\8b "$1" à°\85à°¨à±\87 à°¨à±\87à°®à±\8d&zwnj;à°¸à±\8dà°ªà±\87à°¸à±\8d లేదు.',
+'allpages-bad-ns' => '{{SITENAME}} à°²à±\8b "$1" à°\85à°¨à±\87 à°ªà±\87à°°à±\81బరి లేదు.',
 'allpages-hide-redirects' => 'దారిమార్పులను దాచు',
 
 # SpecialCachedPage
@@ -2106,7 +2147,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 # Special:DeletedContributions
 'deletedcontributions' => 'తొలగించబడిన వాడుకరి రచనలు',
 'deletedcontributions-title' => 'తొలగించబడిన వాడుకరి రచనలు',
-'sp-deletedcontributions-contribs' => 'మారà±\8dà°ªà±\81à°²à±\81 à°\9aà±\87à°°à±\8dà°ªà±\81à°²à±\81',
+'sp-deletedcontributions-contribs' => 'మార్పుచేర్పులు',
 
 # Special:LinkSearch
 'linksearch' => 'బయటి లింకుల అన్వేషణ',
@@ -2147,9 +2188,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'listgrouprights-removegroup' => '{{PLURAL:$2|గుంపుని|గుంపులను}} తొలగించగలరు: $1',
 'listgrouprights-addgroup-all' => 'అన్ని గుంపులను చేర్చగలరు',
 'listgrouprights-removegroup-all' => 'అన్ని గుంపులను తొలగించగలరు',
-'listgrouprights-addgroup-self' => '{{PLURAL:$2|సమà±\82హానà±\8dని|సమà±\82హాలని}} à°¤à°¨ à°¸à±\8dà°µà°\82à°¤ à°\96ాతాà°\95à°¿ చేర్చుకోగలగడం: $1',
+'listgrouprights-addgroup-self' => '{{PLURAL:$2|à°\97à±\81à°\82à°ªà±\81à°¨à±\81|à°\97à±\81à°\82à°ªà±\81లనà±\81}} à°¤à°¨ à°¸à±\8dà°µà°\82à°¤ à°\96ాతాà°\95à±\81 చేర్చుకోగలగడం: $1',
 'listgrouprights-removegroup-self' => '{{PLURAL:$2|సమూహాన్ని|సమూహాలని}} తన స్వంత ఖాతా నుండి తొలగించుకోవడం: $1',
-'listgrouprights-addgroup-self-all' => 'à°\85à°¨à±\8dని à°¸à°®à±\82హాలని à°¸à±\8dà°µà°\82à°¤ à°\96ాతాà°\95à°¿ చేర్చుకోలగడటం',
+'listgrouprights-addgroup-self-all' => 'à°\85à°¨à±\8dని à°¸à°®à±\82హాలని à°¸à±\8dà°µà°\82à°¤ à°\96ాతాà°\95à±\81 చేర్చుకోలగడటం',
 'listgrouprights-removegroup-self-all' => 'స్వంత ఖాతా నుండి అన్ని సమూహాలనూ తొలగించుకోగలగడం',
 
 # Email user
@@ -2336,6 +2377,7 @@ $UNWATCHURL
 'prot_1movedto2' => '$1, $2కు తరలించబడింది',
 'protect-badnamespace-title' => 'సంరక్షించజాలని పేరుబరి',
 'protect-badnamespace-text' => 'ఈ పేరుబరిలో ఉన్న పేజీలను సంరక్షించలేరు.',
+'protect-norestrictiontypes-text' => 'నిరోధ రకాలేవీ అందుబాటులో లేనందువలన ఈ పేజీని సంరక్షించలేం.',
 'protect-norestrictiontypes-title' => 'సంరక్షించజాలని పేజీ',
 'protect-legend' => 'సంరక్షణను నిర్ధారించు',
 'protectcomment' => 'కారణం:',
@@ -2442,12 +2484,13 @@ $1',
 'invert' => 'ఎంపికను తిరగవెయ్యి',
 'tooltip-invert' => 'ఎంచుకున్న పేరుబరి (చెక్ చేసి ఉంటే అనుబంధ పేరుబరి కూడా) లోని పేజీల్లో జరిగిన మార్పులను దాచేందుకు ఈ పెట్టెను చెక్ చెయ్యండి',
 'namespace_association' => 'సంబంధిత పేరుబరి',
+'tooltip-namespace_association' => 'ఎంచుకున్న పేరుబరికి చెందిన చర్చ లేదా విషయం పేరుబరిని కూడా ఎంచుకునేందుకు ఈ పెట్టెను చెక్ చెయ్యండి.',
 'blanknamespace' => '(మొదటి)',
 
 # Contributions
 'contributions' => '{{GENDER:$1|వాడుకరి}} రచనలు',
 'contributions-title' => '$1 యొక్క మార్పులు-చేర్పులు',
-'mycontris' => 'మారà±\8dà°ªà±\81à°²à±\81 à°\9aà±\87à°°à±\8dà°ªà±\81à°²à±\81',
+'mycontris' => 'మార్పుచేర్పులు',
 'contribsub2' => '{{GENDER:$3|$1}} ($2) కొరకు',
 'nocontribs' => 'ఈ విధమైన మార్పులేమీ దొరకలేదు.',
 'uctop' => '(ప్రస్తుత)',
@@ -2468,15 +2511,17 @@ $1',
 'sp-contributions-blocked-notice-anon' => 'ఈ ఐపీ చిరునామాపై ప్రస్తుతం నిరోధం ఉంది.
 నిరోధపు చిట్టాలోని చివరి పద్దుని మీ సమాచారంకోసం ఇస్తున్నాం:',
 'sp-contributions-search' => 'రచనల కోసం అన్వేషణ',
+'sp-contributions-suppresslog' => 'అణచిపెట్టబడిన వాడుకరి రచనలు',
 'sp-contributions-username' => 'ఐపీ చిరునామా లేదా వాడుకరిపేరు:',
 'sp-contributions-toponly' => 'చిట్టచివరి కూర్పులను మాత్రమే చూపించు',
+'sp-contributions-newonly' => 'పేజీని సృష్టించిన మార్పులను మాత్రమే చూపించు',
 'sp-contributions-submit' => 'వెతుకు',
 
 # What links here
-'whatlinkshere' => 'à°\87à°\95à±\8dà°\95à°¡à°¿à°\95à°¿ à°²à°\82à°\95à±\86à°²à±\81à°¨à±\8dనవి',
+'whatlinkshere' => 'à°\87à°\95à±\8dà°\95à°¡à°¿à°\95à°¿ à°²à°¿à°\82à°\95à±\88నవి',
 'whatlinkshere-title' => '"$1"కి లింకున్న పుటలు',
 'whatlinkshere-page' => 'పేజీ:',
-'linkshere' => "కిందనున్న పేజీల నుండి '''[[:$1]]'''కు లింకులు ఉన్నాయి:",
+'linkshere' => 'కింది పేజీల నుండి <strong>[[:$1]]</strong>కు లింకులు ఉన్నాయి:',
 'nolinkshere' => "'''[[:$1]]'''కు ఏ పేజీ నుండీ లింకు లేదు.",
 'nolinkshere-ns' => "'''[[:$1]]''' పేజీకి లింకయ్యే పేజీలు ఎంచుకున్న నేంస్పేసులో లేవు.",
 'isredirect' => 'దారిమార్పు పుట',
@@ -2529,6 +2574,7 @@ $1',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] నిరోధించబడింది.<br />
 నిరోధాల సమీక్ష కొరకు [[Special:BlockList|నిరోధాల జాబితా]] చూడండి.',
 'ipb-blockingself' => 'మిమ్మల్ని మీరే నిరోధించుకోబోతున్నారు! అదే మీ నిశ్చయమా?',
+'ipb-confirmhideuser' => '"వాడుకరిని దాచు" చేతనంగా ఉన్న వాడుకరిని మీరు నిరోధించబోతున్నారు. దీంతో ఈ వాడుకరి పేరు అన్ని జాబితాల్లోనూ, లాగ్ ఎంట్రీలలోనూ అణచి ఉంచబడుతుంది. ఈ పని చెయ్యాలనే మీరు నిశ్చయించుకున్నారా?',
 'ipb-confirmaction' => 'మీరు నిజంగానే ఆ పని చెయ్యాలనుకుంటే, కింద ఉన్న "{{int:ipb-confirm}}" ఫీల్డును చెక్ చెయ్యండి.',
 'ipb-edit-dropdown' => 'నిరోధపు కారణాలను మార్చండి',
 'ipb-unblock-addr' => '$1 పై ఉన్న నిరోధాన్ని తొలగించండి',
@@ -2638,15 +2684,14 @@ $1 ను నిరోధించడానికి కారణం: "$2"',
 'movepagetext' => "కింది ఫారం ఉపయోగించి, ఓ పేజీ పేరు మార్చవచ్చు. దాంతో పాటు దాని చరిత్ర అంతా కొత్త పేజీ చరిత్రగా మారుతుంది.
 పాత పేజీ కొత్త దానికి దారిమార్పు పేజీ అవుతుంది.
 పాత పేజీకి ఉన్న దారిమార్పు పేజీలను ఆటోమెటిగ్గా సరిచేయవచ్చు.
-à°\86లా à°\9aà±\87యవదà±\8dదనà±\81à°\95à±\81à°\82à°\9fà±\87, [[Special:DoubleRedirects|à°¦à±\8dà°µà°\82à°¦]] à°²à±\87దా [[Special:BrokenRedirects|పనిà°\9aà±\87యని]] à°¦à°¾à°°à°¿à°®à°¾à°°à±\8dà°ªà±\81à°² à°ªà±\87à°\9cà±\80లలో సరిచూసుకోండి.
+à°\86లా à°\9aà±\87యవదà±\8dదనà±\81à°\95à±\81à°\82à°\9fà±\87, [[Special:DoubleRedirects|à°\9cమిలి]] à°²à±\87దా [[Special:BrokenRedirects|పనిà°\9aà±\87యని à°¦à°¾à°°à°¿à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81]] à°\89à°¨à±\8dనాయà±\87à°®ో సరిచూసుకోండి.
 లింకులన్నీ అనుకున్నట్లుగా చేరవలసిన చోటికే చేరుతున్నాయని నిర్ధారించుకోవలసిన బాధ్యత మీదే.
 
 ఒకవేళ కొత్త పేరుతో ఇప్పటికే ఒక పేజీ ఉండి ఉంటే (అది గత మార్పుల చరిత్ర లేని ఖాళీ పేజీనో లేదా దారిమార్పు పేజీనో కాకపోతే) తరలింపు '''జరగదు'''.
-
 అంటే మీరు పొరపాటు చేస్తే కొత్త పేరును మార్చి తిరిగి పాత పేరుకు తీసుకురాగలరు కానీ ఇప్పటికే వున్న పేజీని తుడిచివేయలేరు.
 
-'''హెచ్చరిక!'''
-à°\88 à°®à°¾à°°à±\8dà°ªà±\81 à°¬à°¾à°\97à°¾ à°\9cనరà°\82à°\9cà°\95à°®à±\88à°¨ à°ªà±\87à°\9cà±\80à°²à°\95à±\81 à°\85à°¨à±\82à°¹à±\8dà°¯à°\82 కావచ్చు;
+<strong>హెచ్చరిక!</strong>
+à°\87ది à°\9cనరà°\82à°\9cà°\95à°®à±\88à°¨ à°ªà±\87à°\9cà±\80à°²à°\95à±\81 à°\85à°¨à±\81à°\95à±\8bని, à°¤à±\80à°µà±\8dà°°à°®à±\88à°¨ à°®à°¾à°°à±\8dà°ªà±\81 కావచ్చు;
 దాని పరిణామాలను అర్ధం చేసుకుని ముందుకుసాగండి.",
 'movepagetext-noredirectfixer' => "కింది ఫారాన్ని వాడి, ఓ పేజీ పేరు మార్చవచ్చు. దాని చరిత్ర పూర్తిగా కొత్త పేరుకు తరలిపోతుంది. 
 పాత శీర్షిక కొత్తదానికి దారిమార్పు పేజీగా మారిపోతుంది.
@@ -2823,6 +2868,7 @@ $2',
 'import-error-interwiki' => 'పేజీ "$1" యొక్క పేరు బయటి లింకుల (అంతరవికీ) కోసం అట్టేపెట్టబడింది కాబట్టి దాన్ని దిగుమతి చెయ్యలేదు.',
 'import-error-special' => 'పేజీ "$1" ప్రత్యేక పేరుబరికి చెందినది. ఈ పేరుబరిలో పేజీలు సృష్టించే అనుమతి లేదు. అందుచేత దాన్ని దిగుమతి చెయ్యలేదు.',
 'import-error-invalid' => 'పేజీ "$1" పేరు సరైనది కాదు కాబట్టి దాన్ని దిగుమతి చెయ్యలేదు.',
+'import-error-unserialize' => 'పేజీ "$1" యొక్క కూర్పు $2ను సీరియలించలేకపోయాం. ఈ కూర్పు వాడుతున్న కంటెంటు మోడల్ $3 అని తెలియవచ్చింది. ఈ మోడల్ $4 లాగా సీరియలించబడుతుంది.',
 'import-options-wrong' => 'తప్పు {{PLURAL:$2|ఐచ్ఛికం|ఐచ్ఛికాలు}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'ఇచ్చిన మూలపు పేజీ సరైన శీర్షిక కాదు.',
 'import-rootpage-nosubpage' => 'మూలపేజీ యొక్క పేరుబరి "$1" ఉపపేజీలను అనుమతించదు.',
@@ -2841,6 +2887,7 @@ $2',
 'javascripttest-pagetext-noframework' => 'ఈ పేజీ JavaScript పరీక్షల కోసం ఉద్దేశించబడింది.',
 'javascripttest-pagetext-unknownframework' => 'తెలియని పరీక్షా ఫ్రేమ్‍వర్కు "$1".',
 'javascripttest-pagetext-frameworks' => 'కింది పరీక్షా ఫ్రేమ్‍వర్కులలో ఒకదాన్ని ఎంచుకోండి: $1',
+'javascripttest-pagetext-skins' => 'పరీక్షలు నడిపేందుకు ఓ రూపును ఎంచుకోండి:',
 'javascripttest-qunit-intro' => 'mediawiki.org లోని [$1 పరీక్షా డాక్యుమెంటేషన్] చూడండి.',
 
 # Tooltip help for the actions
@@ -2850,43 +2897,43 @@ $2',
 'tooltip-pt-anontalk' => 'ఈ ఐపీ చిరునామా నుండి చేసిన మార్పుల గురించి చర్చ',
 'tooltip-pt-preferences' => 'మీ అభిరుచులు',
 'tooltip-pt-watchlist' => 'మీరు మార్పుల కొరకు గమనిస్తున్న పేజీల జాబితా',
-'tooltip-pt-mycontris' => 'మీ మార్పు-చేర్పుల జాబితా',
-'tooltip-pt-login' => 'à°®à±\80à°°à±\81 à°²à±\8bనిà°\95à°¿ à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aడానà±\8dని à°ªà±\8dà°°à±\8bà°¤à±\8dసహిసà±\8dà°¤à±\81à°¨à±\8dనాà°\82; à°\95ానà±\80 à°\85ది à°¤à°ªà±\8dపనిసరి కాదు.',
-'tooltip-pt-logout' => 'నిషà±\8dà°\95à±\8dరమిà°\82à°\9aండి',
-'tooltip-ca-talk' => 'విషయపà±\81 à°ªà±\81à°\9f గురించి చర్చ',
-'tooltip-ca-edit' => 'à°\88 à°ªà±\87à°\9cà±\80ని à°®à±\80à°°à±\81 à°¸à°°à°¿à°¦à°¿à°¦à±\8dదవà°\9aà±\8dà°\9aà±\81. à°¦à°¾à°\9aà±\87ముందు మునుజూపు బొత్తాన్ని వాడండి.',
+'tooltip-pt-mycontris' => 'మీ మార్పుచేర్పుల జాబితా',
+'tooltip-pt-login' => 'మిమà±\8dమలà±\8dని à°²à°¾à°\97ినవమని à°ªà±\8dà°°à±\8bà°¤à±\8dసహిసà±\8dà°¤à±\81à°¨à±\8dనాà°\82; à°\95ానà±\80 à°\85ది à°¤à°ªà±\8dపనిసరà±\87à°®à±\80 కాదు.',
+'tooltip-pt-logout' => 'లాà°\97à±\8cà°\9fà°µండి',
+'tooltip-ca-talk' => 'విషయపà±\81 à°ªà±\87à°\9cà±\80 గురించి చర్చ',
+'tooltip-ca-edit' => 'à°\88 à°ªà±\87à°\9cà±\80ని à°®à±\80à°°à±\81 à°¸à°°à°¿à°¦à°¿à°¦à±\8dదవà°\9aà±\8dà°\9aà±\81. à°­à°¦à±\8dరపరà°\9aà±\87 ముందు మునుజూపు బొత్తాన్ని వాడండి.',
 'tooltip-ca-addsection' => 'కొత్త విభాగాన్ని మొదలుపెట్టండి',
 'tooltip-ca-viewsource' => 'ఈ పుటని సంరక్షించారు. మీరు దీని మూలాన్ని చూడవచ్చు',
-'tooltip-ca-history' => 'à°\88 à°ªà±\81à°\9f యొక్క వెనుకటి కూర్పులు',
+'tooltip-ca-history' => 'à°\88 à°ªà±\87à°\9cà±\80 యొక్క వెనుకటి కూర్పులు',
 'tooltip-ca-protect' => 'ఈ పేజీని సంరక్షించండి',
 'tooltip-ca-unprotect' => 'ఈ పేజీ సంరక్షణను మార్చండి',
 'tooltip-ca-delete' => 'ఈ పేజీని తొలగించండి',
 'tooltip-ca-undelete' => 'ఈ పేజీని తొలగించడానికి ముందు చేసిన మార్పులను పునఃస్థాపించు',
 'tooltip-ca-move' => 'ఈ పేజీని తరలించండి',
 'tooltip-ca-watch' => 'ఈ పేజీని మీ వీక్షణ జాబితాకు చేర్చుకోండి',
-'tooltip-ca-unwatch' => 'à°\88 à°ªà±\87à°\9cà±\80ని à°®à±\80 à°µà°¿à°\95à±\8dషణా జాబితా నుండి తొలగించండి',
+'tooltip-ca-unwatch' => 'à°\88 à°ªà±\87à°\9cà±\80ని à°®à±\80 à°µà±\80à°\95à±\8dà°·à°£ జాబితా నుండి తొలగించండి',
 'tooltip-search' => '{{SITENAME}} లో వెతకండి',
-'tooltip-search-go' => 'ఇదే పేరుతో పేజీ ఉంటే అక్కడికి తీసుకెళ్ళు',
+'tooltip-search-go' => 'à°\95à°\9aà±\8dà°\9aà°¿à°¤à°\82à°\97à°¾ à°\87à°¦à±\87 à°ªà±\87à°°à±\81à°¤à±\8b à°ªà±\87à°\9cà±\80 à°\89à°\82à°\9fà±\87 à°\85à°\95à±\8dà°\95à°¡à°¿à°\95à°¿ à°¤à±\80à°¸à±\81à°\95à±\86à°³à±\8dà°³à±\81',
 'tooltip-search-fulltext' => 'పేజీలలో ఈ పాఠ్యం కొరకు వెతుకు',
-'tooltip-p-logo' => 'à°®à±\8aà°¦à°\9fà°¿ à°ªà±\81à°\9fà°¨à±\81 à°¦à°°à±\8dశిà°\82à°\9aండి',
-'tooltip-n-mainpage' => 'తలపà±\81à°\9fà°¨à±\81 చూడండి',
-'tooltip-n-mainpage-description' => 'à°®à±\8aà°¦à°\9fà°¿ à°ªà±\81à°\9fà°¨à±\81 చూడండి',
+'tooltip-p-logo' => 'à°®à±\8aà°¦à°\9fà°¿ à°ªà±\87à°\9cà±\80 à°\9aà±\82à°¡ండి',
+'tooltip-n-mainpage' => 'à°®à±\8aà°¦à°\9fà°¿ à°ªà±\87à°\9cà±\80 చూడండి',
+'tooltip-n-mainpage-description' => 'à°®à±\8aà°¦à°\9fà°¿ à°ªà±\87à°\9cà±\80 చూడండి',
 'tooltip-n-portal' => 'ప్రాజెక్టు గురించి, మీరేం చేయవచ్చు, సమాచారం ఎక్కడ దొరుకుతుంది',
 'tooltip-n-currentevents' => 'వర్తమాన ఘటనల యొక్క నేపథ్యాన్ని తెలుసుకోండి',
 'tooltip-n-recentchanges' => 'వికీలో ఇటీవల జరిగిన మార్పుల జాబితా.',
 'tooltip-n-randompage' => 'ఓ యాదృచ్చిక పేజీని చూడండి',
-'tooltip-n-help' => 'à°¤à±\86à°²à±\81à°¸à±\81à°\95à±\8bడానిà°\95à°¿ à°\93 à°®à°\82à°\9aà°¿ à°ªà±\8dà°°à°¦à±\87à°¶à°\82.',
-'tooltip-t-whatlinkshere' => 'à°\87à°\95à±\8dà°\95à°¡à°¿à°¤à±\8b à°®à±\81డిపడియà±\81à°¨à±\8dà°¨ à°\85à°¨à±\8dని à°µà°¿à°\95à±\80 à°ªà±\81à°\9fà°² à°²à°\82à°\95à±\86à°²à±\81',
-'tooltip-t-recentchangeslinked' => 'à°\88 à°ªà±\81à°\9fà°\95à±\81 à°®à±\81డివడియà±\81à°¨à±\8dà°¨ à°ªà±\81à°\9fà°²లో జరిగిన ఇటీవలి మార్పులు',
+'tooltip-n-help' => 'à°¨à±\87à°°à±\8dà°\9aà±\81à°\95à±\81à°¨à±\87 à°\9aà±\8bà°\9fà±\81',
+'tooltip-t-whatlinkshere' => 'à°\87à°\95à±\8dà°\95à°¡à°¿à°\95à°¿ à°²à°¿à°\82à°\95à±\88 à°\89à°¨à±\8dà°¨ à°\85à°¨à±\8dని à°µà°¿à°\95à±\80 à°ªà±\87à°\9cà±\80à°² à°\9cాబితా',
+'tooltip-t-recentchangeslinked' => 'à°\88 à°ªà±\87à°\9cà±\80à°\95à°¿ à°²à°¿à°\82à°\95à±\88 à°\89à°¨à±\8dà°¨ à°ªà±\87à°\9cà±\80à°²à±\8dలో జరిగిన ఇటీవలి మార్పులు',
 'tooltip-feed-rss' => 'ఈ పేజీకి RSS ఫీడు',
 'tooltip-feed-atom' => 'ఈ పేజీకి Atom ఫీడు',
 'tooltip-t-contributions' => 'ఈ వాడుకరి యొక్క రచనల జాబితా చూడండి',
 'tooltip-t-emailuser' => 'ఈ వాడుకరికి ఓ ఈమెయిలు పంపండి',
 'tooltip-t-upload' => 'దస్త్రాలను ఎక్కించండి',
-'tooltip-t-specialpages' => 'à°\85à°¨à±\8dని à°ªà±\8dà°°à°¤à±\8dà°¯à±\87à°\95 à°ªà±\81à°\9fà°² à°¯à±\8aà°\95à±\8dà°\95 à°\9cాబితా',
-'tooltip-t-print' => 'à°\88 à°ªà±\81à°\9f à°¯à±\8aà°\95à±\8dà°\95 à°\85à°\9aà±\8dà°\9aà±\81à°¤à±\80యదà°\97à±\8dà°\97 à°\95à±\82à°°à±\8dపు',
-'tooltip-t-permalink' => 'à°ªà±\81à°\9f యొక్క ఈ కూర్పుకి శాశ్వత లంకె',
-'tooltip-ca-nstab-main' => 'à°®à±\81à°\9aà±\8dà°\9aà°\9fà±\8dà°² à°ªà±\81à°\9fà°¨à±\81 చూడండి',
+'tooltip-t-specialpages' => 'అన్ని ప్రత్యేక పుటల జాబితా',
+'tooltip-t-print' => 'à°\88 à°ªà±\87à°\9cà±\80 à°¯à±\8aà°\95à±\8dà°\95 à°®à±\81à°¦à±\8dరణా à°°à±\82పు',
+'tooltip-t-permalink' => 'à°ªà±\87à°\9cà±\80 యొక్క ఈ కూర్పుకి శాశ్వత లంకె',
+'tooltip-ca-nstab-main' => 'విషయపà±\81 à°ªà±\87à°\9cà±\80ని చూడండి',
 'tooltip-ca-nstab-user' => 'వాడుకరి పేజీని చూడండి',
 'tooltip-ca-nstab-media' => 'మీడియా పేజీని చూడండి',
 'tooltip-ca-nstab-special' => 'ఇది ఒక ప్రత్యేక పుట, దీన్ని మీరు సరిదిద్దలేరు',
@@ -2899,16 +2946,16 @@ $2',
 'tooltip-minoredit' => 'దీన్ని చిన్న మార్పుగా గుర్తించు',
 'tooltip-save' => 'మీ మార్పులను భద్రపరచండి',
 'tooltip-preview' => 'మీ మార్పులను మునుజూడండి, భద్రపరిచేముందు ఇది వాడండి!',
-'tooltip-diff' => 'పాఠానిà°\95à°¿ à°®à±\80à°°à±\81 à°\9aà±\87సిన à°®à°¾à°°à±\8dà°ªà±\81లనà±\81 à°\9aà±\82à°ªà±\81à°\82à°\9aà±\81. [alt-v]',
-'tooltip-compareselectedversions' => 'ఈ పేజీలో ఎంచుకున్న రెండు కూర్పులకు మధ్య తేడాలను చూడండి. [alt-v]',
+'tooltip-diff' => 'పాఠానిà°\95à°¿ à°®à±\80à°°à±\81 à°\8f à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81 à°\9aà±\87సారà±\8b à°\9aà±\82పిసà±\8dà°¤à±\81à°\82ది',
+'tooltip-compareselectedversions' => 'ఈ పేజీలో ఎంచుకున్న రెండు కూర్పులకు మధ్య తేడాలను చూడండి',
 'tooltip-watch' => 'ఈ పేజీని మీ విక్షణా జాబితాకు చేర్చండి',
 'tooltip-watchlistedit-normal-submit' => 'శీర్షికలను తీసివెయ్యి',
 'tooltip-watchlistedit-raw-submit' => 'వీక్షణ జాబితాను తాజాకరించు',
 'tooltip-recreate' => 'పేజీ తుడిచివేయబడ్డాకానీ మళ్ళీ సృష్టించు',
 'tooltip-upload' => 'ఎగుమతి మొదలుపెట్టు',
-'tooltip-rollback' => '"à°°à°¦à±\8dà°¦à±\81à°\9aà±\87యి" à°\85à°¨à±\87ది à°\88 à°ªà±\87à°\9cà±\80ని à°\9aివరిà°\97à°¾ à°®à°¾à°°à±\8dà°\9aినవారి à°®à°¾à°°à±\8dà°ªà±\81లని రద్దుచేస్తుంది',
-'tooltip-undo' => '"దిదà±\8dà°¦à±\81బాà°\9fà±\81ని à°°à°¦à±\8dà°¦à±\81à°\9aà±\87యి" à°\88 à°®à°¾à°°à±\8dà°ªà±\81ని à°°à°¦à±\8dà°¦à±\81à°\9aà±\87à°¸à±\8dà°¤à±\81à°\82ది à°®à°°à°¿à°¯à±\81 దిద్దుబాటు ఫారాన్ని మునుజూపులో తెరుస్తుంది.
-సారాంశానికి కారణాన్ని చేర్చే వీలుకల్పిస్తుంది',
+'tooltip-rollback' => '"à°°à°¦à±\8dà°¦à±\81à°\9aà±\87యి" à°\85à°¨à±\87ది à°\88 à°ªà±\87à°\9cà±\80ని à°\9aివరిà°\97à°¾ à°®à°¾à°°à±\8dà°\9aినవారి à°®à°¾à°°à±\8dà°ªà±\81లనà±\81 à°\92à°\95à±\8dà°\95à°¨à±\8aà°\95à±\8dà°\95à±\81à°¤à±\8b రద్దుచేస్తుంది',
+'tooltip-undo' => '"à°°à°¦à±\8dà°¦à±\81à°\9aà±\87యి" à°\88 à°®à°¾à°°à±\8dà°ªà±\81ని à°°à°¦à±\8dà°¦à±\81à°\9aà±\87సి, దిద్దుబాటు ఫారాన్ని మునుజూపులో తెరుస్తుంది.
+సారాంశానికి కారణాన్ని చేర్చే వీలుకల్పిస్తుంది.',
 'tooltip-preferences-save' => 'అభిరుచులను భద్రపరచు',
 'tooltip-summary' => 'చిన్న సారాంశాన్ని ఇవ్వండి',
 
@@ -2975,7 +3022,9 @@ $2',
 'pageinfo-toolboxlink' => 'పేజీ సమాచారం',
 'pageinfo-redirectsto' => 'ఇక్కడికి దారిమార్పు:',
 'pageinfo-redirectsto-info' => 'సమాచారం',
+'pageinfo-contentpage' => 'విషయపు పేజీగా పరిగణింపబడుతుంది',
 'pageinfo-contentpage-yes' => 'అవును',
+'pageinfo-protect-cascading' => 'సంరక్షణ ఇక్కడినుంచి వ్యాపిస్తుంది',
 'pageinfo-protect-cascading-yes' => 'అవును',
 'pageinfo-category-info' => 'వర్గపు సమాచారం',
 'pageinfo-category-pages' => 'పేజీల సంఖ్య',
@@ -3031,6 +3080,7 @@ $1',
 'file-info-size-pages' => '$1 × $2 పిక్సెళ్ళు, దస్త్రపు పరిమాణం: $3, MIME రకం: $4, $5 {{PLURAL:$5|పేజీ|పేజీలు}}',
 'file-nohires' => 'మరింత స్పష్టమైన బొమ్మ లేదు.',
 'svg-long-desc' => 'SVG ఫైలు, నామమాత్రంగా $1 × $2 పిక్సెళ్ళు, ఫైలు పరిమాణం: $3',
+'svg-long-error' => 'చెల్లని SVG దస్త్రం: $1',
 'show-big-image' => 'అసలు దస్త్రం',
 'show-big-image-preview' => 'ఈ మునుజూపు పరిమాణం: $1.',
 'show-big-image-other' => 'ఇతర {{PLURAL:$2|వైశాల్యం|వైశాల్యాలు}}: $1.',
@@ -3084,12 +3134,13 @@ $1',
 # Bad image list
 'bad_image_list' => 'కింద తెలిపిన తీరులో కలపాలి:
 
-జాబితాలో ఉన్నవాటినే (* గుర్తుతో మొదలయ్యే వాక్యాలు) పరిగణలోకి తీసుకుంటారు. వ్యాక్యంలో ఉన్న మొదటి లింకు ఒక చెడిపోయిన బొమ్మకు లింకు అయ్యుండాలి.
-అదే వాక్యంలో ఈ లింకు తరువాత వచ్చే లింకులను పట్టించుకోదు, ఆ పేజీలలో బొమ్మలు సరిగ్గా చేర్చారని భావిస్తుంది.',
+జాబితాలో ఉన్నవే (* గుర్తుతో మొదలయ్యే వాక్యాలు) పరిగణించబడతాయి.
+వాక్యంలో ఉన్న మొదటి లింకు ఒక చెడిపోయిన ఫైలుకు లింకు అయ్యుండాలి.
+ఆ వాక్యంలో తరువాత వచ్చే లింకులను పట్టించుకోదు. అంటే, ఆ పేజీలలో బొమ్మలు సరిగ్గా చేర్చారని భావిస్తుంది.',
 
 # Metadata
 'metadata' => 'మెటాడేటా',
-'metadata-help' => 'à°\88 à°«à±\88à°²à±\81à°²à±\8b à°\85దనపà±\81 à°¸à°®à°¾à°\9aారà°\82 à°\89à°\82ది, à°¬à°¹à±\81శా à°¦à±\80à°¨à±\8dని à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aడానిà°\95à°¿ à°²à±\87దా à°¸à°¾à°\82à°\96à±\8dà°¯à±\80à°\95à°°à°¿à°\82à°\9aడానిà°\95à°¿ à°µà°¾à°¡à°¿à°¨ à°¡à°¿à°\9cà°¿à°\9fà°²à±\8d à°\95à±\87à°®à±\86à°°à°¾ à°²à±\87దా à°¸à±\8dà°\95ానరà±\8d à°\86 à°¸à°®à°¾à°\9aారానà±\8dని à°\9aà±\87à°°à±\8dà°\9aà°¿à°µà±\81à°\82à°µà°\9aà±\8dà°\9aà±\81. à°\88 à°«à±\88à°²à±\81ని à°\85సలà±\81 à°¸à±\8dథితి à°¨à±\81à°\82à°¡à°¿ à°®à°¾à°°à°¿à°¸à±\8dà°¤à±\87, à°\95à±\8aà°¨à±\8dని à°µà°¿à°µà°°à°¾à°²à±\81 à°\86 à°®à°¾à°°à°¿à°¨ à°«à±\88à°²à±\81à°²à±\8b పూర్తిగా ప్రతిఫలించకపోవచ్చు.',
+'metadata-help' => 'à°\88 à°«à±\88à°²à±\81à°²à±\8b à°\85దనపà±\81 à°¸à°®à°¾à°\9aారà°\82 à°\89à°\82ది, à°¬à°¹à±\81శా à°¦à±\80à°¨à±\8dని à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aడానిà°\95à°¿ à°²à±\87దా à°¸à°¾à°\82à°\96à±\8dà°¯à±\80à°\95à°°à°¿à°\82à°\9aడానిà°\95à°¿ à°µà°¾à°¡à°¿à°¨ à°¡à°¿à°\9cà°¿à°\9fà°²à±\8d à°\95à±\87à°®à±\86à°°à°¾ à°²à±\87దా à°¸à±\8dà°\95ానరà±\8d à°\86 à°¸à°®à°¾à°\9aారానà±\8dని à°\9aà±\87à°°à±\8dà°\9aà°¿à°µà±\81à°\82à°¡à°µà°\9aà±\8dà°\9aà±\81. à°\88 à°«à±\88à°²à±\81à°¨à±\81 à°\85సలà±\81 à°¸à±\8dథితి à°¨à±\81à°\82à°¡à°¿ à°®à°¾à°°à°¿à°¸à±\8dà°¤à±\87, à°\86 à°®à°¾à°°à°¿à°¨ à°«à±\88à°²à±\81à°²à±\8b à°\95à±\8aà°¨à±\8dని à°µà°¿à°µà°°à°¾à°²à±\81 పూర్తిగా ప్రతిఫలించకపోవచ్చు.',
 'metadata-expand' => 'విస్తరిత వివరాలను చూపించు',
 'metadata-collapse' => 'విస్తరిత వివరాలను దాచు',
 'metadata-fields' => 'కింది జాబితాలో ఉన్న మెటాడేటా ఫీల్డులు, బొమ్మ పేజీలో మేటాడేటా టేబులు మూసుకొన్నపుడు కనబడతాయి. మిగతావి దాచేసి ఉంటాయి. 
@@ -3241,6 +3292,7 @@ $1',
 'exif-source' => 'మూలం',
 'exif-editstatus' => 'బొమ్మ యొక్క ఎడిటోరియల్ స్థితి',
 'exif-urgency' => 'ఎంత త్వరగా కావాలి',
+'exif-fixtureidentifier' => 'స్థాపిత వస్తువు పేరు',
 'exif-locationdest' => 'చూపించిన ప్రాంతం',
 'exif-objectcycle' => 'ఈ మాధ్యమం ఉద్దేశించిన సమయం',
 'exif-contact' => 'సంప్రదింపు సమాచారం',
@@ -3256,12 +3308,18 @@ $1',
 'exif-serialnumber' => 'కెమేరా యొక్క సీరియల్ నంబర్',
 'exif-cameraownername' => 'కేమెరా యజమాని',
 'exif-label' => 'సూచిక (లేబెల్)',
+'exif-nickname' => 'బొమ్మ పేరు',
 'exif-rating' => 'రేటింగు (5 కి గాను)',
 'exif-rightscertificate' => 'హక్కుల నిర్వాహణ ధృవీకరణ పత్రం',
 'exif-copyrighted' => 'కాపీహక్కుల స్థితి',
 'exif-copyrightowner' => 'కాపీ హక్కుదారు',
 'exif-usageterms' => 'వాడుక నియమాలు',
+'exif-webstatement' => 'ఆన్‌లైన్ కాపీరైటు పాఠ్యం',
+'exif-originaldocumentid' => 'మూల దస్త్రం యొక్క విశిష్ఠ ఐడీ',
+'exif-licenseurl' => 'కాపీరైటు లైసెన్సు URL',
 'exif-morepermissionsurl' => 'ప్రత్యామ్నాయ లైసెన్సు సమాచారం',
+'exif-attributionurl' => 'దీనిని తిరిగి వాడుకోవాలంటే, ఇక్కడికి లంకె వేయండి',
+'exif-preferredattributionname' => 'దీనిని తిరిగి వాడుకోవాలంటే, వీరిని పేర్కొనండి',
 'exif-pngfilecomment' => 'PNG ఫైలు వ్యాఖ్య',
 'exif-disclaimer' => 'నిష్పూచీ',
 'exif-contentwarning' => 'విషయపు హెచ్చరిక',
@@ -3294,6 +3352,8 @@ $1',
 'exif-planarconfiguration-1' => 'స్థూల ఆకృతి',
 'exif-planarconfiguration-2' => 'సమతల ఆకృతి',
 
+'exif-colorspace-65535' => 'క్రమాంకితం కానిది',
+
 'exif-componentsconfiguration-0' => 'లేదు',
 
 'exif-exposureprogram-0' => 'అనిర్వచితం',
@@ -3564,6 +3624,7 @@ $5
 
 # Language selector for translatable SVGs
 'img-lang-default' => '(అప్రమేయ భాష)',
+'img-lang-info' => 'ఈ బొమ్మను $1 లో చూపెట్టు. $2',
 'img-lang-go' => 'వెళ్ళు',
 
 # Table pager
@@ -3671,10 +3732,13 @@ $5
 'version-entrypoints-header-url' => 'చిరునామా',
 
 # Special:Redirect
+'redirect' => 'ఫైలు, వాడుకరి, పేజీ లేదా కూర్పు ఐడీ ప్రకారం దారిమార్పు',
+'redirect-legend' => 'ఫైలు లేదా పేజీకి దారిమార్పు',
 'redirect-submit' => 'వెళ్ళు',
+'redirect-lookup' => 'చూడు:',
 'redirect-value' => 'విలువ:',
 'redirect-user' => 'వాడుకరి ID',
-'redirect-page' => 'à°ªà±\81à°\9f ఐడీ',
+'redirect-page' => 'à°ªà±\87à°\9cà±\80 ఐడీ',
 'redirect-revision' => 'పేజీ కూర్పు',
 'redirect-file' => 'దస్త్రపు పేరు',
 'redirect-not-exists' => 'విలువ కనబడలేదు',
@@ -3859,12 +3923,14 @@ $5
 'api-error-internal-error' => 'అంతర్గత లోపం: ఈ వికీలో మీ ఎక్కింపును ప్రాసెసు చెయ్యడంలో ఎదో తప్పు జరిగింది.',
 'api-error-invalid-file-key' => 'అంతర్గత దోషము: తాత్కాలిక నిల్వలో ఫైల్ కనపడలేదు.',
 'api-error-missingparam' => 'అంతర్గత దోషం: అభ్యర్ధనలో పరామితులు అన్నీ లేవు.',
+'api-error-missingresult' => 'అంతర్గత లోపం: నకలు తీయడం సఫలమైందో లేదో తెలియడం లేదు.',
 'api-error-mustbeloggedin' => 'దస్త్రాలను ఎక్కించడానికి మీరు ప్రవేశించివుండాలి.',
+'api-error-mustbeposted' => 'అంతర్గత లోపం: అభ్యర్థనకు HTTP POST అవసరం.',
 'api-error-noimageinfo' => 'ఎక్కింపు జయప్రదమైంది. కానీ సర్వరు, ఆ ఫైలు గురించిన సమాచారమేమీ ఇవ్వలేదు.',
 'api-error-nomodule' => 'అంతర్గత దోషము: ఎక్కింపు పర్వికము అమర్చబడలేదు.',
 'api-error-ok-but-empty' => 'అంతర్గత దోషము: సేవకము నుండి ఎటువంటి స్పందనా లేదు.',
 'api-error-overwrite' => 'ఈసరికే ఉన్న ఫైలును తిరగరాయడానికి అనుమతి లేదు.',
-'api-error-stashfailed' => 'à°\85à°\82తరà±\8dà°\97à°¤ à°ªà±\8aరపాà°\9fà±\81: తాత్కాలిక దస్త్రాన్ని భద్రపరచడంలో సేవకి విఫలమైంది.',
+'api-error-stashfailed' => 'à°\85à°\82తరà±\8dà°\97à°¤ à°²à±\8bà°ªà°\82: తాత్కాలిక దస్త్రాన్ని భద్రపరచడంలో సేవకి విఫలమైంది.',
 'api-error-publishfailed' => 'అంతర్గత లోపం: తాత్కాలిక ఫైలును ప్రచురించడంలో సర్వరు విఫలమైంది.',
 'api-error-stasherror' => 'ఫైలును ఖాజానాకు ఎక్కించడంలో లోపం దొర్లింది.',
 'api-error-timeout' => 'సర్వరు ఆశించిన సమయం లోపు స్పందించలేదు.',
@@ -3900,7 +3966,8 @@ $5
 
 # Special:ExpandTemplates
 'expandtemplates' => 'మూసలను విస్తరించు',
-'expand_templates_intro' => 'ఈ ప్రత్యేక పేజీ మీరిచ్చిన మూసలను పూర్తిగా విస్తరించి, చూపిస్తుంది. ఇది <nowiki>{{</nowiki>#language:...}} వంటి పార్సరు ఫంక్షన్లను, <nowiki>{{</nowiki>CURRENTDAY}} వంటి చరరాశులను(వేరియబుల్) కూడా విస్తరిస్తుంది &mdash; నిజానికి జమిలి(మీసాల) బ్రాకెట్లలో ఉన్న ప్రతీదాన్నీ ఇది విస్తరిస్తుంది. మీడియావికీ నుండి సంబంధిత పార్సరు స్టేజిని పిలిచి ఇది ఈ పనిని సాధిస్తుంది.',
+'expand_templates_intro' => 'ఈ ప్రత్యేక పేజీ మీరిచ్చిన మూసలను పూర్తిగా విస్తరించి, చూపిస్తుంది. ఇది <code><nowiki>{{</nowiki>#language:...}}</code> వంటి పార్సరు ఫంక్షన్లను, <code><nowiki>{{</nowiki>CURRENTDAY}}</code> వంటి చరరాశులను (వేరియబుల్) కూడా విస్తరిస్తుంది. 
+నిజానికి ఇది మీసాల బ్రాకెట్లలో ఉన్న ప్రతీదాన్నీ విస్తరిస్తుంది.',
 'expand_templates_title' => '{{FULLPAGENAME}} మొదలగు వాటి కొరకు సందర్భ శీర్షిక:',
 'expand_templates_input' => 'విస్తరించవలసిన పాఠ్యం:',
 'expand_templates_output' => 'ఫలితం',
@@ -3913,6 +3980,4 @@ $5
 'expand_templates_generate_rawhtml' => 'ముడి HTML ను చూపించు',
 'expand_templates_preview' => 'మునుజూపు',
 
-# Unknown messages
-'uploadinvalidxml' => 'ఎక్కించిన ఫైలులోని XML ను పార్సు చెయ్యలేకపోయాం.',
 );
index a910e8e..41f498e 100644 (file)
@@ -232,7 +232,6 @@ $messages = array(
 'tog-ccmeonemails' => 'ส่งสำเนาอีเมลที่ฉันส่งหาผู้อื่นให้ฉัน',
 'tog-diffonly' => 'ไม่แสดงเนื้อหาใต้ส่วนต่างการแก้ไข',
 'tog-showhiddencats' => 'แสดงหมวดหมู่ที่ซ่อนอยู่',
-'tog-noconvertlink' => 'ปิดใช้งานการแปลงชื่อเรื่องของลิงก์',
 'tog-norollbackdiff' => 'ไม่แสดงการเปลี่ยนแปลงหลังดำเนินการย้อนกลับฉุกเฉิน',
 'tog-useeditwarning' => 'เตือนฉัน เมื่อฉันกำลังจะออกจากหน้าแก้ไขโดยมีข้อมูลที่ยังไม่ได้บันทึก',
 'tog-prefershttps' => 'ใช้การเชื่อมต่อปลอดภัยทุกครั้งเมื่อล็อกอิน',
@@ -725,6 +724,9 @@ $1',
 'suspicious-userlogout' => 'คำขอล็อกเอาต์ของคุณถูกปฏิเสธเพราะดูเหมือนส่งมาจากเบราว์เซอร์หรือพร็อกซีแคชที่เสีย',
 'createacct-another-realname-tip' => 'ไม่จำเป็นต้องใส่ชื่อจริง
 หากคุณเลือกใส่ชื่อจริง จะใช้เพื่อแสดงที่มาสำหรับงานของตน',
+'pt-login' => 'ล็อกอิน',
+'pt-createaccount' => 'สร้างบัญชี',
+'pt-userlogout' => 'ล็อกเอาต์',
 
 # Email sending
 'php-mail-error-unknown' => 'เกิดข้อผิดพลาดไม่ทราบสาเหตุในฟังก์ชัน mail() ของพีเอชพี',
@@ -733,7 +735,7 @@ $1',
 
 # Change password dialog
 'changepassword' => 'เปลี่ยนรหัสผ่าน',
-'resetpass_announce' => 'à¸\84ุà¸\93à¹\83à¸\8aà¹\89รหัสอีà¹\80มลà¸\8aัà¹\88วà¸\84ราวลà¹\87อà¸\81อิà¸\99 à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81ำหà¸\99à¸\94รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¸\95รà¸\87à¸\99ีà¹\89 à¸\88ึà¸\87à¸\88ะà¹\80สรà¹\87à¸\88สิà¹\89à¸\99à¸\82ัà¹\89à¸\99à¸\95อà¸\99à¸\81ารลà¹\87อà¸\81อิà¸\99:',
+'resetpass_announce' => 'à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¸\88ึà¸\87à¸\88ะà¹\80สรà¹\87à¸\88สิà¹\89à¸\99à¸\81ารลà¹\87อà¸\81อิà¸\99',
 'resetpass_text' => '<!-- เพิ่มข้อความที่นี่ -->',
 'resetpass_header' => 'เปลี่ยนรหัสผ่าน',
 'oldpassword' => 'รหัสผ่านเดิม:',
@@ -749,8 +751,13 @@ $1',
 'resetpass-submit-cancel' => 'ยกเลิก',
 'resetpass-wrong-oldpass' => 'รหัสผ่านชั่วคราวหรือปัจจุบันไม่ถูกต้อง
 คุณอาจเปลี่ยนรหัสผ่านของคุณไปแล้ว หรือขอรหัสผ่านชั่วคราวใหม่แล้ว',
+'resetpass-recycled' => 'โปรดตั้งรหัสผ่านใหม่ให้ต่างจากรหัสผ่านปัจจุบัน',
+'resetpass-temp-emailed' => 'คุณล็อกอินด้วยรหัสผ่านชั่วคราวที่ส่งทางอีเมล
+คุณต้องตั้งรหัสผ่านใหม่ที่นี่จึงจะเสร็จสิ้นการล็อกอิน:',
 'resetpass-temp-password' => 'รหัสผ่านชั่วคราว:',
 'resetpass-abort-generic' => 'การเปลี่ยนรหัสผ่านถูกส่วนขยายยกเลิก',
+'resetpass-expired' => 'รหัสผ่านของคุณหมดอายุแล้ว โปรดตั้งรหัสผ่านใหม่เพื่อล็อกอิน',
+'resetpass-expired-soft' => 'รหัสผ่านของคุณหมดอายุแล้วและจำเป็นต้องตั้งใหม่ โปรดเลือกรหัสผ่านใหม่ขณะนี้ หรือคลิก "{{int:resetpass-submit-cancel}}" เพื่อตั้งใหม่ทีหลัง',
 
 # Special:PasswordReset
 'passwordreset' => 'ตั้งรหัสผ่านใหม่',
@@ -1253,6 +1260,7 @@ $1",
 'search-result-score' => 'ความเกี่ยวข้อง : $1%',
 'search-redirect' => '(เปลี่ยนทาง $1)',
 'search-section' => '(ส่วน $1)',
+'search-file-match' => '(จับคู่เนื้อหาไฟล์)',
 'search-suggest' => 'คุณอาจหมายถึง: $1',
 'search-interwiki-caption' => 'โครงการพี่น้อง',
 'search-interwiki-default' => '$1 ผลลัพธ์:',
@@ -1576,14 +1584,26 @@ $1",
 'recentchanges-label-plusminus' => 'ขนาดของหน้าเปลี่ยนไปด้วยจำนวนไบต์เท่านี้',
 'recentchanges-legend-heading' => "'''คำอธิบายสัญลักษณ์:'''",
 'recentchanges-legend-newpage' => '(ดูเพิ่มที่[[Special:NewPages|รายชื่อหน้าใหม่]])',
-'rcnotefrom' => "ด้านล่างเป็นการเปลี่ยนแปลงตั้งแต่ '''$2''' (มากสุด '''$1''' รายการ)",
+'rcnotefrom' => 'ด้านล่างเป็นการเปลี่ยนแปลงตั้งแต่ <strong>$2</strong> (มากสุด <strong>$1</strong> รายการ)',
 'rclistfrom' => 'แสดงการเปลี่ยนแปลงใหม่เริ่มตั้งแต่ $1',
 'rcshowhideminor' => '$1การแก้ไขเล็กน้อย',
+'rcshowhideminor-show' => 'แสดง',
+'rcshowhideminor-hide' => 'ซ่อน',
 'rcshowhidebots' => '$1บอต',
+'rcshowhidebots-show' => 'แสดง',
+'rcshowhidebots-hide' => 'ซ่อน',
 'rcshowhideliu' => '$1ผู้ใช้ลงทะเบียน',
+'rcshowhideliu-show' => 'แสดง',
+'rcshowhideliu-hide' => 'ซ่อน',
 'rcshowhideanons' => '$1ผู้ใช้นิรนาม',
+'rcshowhideanons-show' => 'แสดง',
+'rcshowhideanons-hide' => 'ซ่อน',
 'rcshowhidepatr' => '$1การแก้ไขที่ตรวจสอบแล้ว',
+'rcshowhidepatr-show' => 'แสดง',
+'rcshowhidepatr-hide' => 'ซ่อน',
 'rcshowhidemine' => '$1การแก้ไขของฉัน',
+'rcshowhidemine-show' => 'แสดง',
+'rcshowhidemine-hide' => 'ซ่อน',
 'rclinks' => 'แสดงการปรับปรุงล่าสุด $1 รายการ ในช่วง $2 วันที่ผ่านมา<br />$3',
 'diff' => 'ต่าง',
 'hist' => 'ประวัติ',
@@ -1698,6 +1718,7 @@ $1",
 'file-exists-duplicate' => 'ไฟล์นี้ซ้ำกับ{{PLURAL:$1|ไฟล์|ไฟล์}}ต่อไปนี้:',
 'file-deleted-duplicate' => 'ไฟล์ที่เหมือนไฟล์นี้ ([[:$1]]) เคยถูกลบไปก่อนหน้านี้แล้ว
 คุณควรตรวจสอบว่าประวัติการลบของไฟล์ก่อนดำเนินการอัปโหลดใหม่',
+'file-deleted-duplicate-notitle' => 'ไฟล์ที่เหมือนกับไฟล์นี้เคยถูกลบมาก่อน และชื่อดังกล่าวถูกห้ามใช้ คุณควรสอบถามผู้ที่สามารถดูข้อมูลไฟล์ที่ถูกระงับเพื่อทบทวนสถานการณ์ก่อนดำเนินการอัปโหลดไฟล์อีกครั้ง',
 'uploadwarning' => 'คำเตือนการอัปโหลด',
 'uploadwarning-text' => 'กรุณาแก้ไขคำอธิบายไฟล์ด้านล่างนี้ แล้วลองใหม่อีกครั้ง',
 'savefile' => 'บันทึกไฟล์',
@@ -1994,6 +2015,7 @@ $1',
 'ninterwikis' => '$1 ลิงก์ข้ามโครงการ',
 'nlinks' => '$1 ลิงก์',
 'nmembers' => '$1 หน้า',
+'nmemberschanged' => '$1 → $2 สมาชิก',
 'nrevisions' => '$1 รุ่น',
 'nviews' => '$1 ครั้ง',
 'nimagelinks' => 'ใช้ใน $1 {{PLURAL:$1|หน้า|หน้า}}',
@@ -2031,14 +2053,25 @@ $1',
 'deadendpagestext' => 'หน้าต่อไปนี้ไม่เชื่อมโยงไปหน้าอื่นใน {{SITENAME}}',
 'protectedpages' => 'หน้าที่ถูกล็อก',
 'protectedpages-indef' => 'การล็อกแบบไม่มีกำหนดเท่านั้น',
+'protectedpages-summary' => 'หน้านี้แสดงรายการหน้าที่มีอยู่ซึ่งปัจจุบันถูกล็อก สำหรับรายการชื่อเรื่องที่ถูกป้องกันมิให้สร้าง ดู [[{{#special:ProtectedTitles}}]]',
 'protectedpages-cascade' => 'การล็อกแบบสืบทอดเท่านั้น',
 'protectedpages-noredirect' => 'ซ่อนการเปลี่ยนทาง',
 'protectedpagesempty' => 'ขณะนี้ไม่มีหน้าใดถูกล็อกตามพารามิเตอร์เหล่านี้',
+'protectedpages-timestamp' => 'ตราเวลา',
+'protectedpages-page' => 'หน้า',
+'protectedpages-expiry' => 'หมดอายุ',
+'protectedpages-performer' => 'ผู้ใช้ที่ล็อก',
+'protectedpages-params' => 'พารามิเตอร์การล็อก',
+'protectedpages-reason' => 'เหตุผล',
+'protectedpages-unknown-timestamp' => 'ไม่ทราบ',
+'protectedpages-unknown-performer' => 'ไม่ทราบผู้ใช้',
 'protectedtitles' => 'ชื่อเรื่องที่ถูกป้องกัน',
+'protectedtitles-summary' => 'หน้านี้แสดงรายการชื่อที่ปัจจุบันถูกป้องกันมิให้สร้าง สำหรับรายการหน้าที่มีอยู่ที่ถูกล็อก ดู [[{{#special:ProtectedPages}}]]',
 'protectedtitlesempty' => 'ปัจจุบันไม่มีหัวเรื่องที่ได้รับการป้องกันด้วยพารามิเตอร์เหล่านี้',
 'listusers' => 'รายนามผู้ใช้',
 'listusers-editsonly' => 'แสดงเฉพาะผู้ใช้ที่มีการแก้ไข',
 'listusers-creationsort' => 'เรียงลำดับตามวันสร้าง',
+'listusers-desc' => 'เรียงตามลำดับลด',
 'usereditcount' => 'การแก้ไข $1 ครั้ง',
 'usercreated' => '{{GENDER:$3|ถูกสร้าง}}เมื่อ $1 เวลา $2',
 'newpages' => 'หน้าใหม่',
@@ -2304,7 +2337,7 @@ $UNWATCHURL
 'delete-edit-reasonlist' => 'แก้ไขเหตุผลการลบ',
 'delete-toobig' => 'หน้านี้มีประวัติการแก้ไขนาดใหญ่ คือ กว่า $1 รุ่น การลบหน้าเช่นนี้ถูกจำกัดเพื่อป้องกันการรบกวน{{SITENAME}}โดยบังเอิญ',
 'delete-warning-toobig' => 'หน้านี้มีประวัติการแก้ไขขนาดใหญ่ กว่า $1 รุ่น การลบหน้านี้อาจรบกวนการทำงานของฐานข้อมูลของ {{SITENAME}} โปรดดำเนินการด้วยความระมัดระวัง',
-'deleting-backlinks-warning' => "'''คำเตือน:''' หน้าอื่นเชื่อมโยงมายังหรือดึงข้อมูลจากหน้าที่คุณกำลังลบ",
+'deleting-backlinks-warning' => "'''คำเตือน:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|หน้าอื่น]]เชื่อมโยงมายังหรือดึงข้อมูลจากหน้าที่คุณกำลังจะลบ",
 
 # Rollback
 'rollback' => 'ย้อนการแก้ไขกลับฉุกเฉิน',
@@ -2482,6 +2515,7 @@ $1',
 'sp-contributions-search' => 'ค้นหาการแก้ไข',
 'sp-contributions-username' => 'เลขที่อยู่ไอพีหรือชื่อผู้ใช้:',
 'sp-contributions-toponly' => 'แสดงเฉพาะการแก้ไขรุ่นล่าสุด',
+'sp-contributions-newonly' => 'แสดงเฉพาะการแก้ไขที่เป็นการสร้างหน้า',
 'sp-contributions-submit' => 'สืบค้น',
 
 # What links here
@@ -2540,6 +2574,7 @@ $1',
 ดู[[Special:BlockList|รายการบล็อก]]เพื่อทบทวนการบล็อก',
 'ipb-blockingself' => 'คุณกำลังบล็อกตัวเอง! แน่ใจแล้วหรือว่าต้องการทำอย่างนั้น',
 'ipb-confirmhideuser' => 'คุณกำลังบล็อกผู้ใช้โดยเป็นผู้ใช้ "ซ่อนผู้ใช้" ซึ่งจะระงับชื่อผู้ใช้ในรายการและหน่วยปูมทั้งหมด คุณแน่ใจหรือว่าต้องการดำเนินการเช่นนั้น',
+'ipb-confirmaction' => 'หากคุณแน่ใจว่าคุณต้องการดำเนินการ โปรดเลือกเขตข้อมูล "{{int:ipb-confirm}}"  ที่อยู่ล่างสุด',
 'ipb-edit-dropdown' => 'แก้ไขสาเหตุการบล็อก',
 'ipb-unblock-addr' => 'ปลดบล็อก $1',
 'ipb-unblock' => 'ปลดบล็อกผู้ใช้หรือเลขที่อยู่ไอพี',
@@ -3632,7 +3667,7 @@ $5
 # Special:Redirect
 'redirect' => 'การเปลี่ยนทางตามชื่อไฟล์ รหัสประจำผู้ใช้ หน้าหรือรุ่น',
 'redirect-legend' => 'การเปลี่ยนทางไปยังไฟล์หรือหน้า',
-'redirect-summary' => 'หน้าพิเศษนี้เปลี่ยนทางไปยังไฟล์ (ระบุเป็นชื่อไฟล์) หน้า (ระบุเป็นรหัสรุ่น) หรือหน้าผู้ใช้ (ระบุเป็นรหัสผู้ใช้)',
+'redirect-summary' => 'หน้าพิเศษนี้เปลี่ยนทางไปยังไฟล์ (ระบุเป็นชื่อไฟล์) หน้า (ระบุเป็นรหัสรุ่นหรือรหัสหน้า) หรือหน้าผู้ใช้ (ระบุเป็นรหัสผู้ใช้ตัวเลข) การใช้งาน: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] หรือ [[{{#Special:Redirect}}/user/101]]',
 'redirect-submit' => 'ไป',
 'redirect-lookup' => 'ค้นดู:',
 'redirect-value' => 'ค่า:',
@@ -3746,7 +3781,7 @@ $5
 'logentry-delete-delete' => '$1 ลบหน้า $3',
 'logentry-delete-restore' => '$1 กู้คืนหน้า $3',
 'logentry-delete-event' => '$1 เปลี่ยนทัศนวิสัยของ $5 รายการปูมใน $3: $4',
-'logentry-delete-revision' => '$1 เปลี่ยนทัศนวิสัยของ $5 รุ่น ในหน้า $3: $4',
+'logentry-delete-revision' => '$1 เปลี่ยนทัศนวิสัยของ $5 รุ่นในหน้า $3: $4',
 'logentry-delete-event-legacy' => '$1 เปลี่ยนทัศนวิสัยของเหตุการณ์ปูมในหน้า $3',
 'logentry-delete-revision-legacy' => '$1 เปลี่ยนทัศนวิสัยของรุ่นในหน้า $3',
 'logentry-suppress-delete' => '$1 ระงับหน้า $3',
index c738797..d626133 100644 (file)
@@ -132,8 +132,8 @@ $messages = array(
 'mar' => 'mar',
 'apr' => 'apr',
 'may' => 'maý',
-'jun' => 'iýun',
-'jul' => 'iýul',
+'jun' => 'iýn',
+'jul' => 'iýl',
 'aug' => 'awg',
 'sep' => 'sen',
 'oct' => 'okt',
@@ -187,8 +187,8 @@ kiçi kategoriýadan {{PLURAL:$1|sany kiçi kategoriýa|$1 sany kiçi kategoriý
 'vector-action-undelete' => 'Öçürmäni yzyna al',
 'vector-action-unprotect' => 'Goragy üýtget',
 'vector-view-create' => 'Döret',
-'vector-view-edit' => 'Redaktirle',
-'vector-view-history' => 'Geçmişi gör',
+'vector-view-edit' => 'Üýtget',
+'vector-view-history' => 'Taryhy gör',
 'vector-view-view' => 'Oka',
 'vector-view-viewsource' => 'Çeşmäni gör',
 'actions' => 'Hereketler',
@@ -199,19 +199,19 @@ kiçi kategoriýadan {{PLURAL:$1|sany kiçi kategoriýa|$1 sany kiçi kategoriý
 'errorpagetitle' => 'Säwlik',
 'returnto' => '$1.',
 'tagline' => '{{SITENAME}} saýtyndan',
-'help' => 'Ýardam',
-'search' => 'Gözle',
+'help' => 'Kömek',
+'search' => 'Gözleg',
 'searchbutton' => 'Gözle',
 'go' => 'Git',
 'searcharticle' => 'Git',
 'history' => 'Sahypanyň geçmişi',
-'history_short' => 'Geçmiş',
+'history_short' => 'Taryh',
 'updatedmarker' => 'soňky gezek görelim bäri täzelenen',
-'printableversion' => 'Print ediş wersiýasy',
+'printableversion' => 'Çap edilýän wersiýa',
 'permalink' => 'Hemişelik çykgyt',
 'print' => 'Print et',
 'view' => 'Görkez',
-'edit' => 'Redaktirle',
+'edit' => 'Üýtget',
 'create' => 'Döret',
 'editthispage' => 'Bu sahypany redaktirle',
 'create-this-page' => 'Bu sahypany döret',
@@ -225,14 +225,14 @@ kiçi kategoriýadan {{PLURAL:$1|sany kiçi kategoriýa|$1 sany kiçi kategoriý
 'unprotectthispage' => 'Sahypanyň goragyny aýyr',
 'newpage' => 'Täze sahypa',
 'talkpage' => 'Sahypany ara alyp maslahatlaş',
-'talkpagelinktext' => 'Çekişme',
+'talkpagelinktext' => 'Pikir alyşma',
 'specialpage' => 'Ýörite Sahypa',
 'personaltools' => 'Şahsy gurallar',
 'postcomment' => 'Täze bölüm',
 'articlepage' => 'Makalany görkez',
 'talk' => 'Çekişme',
-'views' => 'Keşpler',
-'toolbox' => 'Gural sandygy',
+'views' => 'Görnüşler',
+'toolbox' => 'Gurallar',
 'userpage' => 'Ulanyjy sahypasyny görkez',
 'projectpage' => 'Taslama sahypasyny görkez',
 'imagepage' => 'Faýl sahypasyny görkez',
@@ -244,11 +244,11 @@ kiçi kategoriýadan {{PLURAL:$1|sany kiçi kategoriýa|$1 sany kiçi kategoriý
 'otherlanguages' => 'Başga dillerde',
 'redirectedfrom' => '($1 sahypasyndan gönükdirildi)',
 'redirectpagesub' => 'Gönükdirme sahypasy',
-'lastmodifiedat' => 'Bu sahypa iň soňky gezek $2, $1 senesinde üýtgedildi.',
+'lastmodifiedat' => 'Bu sahypanyň iň soňky üýtgedilen gezegi: $2, $1.',
 'viewcount' => 'Bu sahypa {{PLURAL:$1|bir|$1 }} gezek görülipdir.',
 'protectedpage' => 'Goragly sahypa',
-'jumpto' => 'Git we:',
-'jumptonavigation' => 'ulan',
+'jumpto' => 'Şuňa git:',
+'jumptonavigation' => 'nawigasiýa',
 'jumptosearch' => 'gözle',
 'view-pool-error' => 'Gynansak-da, şu wagt serwerler hetdenaşa işli.
 Biçak köp ulanyjy şu sahypany görmäge synanyşýar.
@@ -266,17 +266,17 @@ $1',
 'copyrightpage' => '{{ns:project}}:Awtorlyk hukugy',
 'currentevents' => 'Oba güzeri',
 'currentevents-url' => 'Project:Oba güzeri',
-'disclaimers' => 'Jogapkärçilikden boýun gaçyrma',
-'disclaimerpage' => 'Project:Umumy jogapkärçilikden boýun gaçyrma',
+'disclaimers' => 'Jogapkärçilikden boýun gaçyrmak',
+'disclaimerpage' => 'Project:Umumy jogapkärçilikden boýun gaçyrmak',
 'edithelp' => 'Nähili redaktirlenýär?',
-'helppage' => 'Help:Içindäkiler',
+'helppage' => 'Help:Mazmuny',
 'mainpage' => 'Baş Sahypa',
-'mainpage-description' => 'Baş Sahypa',
+'mainpage-description' => 'Baş sahypa',
 'policy-url' => 'Project:Ýörelge',
 'portal' => 'Çaýhana',
 'portal-url' => 'Project:Çaýhana',
-'privacy' => 'Gizlinlik ýörelgesi',
-'privacypage' => 'Project:Gizlinlik ýörelgesi',
+'privacy' => 'Gizlinlik syýasaty',
+'privacypage' => 'Project:Gizlinlik syýasaty',
 
 'badaccess' => 'Rugsat säwligi',
 'badaccess-group0' => 'Talap edýän bu işiňizi ýerine ýetirmäge size ygtyýar berilmeýär.',
@@ -288,15 +288,15 @@ See [[Special:Version|version page]].
 Bu sahypany ulanmak üçin MediaWikiniň $1 wersiýasy talap edilýär. [[Special:Version|Wersiýa sahypasyna]] serediň.',
 
 'ok' => 'OK',
-'retrievedfrom' => '"$1" adresinden alyndy.',
+'retrievedfrom' => 'Çeşmesi: "$1"',
 'youhavenewmessages' => 'Size $1 bar. ($2)',
 'youhavenewmessagesmulti' => 'Size $1-de täze habar bar.',
-'editsection' => 'redaktirle',
-'editold' => 'redaktirle',
+'editsection' => 'üýtget',
+'editold' => 'üýtget',
 'viewsourceold' => 'çeşmäni gör',
-'editlink' => 'redaktirle',
-'viewsourcelink' => 'çeşmesini gör',
-'editsectionhint' => '$1 bölümini redaktirle',
+'editlink' => 'üýtget',
+'viewsourcelink' => 'çeşmäni gör',
+'editsectionhint' => 'Bölümi üýtget: $1',
 'toc' => 'Mazmuny',
 'showtoc' => 'görkez',
 'hidetoc' => 'gizle',
@@ -309,10 +309,10 @@ Bu sahypany ulanmak üçin MediaWikiniň $1 wersiýasy talap edilýär. [[Specia
 'feed-invalid' => 'Nädogry ýazylyşyk kanaly görnüşi.',
 'feed-unavailable' => 'Sindikasiýa lentalary elýeterli däl',
 'site-rss-feed' => '$1 RSS lentasy',
-'site-atom-feed' => '$1 Atom lentasy',
+'site-atom-feed' => '$1 — Atom-lenta',
 'page-rss-feed' => '"$1" RSS lentasy',
 'page-atom-feed' => '"$1" Atom lentasy',
-'red-link-title' => '$1 (bu sahypa heniz ýazylmandyr)',
+'red-link-title' => '$1 (heniz ýazylmandyr)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Sahypa',
@@ -322,7 +322,7 @@ Bu sahypany ulanmak üçin MediaWikiniň $1 wersiýasy talap edilýär. [[Specia
 'nstab-project' => 'Taslama sahypasy',
 'nstab-image' => 'Faýl',
 'nstab-mediawiki' => 'Habarlaşyk',
-'nstab-template' => 'Å\9fablon',
+'nstab-template' => 'Å\9eablon',
 'nstab-help' => 'Ýardam sahypasy',
 'nstab-category' => 'Kategoriýa',
 
@@ -347,9 +347,9 @@ Bar bolan ähli ýörite sahypalary [[Special:SpecialPages|ýörite sahypalar]]
 Maglumat bazasyny gulplan administratoryň düşündirişi: $1',
 'missing-article' => 'Maglumat bazasy tapylmagy talap edilýän "$1" $2 atly sahypa degişli teksti tapyp bilmedi.
 
-Bu Ã½agdaý sahypanyÅ\88 Ã¶Ã§Ã¼rilen bir sahypanyň ozalky wersiýasy bolmaklygyndan ýüze çykýan bolup biler.
+Bu Ã½agdaý sahypanyÅ\88 Ã½oklanylan bir sahypanyň ozalky wersiýasy bolmaklygyndan ýüze çykýan bolup biler.
 
-Eger sebäp ol däl bolsa, programma serişdesinde bir säwlige duşan bolmagyňyz ahmal.
+Eger sebäp ol däl bolsa, programma serişdesinde bir ýalňyşlyga duşan bolmagyňyz ahmal.
 Muny bir [[Special:ListUsers/sysop|administratora]] URL-ni belläp alyp ýetirmekligiňizi haýyş edýäris.',
 'missingarticle-rev' => '(wersiýa#: $1)',
 'missingarticle-diff' => '(Tapawut: $1, $2)',
@@ -408,7 +408,7 @@ Web brauzeriňiziň keşini arassalaýançaňyz käbir sahypalar sessiýaňyzyň
 'yourdomainname' => 'Siziň domeniňiz:',
 'externaldberror' => 'Ýa tassyklama maglumat bazasynyň säwligi bar ýa-da öz ulanyjy hasabyňyzy täzelemegiňize rugsat berilmeýär.',
 'login' => 'Hasaba gir',
-'nav-login-createaccount' => 'Hasaba gir / täze hasap aç',
+'nav-login-createaccount' => 'Hasaba gir / Hasap döret',
 'loginprompt' => '{{SITENAME}} saýtynda sessiýa açmak üçin kukileri işletmegiňiz zerurdyr.',
 'userlogin' => 'Hasaba gir / täze hasap aç',
 'userloginnocreate' => 'Sessiýa aç',
@@ -448,7 +448,7 @@ Ulanyjy atlary baş hem-de setir harplara duýgurdyr.
 'wrongpasswordempty' => 'Paroly boş girizdiňiz. Gaýtadan synanyşmagyňyzy haýyş edýäris.',
 'passwordtooshort' => 'Parollar iň bolmanda {{PLURAL:$1|1 simwoldan|$1 simwoldan}} ybarat bolmalydyr.',
 'password-name-match' => 'Parolyňyz ulanyjy adyňyzdan tapawutly bolmalydyr.',
-'mailmypassword' => 'Maňa e-poçta bilen täze parol iber',
+'mailmypassword' => 'Paroly nol et',
 'passwordremindertitle' => '{{SITENAME}} üçin täze wagtlaýyn parol',
 'passwordremindertext' => 'Kimdir biri (ähtimal özüňiz $1 IP adresinden) {{SITENAME}} ($4) üçin täze parol iberilmegini talap etdi. "$2" ulanyjysy üçin wagtlaýynça "$3" paroly döredildi. Eger bu siziň öz talabyňyz bolsa, onda sessiýa açyp, bir täze parol saýlap almagyňyz zerurdyr. Wagtlaýyn parolyňyzyň möhleti {{PLURAL:$5|1 günden|$5 günden}} gutarjakdyr.
 
@@ -604,10 +604,10 @@ Bu paroly sessiýa açanyňyzdan soňra ''[[Special:ChangePassword|paroly üýtg
 Şonuň üçinem biz ony görkezmek üçin sanlaýyn IP adresini ulanmaly bolýarys.
 Şunuň ýaly IP adresinden ençeme ulanyjy peýdalanýan bolmagy ahmal.
 Eger-de sizem anonim ulanyjy bolsaňyz we size siziň bilen dahyly ýok habarlaşyklar gelýän bolsa, onda mundan beýläk başga anonim ulanyjylar bilen garjaşmazlygyňyz üçin [[Special:UserLogin/signup|özüňize hasap ediniň]] ýa-da [[Special:UserLogin|sessiýa açyň]].''",
-'noarticletext' => 'Bu sahypa häzirki wagtda boş dur.
+'noarticletext' => 'Bu sahypa şu wagt boş dur.
 Bu ady başga sahypalarda [[Special:Search/{{PAGENAME}}|gözläp bilersiňiz]],
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} degişli gündeliklerde gözleg geçirip bilersiňiz],
-ýa-da bu sahypany [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktirläp bilersiňiz]</span>.',
+ýa-da bu sahypany [{{fullurl:{{FULLPAGENAME}}|action=edit}} üýtgedip bilersiňiz]</span>.',
 'noarticletext-nopermission' => 'Häzirki wagtda bu sahypada tekst ýok.
 Bu sahypa adyny [[Special:Search/{{PAGENAME}}|başga sahypalarda gözläp]]
 ýa-da <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} degişli gündeliklerde gözleg geçirip bilersiňiz]</span>, ýöne bu sahypany döretmäge rugsadyňyz ýok.',
@@ -725,7 +725,7 @@ Ol eýýäm bar.',
 Ol $2 {{PLURAL:$2|çagyryşdan|çagyryşdan}} az bolmalydyr, häzir bu ýerde {{PLURAL:$1|1 sany çagyryş|$1 sany çagyryş}} bar.",
 'expensive-parserfunction-category' => 'Resurs talap ediji funksiýalara çakdanaşa köp çagyryşy bar bolan sahypalar',
 'post-expand-template-inclusion-warning' => "'''Duýduryş''': Girizilen şablonlaryň göwrümi çakdanaşa uly.
-Käbir şablonlar sahypa giriziljek däldir.",
+Käbir şablonlar sahypa girizilmez.",
 'post-expand-template-inclusion-category' => 'Girizilýän şablonlarynyň göwrümi çakdanaşa uly bolan sahypalar',
 'post-expand-template-argument-warning' => "'''Duýduryş:''' Bu sahypa çakdanaşa uly giňeme ölçegi bar bolan iň bolmanda bir sany şablon argumentini öz içine alýar.
 Ol argumentler hasap edilmedi.",
@@ -751,8 +751,8 @@ $3 tarapyndan görkezilen sebäp: ''$2''",
 'viewpagelogs' => 'Bu sahypanyň gündeliklerini görkez',
 'nohistory' => 'Bu sahypanyň özgerdişler geçmişi ýok.',
 'currentrev' => 'Häzirki wersiýa',
-'currentrev-asof' => '$1 senesinden başlap sahypanyň şu wagtky wersiýasy',
-'revisionasof' => 'Sahypanyň $1 senesindäki wersiýasy',
+'currentrev-asof' => '$1 senesinde sahypanyň iň soňky wersiýasy',
+'revisionasof' => '$1 senesindäki wersiýa',
 'revision-info' => '$2 tarapyndan döredilen $1 seneli wersiýa',
 'previousrevision' => '← Ozalkysy',
 'nextrevision' => 'Indikisi →',
@@ -847,7 +847,7 @@ $1",
 'logdelete-success' => "'''Gündelik görünme derejesi şowlulyk bilen sazlandy.'''",
 'logdelete-failure' => "'''Gündelik görünme derejesini sazlap bolmaýar:'''
 $1",
-'revdel-restore' => 'Görnüşi üýtget',
+'revdel-restore' => 'Görnüş ukybyny üýtget',
 'pagehist' => 'Sahypanyň geçmişi',
 'deletedhist' => 'Öçürilen geçmiş',
 'revdelete-hide-current' => '$2, $1 seneli ýazgyda gizleme säwligi: bu häzirki wersiýa.
@@ -902,7 +902,7 @@ Nawigasiýa çykgytlaryny ulanmaklygyň bu sütüni başky ýagdaýyna getirjekd
 # Merge log
 'mergelog' => 'Birleşdirme gündeligi',
 'pagemerge-logentry' => '[[$1]] bilen [[$2]] birleşdirildi (şuňa çenliki wersiýalar: $3)',
-'revertmerge' => 'Böl',
+'revertmerge' => 'Dargat',
 'mergelogpagetext' => 'Aşakdaky sanaw sahypalaryň geçmişleriniň iň soňky birleşdirmelerini görkezýär.',
 
 # Diffs
@@ -916,7 +916,7 @@ Nawigasiýa çykgytlaryny ulanmaklygyň bu sütüni başky ýagdaýyna getirjekd
 
 # Search results
 'searchresults' => 'Gözleg netijeleri',
-'searchresults-title' => '"$1" üçin gözleg netijeleri',
+'searchresults-title' => '"$1" hakda gözleg netijeleri',
 'toomanymatches' => 'Çakdanaşa köp gabat gelme tapyldy, başgaçarak talap ýazyp görüň',
 'titlematches' => 'Sahypa ady gabat gelýär',
 'textmatches' => 'Sahypa teksti gabat gelýär',
@@ -926,19 +926,20 @@ Nawigasiýa çykgytlaryny ulanmaklygyň bu sütüni başky ýagdaýyna getirjekd
 'prevn-title' => 'Öňki $1 {{PLURAL:$1|netije|netije}}',
 'nextn-title' => 'Indiki $1 {{PLURAL:$1|netije|netije}}',
 'shown-title' => 'Sahypa başyna $1 {{PLURAL:$1|netije|netije}} görkez',
-'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3).',
+'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) gör',
 'searchmenu-exists' => "'''Bu wikide \"[[:\$1]]\" atly sahypa bar'''",
-'searchmenu-new' => "'''Bu wikide \"[[:\$1]]\" sahypasyny döret!'''",
-'searchprofile-articles' => 'Mazmunly sahypalar',
-'searchprofile-project' => 'Ýardam we Taslama sahypalary',
+'searchmenu-new' => '<strong>Bu wikide "[[:$1]]" sahypasyny dörediň!</strong> 
+{{PLURAL:$2|0=|Gözlegde tapylan sahypa-da serediň.|Tapylan gözleg netijelerine-de serediň.}}',
+'searchprofile-articles' => 'Esasy sahypalar',
+'searchprofile-project' => 'Kömek we taslama sahypalary',
 'searchprofile-images' => 'Multimedia',
 'searchprofile-everything' => 'Ähli zatlar',
-'searchprofile-advanced' => 'Giňeldilen',
-'searchprofile-articles-tooltip' => '$1 boýunça gözle',
-'searchprofile-project-tooltip' => '$1 boýunça gözle',
+'searchprofile-advanced' => 'Giňişleýin',
+'searchprofile-articles-tooltip' => '$1 içinden gözle',
+'searchprofile-project-tooltip' => '$1 içinden gözle',
 'searchprofile-images-tooltip' => 'Faýllary gözle',
-'searchprofile-everything-tooltip' => 'Ähli sahypalardan gözle (şol sanda çekişme sahypalaryndan)',
-'searchprofile-advanced-tooltip' => 'Hususy at giňişliklerinde gözle',
+'searchprofile-everything-tooltip' => 'Ähli sahypalardan gözle (şol sanda pikir alyşma sahypalaryndan)',
+'searchprofile-advanced-tooltip' => 'Laýyk at giňişliklerinde gözle',
 'search-result-size' => '$1 ({{PLURAL:$2|1 söz|$2 söz}})',
 'search-result-category-size' => '{{PLURAL:$1|1 agza|$1 agza}} ({{PLURAL:$2|1 kiçi kategoriýa|$2 kiçi kategoriýa}}, {{PLURAL:$3|1 faýl|$3 faýl}})',
 'search-result-score' => 'Kybapdaşlyk: $1%',
@@ -954,7 +955,7 @@ Nawigasiýa çykgytlaryny ulanmaklygyň bu sütüni başky ýagdaýyna getirjekd
 'searchall' => 'ählisi',
 'showingresults' => "Aşakda №'''$2''' netijeden başlap, {{PLURAL:$1|'''1''' netije|'''$1''' netije}} görkezilýär.",
 'showingresultsnum' => "Aşakda №'''$2''' netijeden başlap, {{PLURAL:$3|'''1''' netije|'''$3''' netije}} görkezilýär.",
-'showingresultsheader' => "'''$4''' üçin {{PLURAL:$5|'''$3''' netijeden '''$1''' sanysy|'''$3''' netijeden '''$1 - $2''' aralygy}}",
+'showingresultsheader' => "'''$4''' hakda {{PLURAL:$5|'''$3''' netijeden '''$1''' sanysy|'''$3''' netijeden '''$1 - $2''' aralygy}}",
 'search-nonefound' => 'Talaba gabat gelýän hiç hili netije ýok.',
 'powersearch-legend' => 'Giňişleýin gözleg',
 'powersearch-ns' => 'At giňişliklerinde gözleg:',
@@ -1218,7 +1219,7 @@ $1 {{PLURAL:$1|simwoldan|simwoldan}} köp bolmaly däl.',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|üýtgeşme|üýtgeşme}}',
-'recentchanges' => 'Soňky üýtgeşmeler',
+'recentchanges' => 'Soňky üýtgetmeler',
 'recentchanges-legend' => 'Soňky üýtgeşmeleriň opsiýalary',
 'recentchanges-summary' => 'Wikidäki iň soňky üýtgeşmeleri şu sahypadan yzarlaň.',
 'recentchanges-feed-description' => 'Bu lentadaky wikide edilen iň soňky üýtgeşmeleri yzarlaň.',
@@ -1227,19 +1228,19 @@ $1 {{PLURAL:$1|simwoldan|simwoldan}} köp bolmaly däl.',
 'recentchanges-label-bot' => 'Bu özgerdiş bir bot tarapyndan amala aşyryldy',
 'recentchanges-label-unpatrolled' => 'Bu özgerdişe heniz patrullyk edilmändir',
 'recentchanges-legend-newpage' => '$1 - täze sahypa',
-'rcnotefrom' => '<b>$2</b> senesinden bäri edilen özgerdişler aşakda görkezilýär (<b>$1</b> sanysyna çenli).',
+'rcnotefrom' => '<strong>$2</strong> senesinden soňky üýtgetmeler aşakda görkezilýär (<strong>$1</strong> sanysyna çenli).',
 'rclistfrom' => '$1 senesinden bäri edilen özgerdişleri görkez',
 'rcshowhideminor' => 'ujypsyzja özgerdişleri $1',
 'rcshowhidebots' => 'botlary $1',
-'rcshowhideliu' => 'sessiýasy açyk ulanyjylary $1',
+'rcshowhideliu' => 'Hasaba alnan ulanyjylary $1',
 'rcshowhideanons' => 'anonim ulanyjylary $1',
 'rcshowhidepatr' => 'patrullyk edilen özgerdişleri $1',
 'rcshowhidemine' => 'özgerdişlerimi $1',
 'rclinks' => 'Soňky $2 günde edilen iň soňky $1 üýtgeşmäni görkez;<br /> $3',
 'diff' => 'tapawut',
-'hist' => 'geçmiş',
-'hide' => 'gizle',
-'show' => 'görkez',
+'hist' => 'taryh',
+'hide' => 'Gizle',
+'show' => 'Görkez',
 'minoreditletter' => 'uj',
 'newpageletter' => 'T',
 'boteditletter' => 'b',
@@ -1253,10 +1254,10 @@ $1 {{PLURAL:$1|simwoldan|simwoldan}} köp bolmaly däl.',
 # Recent changes linked
 'recentchangeslinked' => 'Degişli üýtgeşmeler',
 'recentchangeslinked-feed' => 'Degişli üýtgeşmeler',
-'recentchangeslinked-toolbox' => 'Degişli üýtgeşmeler',
+'recentchangeslinked-toolbox' => 'Dahylly üýtgetmeler',
 'recentchangeslinked-title' => '"$1" bilen baglanyşykly üýtgeşmeler',
-'recentchangeslinked-summary' => "Aşakdaky sanaw, görkezilen sahypa (ýa-da görkezilen kategoriýanyň agzalaryna) çykgyt berýän sahypalarda edilen üýtgeşmeleriň sanawydyr.
-[[Special:Watchlist|Gözegçilik sanawyňyzdaky]] sahypalar '''goýy''' ýazgy bilen görkezilýär.",
+'recentchangeslinked-summary' => 'Görkezilen sahypa (ýa-da görkezilen kategoriýanyň agzalaryna) çykgyt berýän sahypalarda edilen soňky üýtgetmeleriň sanawy.
+[[Special:Watchlist|Gözegçilik sanawyňyzdaky]] sahypalar <strong>goýy</strong> bilen görkezilýär.',
 'recentchangeslinked-page' => 'Sahypanyň ady:',
 'recentchangeslinked-to' => 'Tersine, berlen sahypa çykgyt berýän sahypalary görkez',
 
@@ -1453,7 +1454,7 @@ Bir sütüniň adyna tyklap sortirowkanyň tertibini üýtgedip bilersiňiz.',
 
 # File description page
 'file-anchor-link' => 'Faýl',
-'filehist' => 'Faýlyň geçmişi',
+'filehist' => 'Faýlyň taryhy',
 'filehist-help' => 'Faýlyň geçmişini görmek üçin Sene/Wagt bölümündäki senelere tyklaň.',
 'filehist-deleteall' => 'ählisini öçür',
 'filehist-deleteone' => 'öçür',
@@ -1466,7 +1467,7 @@ Bir sütüniň adyna tyklap sortirowkanyň tertibini üýtgedip bilersiňiz.',
 'filehist-user' => 'Ulanyjy',
 'filehist-dimensions' => 'Ölçegler',
 'filehist-filesize' => 'Faýl ölçegi',
-'filehist-comment' => 'Teswirleme',
+'filehist-comment' => 'Teswir',
 'filehist-missing' => 'Faýl ýok',
 'imagelinks' => 'Faýlyň ulanylyşy',
 'linkstoimage' => 'Bu faýla çykgydy bar bolan {{PLURAL:$1|sahypa|$1 sahypa}}:',
@@ -1479,8 +1480,8 @@ Aşakdaky sanaw diňe şu faýla çykgyt berýän {{PLURAL:$1|ilkinji faýly |il
 'sharedupload' => 'Bu faýl $1 ammaryndan, özem beýleki taslamalarda ulanylýan bolmagy ahmal.',
 'sharedupload-desc-there' => 'Bu faýl $1 ammaryndan, özem beýleki taslamalarda ulanylýan bolmagy ahmal.
 Goşmaça maglumat üçin [$2 faýl düşündiriş sahypasyna] serediň.',
-'sharedupload-desc-here' => 'Bu faýl $1 ammaryndan, özem beýleki taslamalarda ulanylýan bolmagy ahmal.
-[$2 Onuň faýl düşündiriş sahypasyndaky] düşündirişi aşakda görkezilýär.',
+'sharedupload-desc-here' => 'Bu faýl $1 toplaýjysyndan, özem başga taslamalarda ulanylýan bolmagy mümkin.
+Onuň [$2 faýl düşündiriş sahypasyndaky] maglumatlar aşakda görkezilýär.',
 'filepage-nofile' => 'Şeýle atly faýl ýok.',
 'filepage-nofile-link' => 'Şeýle atly faýl ýok, ama siz [$1 ony ýükläp bilersiňiz].',
 'uploadnewversion-linktext' => 'Bu faýlyň täze wersiýasyny ýükläň',
@@ -1535,7 +1536,7 @@ Giriş formaty: mazmuntip/kiçitip, meselem <code>surat/jpeg</code>.',
 'unusedtemplateswlh' => 'başga çykgytlar',
 
 # Random page
-'randompage' => 'Mesaýy makala',
+'randompage' => 'Çemgeldik sahypa',
 'randompage-nopages' => 'Aşakdaky {{PLURAL:$2|at giňişliginde|at giňişliklerinde}} hiç hili sahypa ýok: $1.',
 
 # Random redirect
@@ -1975,8 +1976,8 @@ Sahypanyň geçmişini saýlap dikeltmek üçin dikeldilmeli wersiýalaryň gutu
 Ulanan çykgydyňyz nädogry bolmagy ýa-da onuň arhiwden dikeldilen ýa-da aýyrylan bolmagy mümkin.',
 'undelete-nodiff' => 'Hiç hili öňki wersiýa tapylmady.',
 'undeletebtn' => 'Dikelt',
-'undeletelink' => 'görkez/dikelt',
-'undeleteviewlink' => 'görkez',
+'undeletelink' => 'gör/dikelt',
+'undeleteviewlink' => 'gör',
 'undeleteinvert' => 'Saýlanmadyklar',
 'undeletecomment' => 'Sebäp:',
 'undeletedrevisions' => '{{PLURAL:$1|1 wersiýa|$1 wersiýa}} dikeldildi',
@@ -2038,7 +2039,7 @@ Salgylanmak üçin iň soňky blokirleme gündeligi ýazgysy aşakda berilýär:
 'sp-contributions-submit' => 'Gözle',
 
 # What links here
-'whatlinkshere' => 'Bu sahypa çykgytlar',
+'whatlinkshere' => 'Şu ýere çykgytlar',
 'whatlinkshere-title' => '"$1" makalasyna çykgyt berýän sahypalar',
 'whatlinkshere-page' => 'Sahypa:',
 'linkshere' => "'''[[:$1]]''' sahypasyna çykgyt berýän sahypalar:",
@@ -2111,8 +2112,8 @@ Aşakda blokirlemäniň takyk sebäbini ýazyň (meselem: wandalizm eden sahypal
 'ipblocklist-empty' => 'Blokirleme sanawy boş.',
 'ipblocklist-no-results' => 'Talap edilen IP adresi ýa-da ulanyjy ady blokirlengi däl.',
 'blocklink' => 'blokirle',
-'unblocklink' => 'blokirowkany aýyr',
-'change-blocklink' => 'blokirowkany üýtget',
+'unblocklink' => 'blokirlemäni aýyr',
+'change-blocklink' => 'blokirlemäni üýtget',
 'contribslink' => 'goşantlar',
 'autoblocker' => 'Awtomatik usulda blokirlendiňiz, çünki ýaňy-ýakynda IP adresiňiz "[[User:$1|$1]]" ulanyjysy tarapyndan ulanyldy. $1 atly ulanyjynyň blokirlenmegi üçin görkezilen sebäp: "\'\'\'$2\'\'\'"',
 'blocklogpage' => 'Blokirleme gündeligi',
@@ -2253,7 +2254,7 @@ Gündeligiň iň soňky ýazgysy salgylanmak üçin aşakda berilýär:",
 Başga bir at saýlaň.',
 
 # Export
-'export' => 'Sahypa eksportirle',
+'export' => 'Sahypalary çykar',
 'exporttext' => 'Belli bir sahypanyň ýa-da sahypalar toplumynyň tekstini we redaktirleme geçmişini XML arkaly eksportirläp bilersiňiz.
 Soňra ony [[Special:Import|importirleme sahypasynyň]] üsti bilen MediaWiki ulanýan başga bir wikä importirläp bolýar.
 
@@ -2353,54 +2354,53 @@ Kompýuteriňize ýazdyryň we şu ýere ýükläň.',
 'tooltip-pt-mytalk' => 'Pikir alyşma sahypaňyz',
 'tooltip-pt-anontalk' => 'Bu IP adresinden edilen özgerdişler barada pikir alyş',
 'tooltip-pt-preferences' => 'Ileri tutmalaryňyz',
-'tooltip-pt-watchlist' => 'Gözegçilikde saklaýan sahypalarym',
+'tooltip-pt-watchlist' => 'Üýtgetmelerini gözegçilikde saklaýan sahypalaryňyz',
 'tooltip-pt-mycontris' => 'Eden goşantlaryňyzyň sanawy',
-'tooltip-pt-login' => 'Hasaba girmegiňiz maslahat berilýär, ýöne hökmany däl.',
+'tooltip-pt-login' => 'Hasaba girmegiňiz maslahat berilýär, ýöne hökman däl.',
 'tooltip-pt-logout' => 'Hasapdan çyk',
-'tooltip-ca-talk' => 'Sahypanyň mazmuny barada garaýşyňy beýan et',
-'tooltip-ca-edit' => 'Bu sahypany redaktirläp bilersiňiz. Ýazdyrmankaňyz synlap görmekligi ýatdan çykarmaň.',
+'tooltip-ca-talk' => 'Esasy sahypa barada çekişme',
+'tooltip-ca-edit' => 'Bu sahypany üýtgedip bilersiňiz. Ýazdyrmankaňyz "synlaw" düwmesine basyp, synlap görüň.',
 'tooltip-ca-addsection' => 'Täze bölüm başlat',
-'tooltip-ca-viewsource' => 'Bu sahypa gorag astynda.
-Onuň çeşmesini görüp bilersiňiz',
-'tooltip-ca-history' => 'Bu sahypanyň ozalky wersiýalary',
+'tooltip-ca-viewsource' => 'Bu sahypa goragly, ýöne onuň çeşmesini görüp bilersiňiz',
+'tooltip-ca-history' => 'Sahypanyň öňki wersiýalary',
 'tooltip-ca-protect' => 'Sahypany goraga al',
 'tooltip-ca-unprotect' => 'Bu sahypanyň goragyny üýtget',
 'tooltip-ca-delete' => 'Sahypany öçür',
 'tooltip-ca-undelete' => 'Bu sahypadaky özgerdişleri öçürilmänkäki ýagdaýyna yzyna dikelt',
 'tooltip-ca-move' => 'Sahypanyň adyny üýtget',
-'tooltip-ca-watch' => 'Bu sahypany gözegçilige al',
+'tooltip-ca-watch' => 'Sahypany gözegçilik sanawyňa goş',
 'tooltip-ca-unwatch' => 'Bu sahypany gözegçilik sanawyňdan aýyr',
-'tooltip-search' => '{{SITENAME}} boýunça gözle',
+'tooltip-search' => '{{SITENAME}} saýtynda gözle',
 'tooltip-search-go' => 'Eger bar bolsa, anyk şu atdaky sahypa git',
-'tooltip-search-fulltext' => 'Şu tekst bar bolan sahypalary gözle',
+'tooltip-search-fulltext' => 'Sahypalardan şu teksti gözle',
 'tooltip-p-logo' => 'Baş sahypa baryp gör',
 'tooltip-n-mainpage' => 'Baş sahypa baryp gör',
 'tooltip-n-mainpage-description' => 'Baş sahypa baryp gör',
 'tooltip-n-portal' => 'Taslama hakynda, nämeler edip bolar, nämeler nirede',
 'tooltip-n-currentevents' => 'Bolup geçýän wakalar barada iň täze maglumatlar',
-'tooltip-n-recentchanges' => 'Wikidäki soňky üýtgeşmeleriň sanawy',
-'tooltip-n-randompage' => 'Çem gelen sahypa git',
-'tooltip-n-help' => 'Kömek almak üçin',
-'tooltip-t-whatlinkshere' => 'Bu sahypa çykgyt berýän ähli wiki sahypalarynyň sanawy',
-'tooltip-t-recentchangeslinked' => 'Bu sahypa çykgyt berýän sahypalardaky soňky üýtgeşmeler',
+'tooltip-n-recentchanges' => 'Wikidäki soňky üýtgetmeleriň sanawy',
+'tooltip-n-randompage' => 'Çem gelen sahypany aç',
+'tooltip-n-help' => 'Kömek soralýan ýer',
+'tooltip-t-whatlinkshere' => 'Şu ýere çykgyt berýän ähli wiki-sahypalaryň sanawy',
+'tooltip-t-recentchangeslinked' => 'Bu sahypadan çykgyt alýan sahypalardaky soňky üýtgetmeler',
 'tooltip-feed-rss' => 'Bu sahypa üçin RSS lentasy',
-'tooltip-feed-atom' => 'Bu sahypa üçin atom lentasy',
+'tooltip-feed-atom' => 'Bu sahypanyň atom lentasy',
 'tooltip-t-contributions' => 'Şu ulanyjynyň goşantlarynyň sanawyny gör',
 'tooltip-t-emailuser' => 'Bu ulanyja e-poçta iber',
-'tooltip-t-upload' => 'Suratlary ýa-da multimediýa faýllaryny ýükläň',
-'tooltip-t-specialpages' => 'Ähli ýörite sahypalaryň sanawyny görkez',
-'tooltip-t-print' => 'Bu sahypanyň print etmäge taýýar wersiýasy',
-'tooltip-t-permalink' => 'Sahypanyň bu wersiýasyna hemişelik çykgyt',
-'tooltip-ca-nstab-main' => 'Sahypany görkez',
+'tooltip-t-upload' => 'Faýllary ýükle',
+'tooltip-t-specialpages' => 'Ähli ýörite sahypalaryň sanawy',
+'tooltip-t-print' => 'Bu sahypanyň çap edilýän wersiýasy',
+'tooltip-t-permalink' => 'Sahypanyň şu wersiýasyna hemişelik çykgyt',
+'tooltip-ca-nstab-main' => 'Esasy sahypany gör',
 'tooltip-ca-nstab-user' => 'Ulanyjynyň sahypasyny görkez',
 'tooltip-ca-nstab-media' => 'Media sahypasyny görkez',
 'tooltip-ca-nstab-special' => 'Bu ýörite sahypa, ony redaktirläp bolmaýar',
 'tooltip-ca-nstab-project' => 'Taslama sahypasyny görkez',
-'tooltip-ca-nstab-image' => 'Suratyň sahypasyny görkez',
+'tooltip-ca-nstab-image' => 'Faýlyň sahypasyny gör',
 'tooltip-ca-nstab-mediawiki' => 'Ulgam habarlaşygyny görkez',
 'tooltip-ca-nstab-template' => 'Şablony görkez',
 'tooltip-ca-nstab-help' => 'Ýardam sahypasyny görkez',
-'tooltip-ca-nstab-category' => 'Kategoriýanyň sahypasyny görkez',
+'tooltip-ca-nstab-category' => 'Kategoriýanyň sahypasyny gör',
 'tooltip-minoredit' => 'Ujypsyzja özgerdiş hökmünde belle',
 'tooltip-save' => 'Özgerdişleriňi ýazdyr',
 'tooltip-preview' => 'Deslapky syn; ýazdyrmankaňyz şuny ulanyp özgerdişleriňizi gözden geçiriň!',
@@ -2410,8 +2410,7 @@ Onuň çeşmesini görüp bilersiňiz',
 'tooltip-recreate' => 'Öçürilendigine garamazdan sahypany gaýtadan döret',
 'tooltip-upload' => 'Ýüklemäni başlat',
 'tooltip-rollback' => '"Öňki katdyna getir" ýeke gezek tyklananda bu sahypa iň soňky goşant goşanyň özgerdişlerini yzyna getirýär',
-'tooltip-undo' => '"Yzyna al" bu özgerdişi yzyna getirýär we özgerdiş formuny deslapky syn modunda açýar.
-Mazmun üçin bir sebäp goşmaga rugsat berýär',
+'tooltip-undo' => '"Yzyna al" bu özgerdişi yzyna getirýär we özgerdiş formuny synlaw modunda açýar. Yzyna almagyň sebäbini ýazmaga mümkinçilik berýär.',
 'tooltip-preferences-save' => 'Ileri tutmalary ýazdyr',
 'tooltip-summary' => 'Gysgaça düşündiriş giriziň',
 
@@ -2481,7 +2480,7 @@ Ony işletseňiz iş ulgamyňyza howp astyna salmagyňyz mümkin.",
 'file-info-size' => '$1 × $2 piksel, faýlyň ölçegi: $3, MIME tipli: $4',
 'file-nohires' => 'Wersiýanyň mundan uly ölçegi ýok.',
 'svg-long-desc' => 'SVG faýly, nominal $1 × $2 piksel, faýl ölçegi: $3',
-'show-big-image' => 'Suratyň doly ölçegi',
+'show-big-image' => 'Original faýl',
 'file-info-gif-looped' => 'halkaly',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|kadr|kadr}}',
 'file-info-png-looped' => 'halkaly',
@@ -2504,7 +2503,7 @@ Ony işletseňiz iş ulgamyňyza howp astyna salmagyňyz mümkin.",
 'bad_image_list' => 'Format aşakdaky ýaly bolmalydyr:
 
 Diňe sanawyň elementleri (* bilen başlaýanlar) nazara alynýar. Setirdäki ilkinji çykgyt ýaramaz suratyň çykgydy bolmalydyr.
-Ondan soňraky çykgyt(lar) kadadan çykma hökmünde kabul edilýär, meselem: surat sahypada setiriçinde görünip biler.',
+Ondan soňraky çykgyt(lar) kadadan çykma hökmünde kabul edilýär, meselem: surat sahypada setiriçinde görp biler.',
 
 # Metadata
 'metadata' => 'Meta-maglumat',
index d59ae10..356993e 100644 (file)
@@ -185,7 +185,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Padalahan ako ng mga kopya ng mga ipinadala kong e-liham sa ibang mga tagagamit',
 'tog-diffonly' => 'Huwag ipakita ang nilalaman ng pahinang nasa ilalim ng mga pagkakaiba',
 'tog-showhiddencats' => 'Ipakita ang mga nakatagong kategorya',
-'tog-noconvertlink' => 'Huwag paganahin ang pagpapalit ng pamagat na pangkawing',
 'tog-norollbackdiff' => 'Alisin ang mga pagkakaiba pagkatapos isagawa ang pagpapagulong na pabalik sa dati',
 'tog-useeditwarning' => 'Magbabala sa akin kapag umalis ako sa isang pahina ng pampatnugot na hindi pa nasasagip ang mga pagbabago',
 
@@ -560,15 +559,15 @@ Tandaan na may ilang pahinang maaaring magpatuloy na nagpapakitang parang nakala
 Huwag kalimutang baguhin ang iyong [[Special:Preferences|mga kagustuhan sa {{SITENAME}}]].',
 'yourname' => 'Bansag:',
 'userlogin-yourname' => 'Pangngalan',
-'userlogin-yourname-ph' => 'Ilagay ang iyong Pangngalan',
-'createacct-another-username-ph' => 'Ilagay ang Pangngalan',
+'userlogin-yourname-ph' => 'Ilagay ang iyong Pangalan',
+'createacct-another-username-ph' => 'Ilagay ang Pangalan',
 'yourpassword' => 'Hudyat:',
 'userlogin-yourpassword' => 'Hudyat',
 'userlogin-yourpassword-ph' => 'Ipasok ang iyong hudyat',
-'createacct-yourpassword-ph' => 'Ilagay ang hudyat',
+'createacct-yourpassword-ph' => 'Ilagay ang hudyat (password)',
 'yourpasswordagain' => 'Hudyat mo uli:',
 'createacct-yourpasswordagain' => 'Tiyakin ang hudyat',
-'createacct-yourpasswordagain-ph' => 'Muling ilagay ang hudyat',
+'createacct-yourpasswordagain-ph' => 'Muling ilagay ang hudyat (password)',
 'remembermypassword' => 'Tandaan ang paglagda ko sa kompyuter na ito (pinakamarami na ang $1 {{PLURAL:$1|araw|mga araw}})',
 'userlogin-remembermypassword' => 'Panatilihin akong nakalagda',
 'userlogin-signwithsecure' => 'Gumamit ng ligtas na koneksyon',
@@ -587,11 +586,11 @@ Huwag kalimutang baguhin ang iyong [[Special:Preferences|mga kagustuhan sa {{SIT
 'userlogin-joinproject' => 'Sumali sa {{SITENAME}}',
 'nologin' => 'Wala ka pang kuwenta? $1.',
 'nologinlink' => 'Lumikha ng kuwenta',
-'createaccount' => 'Lumikha ng kuwenta',
+'createaccount' => 'Lumikha ng akawnt',
 'gotaccount' => 'May kuwenta ka na ba? $1.',
 'gotaccountlink' => 'Lumagda',
 'userlogin-resetlink' => 'Nakalimutan mo ang iyong mga detalyeng panglagda?',
-'userlogin-resetpassword-link' => 'Nakalimutan ba ang iyong hudyat?',
+'userlogin-resetpassword-link' => 'Nakalimutan ba ang iyong hudyat (password)?',
 'userlogin-createanother' => 'Lumikha ng iba pang akawnt',
 'createacct-join' => 'Ilagay ang iyong impormasyon sa ibaba.',
 'createacct-another-join' => 'Ilagay ang impormasyon ng bagong akawnt sa ibaba.',
index 757bd50..0214a8a 100644 (file)
@@ -37,6 +37,7 @@
  * @author LuCKY
  * @author Mach
  * @author Manco Capac
+ * @author Marmase
  * @author Meelo
  * @author Metal Militia
  * @author Mirzali
@@ -393,7 +394,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Diğer kullanıcılara gönderdiğim e-postaların kopyalarını bana da gönder',
 'tog-diffonly' => 'Sayfa içeriğini sürüm farklarının altında gösterme',
 'tog-showhiddencats' => 'Gizli kategorileri göster',
-'tog-noconvertlink' => 'Bağlantı başlığı dönüştürmesini devre dışı bırakma',
 'tog-norollbackdiff' => 'Geridönüş uygulandıktan sonra değişikliği atla',
 'tog-useeditwarning' => 'Kaydedilmemiş değişikliğe sahip bir değişiklik sayfasından çıkarken beni uyar',
 'tog-prefershttps' => 'Oturumu açarken her zaman güvenli bağlantı kullan',
@@ -893,6 +893,9 @@ Devam etmeden önce $1 bekleyin.',
 'suspicious-userlogout' => 'Çıkış isteğiniz reddedildi çünkü bozuk bir tarayıcı ya da önbellekli vekil tarafından gönerilmiş gibi görünüyor.',
 'createacct-another-realname-tip' => 'Gerçek adınız isteğe bağlıdır.
 Eğer gerçek adınızı belirtirseniz, çalışmalarınıza atıfta bulunulması için de kullanılacaktır.',
+'pt-login' => 'Giriş yap',
+'pt-createaccount' => 'Hesap oluştur',
+'pt-userlogout' => 'Oturumu kapat',
 
 # Email sending
 'php-mail-error-unknown' => "PHP's mail() fonksiyonunda bilinmeyen hata",
@@ -917,8 +920,11 @@ Lütfen tekrar denemeden önce $1 bekleyin.',
 'resetpass-submit-cancel' => 'İptal',
 'resetpass-wrong-oldpass' => 'Geçersiz geçici veya güncel şifre.
 Şifrenizi zaten başarıyla değiştirdiniz ya da yeni bir geçici şifre istediniz.',
+'resetpass-recycled' => 'Lütfen parolanızı eski parolanızdan farklı olarak değiştirin.',
 'resetpass-temp-password' => 'Geçici parola:',
 'resetpass-abort-generic' => 'Parola değişikliği bir uzantı tarafından iptal edildi.',
+'resetpass-expired' => 'Parolanızın süresi bitti. Lütfen, giriş için yeni bir parola oluşturun.',
+'resetpass-expired-soft' => 'Parolanızın süresi bitti ve değiştirilmesi gerekiyor. Lütfen, yeni bir parola seçin veya daha sonra oluşturmak için "{{int:resetpass-submit-cancel}}" butonuna tıklayın.',
 
 # Special:PasswordReset
 'passwordreset' => 'Parola sıfırlama',
@@ -1764,11 +1770,23 @@ Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz
 'rcnotefrom' => "'''$2''' tarihinden itibaren yapılan değişiklikler aşağıdadır (en fazla <b>$1</b> tanesi gösterilmektedir).",
 'rclistfrom' => '$1 tarihinden itibaren yeni değişiklikleri göster',
 'rcshowhideminor' => 'Küçük değişiklikleri $1',
+'rcshowhideminor-show' => 'Göster',
+'rcshowhideminor-hide' => 'Gizle',
 'rcshowhidebots' => 'botları $1',
+'rcshowhidebots-show' => 'Göster',
+'rcshowhidebots-hide' => 'Gizle',
 'rcshowhideliu' => 'Kayıtlı kullanıcıları $1',
+'rcshowhideliu-show' => 'Göster',
+'rcshowhideliu-hide' => 'Gizle',
 'rcshowhideanons' => 'Anonim kullanıcıları $1',
+'rcshowhideanons-show' => 'Göster',
+'rcshowhideanons-hide' => 'Gizle',
 'rcshowhidepatr' => 'İzlenmiş değişiklikleri $1',
+'rcshowhidepatr-show' => 'Göster',
+'rcshowhidepatr-hide' => 'Gizle',
 'rcshowhidemine' => 'Değişikliklerimi $1',
+'rcshowhidemine-show' => 'Göster',
+'rcshowhidemine-hide' => 'Gizle',
 'rclinks' => 'Son $2 günde yapılan son $1 değişikliği göster;<br /> $3',
 'diff' => 'fark',
 'hist' => 'geçmiş',
@@ -1893,6 +1911,7 @@ Dosyayı tekrar yüklemeye devam etmeden önce, bastırılmış dosya verisini g
 'uploaddisabledtext' => 'Dosya yüklemeleri devredışı bırakılmıştır.',
 'php-uploaddisabledtext' => 'PHP dosyası yüklemeleri devre dışıdır. Lütfen file_uploads ayarını kontrol edin.',
 'uploadscripted' => 'Bu dosya bir internet tarayıcısı tarafından hatalı çevrilebilecek bir HTML veya script kodu içermektedir.',
+'uploadinvalidxml' => 'Yüklenen dosyadaki XML işlenemedi.',
 'uploadvirus' => 'Bu dosya virüslüdür! Detayları: $1',
 'uploadjava' => 'Dosya, bir Java .classdosyası içeren bir ZIP dosyasıdır.
 Java dosyalarının yüklenmesine izin verilmemektedir, zira güvenlik kısıtlamalarının atlanmasına neden olabilmektedirler.',
@@ -2560,10 +2579,10 @@ dikkatle devam edin.',
 'rollbacklinkcount-morethan' => '$1 {{PLURAL:$1|değişiklikten|değişiklikten}} fazla geri döndür',
 'rollbackfailed' => 'geri alma işlemi başarısız',
 'cantrollback' => 'Sayfaya son katkıda bulunan kullanıcı, sayfaya katkıda bulunmuş tek kişi olduğu için, değişiklikler geri alınamıyor.',
-'alreadyrolled' => '[[User:$2|$2]] ([[User talk:$2|Talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) tarafından [[:$1]] sayfasında yapılmış son değişiklik geriye alınamıyor;
-başka biri sayfada değişiklik yaptı ya da sayfayı geriye aldı.
+'alreadyrolled' => '[[User:$2|$2]] ([[User talk:$2|Tartışma]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) tarafından [[:$1]] sayfasında yapılmış son değişiklik geriye alınamıyor;
+başka birisi sayfada değişiklik yaptı ya da sayfayı geriye aldı.
 
-Son değişikliği yapan: [[User:$3|$3]] ([[User talk:$3|Talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
+Son değişikliği yapan: [[User:$3|$3]] ([[User talk:$3|Tartışma]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "Değişiklik özeti: \"''\$1''\" idi.",
 'revertpage' => '[[Special:Contributions/$2|$2]] [[User talk:$2|mesaj]] tarafından yapılan değişiklikler geri alınarak, [[User:$1|$1]] tarafından değiştirilmiş önceki sürüm geri getirildi.',
 'revertpage-nouser' => 'Gizli bir kullanıcı tarafından yapılan değişiklikler geri alınarak {{GENDER:$1|[[User:$1|$1]]}} tarafından yapılan son revizyon geri getirildi',
@@ -4278,6 +4297,4 @@ Aslında, çift ayraçlı hemen hemen her şeyi genişletir.',
 'expand_templates_generate_rawhtml' => 'Ham HTML göster',
 'expand_templates_preview' => 'Önizleme',
 
-# Unknown messages
-'uploadinvalidxml' => 'Yüklenen dosyadaki XML işlenemedi.',
 );
index eb963a4..dd664f6 100644 (file)
@@ -12,6 +12,7 @@
  * @author Don Alessandro
  * @author Haqmar
  * @author Himiq Dzyu
+ * @author Ilnur efende
  * @author KhayR
  * @author MF-Warburg
  * @author Marat Vildanov
@@ -353,7 +354,7 @@ $messages = array(
 'moredotdotdot' => 'Дәвамы…',
 'morenotlisted' => 'Башка берни дә юк...',
 'mypage' => 'Бит',
-'mytalk' => 'Бәхәс',
+'mytalk' => 'Бәхәс бите',
 'anontalk' => 'Бу IP адресы өчен бәхәс бите',
 'navigation' => 'Күчү',
 'and' => '&#32;һәм',
@@ -694,6 +695,8 @@ $2',
 'login-abort-generic' => 'Системага уңышсыз керү очрагы',
 'loginlanguagelabel' => 'Тел: $1',
 'suspicious-userlogout' => 'Сезнең эшчәнлекне бетерү соравыгыз кире кагылды, чөнки ул ялгыш браузер яисә кэшлаучы прокси аша җибәрелергэ мөмкин.',
+'pt-login' => 'Керү',
+'pt-userlogout' => 'Чыгу',
 
 # Email sending
 'php-mail-error-unknown' => 'PHP mail() функциясендә билгесез хата',
@@ -1340,17 +1343,29 @@ $1",
 'recentchanges-feed-description' => 'Бу агымда соңгы үзгәртүләрне күзәтү.',
 'recentchanges-label-newpage' => 'Бу үзгәртү белән яңа бит төзелде',
 'recentchanges-label-minor' => 'Бу кече үзгәртү',
-'recentchanges-label-bot' => 'Бу үзгәртү бот белән эшләнгән иде',
+'recentchanges-label-bot' => 'Бу үзгәртү бот белән эшләнгән',
 'recentchanges-label-unpatrolled' => 'Үзгәртүне әлегә тикшермәгәннәр',
+'recentchanges-label-plusminus' => 'Битнең зурлыгы шуның кадәрле байтка үзгәрде',
 'recentchanges-legend-newpage' => '([[Special:NewPages|яңа бит]])',
 'rcnotefrom' => "Астарак '''$2''' башлап ('''$1''' кадәр) үзгәртүләр күрсәтелгән.",
 'rclistfrom' => '$1 башлап яңа үзгәртүләрне күрсәт',
 'rcshowhideminor' => 'кече үзгәртүләрне $1',
+'rcshowhideminor-show' => 'Күрсәтергә',
+'rcshowhideminor-hide' => 'Яшерергә',
 'rcshowhidebots' => 'ботларны $1',
-'rcshowhideliu' => '$1 кергән кулланучылар',
+'rcshowhidebots-show' => 'Күрсәтергә',
+'rcshowhidebots-hide' => 'Яшерергә',
+'rcshowhideliu' => '$1 теркәлгән кулланучыларны яшерергә',
+'rcshowhideliu-show' => 'Күрсәтергә',
+'rcshowhideliu-hide' => 'Яшерергә',
 'rcshowhideanons' => 'кермәгән кулланучыларны $1',
+'rcshowhideanons-show' => 'Күрсәтергә',
+'rcshowhideanons-hide' => 'Яшерергә',
 'rcshowhidepatr' => 'тикшерелгән үзгәртүләрне $1',
+'rcshowhidepatr-hide' => 'Яшерергә',
 'rcshowhidemine' => 'минем үзгәртүләремне $1',
+'rcshowhidemine-show' => 'Күрсәтергә',
+'rcshowhidemine-hide' => 'Яшерергә',
 'rclinks' => 'Соңгы $2 көн эчендә соңгы $1 үзгәртүне күрсәт<br />$3',
 'diff' => 'аерма',
 'hist' => 'тарих',
index 6537cb5..2cff208 100644 (file)
@@ -85,7 +85,6 @@ $messages = array(
 'tog-ccmeonemails' => 'مەن باشقىلارغا يوللىغان ئېلخەتنى ئۆزەمگىمۇ بىر نۇسخا يوللا',
 'tog-diffonly' => 'تۈزىتىلگەن ئىككى نەشرىنىڭ پەرقىنى سېلىشتۇرغاندا بەت مەزمۇنىنى كۆرسەتمە',
 'tog-showhiddencats' => 'يوشۇرۇن تۈرلەرنى كۆرسەت',
-'tog-noconvertlink' => 'ئۇلانما ماۋزۇ ئالماشتۇرۇشنى چەكلە',
 'tog-norollbackdiff' => 'قايتۇرۇشنى ئىجرا قىلغاندىن كېيىن پەرقنى كۆرسەتمە',
 'tog-useeditwarning' => 'بىر تەھرىرلىگەن بەتنى ساقلىماي چېكىنگەندە مېنى ئەسكەرت',
 'tog-prefershttps' => 'تىزىمغا كىرگەندە دائىم بىخەتەر ئۇلىنىشنى ئىشلەت',
index 5eb04b6..f639c31 100644 (file)
@@ -49,6 +49,7 @@
  * @author Yuriy Apostol
  * @author Ата
  * @author Дар'я Козлова
+ * @author Максим Підліснюк
  * @author Тест
  */
 
@@ -403,7 +404,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Надсилати мені копії листів, які я надсилаю іншим користувачам',
 'tog-diffonly' => 'Не показувати вміст сторінки під різницею версій',
 'tog-showhiddencats' => 'Показувати приховані категорії',
-'tog-noconvertlink' => 'Вимкнути конвертацію назви посилання',
 'tog-norollbackdiff' => 'Не показувати різницю версій після виконання відкоту',
 'tog-useeditwarning' => 'Попереджати мене, якщо я залишаю сторінку редагування з незбереженими змінами',
 'tog-prefershttps' => "Завжди використовувати безпечне з'єднання при вході у систему",
@@ -914,6 +914,9 @@ $1',
 'suspicious-userlogout' => 'Ваш запит на завершення сеанса відхилений, оскільки він схожий на запит, відправлений зіпсованим веб-оглядачем або кешуючим проксі-сервером.',
 'createacct-another-realname-tip' => "Справжнє ім'я є необов'язковим.
 Якщо ви вирішите надати його, то воно буде використовуватися для присвоєння користувачу авторства до його роботи.",
+'pt-login' => 'Увійти',
+'pt-createaccount' => 'Створити обліковий запис',
+'pt-userlogout' => 'Вийти',
 
 # Email sending
 'php-mail-error-unknown' => 'Невідома помилка в PHP-функції mail()',
@@ -922,7 +925,7 @@ $1',
 
 # Change password dialog
 'changepassword' => 'Змінити пароль',
-'resetpass_announce' => 'Ð\92и Ð²Ð²Ñ\96йÑ\88ли, Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\87и Ñ\82имÑ\87аÑ\81овий Ð¿Ð°Ñ\80олÑ\8c, Ñ\8fкий Ð¾Ñ\82Ñ\80имали ÐµÐ»ÐµÐºÑ\82Ñ\80онноÑ\8e Ð¿Ð¾Ñ\88Ñ\82оÑ\8e. Ð\94лÑ\8f Ð·Ð°Ð²ÐµÑ\80Ñ\88еннÑ\8f Ð²Ñ\85одÑ\83 Ð´Ð¾ Ñ\81иÑ\81Ñ\82еми, Ð²Ð¸ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ\96 Ð²ÐºÐ°Ð·Ð°Ñ\82и Ð½Ð¾Ð²Ð¸Ð¹ Ð¿Ð°Ñ\80олÑ\8c Ñ\82Ñ\83Ñ\82:',
+'resetpass_announce' => 'Ð\94лÑ\8f Ð·Ð°Ð²ÐµÑ\80Ñ\88еннÑ\8f Ð²Ñ\85одÑ\83 Ð²Ð¸ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ\96 Ð²Ñ\81Ñ\82ановиÑ\82и Ð½Ð¾Ð²Ð¸Ð¹ Ð¿Ð°Ñ\80олÑ\8c.',
 'resetpass_text' => '<!-- Додавайте текст сюди -->',
 'resetpass_header' => 'Змінити пароль облікового запису',
 'oldpassword' => 'Старий пароль:',
@@ -938,8 +941,13 @@ $1',
 'resetpass-submit-cancel' => 'Скасувати',
 'resetpass-wrong-oldpass' => 'Неправильний тимчасовий або поточний пароль.
 Можливо, ви вже успішно змінили пароль або зробили запит на новий тимчасовий пароль.',
+'resetpass-recycled' => 'Змініть свій пароль на щось інше, ніж ваш поточний пароль.',
+'resetpass-temp-emailed' => 'Ви ввійшли, використовуючи тимчасовий пароль, який отримали електронною поштою. 
+Для завершення входу в систему необхідно задати новий пароль:',
 'resetpass-temp-password' => 'Тимчасовий пароль:',
 'resetpass-abort-generic' => 'Зміну пароля було перервано розширенням.',
+'resetpass-expired' => 'Термін дії вашого пароля закінчився. Будь ласка, встановіть новий пароль для входу в систему.',
+'resetpass-expired-soft' => 'Термін дії вашого пароля закінчився, і тепер він повинен бути змінений. Будь ласка, виберіть новий пароль або натисніть "{{int:resetpass-submit-cancel}}", щоб змінити його пізніше.',
 
 # Special:PasswordReset
 'passwordreset' => 'Скинути пароль',
@@ -1802,11 +1810,23 @@ $1",
 'rcnotefrom' => 'Нижче відображені редагування з <strong>$2</strong> (до <strong>$1</strong>).',
 'rclistfrom' => 'Показати редагування починаючи з $1.',
 'rcshowhideminor' => '$1 незначні редагування',
+'rcshowhideminor-show' => 'показати',
+'rcshowhideminor-hide' => 'приховати',
 'rcshowhidebots' => '$1 ботів',
+'rcshowhidebots-show' => 'показати',
+'rcshowhidebots-hide' => 'приховати',
 'rcshowhideliu' => '$1 зареєстрованих користувачів',
+'rcshowhideliu-show' => 'показати',
+'rcshowhideliu-hide' => 'приховати',
 'rcshowhideanons' => '$1 анонімів',
+'rcshowhideanons-show' => 'показати',
+'rcshowhideanons-hide' => 'приховати',
 'rcshowhidepatr' => '$1 перевірені',
+'rcshowhidepatr-show' => 'показати',
+'rcshowhidepatr-hide' => 'приховати',
 'rcshowhidemine' => '$1 мої редагування',
+'rcshowhidemine-show' => 'показати',
+'rcshowhidemine-hide' => 'приховати',
 'rclinks' => 'Показати останні $1 редагувань за $2 днів<br />$3',
 'diff' => 'різн.',
 'hist' => 'історія',
@@ -1942,6 +1962,8 @@ $1",
 'uploaddisabledtext' => 'Можливість завантаження файлів відключена.',
 'php-uploaddisabledtext' => 'Завантаження файлів вимкнене у налаштуваннях PHP. Будь ласка, перевірте значення file_uploads.',
 'uploadscripted' => 'Файл містить HTML-код або скрипт, який може неправильно обробитися браузером.',
+'uploadscriptednamespace' => 'Цей SVG-файл містить недопустимий простір імен "$1"',
+'uploadinvalidxml' => 'Не вдалося проаналізувати XML у завантаженому файлі.',
 'uploadvirus' => 'Файл містить вірус! Див. $1',
 'uploadjava' => 'Файл є ZIP-архівом, що містить .class-файл Java.
 Завантаження Java-файлів не дозволене, бо вони можуть використовуватися для обходу системи безпеки.',
@@ -2311,6 +2333,7 @@ $1',
 'deadendpagestext' => 'Наступні сторінки не містять посилань на інші сторінки цієї вікі.',
 'protectedpages' => 'Захищені сторінки',
 'protectedpages-indef' => 'Тільки безстроково захищені',
+'protectedpages-summary' => 'На цій сторінці перераховані сторінки, які на цей момент захищені. Список назв, які захищені від створення див. [[{{#special:ProtectedTitles}}]].',
 'protectedpages-cascade' => 'Тільки каскадний захист',
 'protectedpages-noredirect' => 'Сховати перенаправлення',
 'protectedpagesempty' => 'Зараз нема захищених сторінок із зазначеними параметрами',
@@ -2323,6 +2346,7 @@ $1',
 'protectedpages-unknown-timestamp' => 'Невідомо',
 'protectedpages-unknown-performer' => 'Невідомий користувач',
 'protectedtitles' => 'Заборонені назви',
+'protectedtitles-summary' => 'На цій сторінці перераховані назви, які захищені від створення. Для перегляду списку сторінок, які на цей момент захищені, див. [[{{#special:ProtectedPages}}]].',
 'protectedtitlesempty' => 'Зараз нема захищених назв із зазначеними параметрами.',
 'listusers' => 'Список користувачів',
 'listusers-editsonly' => 'Показати лише користувачів, які зробили принаймні одне редагування',
@@ -2772,8 +2796,10 @@ $1',
 'sp-contributions-blocked-notice-anon' => 'Доступ з цієї IP-адреси зараз заблокований.
 Далі наведено останній запис з журналу блокувань:',
 'sp-contributions-search' => 'Пошук внеску',
+'sp-contributions-suppresslog' => 'вилучений внесок користувача',
 'sp-contributions-username' => "IP-адреса або ім'я користувача:",
 'sp-contributions-toponly' => 'Показувати тільки редагування, що є останніми версіями',
+'sp-contributions-newonly' => 'Показувати тільки редагування, які є створеннями сторінок',
 'sp-contributions-submit' => 'Знайти',
 
 # What links here
@@ -4480,6 +4506,4 @@ MediaWiki поширюється в надії, що вона буде кори
 'expand_templates_generate_rawhtml' => 'Показати сирий HTML',
 'expand_templates_preview' => 'Попередній перегляд',
 
-# Unknown messages
-'uploadinvalidxml' => 'Не вдалося проаналізувати XML у завантаженому файлі.',
 );
index d9240ce..e4b7cc9 100644 (file)
@@ -118,9 +118,9 @@ $messages = array(
 'tog-extendwatchlist' => 'Kengaytirilgan kuzatuv roʻyxati: faqat oxirgi paytdagi emas, barcha oʻzgarishlar koʻrsatiladi',
 'tog-usenewrc' => 'Yangi oʻzgarishlar va kuzatuv roʻyxatidagi sahifalarni guruhlarga boʻlish (JavaScript orqali)',
 'tog-numberheadings' => 'Sarlavhalarni avtomatik raqamlash',
-'tog-showtoolbar' => 'Tahrirlash asboblari joylashgan yoʻlakchani koʻrsatish (JavaScript orqali)',
-'tog-editondblclick' => 'Sichqoncha tugmasini ikki marta bosish orqali tahrirlashni boshlash',
-'tog-editsectiononrightclick' => 'Boʻlim sarlavhasiga sichqonchaning oʻng tugmasi bilan bosib tahrirlashni boshlash',
+'tog-showtoolbar' => 'Yuqoridagi tahrirlash asboblarini koʻrsatish',
+'tog-editondblclick' => 'Sichqonchaning chap tugmasini ikki marta bosib tahrirlashni boshlash',
+'tog-editsectiononrightclick' => 'Boʻlim sarlavhasiga sichqonchaning oʻng tugmasini bosib tahrirlashni boshlash',
 'tog-rememberpassword' => 'Hisob ma’lumotlarim ushbu brauzerda eslab qolinsin (ko‘pi bilan $1 kunga)',
 'tog-watchcreations' => 'Men yaratgan sahifalar va yuklagan fayllar kuzatuv roʻyxatimga qoʻshilsin',
 'tog-watchdefault' => 'Men tahrirlagan sahifa va fayllar kuzatuv roʻyxatimga qoʻshilsin',
@@ -137,7 +137,7 @@ $messages = array(
 'tog-oldsig' => 'Joriy imzo:',
 'tog-fancysig' => 'Imzoni viki-belgi qilib koʻrsatish (avtomatik ishoratsiz)',
 'tog-uselivepreview' => 'Tez koʻrib chiqish (JavaScript orqali) (sinovda)',
-'tog-forceeditsummary' => 'Qisqa tavsif oynasi toʻldirilmagani haqida ogohlantirish koʻrsatilsin',
+'tog-forceeditsummary' => 'Qisqa tavsif oynasi toʻldirilmagani haqida ogohlantirish koʻrsatish',
 'tog-watchlisthideown' => 'Oʻz tahrirlarim kuzatuv roʻyxatimda koʻrsatilmasin',
 'tog-watchlisthidebots' => 'Botlar qilgan tahrirlar kuzatuv roʻyxatimda koʻrsatilmasin',
 'tog-watchlisthideminor' => 'Kichik tahrirlar kuzatuv roʻyxatimda koʻrsatilmasin',
@@ -147,9 +147,8 @@ $messages = array(
 'tog-ccmeonemails' => 'Boshqa ishtirokchilarga yozgan xatimning nusxasi oʻzimga yuborilsin',
 'tog-diffonly' => 'Versiyalar taqqoslanayotganda, pastda sahifa matni koʻrsatilmasin',
 'tog-showhiddencats' => 'Yashirin turkumlarni koʻrsatish',
-'tog-noconvertlink' => 'Sarlavhani oʻzgartirish havolasini oʻchirib qoʻyish',
 'tog-norollbackdiff' => 'Tahrir qaytarilganda, versiyalar taqqosi koʻrsatilmasin',
-'tog-useeditwarning' => 'Kiritgan oʻzgarishlarimni saqlamay sahifadan chiqib ketayotganim haqida ogohlantirilsin',
+'tog-useeditwarning' => 'Oʻzgarishlarni saqlamay sahifadan chiqib ketayotganim haqida ogohlantirish',
 'tog-prefershttps' => 'Doim himoyalangan holda kirish',
 
 'underline-always' => 'Har doim',
@@ -190,18 +189,18 @@ $messages = array(
 'october' => 'oktabr',
 'november' => 'noyabr',
 'december' => 'dekabr',
-'january-gen' => 'yanvarning',
-'february-gen' => 'fevralning',
-'march-gen' => 'martning',
-'april-gen' => 'aprelning',
-'may-gen' => 'mayning',
-'june-gen' => 'iyunning',
-'july-gen' => 'iyulning',
-'august-gen' => 'avgustning',
-'september-gen' => 'sentabrning',
-'october-gen' => 'oktabrning',
-'november-gen' => 'noyabrning',
-'december-gen' => 'dekabrning',
+'january-gen' => 'yanvar',
+'february-gen' => 'fevral',
+'march-gen' => 'mart',
+'april-gen' => 'aprel',
+'may-gen' => 'may',
+'june-gen' => 'iyun',
+'july-gen' => 'iyul',
+'august-gen' => 'avgust',
+'september-gen' => 'sentabr',
+'october-gen' => 'oktabr',
+'november-gen' => 'noyabr',
+'december-gen' => 'dekabr',
 'jan' => 'yan',
 'feb' => 'fev',
 'mar' => 'mar',
@@ -214,6 +213,17 @@ $messages = array(
 'oct' => 'okt',
 'nov' => 'noy',
 'dec' => 'dek',
+'january-date' => 'Yanvar $1',
+'february-date' => 'Fevral $1',
+'march-date' => 'Mart $1',
+'april-date' => 'Aprel $1',
+'june-date' => 'Iyun $1',
+'july-date' => 'Iyul $1',
+'august-date' => 'Avgust $1',
+'september-date' => 'Sentabr $1',
+'october-date' => 'Oktabr $1',
+'november-date' => 'Noyabr $1',
+'december-date' => 'Dekabr $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Turkum}}',
@@ -293,7 +303,8 @@ $messages = array(
 'create-this-page' => 'Ushbu sahifani yaratish',
 'delete' => 'O‘chirish',
 'deletethispage' => 'Ushbu sahifani o‘chirish',
-'undelete_short' => '$1 ta tahrirni tiklash',
+'undeletethispage' => 'Ushbu sahifani tiklash',
+'undelete_short' => '{{PLURAL:$1|bitta tahrir|$1 ta tahrir}}ni tiklash',
 'viewdeleted_short' => '$1 ta oʻchirilgan tahrirni koʻrish',
 'protect' => 'Himoyalash',
 'protect_change' => 'Oʻzgartirish',
@@ -339,7 +350,7 @@ $1',
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} haqida',
 'aboutpage' => 'Project:Haqida',
-'copyright' => 'Keltirilgan maʼlumotlar $1 orqali tarqatilmoqda.',
+'copyright' => 'Keltirilgan maʼlumotlar $1 orqali tarqatilmoqda (agar aksinchasi koʻrsatilmagan boʻlsa).',
 'copyrightpage' => '{{ns:project}}:Mualliflik huquqlari',
 'currentevents' => 'Joriy hodisalar',
 'currentevents-url' => 'Project:Joriy hodisalar',
@@ -486,11 +497,14 @@ Boshqa hisob raqami orqali kirish uchun quyidagi formadan foydalaning.',
 'userlogin-createanother' => 'Boshqa hisob yaratish',
 'createacct-join' => 'Maʼlumotlaringizni quyiga yozing',
 'createacct-another-join' => 'Yangi hisob yozuvi maʼlumotlarini quyida koʻrsating.',
+'createacct-emailrequired' => 'Elektron pochta manzilingiz',
 'createacct-emailoptional' => 'Elektron pochta manzili (majburiy emas)',
-'createacct-email-ph' => 'Elektron pochtangiz manzilini kiriting',
+'createacct-email-ph' => 'Elektron pochta manzilingizni kiriting',
 'createacct-another-email-ph' => 'Elektron pochta manzilini kiriting',
 'createaccountmail' => 'Tasodifan tanlab beriladigan vaqtinchalik maxfiy soʻzdan foydalanish (elektron pochta manzilingizga joʻnatiladi)',
 'createaccountreason' => 'Sabab:',
+'createacct-reason' => 'Sabab',
+'createacct-reason-ph' => 'Nimaga yana boshqa hisob yaratyapsiz',
 'createacct-captcha' => 'Xavfsizlik tekshiruvi',
 'createacct-imgcaptcha-ph' => 'Yuqoridagi yozuvni bu yerga kiriting',
 'createacct-submit' => 'Hisob yaratish',
@@ -512,12 +526,15 @@ Ism yozilishini tekshirib koʻring.',
 'wrongpasswordempty' => 'Maxfiy soʻz koʻrsatilmagan. Qaytadan urinib koʻring.',
 'mailmypassword' => 'Maxfiy soʻzni yangilash',
 'passwordremindertitle' => "{{SITENAME}} uchun vaqtinchalik yangi maxfiy so'z",
-'emailauthenticated' => 'Sizning elektron pochta manzilingiz $2, $3 da tasdiqlangan.',
-'emailconfirmlink' => 'Sizning elektron pochta manzilingizni tasdiqlash',
+'emailauthenticated' => 'Elektron pochta manzilingiz $2, $3 da tasdiqlangan.',
+'emailconfirmlink' => 'Elektron pochta manzilingizni tasdiqlash',
 'emaildisabled' => 'Bu sayt elektron pochta xatlarini yubora olmaydi.',
 'accountcreated' => 'Hisob yozuvi yaratildi',
 'login-abort-generic' => 'Tizimga kirishga mufavvaqiyatsiz urinish',
 'loginlanguagelabel' => 'Til: $1',
+'pt-login' => 'Kirish',
+'pt-createaccount' => 'Hisob yaratish',
+'pt-userlogout' => 'Chiqish',
 
 # Change password dialog
 'changepassword' => 'Maxfiy soʻzni oʻzgartirish',
@@ -538,7 +555,7 @@ Ism yozilishini tekshirib koʻring.',
 'passwordreset-legend' => 'Maxfiy soʻzni yangilash',
 'passwordreset-username' => 'Foydalanuvchi nomi:',
 'passwordreset-domain' => 'Domen:',
-'passwordreset-email' => 'Elektron pochta manzili:',
+'passwordreset-email' => 'Elektron pochta manzilingiz:',
 'passwordreset-emailelement' => "Foydalanuvchi ismi: $1
 Vaqtinchalik maxfiy so'z: $2",
 
@@ -954,7 +971,7 @@ Agar keltirsangiz, undan sahifa kim tomonidan tahrirlanganini koʻrsatish uchun
 'recentchanges-label-plusminus' => 'vazni qanchaga oʻzgargani (bayt)',
 'recentchanges-legend-heading' => "'''Izoh:'''",
 'recentchanges-legend-newpage' => '([[Special:NewPages|alohida roʻyxat]])',
-'rcnotefrom' => "Quyida <strong>$2</strong> dan (<strong>$1</strong> gacha) bo'lgan o'zgarishlar keltirilgan.",
+'rcnotefrom' => 'Quyida <strong>$2</strong>dan boshlab boʻlgan oʻzgarishlar keltirilgan (<strong>$1</strong>dan koʻp boʻlmaganlari koʻrsatildi).',
 'rclistfrom' => '$1 dan boshlab yangi oʻzgarishlarni koʻrsat.',
 'rcshowhideminor' => 'Kichik tahrirlarni $1',
 'rcshowhidebots' => 'Botlarni $1',
@@ -1026,6 +1043,8 @@ Quyida bu sahifaga oid yoʻqotish va koʻchirish qaydlari keltirilgan:',
 'listfiles_size' => 'Oʻlchami',
 'listfiles_description' => 'Taʼrif',
 'listfiles_count' => 'Versiyalar',
+'listfiles-latestversion-yes' => 'Ha',
+'listfiles-latestversion-no' => 'Yoʻq',
 
 # File description page
 'file-anchor-link' => 'Fayl',
@@ -1069,6 +1088,9 @@ Uning [$2 fayl tavsifi sahifasidan] olingan tavsifi quyida keltirilgan.',
 # Random page
 'randompage' => 'Tasodifiy sahifa',
 
+# Random page in category
+'randomincategory-selectcategory-submit' => 'Oʻtish',
+
 # Statistics
 'statistics' => 'Statistika',
 'statistics-header-pages' => 'Sahifalar statistikasi',
@@ -1084,6 +1106,9 @@ Uning [$2 fayl tavsifi sahifasidan] olingan tavsifi quyida keltirilgan.',
 'statistics-users-active' => 'Faol foydalanuvchilar',
 'statistics-users-active-desc' => 'Oxirgi $1 kun ichida kamida bitta amal qilgan foydalanuvchilar',
 
+'pageswithprop-prop' => 'Xossa nomi:',
+'pageswithprop-submit' => 'Oʻtish',
+
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bayt}}',
 'ncategories' => '$1 {{PLURAL:$1|turkum|turkumlar}}',
index b2179c9..6bc0430 100644 (file)
@@ -375,7 +375,6 @@ $messages = array(
 'tog-ccmeonemails' => 'Gửi bản sao cho tôi khi gửi thư điện tử cho người khác',
 'tog-diffonly' => 'Không hiển thị nội dung trang dưới phần so sánh phiên bản',
 'tog-showhiddencats' => 'Hiển thị thể loại ẩn',
-'tog-noconvertlink' => 'Tắt liên kết chuyển đổi tựa đề',
 'tog-norollbackdiff' => 'Không so sánh sau khi lùi sửa',
 'tog-useeditwarning' => 'Cảnh báo khi tôi thoát trang sửa đổi mà chưa lưu trang',
 'tog-prefershttps' => 'Luôn kết nối an toàn khi đăng nhập',
@@ -866,7 +865,7 @@ Xin hãy bỏ qua thông điệp này nếu tài khoản này không phải do b
 
 Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao của bạn.',
 'pt-login' => 'Đăng nhập',
-'pt-createaccount' => 'Tạo tài khoản',
+'pt-createaccount' => 'Mở tài khoản',
 'pt-userlogout' => 'Đăng xuất',
 
 # Email sending
@@ -896,7 +895,7 @@ Có thể bạn đã thay đổi thành công mật khẩu của mình hoặc đ
 'resetpass-temp-password' => 'Mật khẩu tạm:',
 'resetpass-abort-generic' => 'Một phần mở rộng đã hủy bỏ tác vụ thay đổi mật khẩu.',
 'resetpass-expired' => 'Mật khẩu của bạn đã hết hạn. Xin vui lòng tạo lại mật khẩu mới để đăng nhập.',
-'resetpass-expired-soft' => 'Mật khẩu của bạn đã hết hạn và cần được đặt lại. Xin vui lòng chọn một mật khẩu mới lúc bây giờ hoặc bấm Hủy bỏ để đặt lại sau.',
+'resetpass-expired-soft' => 'Mật khẩu của bạn đã hết hạn và cần được đặt lại. Xin vui lòng chọn một mật khẩu mới lúc bây giờ hoặc bấm “{{int:resetpass-submit-cancel}}” để đặt lại sau.',
 
 # Special:PasswordReset
 'passwordreset' => 'Tái tạo mật khẩu',
@@ -1746,14 +1745,26 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao c
 'recentchanges-legend-heading' => "'''Chú giải:'''",
 'recentchanges-legend-newpage' => '(xem thêm [[Special:NewPages|danh sách các trang mới]])',
 'recentchanges-legend-plusminus' => "(''±123'')",
-'rcnotefrom' => "Thay đổi từ '''$2''' (hiển thị tối đa '''$1''' thay đổi).",
+'rcnotefrom' => 'Thay đổi từ <strong>$2</strong> (hiển thị tối đa <strong>$1</strong> thay đổi).',
 'rclistfrom' => 'Hiển thị các thay đổi từ $1.',
 'rcshowhideminor' => '$1 sửa đổi nhỏ',
+'rcshowhideminor-show' => 'Hiện',
+'rcshowhideminor-hide' => 'Ẩn',
 'rcshowhidebots' => '$1 sửa đổi bot',
+'rcshowhidebots-show' => 'Hiện',
+'rcshowhidebots-hide' => 'Ẩn',
 'rcshowhideliu' => '$1 thành viên đăng ký',
+'rcshowhideliu-show' => 'Hiện',
+'rcshowhideliu-hide' => 'Ẩn',
 'rcshowhideanons' => '$1 sửa đổi vô danh',
+'rcshowhideanons-show' => 'Hiện',
+'rcshowhideanons-hide' => 'Ẩn',
 'rcshowhidepatr' => '$1 sửa đổi đã tuần tra',
+'rcshowhidepatr-show' => 'Hiện',
+'rcshowhidepatr-hide' => 'Ẩn',
 'rcshowhidemine' => '$1 sửa đổi của tôi',
+'rcshowhidemine-show' => 'Hiện',
+'rcshowhidemine-hide' => 'Ẩn',
 'rclinks' => 'Xem $1 sửa đổi gần đây nhất trong $2 ngày qua; $3.',
 'diff' => 'khác',
 'hist' => 'sử',
@@ -1880,6 +1891,8 @@ Bạn nên xin một người có quyền xem dữ liệu tập tin bị đàn 
 '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.',
+'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.',
 'uploadvirus' => 'Tập tin có virút! Chi tiết: $1',
 'uploadjava' => 'Tập tin ZIP này chứa một tập tin Java .class.
 Không được phép tải lên các tập tin Java, bởi vì chúng có thể vượt qua các hạn chế bảo mật.',
@@ -2534,7 +2547,7 @@ Việc xóa các trang như vậy bị hạn chế để ngăn ngừa phá hoạ
 'delete-warning-toobig' => 'Trang này có lịch sử sửa đổi lớn, đến hơn {{PLURAL:$1|lần|lần}} sửa đổi.
 Việc xóa các trang có thể làm tổn hại đến hoạt động của cơ sở dữ liệu {{SITENAME}};
 hãy cẩn trọng khi thực hiện.',
-'deleting-backlinks-warning' => "'''Cảnh báo:''' Có trang khác liên kết đến hoặc nhúng trang mà bạn sắp xóa.",
+'deleting-backlinks-warning' => "'''Cảnh báo:''' Có [[Special:WhatLinksHere/{{FULLPAGENAME}}|trang khác]] liên kết đến hoặc nhúng trang mà bạn sắp xóa.",
 
 # Rollback
 'rollback' => 'Lùi tất cả sửa đổi',
@@ -2707,8 +2720,10 @@ $1',
 'sp-contributions-blocked-notice' => 'Thành viên này hiện đang bị cấm sửa đổi. Nhật trình cấm gần nhất được ghi ở dưới để tiện theo dõi:',
 'sp-contributions-blocked-notice-anon' => 'Địa chỉ IP này đang bị cấm. Hãy tham khảo mục mới nhất trong nhật trình cấm IP này:',
 'sp-contributions-search' => 'Tìm kiếm đóng góp',
+'sp-contributions-suppresslog' => 'đóng góp đã bị đàn áp của thành viên',
 'sp-contributions-username' => 'Địa chỉ IP hay tên thành viên:',
 'sp-contributions-toponly' => 'Chỉ hiện các phiên bản mới nhất',
+'sp-contributions-newonly' => 'Chỉ hiện các sửa đổi tạo trang',
 'sp-contributions-submit' => 'Tìm kiếm',
 
 # What links here
@@ -4356,6 +4371,4 @@ Nếu không thì bạn có thể điền biểu mẫu đơn giản ở dưới.
 'expand_templates_generate_rawhtml' => 'Hiển thị HTML thô',
 'expand_templates_preview' => 'Xem trước',
 
-# Unknown messages
-'uploadinvalidxml' => 'Không thể phân tích mã XML trong tập tin tải lên.',
 );
index 12d010e..ca8b2fa 100644 (file)
@@ -166,8 +166,8 @@ $messages = array(
 'disclaimerpage' => 'Project:Ceeltümin vassamizõõ',
 'edithelp' => 'Muutuzavid',
 'helppage' => 'Help:Sisälto',
-'mainpage' => 'Esicülci',
-'mainpage-description' => 'Esicülci',
+'mainpage' => 'Päälehto',
+'mainpage-description' => 'Päälehto',
 'portal' => 'Foorum',
 'portal-url' => 'Project:Foorum',
 'privacy' => 'Salaštrahuituz',
@@ -787,7 +787,7 @@ Että või muuttaa cülcia, mutta võittõ kattsoa sene lähtekoodi.',
 'tooltip-search-go' => 'Mee cüľľelee, kummall on vakurat sesama nimi (kui eloz on)',
 'tooltip-search-fulltext' => 'Etsi cülciltä sitä tekstiä',
 'tooltip-p-logo' => 'Mee esicüľľelee',
-'tooltip-n-mainpage' => 'Mee esicüľľelee',
+'tooltip-n-mainpage' => 'Mee päälehole',
 'tooltip-n-mainpage-description' => 'Mee esicüľľelee',
 'tooltip-n-portal' => 'Juttua projektissa: Mitä tüü võittõ tehä, kuza levvette mitä',
 'tooltip-n-currentevents' => 'Lugõ soobšeńńad nücüizess kõhtoiss',
index ab43ec6..1068623 100644 (file)
@@ -747,6 +747,9 @@ $2',
 'suspicious-userlogout' => ' אײַער בקשה אַרויסלאָגירן זיך איז אפגעלייגט געווארן ווייַל אייגנטלעך איז זי געשיקט דורך אַ צעבראכענעם בלעטערער אָדער א פראקסי מיט א זאפאס.',
 'createacct-another-realname-tip' => 'עכטער נאמען איז אפציאנאל.
 אויב איר וויילט אויס צוצושטעלן אים, וועט דאס גענוצט ווערן צו געבן אטריבוציע פאר זייער ארבעט.',
+'pt-login' => 'אַרײַנלאגירן',
+'pt-createaccount' => 'שאַפֿן אַ קאנטע',
+'pt-userlogout' => 'אַרויסלאגירן',
 
 # Email sending
 'php-mail-error-unknown' => 'אומבאַקאַנט טעות אין()mail פֿונקציע פֿון PHP.',
@@ -755,7 +758,7 @@ $2',
 
 # Change password dialog
 'changepassword' => 'טוישן פאַסווארט',
-'resetpass_announce' => '×\90×\99ר ×\94×\90×\98 ×\90ר×\99×\99× ×\9c×\90×\92×\99ר×\98 ×\9e×\99×\98 ×\90 ×¤×¨×\90×\95×\95×\99×\96×\90ר×\99ש×\9f ×§×\90×\93 ×\92עש×\99ק×\98 ×\93×\95ר×\9b×\9f ×¢-פ×\90ס×\98. ×¦×\95 ×¤×\90רענ×\93×\99×\92×\9f ×\90ר×\99×\99× ×\9c×\90×\92×\99ר×\9f, ×\91ר×\95×\99×\9b×\98 ×\90×\99ר ×\90נש×\98×¢×\9c×\9f ×\90 × ×\99×\99 ×¤×\90ס×\95×\95×\90ר×\98 ×\93×\90:',
+'resetpass_announce' => 'צו פארענדיגן אריינלאגירן, ברויכט איר אנשטעלן א ניי פאסווארט דא:',
 'resetpass_text' => '<!-- לייגט צו טעקסט דא -->',
 'resetpass_header' => 'ענדערן קאנטע פאסווארט',
 'oldpassword' => 'אַלטע פאַסווארט:',
@@ -771,8 +774,10 @@ $2',
 'resetpass-submit-cancel' => 'אַנולירן',
 'resetpass-wrong-oldpass' => 'אומגילטיג צײַטווײַליק אדער לויפֿיק פאַסווארט.
 איר האט מעגלעך שוין געטוישט אייער פאַסווארט מיט הצלחה אדער געבעטן א נײַ  צײַטווײַליק פאַסווארט.',
+'resetpass-recycled' => 'זײַט אזוי גוט שטעטל אירע פאסווארט צו עפעס אנדערש פונעם לויפיקן פאסווארט.',
 'resetpass-temp-password' => 'צײַטווייליק פאַסווארט:',
 'resetpass-abort-generic' => 'פאסווארט ענדערונג איז מבוטל געווארן דורך א פארברייטערונג.',
+'resetpass-expired' => 'אירע פאסווארט איז אויסגעגאנגען. זײַט אזוי גוט שטעלט א נײַ פאסווארט כדי ארײַנלאגירן.',
 
 # Special:PasswordReset
 'passwordreset' => 'צוריקשטעלן פאַסווארט',
@@ -1257,6 +1262,7 @@ $1",
 'showhideselectedversions' => 'ווײַזן/באַהאַלטן געקליבענע רעוויזיעס',
 'editundo' => 'אַנולירן',
 'diff-empty' => '(קיין אונטערשייד)',
+'diff-multi-sameuser' => '({{PLURAL:$1|איין צווישנדיקע ווערסיע |$1 צווישנדיקע ווערסיעס}} פֿונעם זעלבן באַניצער נישט געוויזן.)',
 'diff-multi-otherusers' => '({{PLURAL:$1|איין מיטלסטע ווערסיע |$1 מיטלסטע ווערסיעס}} פֿון {{PLURAL:$2|איין אנדער באַניצער|$2 באַניצער}} נישט געוויזן.)',
 'diff-multi-manyusers' => '({{PLURAL:$1|איין מיטלסטע ווערסיע |$1 מיטלסטע ווערסיעס}} פֿון מער ווי {{PLURAL:$2|איין באַניצער|$2 באַניצער}} נישט געוויזן.)',
 'difference-missing-revision' => '{{PLURAL:$2|איין ווערסיע|$2 ווערסיעס}} פון דעם דיפערענץ ($1) {{PLURAL:$2|האט}} מען נישט געטראפן.
@@ -1622,14 +1628,26 @@ $1",
 'recentchanges-legend-heading' => "'''לעגענדע:'''",
 'recentchanges-legend-newpage' => '(זעט אויך [[Special:NewPages|די רשימה פון נייע בלעטער]])',
 'recentchanges-legend-plusminus' => "(''±123'')",
-'rcnotefrom' => "פֿאלגנד זענען די ענדערונגען זײַט '''$2''' (ביז '''$1''')",
+'rcnotefrom' => 'פֿאלגנד זענען די ענדערונגען זײַט <strong>$2</strong> (ביז <strong>$1</strong>).',
 'rclistfrom' => 'װײַזן נײַע ענדערונגען פֿון $1',
 'rcshowhideminor' => '$1 מינערדיגע ענדערונגען',
+'rcshowhideminor-show' => 'ווײַזן',
+'rcshowhideminor-hide' => 'באהאלטן',
 'rcshowhidebots' => '$1 ראבאטן',
+'rcshowhidebots-show' => 'ווײַזן',
+'rcshowhidebots-hide' => 'באַהאַלטן',
 'rcshowhideliu' => '$1 אײַנגעשריבענע באַניצער',
+'rcshowhideliu-show' => 'ווײַזן',
+'rcshowhideliu-hide' => 'באַהאַלטן',
 'rcshowhideanons' => '$1 אַנאָנימע באַניצער',
+'rcshowhideanons-show' => 'ווײַזן',
+'rcshowhideanons-hide' => 'באַהאַלטן',
 'rcshowhidepatr' => '$1 פאַטראלירטע ענדערונגען',
+'rcshowhidepatr-show' => 'ווײַזן',
+'rcshowhidepatr-hide' => 'באַהאַלטן',
 'rcshowhidemine' => '$1 מײַנע רעדאַקטירוננגען',
+'rcshowhidemine-show' => 'ווײַזן',
+'rcshowhidemine-hide' => 'באַהאַלטן',
 'rclinks' => 'װײַזן די לעצטע $1 ענדערונגען אין די לעצטע $2 טעג.<br />$3',
 'diff' => 'אונטערשייד',
 'hist' => 'היסטאריע',
@@ -2081,6 +2099,11 @@ $1",
 'protectedpages-cascade' => 'בלויז קאַסקאַדירנדיקע באַשיצונגען',
 'protectedpages-noredirect' => 'פֿארהיילן ווייטערפֿירונגען',
 'protectedpagesempty' => 'אצינד זענען קיין בלעטער נישט געשיצט מיט די דאזיגע פאַראַמעטערס.',
+'protectedpages-timestamp' => 'צײַטשטעמפל',
+'protectedpages-page' => 'בלאַט',
+'protectedpages-expiry' => 'גייט אויס',
+'protectedpages-reason' => 'אורזאַך',
+'protectedpages-unknown-timestamp' => 'אומבאַוואוסט',
 'protectedtitles' => 'געשיצטע קעפלעך',
 'protectedtitlesempty' => 'אצינד זענען קיין קעפלעך נישט באַשיצט מיט די דאזיגע פאַראַמעטערס.',
 'listusers' => 'באַניצער ליסטע',
@@ -2352,7 +2375,8 @@ $UNWATCHURL
 'delete-edit-reasonlist' => 'רעדאַקטירן די אויסמעקן סיבות',
 'delete-toobig' => 'דער בלאַט האט א גרויסע רעדאקטירונג היסטאריע, מער ווי $1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}}. אויסמעקן אזעלכע בלעטער איז באַגרענעצט געווארן בכדי צו פֿאַרמײַדן א צופֿעליגע פֿאַרשטערונג פֿון  {{SITENAME}}.',
 'delete-warning-toobig' => 'דער בלאַט האט א גרויסע רעדאקטירונג היסטאריע, מער ווי $1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}}. אויסמעקן אים קען פֿאַרשטערן דאַטנבאַזע אפעראַציעס פֿון {{SITENAME}}; זײַט פֿארזיכטיג איידער איר מעקט אויס.',
-'deleting-backlinks-warning' => "'''ווארענוג:''' אנדערע בלעטער פארבינדן צום בלאט אדער אריבערשליסן פונעם בלאט איר האלט ביי אויסמעקן.",
+'deleting-backlinks-warning' => "'''ווארענוג:'''
+[[Special:WhatLinksHere/{{FULLPAGENAME}}|אנדערע בלעטער]]  פארבינדן צום בלאט אדער אריבערשליסן דעם בלאט איר האלט ביי אויסמעקן.",
 
 # Rollback
 'rollback' => 'צוריקדרייען רעדאַקטירונגען',
index ff1e984..dac35e8 100644 (file)
@@ -271,7 +271,6 @@ $messages = array(
 'tog-ccmeonemails' => '當我寄電郵畀其他人嗰陣寄返封副本畀我',
 'tog-diffonly' => '響差異下面唔顯示頁面內容',
 'tog-showhiddencats' => '顯示隱藏類',
-'tog-noconvertlink' => '唔轉連結標題',
 'tog-norollbackdiff' => '進行反轉之後略過差異',
 'tog-useeditwarning' => '當我離開未保存好嘅修改嗰陣警告我',
 'tog-prefershttps' => '簽到後繼續用加密連線',
@@ -689,6 +688,7 @@ $1',
 'login-throttled' => '你已經試咗太多次登入動作。請等多一陣再試過。',
 'loginlanguagelabel' => '語言:$1',
 'suspicious-userlogout' => '你去登出嘅要求已經拒絕咗,因為佢可能由壞咗嘅瀏覽器或者快取代理傳送。',
+'pt-createaccount' => '開戶口',
 
 # Email sending
 'php-mail-error-unknown' => '響 PHP 嘅 mail() 參數度出現咗未知嘅錯誤',
index ed1ee3a..6e6ad18 100644 (file)
@@ -7,16 +7,10 @@
  * @ingroup Language
  * @file
  *
- * @author Cwek
- * @author Gakmo
  * @author Kuailong
- * @author Li3939108
  * @author PhiLiP
- * @author Qiyue2001
  * @author Shizhao
- * @author StephDC
  * @author Wong128hk
- * @author Xiaomingyan
  */
 
 # Stub message file for converter code "zh"
@@ -179,84 +173,18 @@ $specialPageAliases = array(
 );
 
 $messages = array(
-# User preference toggles
-'tog-underline' => '鏈接下劃線:',
-'tog-hideminor' => '于最近更改列表中隱藏小編輯',
-'tog-showtoolbar' => '顯示編輯工具欄(需要 JavaScript)',
-'tog-editondblclick' => '双击以编辑页面',
-'tog-editsectiononrightclick' => '允许通过右击章节标题来编辑章节',
-'tog-rememberpassword' => '让浏览器记住我的登录(最大记录为$1天)',
-'tog-watchcreations' => '将我创建的页面和上传的文件添加到监视列表',
-'tog-watchdefault' => '将我编辑过的页面和上传的文件添加到监视列表',
-'tog-watchmoves' => '将我移动过的页面和上传的文件添加到监视列表',
-'tog-watchdeletion' => '将我删除的页面和文件添加到监视列表',
-'tog-minordefault' => '默认所有编辑为小编辑',
-'tog-previewontop' => '在编辑框前显示预览',
-'tog-previewonfirst' => '在第一次编辑时显示预览',
-'tog-enotifwatchlistpages' => '当在我监视列表的页面或文件发生更改时以电子邮件通知我',
-'tog-enotifusertalkpages' => '当我的用户讨论页发生更改时以电子邮件通知我',
-'tog-watchlisthideown' => '从监视列表隐藏我的编辑',
-'tog-watchlisthidebots' => '在监视列表中隐藏機器人用戶的修改',
-'tog-watchlisthideminor' => '在监视列表中隐藏小修改',
-'tog-norollbackdiff' => '進行回退後略過差異比較',
-
-# Font style option in Special:Preferences
-'editfont-monospace' => '等寬字體',
-
-# Categories related messages
-'category_header' => '分类“$1”中的页面',
-'subcategories' => '子分类',
-'hidden-category-category' => '隐藏的分类',
-
-'about' => '关于',
-'cancel' => '取消',
-'moredotdotdot' => '更多……',
-'mypage' => '页面',
-'mytalk' => '讨论',
-'anontalk' => '这个IP地址的讨论页',
-'navigation' => '导航',
-
-# Cologne Blue skin
-'qbbrowse' => '浏览',
-'qbedit' => '编辑',
-'qbpageoptions' => '该页',
-'faq' => '常见问题',
-'faqpage' => 'Project:常见问题',
-
-# Vector skin
-'vector-action-delete' => '删除',
-'vector-action-move' => '移动',
-'vector-view-create' => '创建',
-'vector-view-edit' => '编辑',
-'vector-view-history' => '查看历史',
-
-'newpage' => '最新页面',
-
-# Login and logout pages
-'userlogin-noaccount' => '没有账户?',
-'createacct-join' => '请在下面输入您的资料',
-
-# Edit pages
-'editing' => '编辑“$1”',
-
-# Miscellaneous special pages
-'newpages' => '最新页面',
-
-# Tooltip help for the actions
-'interlanguage-link-title' => '$1 – $2',
-
 /*
 Short names for language variants used for language conversion links.
 Variants for Chinese language
 */
 'variantname-zh-hans' => '简体',
 'variantname-zh-hant' => '繁體',
-'variantname-zh-cn' => '大陆简体',
-'variantname-zh-tw' => '台灣正體',
-'variantname-zh-hk' => '香港繁體',
-'variantname-zh-mo' => '澳門繁體',
-'variantname-zh-sg' => '新加坡简体',
-'variantname-zh-my' => '大马简体',
-'variantname-zh' => '不转换',
+'variantname-zh-cn'   => '大陆简体',
+'variantname-zh-tw'   => '台灣正體',
+'variantname-zh-hk'   => '香港繁體',
+'variantname-zh-mo'   => '澳門繁體',
+'variantname-zh-sg'   => '新加坡简体',
+'variantname-zh-my'   => '大马简体',
+'variantname-zh'      => '不转换',
 
 );
index cd395bb..6e72e36 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Chinese (China) (中文(中国大陆)‎)
+/** Chinese (China) (‪中文(中国大陆)‬)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -12,7 +12,6 @@
  * @author Shizhao
  * @author Wong128hk
  * @author Xiaomingyan
- * @author 范
  */
 
 # Inherit everything for now
@@ -22,21 +21,12 @@ $messages = array(
 # User preference toggles
 'tog-norollbackdiff' => '进行回退后略过差异比较',
 
-'mytalk' => '讨论',
+'mytalk' => '我的讨论页',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'portal' => '社区专页',
 
-# Login and logout pages
-'createacct-benefit-body1' => '{{PLURAL:$1|次编辑}}',
-'createacct-benefit-body2' => '
-{{PLURAL:$1|个页面}}',
-'createacct-benefit-body3' => '位最近{{PLURAL:$1|贡献者}}',
-
 # Edit pages
-'editing' => '编辑“$1”',
-
-# Tooltip help for the actions
-'interlanguage-link-title' => '$1 – $2',
+'editing' => '正在编辑 $1',
 
 );
index ecb074d..dd0183b 100644 (file)
@@ -73,6 +73,7 @@
  * @author Wrightbus
  * @author Xiaomingyan
  * @author Yfdyh000
+ * @author Zoglun
  * @author 乌拉跨氪
  * @author 御坂美琴
  * @author 燃玉
@@ -421,7 +422,6 @@ $messages = array(
 'tog-ccmeonemails' => '把我给其他用户发送的电子邮件的副本发送给我',
 'tog-diffonly' => '不在差异下面显示页面内容',
 'tog-showhiddencats' => '显示隐藏分类',
-'tog-noconvertlink' => '停用链接文字转换',
 'tog-norollbackdiff' => '执行回退后不显示差异',
 'tog-useeditwarning' => '当我离开有未保存更改的编辑页面时提醒我',
 'tog-prefershttps' => '登录时始终使用安全连接',
@@ -937,7 +937,7 @@ $2',
 'resetpass-temp-password' => '临时密码:',
 'resetpass-abort-generic' => '密码更改已被一个扩展插件中止。',
 'resetpass-expired' => '您的密码已经过期。请设置一个新的密码登录。',
-'resetpass-expired-soft' => '您的密码已经过期,并且需要重置。请现在选择一个新密码,或单击取消以便稍后重置。',
+'resetpass-expired-soft' => '您的密码已过期并且需要重置。请现在选择一个新密码,或单击“{{int:resetpass-submit-cancel}}”以便稍后重置。',
 
 # Special:PasswordReset
 'passwordreset' => '重置密码',
@@ -1020,11 +1020,11 @@ $2
 'subject' => '标题:',
 'minoredit' => '标记为小编辑',
 'watchthis' => '监视本页',
-'savearticle' => '保存本页',
+'savearticle' => '保存页面',
 'preview' => '预览',
 'showpreview' => '显示预览',
 'showlivepreview' => '实时预览',
-'showdiff' => '显示差异',
+'showdiff' => '显示更改',
 'anoneditwarning' => "'''警告:'''你没有登录。你的IP地址将被记录在该页面的编辑历史中。",
 'anonpreviewwarning' => "''你没有登录。保存会记录你的IP地址于该页面的编辑历史中。''",
 'missingsummary' => "'''提示:'''你没有提供编辑摘要。如果你再次点击“{{int:savearticle}}”,你的编辑将不带编辑摘要保存。",
@@ -1093,7 +1093,7 @@ $2
 'updated' => '(已更新)',
 'note' => "'''注意:'''",
 'previewnote' => "'''请记住这只是预览。'''你的更改还没有保存!",
-'continue-editing' => 'å¾\80ç¼\96è¾\91æ¡\86',
+'continue-editing' => 'å\89\8då¾\80ç¼\96è¾\91å\8cº',
 'previewconflict' => '该预览反映了上面文字编辑区中的文字在你保存后的显示状况。',
 'session_fail_preview' => "'''对不起!由于会话数据丢失,我们无法处理你的编辑。'''请重试。如果仍然失败,请尝试[[Special:UserLogout|退出登录]]后重新登录。",
 'session_fail_preview_html' => "'''对不起!由于会话数据丢失,我们无法处理你的编辑。'''
@@ -1420,7 +1420,7 @@ $1",
 'powersearch-toggleall' => '全选',
 'powersearch-togglenone' => '全不选',
 'search-external' => '外部搜索',
-'searchdisabled' => '{{SITENAME}}的搜索已被禁用。您可以暂时使用Google进行搜索,须注意他们索引的{{SITENAME}}内容可能会过时。',
+'searchdisabled' => '{{SITENAME}}的搜索已被禁用。您可以暂时使用搜索引擎进行搜索,须注意他们索引的{{SITENAME}}内容可能不是最新的。',
 'search-error' => '搜索时发生错误:$1',
 
 # Preferences page
@@ -1721,14 +1721,26 @@ $1",
 'recentchanges-legend-heading' => "'''说明:'''",
 'recentchanges-legend-newpage' => '(另见[[Special:NewPages|新页面列表]])',
 'recentchanges-legend-plusminus' => "(''±123'')",
-'rcnotefrom' => "下面是'''$2'''之后的更改(最多显示'''$1'''个)。",
+'rcnotefrom' => '下面是<strong>$2</strong>之后的更改(最多显示<strong>$1</strong>个)。',
 'rclistfrom' => '显示$1之后的新更改',
 'rcshowhideminor' => '$1小编辑',
+'rcshowhideminor-show' => '显示',
+'rcshowhideminor-hide' => '隐藏',
 'rcshowhidebots' => '$1机器人',
+'rcshowhidebots-show' => '显示',
+'rcshowhidebots-hide' => '隐藏',
 'rcshowhideliu' => '$1注册用户',
+'rcshowhideliu-show' => '显示',
+'rcshowhideliu-hide' => '隐藏',
 'rcshowhideanons' => '$1匿名用户',
+'rcshowhideanons-show' => '显示',
+'rcshowhideanons-hide' => '隐藏',
 'rcshowhidepatr' => '$1已巡查的编辑',
+'rcshowhidepatr-show' => '显示',
+'rcshowhidepatr-hide' => '隐藏',
 'rcshowhidemine' => '$1我的编辑',
+'rcshowhidemine-show' => '显示',
+'rcshowhidemine-hide' => '隐藏',
 'rclinks' => '显示最后$2天的最后$1个更改<br />$3',
 'diff' => '差异',
 'hist' => '历史',
@@ -1845,6 +1857,8 @@ $1",
 'uploaddisabledtext' => '文件上传已停用。',
 'php-uploaddisabledtext' => 'PHP文件上传停用。请检查file_uploads设置。',
 'uploadscripted' => '该文件包含可能被网络浏览器错误解释的 HTML 或脚本代码。',
+'uploadscriptednamespace' => "此SVG文件包含非法名字空间'$1'",
+'uploadinvalidxml' => '上传文件中的XML无法解析。',
 'uploadvirus' => '该文件包含病毒!
 详情:$1',
 'uploadjava' => '该文件是 ZIP 文件,其中包含 Java 的.class 文件。
@@ -2462,7 +2476,7 @@ $UNWATCHURL
 'delete-edit-reasonlist' => '编辑删除原因',
 'delete-toobig' => '这个页面有一个十分大量的编辑历史,超过$1次修订。删除此类页面的动作已经被限制,以防止在{{SITENAME}}上的意外扰乱。',
 'delete-warning-toobig' => '这个页面有一个十分大量的编辑历史,超过$1次修订。删除它可能会扰乱{{SITENAME}}的数据库操作;在继续此动作前请小心。',
-'deleting-backlinks-warning' => "'''警告:'''有其他页面链接至或transclude自您要删除的页面。",
+'deleting-backlinks-warning' => "'''警告:'''有[[Special:WhatLinksHere/{{FULLPAGENAME}}|其他页面]]链接至或包含您要删除的页面。",
 
 # Rollback
 'rollback' => '回退编辑',
@@ -2630,8 +2644,10 @@ $1',
 'sp-contributions-blocked-notice-anon' => '这个IP地址现时正在被封锁中。
 最近的封锁日志项目在下面提供以便参考:',
 'sp-contributions-search' => '搜索贡献',
+'sp-contributions-suppresslog' => '已被删除的用户贡献',
 'sp-contributions-username' => 'IP地址或用户名:',
 'sp-contributions-toponly' => '仅显示最后版本的编辑',
+'sp-contributions-newonly' => '仅显示创建页面的编辑',
 'sp-contributions-submit' => '搜索',
 
 # What links here
@@ -3010,7 +3026,7 @@ $2',
 'tooltip-pt-watchlist' => '你正在监视更改的页面的列表',
 'tooltip-pt-mycontris' => '你的贡献的列表',
 'tooltip-pt-login' => '我们鼓励您登录,不过这不是强制的',
-'tooltip-pt-logout' => '退出登录',
+'tooltip-pt-logout' => '退出',
 'tooltip-ca-talk' => '关于内容页面的讨论',
 'tooltip-ca-edit' => '你可以编辑本页面。请在保存前使用预览按钮',
 'tooltip-ca-addsection' => '开始新段落',
@@ -3085,7 +3101,7 @@ $2',
 'group-bureaucrat.css' => '/* 放置于这里的CSS将只影响机行政员 */',
 
 # Scripts
-'common.js' => '/* 这里的任何JavaScript将为所有用户在每一页面载入加载。 */',
+'common.js' => '/* 这里的任何JavaScript将为所有用户在每次页面载入时加载。 */',
 'cologneblue.js' => '/* 这里的任何JavaScript将为使用科隆香水蓝皮肤的用户加载 */',
 'monobook.js' => '/* 这里的任何JavaScript将为使用MonoBook皮肤的用户加载 */',
 'modern.js' => '/* 这里的任何JavaScript将为使用现代皮肤的用户加载 */',
@@ -3134,7 +3150,7 @@ $2',
 'pageinfo-length' => '页面长度(字节)',
 'pageinfo-article-id' => '页面ID',
 'pageinfo-language' => '页面内容语言',
-'pageinfo-content-model' => '页面内容模式',
+'pageinfo-content-model' => '页面内容类型',
 'pageinfo-robot-policy' => '爬虫索引',
 'pageinfo-robot-index' => '允许',
 'pageinfo-robot-noindex' => '不允许',
@@ -4178,6 +4194,4 @@ MediaWiki发表时预期有用,但对此'''无任何保证''',亦无隐含
 'expand_templates_generate_rawhtml' => '显示原始HTML',
 'expand_templates_preview' => '预览',
 
-# Unknown messages
-'uploadinvalidxml' => '上传文件中的XML无法解析。',
 );
index fe218bb..17123d0 100644 (file)
@@ -306,7 +306,6 @@ $messages = array(
 'tog-ccmeonemails' => '當我寄電子郵件給其他使用者時,也寄一份副本到我的信箱',
 'tog-diffonly' => '比對版本差異時下面不顯示頁面內容',
 'tog-showhiddencats' => '顯示隱藏分類',
-'tog-noconvertlink' => '不轉換連結標題',
 'tog-norollbackdiff' => '回退後不做差異比對',
 'tog-useeditwarning' => '當離開頁面時編輯仍未儲存,請提醒我',
 'tog-prefershttps' => '登入時始終使用安全連線',
@@ -837,7 +836,7 @@ $2',
 'resetpass-temp-password' => '臨時密碼:',
 'resetpass-abort-generic' => '擴充元件已中止了更改密碼操作。',
 'resetpass-expired' => '您的密碼已過期。請設置新密碼以登錄。',
-'resetpass-expired-soft' => '您的密碼已過期,現需重置。請設置新密碼以登錄,或點擊取消以稍後重置。',
+'resetpass-expired-soft' => '您的密碼已過期,現需重置。請設置新密碼以登錄,或點擊“{{int:resetpass-submit-cancel}}”以稍後重置。',
 
 # Special:PasswordReset
 'passwordreset' => '重新設定密碼',
@@ -1657,14 +1656,26 @@ $1",
 'recentchanges-legend-heading' => "'''說明:'''",
 'recentchanges-legend-newpage' => '(另見[[Special:NewPages|新頁面列表]])',
 'recentchanges-legend-plusminus' => "(''±123'')",
-'rcnotefrom' => "下面是自'''$2'''(最多顯示'''$1'''):",
+'rcnotefrom' => '下面是自<strong>$2</strong>起之更改(至多顯示<strong>$1</strong>個)。',
 'rclistfrom' => '顯示自 $1 以來的新變更',
 'rcshowhideminor' => '$1小編輯',
+'rcshowhideminor-show' => '顯示',
+'rcshowhideminor-hide' => '隱藏',
 'rcshowhidebots' => '$1機器人的編輯',
+'rcshowhidebots-show' => '顯示',
+'rcshowhidebots-hide' => '隱藏',
 'rcshowhideliu' => '$1已註冊用戶',
+'rcshowhideliu-show' => '顯示',
+'rcshowhideliu-hide' => '隱藏',
 'rcshowhideanons' => '$1匿名用戶的編輯',
+'rcshowhideanons-show' => '顯示',
+'rcshowhideanons-hide' => '隱藏',
 'rcshowhidepatr' => '$1巡查過的編輯',
+'rcshowhidepatr-show' => '顯示',
+'rcshowhidepatr-hide' => '隱藏',
 'rcshowhidemine' => '$1我的編輯',
+'rcshowhidemine-show' => '顯示',
+'rcshowhidemine-hide' => '隱藏',
 'rclinks' => '顯示最近$2天內最新的$1次改動。<br />$3',
 'diff' => '差異',
 'hist' => '歷史',
@@ -1784,6 +1795,8 @@ $1",
 'uploaddisabledtext' => '檔案上傳不可用。',
 'php-uploaddisabledtext' => 'PHP 檔案上載已經停用。請檢查 file_uploads 設定。',
 'uploadscripted' => '該檔案包含可能被網路瀏覽器錯誤解釋的 HTML 或腳本代碼。',
+'uploadscriptednamespace' => "此SVG檔案中包含非法命名空間'$1'",
+'uploadinvalidxml' => '上載檔案中的XML無法解析。',
 'uploadvirus' => '該檔案包含有病毒!
 詳情:$1',
 'uploadjava' => '該檔案是 ZIP 檔案,其中包含 Java 的.class 檔案。
@@ -2419,7 +2432,7 @@ $UNWATCHURL
 'delete-edit-reasonlist' => '編輯刪除理由',
 'delete-toobig' => '這個頁面有一個十分大量的編輯歷史,超過$1次修訂。刪除此類頁面的動作已經被限制,以防止在{{SITENAME}}上的意外擾亂。',
 'delete-warning-toobig' => '這個頁面有一個十分大量的編輯歷史,超過$1次修訂。刪除它可能會擾亂{{SITENAME}}的資料庫操作;在繼續此動作前請小心。',
-'deleting-backlinks-warning' => "'''警告:'''您要刪除的頁面有其他頁面連接至此或從此頁面transclude。",
+'deleting-backlinks-warning' => "'''警告:'''您要刪除的頁面有[[Special:WhatLinksHere/{{FULLPAGENAME}}|其他頁面]]連接至此或包含此頁面。",
 
 # Rollback
 'rollback' => '回退編輯',
@@ -2592,8 +2605,10 @@ $1',
 'sp-contributions-blocked-notice-anon' => '這個IP地址現時正在被封鎖中。
 最近的封鎖日誌項目在下面提供以便參考:',
 'sp-contributions-search' => '搜尋貢獻記錄',
+'sp-contributions-suppresslog' => '已隱藏的用戶貢獻',
 'sp-contributions-username' => 'IP位址或用戶名稱:',
 'sp-contributions-toponly' => '只顯示最新修訂版本的編輯',
+'sp-contributions-newonly' => '僅顯示建立頁面之編輯',
 'sp-contributions-submit' => '搜尋',
 
 # What links here
@@ -4138,6 +4153,4 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 'expand_templates_generate_rawhtml' => '顯示原始HTML',
 'expand_templates_preview' => '預覽',
 
-# Unknown messages
-'uploadinvalidxml' => '上載檔案中的XML無法解析。',
 );
index de09791..dc28646 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Chinese (Hong Kong) (中文(香港)‎)
+/** Chinese (Hong Kong) (‪中文(香港)‬)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -7,16 +7,11 @@
  * @ingroup Language
  * @file
  *
- * @author Gakmo
  * @author Horacewai2
- * @author Justincheng12345
  * @author Kayau
- * @author Liflon
  * @author Mark85296341
- * @author Openerror
  * @author PhiLiP
  * @author Shizhao
- * @author Simon Shek
  * @author Waihorace
  * @author Wong128hk
  * @author Yukiseaside
@@ -34,235 +29,38 @@ $specialPageAliases = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => '連結加底線:',
-'tog-hideminor' => '近期變動中隱藏細微修改',
-'tog-hidepatrolled' => '於近期變動中隱藏巡查過的編輯',
-'tog-newpageshidepatrolled' => '於新頁面清單中隱藏巡查過的頁面',
-'tog-extendwatchlist' => '展開監視清單以顯示所有更改',
-'tog-usenewrc' => '在最近更改和監視列表中整合同一頁的修改',
-'tog-numberheadings' => '標題自動編號',
-'tog-showtoolbar' => '顯示編輯工具欄',
-'tog-editondblclick' => '雙擊編輯頁面',
-'tog-editsectiononrightclick' => '允許右擊標題編輯段落',
-'tog-rememberpassword' => '在這個瀏覽器上記住我的登入資訊(可維持 $1 {{PLURAL:$1|天|天}})',
-'tog-watchcreations' => '將我建立的頁面及檔案添加到我的監視列表中',
-'tog-watchdefault' => '將我更改的頁面及檔案添加到我的監視列表中',
-'tog-watchmoves' => '將我移動的頁面及檔案添加到我的監視列表',
-'tog-watchdeletion' => '將我刪除的頁面及檔案添加到我的監視列表',
-'tog-minordefault' => '預設將編輯設定為小編輯',
-'tog-previewontop' => '在編輯框上方顯示預覽',
-'tog-previewonfirst' => '首次編輯時顯示原文內容預覽',
-'tog-enotifwatchlistpages' => '當監視列表中的頁面或檔案改變時發電子郵件給我',
-'tog-enotifusertalkpages' => '當我的對話頁有更改時發電子郵件通知我',
-'tog-enotifminoredits' => '即使是頁面或檔案的小修改也向我發電子郵件',
-'tog-enotifrevealaddr' => '在通知電子郵件中顯示我的電子郵件位址',
-'tog-shownumberswatching' => '顯示監視用戶的數目',
-'tog-oldsig' => '原有簽名:',
-'tog-fancysig' => '將簽名以維基文字對待 (不產生自動連結)',
-'tog-uselivepreview' => '使用實時預覽(試驗中)',
-'tog-forceeditsummary' => '當沒有輸入摘要時提醒我',
-'tog-watchlisthideown' => '監視列表中隱藏我的編輯',
 'tog-watchlisthidebots' => '監視列表中隱藏機械人的編輯',
-'tog-watchlisthideminor' => '監視列表中隱藏小修改',
-'tog-watchlisthideliu' => '監視列表中隱藏登入用戶',
-'tog-watchlisthideanons' => '監視列表中隱藏匿名用戶',
-'tog-watchlisthidepatrolled' => '監視清單中隱藏已巡查的編輯',
-'tog-ccmeonemails' => '當我寄電子郵件給其他用戶時,寄一份複本到我的信箱。',
-'tog-diffonly' => '在比較兩個修訂版本差異時不顯示頁面內容',
-'tog-showhiddencats' => '顯示隱藏分類',
-'tog-norollbackdiff' => '回退後略過差異比較',
-'tog-useeditwarning' => '當離開頁面時編輯仍未儲存,請提醒我',
-'tog-prefershttps' => '登入時永遠使用安全連線',
-
-'underline-always' => '總是使用',
-'underline-never' => '從不使用',
-'underline-default' => '面板或瀏覽器預設',
-
-# Font style option in Special:Preferences
-'editfont-style' => '編輯區字型樣式:',
-'editfont-default' => '瀏覽器預設',
-'editfont-monospace' => '固定間距字型',
-'editfont-sansserif' => '無襯線字型',
-'editfont-serif' => '襯線字型',
 
 # Dates
-'sunday' => '星期日',
-'monday' => '星期一',
-'tuesday' => '星期二',
-'wednesday' => '星期三',
-'thursday' => '星期四',
-'friday' => '星期五',
-'saturday' => '星期六',
-'sun' => '日',
-'mon' => '一',
-'tue' => '二',
-'wed' => '三',
-'thu' => '四',
-'fri' => '五',
-'sat' => '六',
-'january' => '一月',
-'february' => '二月',
-'march' => '三月',
-'april' => '四月',
-'may_long' => '五月',
-'june' => '六月',
-'july' => '七月',
-'august' => '八月',
+'january'   => '一月',
+'february'  => '二月',
+'march'     => '三月',
+'april'     => '四月',
+'may_long'  => '五月',
+'june'      => '六月',
+'july'      => '七月',
+'august'    => '八月',
 'september' => '九月',
-'october' => '十月',
-'november' => '十一月',
-'december' => '十二月',
-'january-gen' => '一月',
-'february-gen' => '二月',
-'march-gen' => '三月',
-'april-gen' => '四月',
-'may-gen' => '五月',
-'june-gen' => '六月',
-'july-gen' => '七月',
-'august-gen' => '八月',
-'september-gen' => '九月',
-'october-gen' => '十月',
-'november-gen' => '十一月',
-'december-gen' => '十二月',
-'jan' => '1月',
-'feb' => '2月',
-'mar' => '3月',
-'apr' => '4月',
-'may' => '5月',
-'jun' => '6月',
-'jul' => '7月',
-'aug' => '8月',
-'sep' => '9月',
-'oct' => '10月',
-'nov' => '11月',
-'dec' => '12月',
-'january-date' => '1月$1日',
-'february-date' => '2月$1日',
-'march-date' => '三月$1日',
-'april-date' => '四月$1日',
-'may-date' => '五月$1日',
-'june-date' => '六月$1日',
-'july-date' => '七月$1日',
-'august-date' => '八月$1日',
-'september-date' => '九月$1日',
-'october-date' => '十月$1日',
-'november-date' => '十一月$1日',
-'december-date' => '十二月$1日',
-
-# Categories related messages
-'pagecategories' => '$1個分類',
-'category_header' => '分類中的頁面「$1」',
-'subcategories' => '子分類',
-'category-media-header' => '「$1」分類中的媒體',
-'category-empty' => "''這個分類中尚未包含任何頁面或媒體。''",
-'hidden-categories' => '$1個隱藏分類',
-'hidden-category-category' => '隱藏分類',
-'category-subcat-count' => '{{PLURAL:$2|這個分類中只有以下的子分類。|這個分類中有以下的$1個子分類,共有$2個子分類。}}',
-'category-subcat-count-limited' => '這個分類下有$1個子分類。',
-'category-article-count' => '{{PLURAL:$2|這個分類中只有以下的頁面。|這個分類中有以下的$1個頁面,共有$2個頁面。}}',
-'category-article-count-limited' => '這個分類下有$1個頁面。',
-'category-file-count' => '{{PLURAL:$2|這個分類中只有以下的檔案。|這個分類中有以下的$1個檔案,共有$2個檔案。}}',
-'category-file-count-limited' => '這個分類下有$1個檔案。',
-'listingcontinuesabbrev' => '續',
-'index-category' => '已索引的頁面',
-'noindex-category' => '未索引的頁面',
-'broken-file-category' => '包含損壞檔案連結的頁面',
+'october'   => '十月',
+'november'  => '十一月',
+'december'  => '十二月',
 
-'about' => '關於',
-'article' => '內容頁面',
-'newwindow' => '(於新視窗開啟)',
-'cancel' => '取消',
-'moredotdotdot' => '更多...',
-'morenotlisted' => '這不是完整的列表。',
-'mytalk' => '討論頁',
-'anontalk' => '此IP位址的討論頁',
-'navigation' => '導航',
-'and' => '和',
+'mytalk' => '我的討論頁',
 
-# Cologne Blue skin
-'qbfind' => '搜尋',
-'qbbrowse' => '瀏覽',
-'qbedit' => '編輯',
-'qbpageoptions' => '本頁',
-'qbmyoptions' => '我的用戶頁面',
-'faq' => '常見問題',
-'faqpage' => 'Project:常見問題',
-
-# Vector skin
-'vector-action-addsection' => '新增主題',
-'vector-action-delete' => '刪除',
-'vector-action-undelete' => '恢復',
-'vector-action-unprotect' => '修改保護狀態',
-'vector-view-history' => '歷史',
-'vector-view-view' => '閱覽',
-'vector-view-viewsource' => '查看原始碼',
-'variants' => '變體',
-
-'navigation-heading' => '導航菜單',
-'returnto' => '回到$1。',
-'tagline' => '從 {{SITENAME}}',
-'help' => '幫助',
-'search' => '搜尋',
-'searcharticle' => '提交',
-'updatedmarker' => '自從我上次查看後已更新',
+'tagline'          => '從 {{SITENAME}}',
+'search'           => '搜尋',
 'printableversion' => '可打印版',
-'permalink' => '永久連接',
-'print' => '打印',
-'undeletethispage' => '恢復本頁',
-'undelete_short' => '恢復{{PLURAL:$1|1次編輯|$1次編輯}}',
-'viewdeleted_short' => '查看{{PLURAL:$1|1次已刪的編輯|$1次已刪的編輯}}',
-'protect_change' => '修改',
-'unprotect' => '修改保護狀態',
-'unprotectthispage' => '修改本頁的保護狀態',
-'talkpage' => '對本頁進行討論',
-'talkpagelinktext' => '討論頁',
-'specialpage' => '特殊頁面',
-'postcomment' => '新章節',
-'articlepage' => '查看內容頁面',
-'views' => '外觀',
-'userpage' => '查看用戶頁',
-'projectpage' => '查看計劃頁面',
-'imagepage' => '查看檔案頁面',
-'mediawikipage' => '查看訊息頁面',
-'templatepage' => '查看模板頁',
-'viewhelppage' => '查看幫助頁面',
-'categorypage' => '查看分類頁面',
-'viewtalkpage' => '查看討論頁',
-'redirectpagesub' => '重定向頁',
-'lastmodifiedat' => '本頁最後更改於$1$2。',
-'viewcount' => '本頁的瀏覽次數為{{PLURAL:$1|1次|$1次}}。',
-'protectedpage' => '受保護的頁面',
-'jumpto' => '跳到:',
-'jumptonavigation' => '導航',
-'jumptosearch' => '搜尋',
-'view-pool-error' => '抱歉,伺服器現時超出負荷。
-有太多用戶想要查看本頁。
-請先稍候片刻才再嘗試查看本頁。
-
-$1',
-'pool-timeout' => '等待鎖時超出了時限',
-
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
-'aboutsite' => '關於{{SITENAME}}',
-'aboutpage' => 'Project:關於我們',
-'copyright' => '除非另外註明,否則內容以$1提供。',
-'copyrightpage' => '{{ns:project}}:版權',
-'edithelp' => '編輯方面的幫助',
-'mainpage' => '主頁',
-'mainpage-description' => '主頁',
-'portal' => '社群區入口',
-'portal-url' => 'Project:社群入口',
-'privacy' => '私隱政策',
+'permalink'        => '永久連接',
+'print'            => '打印',
+'specialpage'      => '特殊頁面',
+'jumpto'           => '跳到:',
+'jumptosearch'     => '搜尋',
+
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+'aboutpage'   => 'Project:關於我們',
+'privacy'     => '私隱政策',
 'privacypage' => 'Project:私隱政策',
 
-'badaccess-group0' => '您無權執行您所提出的行動。',
-'badaccess-groups' => '您所提出的行動只有{{PLURAL:$2|此群組|以下群組之一}}才可執行:$1。',
-
-'versionrequired' => '需要$1版本的MediaWiki',
-'versionrequiredtext' => '要使用本頁的話需要$1版本的MediaWiki。
-請見[[Special:版本|版本頁面]]。',
-
-'retrievedfrom' => '擷取自$1',
 'red-link-title' => '$1 (頁面不存在)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
@@ -270,14 +68,14 @@ $1',
 
 # Login and logout pages
 'nav-login-createaccount' => '登入/創造帳戶',
-'userlogin' => '登入/創造帳戶',
+'userlogin'               => '登入/創造帳戶',
 
 # Edit pages
-'editing' => '正在編輯「$1」',
+'editing' => '正在編輯 $1',
 
 # Revision deletion
-'rev-deleted-comment' => '(註釋已除)',
-'rev-deleted-event' => '(日誌已除)',
+'rev-deleted-comment'     => '(註釋已除)',
+'rev-deleted-event'       => '(日誌已除)',
 'revdelete-suppress-text' => "壓制'''只'''應用於以下的情況:
 * 不合適的個人資料
 *: ''地址、電話號碼、身份證號碼等。''",
@@ -285,6 +83,9 @@ $1',
 # Diffs
 'editundo' => '撤銷',
 
+# Search results
+'search-mwsuggest-disabled' => '沒有意見',
+
 # Preferences page
 'prefs-help-gender' => '可選:用於軟件中的性別指定。此項資料將會被公開。',
 
@@ -297,7 +98,7 @@ $1',
 
 # Recent changes
 'recentchanges-label-bot' => '這次編輯是由機械人進行',
-'rcshowhidebots' => '$1機械人的編輯',
+'rcshowhidebots'          => '$1機械人的編輯',
 
 # Special:ActiveUsers
 'activeusers-hidebots' => '隱藏機械人',
@@ -306,24 +107,17 @@ $1',
 'contribslink' => '貢獻',
 
 # Tooltip help for the actions
-'tooltip-search' => '搜尋 {{SITENAME}}',
-'tooltip-search-go' => '若是真有其頁,則進入相同名字的頁面',
-'tooltip-search-fulltext' => '在此頁面內搜尋此文字',
-'tooltip-n-mainpage' => '回到首頁',
+'tooltip-search'                 => '搜尋 {{SITENAME}}',
+'tooltip-search-go'              => '若是真有其頁,則進入相同名字的頁面',
+'tooltip-search-fulltext'        => '在此頁面內搜尋此文字',
+'tooltip-n-mainpage'             => '回到首頁',
 'tooltip-n-mainpage-description' => '回到首頁',
-'tooltip-n-randompage' => '跳到一個隨機抽取的頁面',
-'tooltip-t-print' => '這個頁面的可打印版本',
-'interlanguage-link-title' => '$1 – $2',
+'tooltip-n-randompage'           => '跳到一個隨機抽取的頁面',
+'tooltip-t-print'                => '這個頁面的可打印版本',
 
 # Special:NewFiles
 'showhidebots' => '($1機械人)',
 
-/*
-Short names for language variants used for language conversion links.
-Variants for Chinese language
-*/
-'variantname-zh-hant' => '‪繁體中文',
-
 # Special:SpecialPages
 'specialpages' => '特殊頁面',
 
index fc87626..37be152 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** 中文(澳門)‎ (中文(澳門)‎)
+/** ‪Chinese (Macau) (‪中文(澳門)‬)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -11,9 +11,3 @@
 
 # Inherit everything for now
 $fallback = 'zh-hk, zh-hant, zh-hans';
-
-$messages = array(
-# Tooltip help for the actions
-'interlanguage-link-title' => '$1 – $2',
-
-);
index f4aa157..ccf8371 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Chinese (Singapore) (中文(新加坡)‎)
+/** Chinese (Singapore) (‪中文(新加坡)‬)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -7,11 +7,9 @@
  * @ingroup Language
  * @file
  *
- * @author Liuxinyu970226
  * @author PhiLiP
  * @author Shizhao
  * @author Wong128hk
- * @author Xiaomingyan
  */
 
 # Inherit everything for now
@@ -21,15 +19,10 @@ $messages = array(
 # User preference toggles
 'tog-norollbackdiff' => '进行回退后略过差异比较',
 
-'talkpagelinktext' => '讨论页',
-
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'portal' => '社区入口',
 
 # Edit pages
-'editing' => '编辑“$1”',
-
-# Tooltip help for the actions
-'interlanguage-link-title' => '$1 – $2',
+'editing' => '正在编辑 $1',
 
 );
index 3c21302..d28642e 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Chinese (Taiwan) (中文(台灣)‎)
+/** Chinese (Taiwan) (‪中文(台灣)‬)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -10,7 +10,6 @@
  * @author Alexsh
  * @author Andrew971218
  * @author BobChao
- * @author Danny0838
  * @author Ianbu
  * @author Jidanni
  * @author Mark85296341
  * @author PhiLiP
  * @author Roc michael
  * @author Shizhao
- * @author Simon Shek
  * @author Urhixidur
- * @author Waihorace
  * @author Wong128hk
- * @author Xiaomingyan
  * @author Zerng07
  * @author לערי ריינהארט
  */
@@ -107,65 +103,66 @@ $dateFormats = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => '連結標注底線',
-'tog-hideminor' => '近期變動中隱藏小修改',
-'tog-usenewrc' => '使用強化的近期變動 (需要JavaScript)',
-'tog-numberheadings' => '自動編號標題',
-'tog-showtoolbar' => '顯示編輯工具欄 (需要JavaScript)',
-'tog-watchcreations' => '將我建立的頁面加進我的監視列表',
-'tog-watchdefault' => '將我更改的頁面添加到我的監視列表中',
-'tog-minordefault' => '預設將編輯設定為細微修改',
+'tog-underline'            => '連結標注底線',
+'tog-justify'              => '段落對齊',
+'tog-hideminor'            => '近期變動中隱藏細微修改',
+'tog-usenewrc'             => '使用強化的近期變動 (需要JavaScript)',
+'tog-numberheadings'       => '自動編號標題',
+'tog-showtoolbar'          => '顯示編輯工具欄 (需要JavaScript)',
+'tog-watchcreations'       => '將我建立的頁面加進我的監視列表',
+'tog-watchdefault'         => '將我更改的頁面添加到我的監視列表中',
+'tog-minordefault'         => '預設將編輯設定為細微修改',
 'tog-enotifwatchlistpages' => '當我監視的頁面改變時發電子郵件給我',
-'tog-enotifusertalkpages' => '當我的對話頁有更動時發電子郵件通知我',
-'tog-shownumberswatching' => '顯示監視數目',
-'tog-uselivepreview' => '使用即時預覽 (JavaScript) (試驗中)',
-'tog-watchlisthideminor' => '監視列表中隱藏細微修改',
-'tog-ccmeonemails' => '當我寄電子郵件給其他使用者時,也寄一份複本到我的信箱。',
+'tog-enotifusertalkpages'  => '當我的對話頁有更動時發電子郵件通知我',
+'tog-shownumberswatching'  => '顯示監視數目',
+'tog-uselivepreview'       => '使用即時預覽 (JavaScript) (試驗中)',
+'tog-watchlisthideminor'   => '監視列表中隱藏細微修改',
+'tog-ccmeonemails'         => '當我寄電子郵件給其他使用者時,也寄一份複本到我的信箱。',
 
 # Dates
-'saturday' => '星期六',
-'sun' => '日',
-'mon' => '一',
-'tue' => '二',
-'wed' => '三',
-'thu' => '四',
-'fri' => '五',
-'january' => '一月',
-'february' => '二月',
-'march' => '三月',
-'april' => '四月',
-'may_long' => '五月',
-'june' => '六月',
-'july' => '七月',
-'august' => '八月',
-'september' => '九月',
-'october' => '十月',
-'november' => '十一月',
-'december' => '十二月',
-'january-gen' => '一月',
-'february-gen' => '二月',
-'march-gen' => '三月',
-'april-gen' => '四月',
-'may-gen' => '五月',
-'june-gen' => '六月',
-'july-gen' => '七月',
-'august-gen' => '八月',
+'saturday'      => '星期六',
+'sun'           => '日',
+'mon'           => '一',
+'tue'           => '二',
+'wed'           => '三',
+'thu'           => '四',
+'fri'           => '五',
+'january'       => '一月',
+'february'      => '二月',
+'march'         => '三月',
+'april'         => '四月',
+'may_long'      => '五月',
+'june'          => '六月',
+'july'          => '七月',
+'august'        => '八月',
+'september'     => '九月',
+'october'       => '十月',
+'november'      => '十一月',
+'december'      => '十二月',
+'january-gen'   => '一月',
+'february-gen'  => '二月',
+'march-gen'     => '三月',
+'april-gen'     => '四月',
+'may-gen'       => '五月',
+'june-gen'      => '六月',
+'july-gen'      => '七月',
+'august-gen'    => '八月',
 'september-gen' => '九月',
-'october-gen' => '十月',
-'november-gen' => '十一月',
-'december-gen' => '十二月',
-'jan' => '1月',
-'feb' => '2月',
-'mar' => '3月',
-'apr' => '4月',
-'may' => '5月',
-'jun' => '6月',
-'jul' => '7月',
-'aug' => '8月',
-'sep' => '9月',
-'oct' => '10月',
-'nov' => '11月',
-'dec' => '12月',
+'october-gen'   => '十月',
+'november-gen'  => '十一月',
+'december-gen'  => '十二月',
+'jan'           => '1月',
+'feb'           => '2月',
+'mar'           => '3月',
+'apr'           => '4月',
+'may'           => '5月',
+'jun'           => '6月',
+'jul'           => '7月',
+'aug'           => '8月',
+'sep'           => '9月',
+'oct'           => '10月',
+'nov'           => '11月',
+'dec'           => '12月',
 
 # Categories related messages
 'subcategories' => '子分類',
@@ -175,54 +172,54 @@ $messages = array(
 
 # Vector skin
 'vector-action-protect' => '保護',
-'vector-view-create' => '建立',
-'vector-view-view' => '閱讀',
-
-'help' => '使用說明',
-'search' => '搜尋',
-'searchbutton' => '搜尋',
-'history' => '修訂記錄',
-'history_short' => '歷史',
-'edit' => '編輯',
-'create' => '建立',
-'delete' => '刪除',
+'vector-view-create'    => '建立',
+'vector-view-view'      => '閱讀',
+
+'help'           => '使用說明',
+'search'         => '搜尋',
+'searchbutton'   => '搜尋',
+'history'        => '修訂記錄',
+'history_short'  => '歷史',
+'edit'           => '編輯',
+'create'         => '建立',
+'delete'         => '刪除',
 'protect_change' => '更改',
-'postcomment' => '新段落',
-'toolbox' => '工具箱',
-'userpage' => '檢視使用者頁面',
-'projectpage' => '檢視計畫頁面',
+'postcomment'    => '新段落',
+'toolbox'        => '工具箱',
+'userpage'       => '檢視使用者頁面',
+'projectpage'    => '檢視計畫頁面',
 'lastmodifiedat' => '本頁最後更動時間在 $1 $2。',
-'jumptosearch' => '搜尋',
+'jumptosearch'   => '搜尋',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
-'aboutsite' => '關於 {{SITENAME}}',
-'copyright' => '本站的文字內容除另有聲明外,全部以 $1 條款授權使用。',
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+'aboutsite'   => '關於 {{SITENAME}}',
+'copyright'   => '本站的文字內容除另有聲明外,全部以 $1 條款授權使用。',
 'disclaimers' => '免責聲明',
-'edithelp' => '編輯說明',
-'mainpage' => '首頁',
-'portal' => '社群入口',
-'portal-url' => 'Project:社群入口',
+'edithelp'    => '編輯說明',
+'mainpage'    => '首頁',
+'portal'      => '社群入口',
+'portal-url'  => 'Project:社群入口',
 
 'badaccess-groups' => '您剛才的請求只有{{PLURAL:$2|這個|這些}}使用者組的使用者才能使用: $1',
 
-'editold' => '編輯',
-'editsectionhint' => '編輯章ç¯\80:$1',
-'showtoc' => '顯示',
-'hidetoc' => '隱藏',
-'thisisdeleted' => '檢視或復原$1?',
-'site-rss-feed' => '訂閱 $1 的 RSS 資料來源',
-'site-atom-feed' => '訂閱 $1 的 Atom 資料來源',
-'page-rss-feed' => '訂閱「$1」的 RSS 資料來源',
-'page-atom-feed' => '訂閱「$1」的 Atom 資料來源',
-'red-link-title' => '$1 (頁面不存在)',
+'editold'         => '編輯',
+'editsectionhint' => 'ç¼\96è¾\91段è\90½:$1',
+'showtoc'         => '顯示',
+'hidetoc'         => '隱藏',
+'thisisdeleted'   => '檢視或復原$1?',
+'site-rss-feed'   => '訂閱 $1 的 RSS 資料來源',
+'site-atom-feed'  => '訂閱 $1 的 Atom 資料來源',
+'page-rss-feed'   => '訂閱「$1」的 RSS 資料來源',
+'page-atom-feed'  => '訂閱「$1」的 Atom 資料來源',
+'red-link-title'  => '$1 (頁面不存在)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => '頁面',
-'nstab-user' => '使用者頁面',
-'nstab-special' => '特殊頁面',
-'nstab-project' => '計畫頁面',
+'nstab-main'      => '頁面',
+'nstab-user'      => '使用者頁面',
+'nstab-special'   => '特殊頁面',
+'nstab-project'   => '計畫頁面',
 'nstab-mediawiki' => '介面',
-'nstab-help' => '說明頁面',
+'nstab-help'      => '說明頁面',
 
 # Main script and global functions
 'nosuchactiontext' => '該URL所指定的動作無效。
@@ -230,75 +227,79 @@ $messages = array(
 這也可能是{{SITENAME}}所使用的軟件出現了錯誤。',
 
 # General errors
-'readonlytext' => '資料庫目前禁止輸入新內容及更改,
+'readonlytext'        => '資料庫目前禁止輸入新內容及更改,
 這很可能是由於資料庫正在維修,之後即可復原。
 管理員有如下解釋:
 <p>$1</p>',
-'cannotdelete' => '無法刪除選定的頁面或圖片(它可能已經被其他人刪除了)。',
+'cannotdelete'        => '無法刪除選定的頁面或圖片(它可能已經被其他人刪除了)。',
 'actionthrottledtext' => '系統因為反垃圾編輯的考量,禁止如此頻繁地修改資料,請數分鐘後再嘗試。',
-'viewsourcetext' => '你可以檢視並複製本頁面的原始碼。',
-'editinginterface' => "'''警告:''' 您正在編輯的頁面是正用在軟體上的介面文字。改變此頁將影響其他用戶的介面外觀。如要翻譯,請考慮使用 [//translatewiki.net/wiki/Main_Page?setlang=zh-hant translatewiki.net],一個用來為MediaWiki軟體本地化的計畫。",
+'viewsourcetext'      => '你可以檢視並複製本頁面的原始碼。',
+'editinginterface'    => "'''警告:''' 您正在編輯的頁面是正用在軟體上的介面文字。改變此頁將影響其他用戶的介面外觀。如要翻譯,請考慮使用 [//translatewiki.net/wiki/Main_Page?setlang=zh-hant translatewiki.net],一個用來為MediaWiki軟體本地化的計畫。",
 'ns-specialprotected' => '在{{ns:special}}名字空間中的頁面是不可以編輯的。',
 
 # Login and logout pages
-'logouttext' => "您現在已經登出。
-
-您可以以匿名方式繼續使用{{SITENAME}},或者以相同或不同用戶身份<span class='plainlinks'>[$1 登入]</span>。
-請注意,如果你再次登入,此頁或會繼續顯示,直到您清除瀏覽器快取。",
-'yourname' => '您的使用者名稱:',
-'yourpassword' => '密碼:',
-'login' => '登入',
-'nav-login-createaccount' => '登入/建立新帳號',
-'userlogin' => '登入/建立新帳號',
-'logout' => '登出',
-'userlogout' => '登出',
-'nologin' => '您還沒有帳號嗎?$1。',
-'nologinlink' => '建立新帳號',
-'createaccount' => '建立新帳號',
-'gotaccount' => '已經擁有帳號?$1。',
-'badretype' => '你所輸入的密碼並不相同。',
-'userexists' => '您所輸入的使用者名稱已經存在,請另選一個名稱。',
-'nocookiesnew' => '已成功建立新帳號!偵測到您已關閉 Cookies,請開啟它並登入。',
-'nocookieslogin' => '本站利用 Cookies 進行使用者登入,偵測到您已關閉 Cookies,請開啟它並重新登入。',
-'noname' => '你沒有輸入一個有效的使用者帳號。',
-'loginsuccess' => '你現在以 "$1"的身份登入{{SITENAME}}。',
-'nosuchuser' => '找不到使用者 "$1"。
+'logouttext'                 => '您現在已經登出。
+
+您可以以匿名方式繼續使用{{SITENAME}},或者以相同或不同用戶身份[[Special:UserLogin|登入]]。
+請注意,如果你再次登入,此頁或會繼續顯示,直到您清除瀏覽器快取。',
+'welcomecreation'            => '== 歡迎,$1! ==
+您的帳號已經建立。
+請不要忘記設定[[Special:Preferences|{{SITENAME}}的個人參數]]。',
+'yourname'                   => '您的使用者名:',
+'yourpassword'               => '密碼:',
+'login'                      => '登入',
+'nav-login-createaccount'    => '登入/建立新帳號',
+'userlogin'                  => '登入/建立新帳號',
+'logout'                     => '登出',
+'userlogout'                 => '登出',
+'nologin'                    => '您還沒有帳號嗎?$1。',
+'nologinlink'                => '建立新帳號',
+'createaccount'              => '建立新帳號',
+'gotaccount'                 => '已經擁有帳號?$1。',
+'badretype'                  => '你所輸入的密碼並不相同。',
+'userexists'                 => '您所輸入的使用者名稱已經存在,請另選一個名稱。',
+'nocookiesnew'               => '已成功建立新帳號!偵測到您已關閉 Cookies,請開啟它並登入。',
+'nocookieslogin'             => '本站利用 Cookies 進行使用者登入,偵測到您已關閉 Cookies,請開啟它並重新登入。',
+'noname'                     => '你沒有輸入一個有效的使用者帳號。',
+'loginsuccess'               => '你現在以 "$1"的身份登入{{SITENAME}}。',
+'nosuchuser'                 => '找不到使用者 "$1"。
 檢查您的拼寫,或者用下面的表格[[Special:UserLogin/signup|建立一個新帳號]]。',
-'nosuchusershort' => '沒有一個名為「$1」的使用者。請檢查您輸入的文字是否有錯誤。',
-'nouserspecified' => '你需要指定一個使用者帳號。',
-'passwordtooshort' => '您的密碼不正確或太短,不能少於$1個字元,而且必須跟使用者名不同。',
-'passwordremindertitle' => '{{SITENAME}}密碼提醒',
-'passwordremindertext' => '有人(來自IP位址$1,可能是您)已請求{{SITENAME}}的新密碼 ($4)。
+'nosuchusershort'            => '沒有一個名為「$1」的使用者。請檢查您輸入的文字是否有錯誤。',
+'nouserspecified'            => '你需要指定一個使用者帳號。',
+'passwordtooshort'           => '您的密碼不正確或太短,不能少於$1個字元,而且必須跟使用者名不同。',
+'passwordremindertitle'      => '{{SITENAME}}密碼提醒',
+'passwordremindertext'       => '有人(來自IP位址$1,可能是您)已請求{{SITENAME}}的新密碼 ($4)。
 用戶"$2"現在已設定新臨時密碼"$3"。
 如果這個動作是您所指示的,您需要立即登入並選擇一個新的密碼。
 您的臨時密碼會在{{PLURAL:$5|一|$5}}天內過期。
 
 如果是其他人發出了該請求,或者您已經想起了您的密碼而且並不打算換掉,
 您可以忽略此消息並繼續使用您的舊密碼。',
-'noemail' => '使用者"$1"沒有登記電子郵件地址。',
-'passwordsent' => '使用者"$1"的新密碼已經寄往所登記的電子郵件地址。
+'noemail'                    => '使用者"$1"沒有登記電子郵件地址。',
+'passwordsent'               => '使用者"$1"的新密碼已經寄往所登記的電子郵件地址。
 請在收到後再登入。',
-'blocked-mailpassword' => '由於這個使用者被封鎖,我們暫時禁止您請求申請新密碼。造成不便敬請見諒',
-'eauthentsent' => '一封確認信已經發送到所示的地址。在發送其它郵件到此帳號前,您必須首先依照這封信中的指導確認這個電子郵件信箱真實有效。',
+'blocked-mailpassword'       => '由於這個使用者被封鎖,我們暫時禁止您請求申請新密碼。造成不便敬請見諒',
+'eauthentsent'               => '一封確認信已經發送到所示的地址。在發送其它郵件到此帳號前,您必須首先依照這封信中的指導確認這個電子郵件信箱真實有效。',
 'acct_creation_throttle_hit' => '抱歉,使用您的IP位址拜訪此wiki網站的訪客已經在昨天創建了$1個帳號,達到了該時段的上限,所以目前使用這個IP位址的訪客不能再繼續創建帳號。',
-'emailauthenticated' => '您的電子郵件地址已經於$2 $3確認有效。',
-'emailnotauthenticated' => '您的電子郵件地址<strong>還沒被認證</strong>。以下功能將不會發送任何郵件。',
-'noemailprefs' => '指定一個電子郵件地址以使用此功能',
-'emailconfirmlink' => '確認您的電子郵件地址',
-'invalidemailaddress' => '電子郵件地址格式不正確,請輸入正確的電子郵件位址或清空該輸入框。',
-'accountcreated' => '已建立帳號',
-'accountcreatedtext' => '$1的帳號已經被建立。',
-'createaccount-title' => '在{{SITENAME}}中建立新帳號',
-'createaccount-text' => '有人在{{SITENAME}}中為 $2 建立了一個新帳號($4)。 "$2" 的密碼是 "$3" 。您應該立即登入並更改密碼。
+'emailauthenticated'         => '您的電子郵件地址已經於$2 $3確認有效。',
+'emailnotauthenticated'      => '您的電子郵件地址<strong>還沒被認證</strong>。以下功能將不會發送任何郵件。',
+'noemailprefs'               => '指定一個電子郵件地址以使用此功能',
+'emailconfirmlink'           => '確認您的電子郵件地址',
+'invalidemailaddress'        => '電子郵件地址格式不正確,請輸入正確的電子郵件位址或清空該輸入框。',
+'accountcreated'             => '已建立帳號',
+'accountcreatedtext'         => '$1的帳號已經被建立。',
+'createaccount-title'        => '在{{SITENAME}}中建立新帳號',
+'createaccount-text'         => '有人在{{SITENAME}}中為 $2 建立了一個新帳號($4)。 "$2" 的密碼是 "$3" 。您應該立即登入並更改密碼。
 
 如果該帳號建立錯誤的話,您可以忽略此訊息。',
 
 # Change password dialog
-'resetpass_announce' => '您是透過臨時發送到郵件中的代碼登入的。要完成登入,您必須在這裡設定一個新密碼:',
-'resetpass_header' => '更換帳號密碼',
-'oldpassword' => '舊密碼',
-'newpassword' => '新密碼',
-'changepassword-success' => '您的密碼已經被成功更改﹗現下正為您登入...',
+'resetpass'           => '更換密碼',
+'resetpass_announce'  => '您是透過臨時發送到郵件中的代碼登入的。要完成登入,您必須在這裡設定一個新密碼:',
+'resetpass_header'    => '更換帳號密碼',
+'oldpassword'         => '舊密碼',
+'newpassword'         => '新密碼',
+'resetpass_success'   => '您的密碼已經被成功更改﹗現下正為您登入...',
 'resetpass_forbidden' => '無法更改密碼',
 
 # Edit page toolbar
@@ -306,49 +307,49 @@ $messages = array(
 'media_tip' => '媒體檔案連結',
 
 # Edit pages
-'summary' => '摘要',
-'minoredit' => '這是一個細微修改',
-'savearticle' => '儲存頁面',
-'blockedtitle' => '使用者被封鎖',
-'confirmedittext' => '在編輯此頁之前您必須確認您的電子郵件地址。請透過[[Special:Preferences|偏好設定]]設定並驗證您的電子郵件地址。',
-'accmailtext' => "'[[User talk:$1|$1]]'的隨機產生密碼已經寄到$2。
+'summary'                    => '摘要',
+'minoredit'                  => '這是一個細微修改',
+'savearticle'                => '儲存頁面',
+'blockedtitle'               => '使用者被封鎖',
+'confirmedittext'            => '在編輯此頁之前您必須確認您的電子郵件地址。請透過[[Special:Preferences|偏好設定]]設定並驗證您的電子郵件地址。',
+'accmailtext'                => "'[[User talk:$1|$1]]'的隨機產生密碼已經寄到$2。
 
 這個新帳號的密碼可以在登入後的''[[Special:ChangePassword|更改密碼]]''頁面中更改。",
-'newarticletext' => '您進入了一個尚未建立的頁面。
+'newarticletext'             => '您進入了一個尚未建立的頁面。
 要建立該頁面,請在下面的編輯框中輸入內容(詳情參見[[{{MediaWiki:Helppage}}|說明]])。
 如果您是不小心來到此頁面,直接點擊您瀏覽器中的「返回」按鈕返回。',
-'anontalkpagetext' => "---- ''這是一個還未建立帳號的匿名使用者的對話頁。我們因此只能用IP地址來與他/她聯絡。該IP地址可能由幾名使用者共享。如果您是一名匿名使用者並認為本頁上的評語與您無關,請[[Special:UserLogin|建立新帳號或登入]]以避免在未來於其他匿名使用者混淆。''",
-'noarticletext' => '此頁目前沒有內容,您可以在其它頁[[Special:Search/{{PAGENAME}}|搜索此頁標題]],
+'anontalkpagetext'           => "---- ''這是一個還未建立帳號的匿名使用者的對話頁。我們因此只能用IP地址來與他/她聯絡。該IP地址可能由幾名使用者共享。如果您是一名匿名使用者並認為本頁上的評語與您無關,請[[Special:UserLogin|建立新帳號或登入]]以避免在未來於其他匿名使用者混淆。''",
+'noarticletext'              => '此頁目前沒有內容,您可以在其它頁[[Special:Search/{{PAGENAME}}|搜索此頁標題]],
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜索有關日誌],
 或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 編輯此頁]</span>。',
-'userpage-userdoesnotexist' => '使用者帳號「<nowiki>$1</nowiki>」未曾建立。請在建立/編輯這個頁面前先檢查一下。',
-'clearyourcache' => "'''注意:''' 在儲存以後, 您必須清除瀏覽器的快取才能看到所作出的改變。 '''Mozilla / Firefox / Safari:''' 按著 ''Shift'' 再點擊''重新整理''(或按下''Ctrl-Shift-R'',在蘋果Mac上按下''Cmd-Shift-R'');'''IE:''' 按著 ''Ctrl'' 再點擊 ''重新整理'',或按下 ''Ctrl-F5'';'''Konqueror:''' 只需點擊 ''重新整理'';'''Opera:''' 使用者需要在 ''工具-設定'' 中完整地清除它們的快取。",
-'usercsspreview' => "'''注意您只是在預覽您的個人 CSS, 還沒有儲存﹗'''",
-'userjspreview' => "'''注意您只是在測試/預覽您的個人 JavaScript,還沒有儲存﹗'''",
-'previewnote' => "'''請記住這只是預覽,內容尚未儲存!'''",
-'session_fail_preview' => "'''很抱歉!由於部份資料遺失,我們無法處理您的編輯。'''
+'userpage-userdoesnotexist'  => '使用者帳號「<nowiki>$1</nowiki>」未曾建立。請在建立/編輯這個頁面前先檢查一下。',
+'usercsspreview'             => "'''注意您只是在預覽您的個人 CSS, 還沒有儲存﹗'''",
+'userjspreview'              => "'''注意您只是在測試/預覽您的個人 JavaScript,還沒有儲存﹗'''",
+'previewnote'                => "'''請記住這只是預覽,內容尚未儲存!'''",
+'session_fail_preview'       => "'''很抱歉!由於部份資料遺失,我們無法處理您的編輯。'''
 請再試一次。
 如果仍然失敗,請[[Special:UserLogout|登出]]後重新登入。",
-'session_fail_preview_html' => "'''很抱歉!部份資料已遺失,我們無法處理您的編輯。''''''如果這個編輯過程沒有問題,請再試一次。如果仍然有問題,請登出後再重新登入一次。'''",
-'token_suffix_mismatch' => "'''由於您使用者端中的編輯信符毀損了一些標點符號字元,為防止編輯的文字損壞,您的編輯已經被拒絕。
+'session_fail_preview_html'  => "'''很抱歉!部份資料已遺失,我們無法處理您的編輯。''''''如果這個編輯過程沒有問題,請再試一次。如果仍然有問題,請登出後再重新登入一次。'''",
+'token_suffix_mismatch'      => "'''由於您使用者端中的編輯信符毀損了一些標點符號字元,為防止編輯的文字損壞,您的編輯已經被拒絕。
 這種情況通常出現於使用含有很多臭蟲、以網路為主的匿名代理服務的時候。'''",
-'editing' => '編輯「$1」',
-'editingcomment' => '正在編輯$1(新段落)',
-'storedversion' => '已保存版本',
-'nonunicodebrowser' => "'''警告: 您的瀏覽器不相容Unicode編碼。這裡有一個工作區將使您能安全地編輯頁面: 非ASCII字元將以十六進製編碼模式出現在編輯框中。'''",
-'editingold' => "'''警告:你正在編輯的是本頁的舊版本。
+'editing'                    => '正在编辑 $1',
+'editingcomment'             => '正在編輯$1(新段落)',
+'storedversion'              => '已保存版本',
+'nonunicodebrowser'          => "'''警告: 您的瀏覽器不相容Unicode編碼。這裡有一個工作區將使您能安全地編輯頁面: 非ASCII字元將以十六進製編碼模式出現在編輯框中。'''",
+'editingold'                 => "'''警告:你正在編輯的是本頁的舊版本。
 如果你保存它的話,在本版本之後的任何修改都會遺失。'''",
-'longpageerror' => "'''錯誤: 您所提交的文字長度有$1KB,這大於$2KB的最大值。該文字不能被儲存。'''",
-'protectedpagewarning' => "'''警告: 本頁已經被保護,只有擁有管理員許可權的使用者才可修改。'''",
-'semiprotectedpagewarning' => "'''注意:''' 本頁面被鎖定,僅限註冊使用者編輯。",
-'cascadeprotectedwarning' => '警告: 本頁已經被保護,只有擁有管理員權限的使用者才可修改,因為本頁已被以下連鎖保護的{{PLURAL:$1|一個|多個}}頁面所包含:',
-'nocreatetext' => '此網站限制了建立新頁面的功能。你可以返回並編輯已有的頁面,或者[[Special:UserLogin|登錄或建立新帳號]]。',
-'nocreate-loggedin' => '您在這個wiki中並無許可權去建立新頁面。',
+'longpageerror'              => "'''錯誤: 您所提交的文字長度有$1KB,這大於$2KB的最大值。該文字不能被儲存。'''",
+'protectedpagewarning'       => "'''警告: 本頁已經被保護,只有擁有管理員許可權的使用者才可修改。'''",
+'semiprotectedpagewarning'   => "'''注意:''' 本頁面被鎖定,僅限註冊使用者編輯。",
+'cascadeprotectedwarning'    => '警告: 本頁已經被保護,只有擁有管理員權限的使用者才可修改,因為本頁已被以下連鎖保護的{{PLURAL:$1|一個|多個}}頁面所包含:',
+'nocreatetitle'              => '建立頁面受限',
+'nocreatetext'               => '此網站限制了建立新頁面的功能。你可以返回並編輯已有的頁面,或者[[Special:UserLogin|登錄或建立新帳號]]。',
+'nocreate-loggedin'          => '您在這個wiki中並無許可權去建立新頁面。',
 'recreate-moveddeleted-warn' => "'''警告: 你現在重新建立一個先前曾經刪除過的頁面。'''
 
 你應該要考慮一下繼續編輯這一個頁面是否合適。
 為方便起見,這一個頁面的刪除記錄已經在下面提供:",
-'edit-hook-aborted' => '編輯被鉤取消。
+'edit-hook-aborted'          => '編輯被鉤取消。
 它並無給出解釋。',
 
 # Parser/template warnings
@@ -365,86 +366,93 @@ $messages = array(
 說明:(目前) 指與目前版本比較,(先前) 指與前一個修訂版本比較,小 = 細微修改。',
 
 # Revision feed
-'history-feed-title' => '修訂沿革',
+'history-feed-title'       => '修訂沿革',
 'history-feed-description' => '本站上此頁的修訂沿革',
-'history-feed-empty' => '所請求的頁面不存在。它可能已被刪除或重新命名。
+'history-feed-empty'       => '所請求的頁面不存在。它可能已被刪除或重新命名。
 嘗試[[Special:Search|搜尋本站]]獲得相關的新建頁面。',
 
 # Revision deletion
-'rev-deleted-comment' => '(註釋已除)',
-'rev-deleted-user' => '(使用者名已移除)',
-'rev-deleted-event' => '(日誌已除)',
+'rev-deleted-comment'         => '(註釋已除)',
+'rev-deleted-user'            => '(使用者名已移除)',
+'rev-deleted-event'           => '(日誌已除)',
 'rev-deleted-text-permission' => '該頁面修訂已經被從公共文件中移除。
+在[{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} 刪除日誌]中您可能會檢視到詳細的訊息。',
+'rev-deleted-text-view'       => '該頁面修訂已經被從公共文件中移除。作為此網站的管理員,您可以檢視它;
 在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 刪除日誌]中您可能會檢視到詳細的訊息。',
-'rev-deleted-text-view' => '該頁面修訂已經被從公共文件中移除。作為此網站的管理員,您可以檢視它;
-在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 刪除日誌]中您可能會檢視到詳細的訊息。',
-'revisiondelete' => '刪除/復原刪除修訂',
-'revdelete-nooldid-title' => '沒有目標修訂',
-'revdelete-nooldid-text' => '您沒有指定此操作的目標修訂。',
-'logdelete-selected' => "'''選取的$1個日誌項目:'''",
-'revdelete-text' => "'''刪除的修訂仍將顯示在修訂記錄中, 但它們的文字內容已不能被公眾訪問。'''
+'revisiondelete'              => '刪除/復原刪除修訂',
+'revdelete-nooldid-title'     => '沒有目標修訂',
+'revdelete-nooldid-text'      => '您沒有指定此操作的目標修訂。',
+'logdelete-selected'          => "'''選取的$1個日誌項目:'''",
+'revdelete-text'              => "'''刪除的修訂仍將顯示在修訂記錄中, 但它們的文字內容已不能被公眾訪問。'''
 
 在此網站的其他管理員將仍能訪問隱藏的內容並透過與此相同的介面復原刪除,除非網站工作者進行了一些附加的限制。",
-'revdelete-legend' => '設定修訂限制:',
-'revdelete-hide-user' => '隱藏編輯者的使用者名/IP',
-'revdelete-hide-restricted' => '將此限制同樣應用於管理員',
-'revdelete-suppress' => '同時壓制由操作員以及其他使用者的資料',
-'revdelete-unsuppress' => '在已復原的修訂中移除限制',
-'revdelete-success' => '修訂的可見性已經成功設定。',
-'logdelete-success' => '事件的可見性已經成功設定。',
+'revdelete-legend'            => '設定修訂限制:',
+'revdelete-hide-user'         => '隱藏編輯者的使用者名/IP',
+'revdelete-hide-restricted'   => '將此限制同樣應用於管理員',
+'revdelete-suppress'          => '同時壓制由操作員以及其他使用者的資料',
+'revdelete-unsuppress'        => '在已復原的修訂中移除限制',
+'revdelete-success'           => '修訂的可見性已經成功設定。',
+'logdelete-success'           => '事件的可見性已經成功設定。',
 
 # History merging
-'mergehistory' => '合併修訂記錄',
+'mergehistory'        => '合併修訂記錄',
 'mergehistory-header' => "這一頁可以講您合併一個來源頁面的歷史到另一個新頁面中。
 請確認這次更改會繼續保留該頁面先前的歷史版本。
 
 '''最少該來源頁面的現時修訂必定會保持。'''",
-'mergehistory-merge' => '以下[[:$1]]的修訂可以合併到[[:$2]]。用該選項按鈕欄去合併只有在指定時間以前所建立的修訂。要留意的是使用導航連結便會重設這一欄。',
+'mergehistory-merge'  => '以下[[:$1]]的修訂可以合併到[[:$2]]。用該選項按鈕欄去合併只有在指定時間以前所建立的修訂。要留意的是使用導航連結便會重設這一欄。',
 
 # Merge log
 'mergelogpagetext' => '以下是一個最近由一個頁面的修訂沿革合併到另一個頁面的列表。',
 
 # Diffs
-'history-title' => '「$1」的修訂沿革',
+'history-title'           => '「$1」的修訂沿革',
 'compareselectedversions' => '比較選定的版本',
 
 # Search results
-'searchresults' => '搜尋結果',
-'searchdisabled' => '{{SITENAME}}由於性能方面的原因,全文搜尋已被暫時停用。您可以暫時透過Google搜尋。請留意他們的索引可能會過時。',
+'searchresults'    => '搜尋結果',
+'searchresulttext' => '有關搜尋{{SITENAME}}的更多詳情,參見[[{{MediaWiki:Helppage}}|{{int:help}}]]。',
+'searchsubtitle'   => '查詢\'\'\'[[:$1]]\'\'\'([[Special:Prefixindex/$1|所有以 "$1" 開頭的頁面]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|所有鏈接到 "$1" 的頁面]])',
+'nonefound'        => "'''注意''': 只有一些名稱空間是會作為預設搜尋。嘗試''all:''去搜尋全部的頁面(包埋討論頁面、模板等),或可用需要的名稱空間作為前綴。",
+'powersearch'      => '搜尋',
+'searchdisabled'   => '{{SITENAME}}由於性能方面的原因,全文搜尋已被暫時停用。您可以暫時透過Google搜尋。請留意他們的索引可能會過時。',
 
 # Preferences page
-'preferences' => '偏好設定',
-'mypreferences' => '偏好設定',
-'prefs-personal' => '使用者資料',
-'prefs-rc' => '近期變動',
+'preferences'          => '偏好設定',
+'mypreferences'        => '我的偏好設定',
+'prefsnologintext'     => '您必須先[[Special:UserLogin|登入]]才能設定個人參數。',
+'prefs-personal'       => '使用者資料',
+'prefs-rc'             => '近期變動',
 'prefs-watchlist-days' => '監視列表中顯示記錄的最長天數:',
-'saveprefs' => '保存偏好設定',
-'searchresultshead' => '搜尋結果設定',
-'recentchangesdays' => '近期變動中的顯示日數:',
-'recentchangescount' => '近期變動中的編輯數:',
-'savedprefs' => '您的個人偏好設定已經儲存。',
-'timezonelegend' => '時區',
-'localtime' => '當地時間',
-'servertime' => '伺服器時間:',
-'allowemail' => '接受來自其他使用者的郵件',
-'defaultns' => '否則在這些名字空間搜尋:',
-'username' => '使用者名:',
-'uid' => '使用者ID:',
-'yournick' => '暱稱:',
-'badsig' => '錯誤的原始簽名;請檢查HTML標籤。',
-'badsiglength' => '你的簽名過長;簽名長度必須在$1個字元以下。',
-'prefs-help-gender' => '可選:用於軟體中的性別指定。此項資料將會被公開。',
-'prefs-help-realname' => '真實姓名是選填的,如果您選擇提供它,那它便用以對您的貢獻署名。',
-'prefs-help-email' => '電子郵件是選填的,但當啟用它後可以在您忘記您的個密碼時需要將新密碼重設寄回給您。而在您未公開自己的使用者身分時也能透過您的用戶頁或用戶討論頁與您聯繫。',
+'saveprefs'            => '保存偏好設定',
+'resetprefs'           => '重設參數',
+'searchresultshead'    => '搜尋結果設定',
+'recentchangesdays'    => '近期變動中的顯示日數:',
+'recentchangescount'   => '近期變動中的編輯數:',
+'savedprefs'           => '您的個人偏好設定已經儲存。',
+'timezonelegend'       => '時區',
+'localtime'            => '當地時間',
+'timezoneoffset'       => '時差¹',
+'servertime'           => '伺服器時間',
+'allowemail'           => '接受來自其他使用者的郵件',
+'defaultns'            => '否則在這些名字空間搜尋:',
+'username'             => '使用者名:',
+'uid'                  => '使用者ID:',
+'yournick'             => '暱稱:',
+'badsig'               => '錯誤的原始簽名;請檢查HTML標籤。',
+'badsiglength'         => '你的簽名過長;簽名長度必須在$1個字元以下。',
+'prefs-help-gender'    => '可選:用於軟體中的性別指定。此項資料將會被公開。',
+'prefs-help-realname'  => '真實姓名是選填的,如果您選擇提供它,那它便用以對您的貢獻署名。',
+'prefs-help-email'     => '電子郵件是選填的,但當啟用它後可以在您忘記您的個密碼時需要將新密碼重設寄回給您。而在您未公開自己的使用者身分時也能透過您的用戶頁或用戶討論頁與您聯繫。',
 
 # User rights
-'userrights' => '使用者權限管理',
-'userrights-lookup-user' => '管理使用者群組',
+'userrights'               => '使用者權限管理',
+'userrights-lookup-user'   => '管理使用者群組',
 'userrights-user-editname' => '輸入使用者帳號:',
-'editusergroup' => '編輯使用者群組',
-'editinguser' => "正在編輯使用者'''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]] | [[Special:Contributions/$1|{{int:contribslink}}]])",
+'editusergroup'            => '編輯使用者群組',
+'editinguser'              => "正在編輯使用者'''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]] | [[Special:Contributions/$1|{{int:contribslink}}]])",
 'userrights-editusergroup' => '編輯使用者群組',
-'saveusergroups' => '保存使用者群組',
+'saveusergroups'           => '保存使用者群組',
 
 # Groups
 'group-autoconfirmed' => '自動確認使用者',
@@ -454,31 +462,31 @@ $messages = array(
 'grouppage-autoconfirmed' => '{{ns:project}}:自動確認使用者',
 
 # User rights log
-'rightslog' => '使用者權限日誌',
+'rightslog'     => '使用者權限日誌',
 'rightslogtext' => '以下記錄了使用者權限的更改記錄。',
 
 # Recent changes
-'recentchanges' => '近期變動',
-'recentchanges-feed-description' => '追蹤此訂閱在 wiki 上的近期變動。',
-'rcnotefrom' => '下面是自<b>$2</b>(最多顯示<b>$1</b>):',
-'rcshowhideminor' => '$1細微修改',
-'rcshowhidebots' => '$1機器人的編輯',
-'rcshowhideliu' => '$1具名使用者的編輯',
-'rcshowhideanons' => '$1匿名使用者的編輯',
-'rcshowhidepatr' => ' $1檢查過的編輯',
+'recentchanges'                     => '近期變動',
+'recentchanges-feed-description'    => '追蹤此訂閱在 wiki 上的近期變動。',
+'rcnotefrom'                        => '下面是自<b>$2</b>(最多顯示<b>$1</b>):',
+'rcshowhideminor'                   => '$1細微修改',
+'rcshowhidebots'                    => '$1機器人的編輯',
+'rcshowhideliu'                     => '$1具名使用者的編輯',
+'rcshowhideanons'                   => '$1匿名使用者的編輯',
+'rcshowhidepatr'                    => ' $1檢查過的編輯',
 'number_of_watching_users_pageview' => '[$1個關注使用者]',
 
 # Recent changes linked
-'recentchangeslinked' => '相關頁面修訂記錄',
-'recentchangeslinked-feed' => '相關頁面修訂記錄',
+'recentchangeslinked'         => '相關頁面修訂記錄',
+'recentchangeslinked-feed'    => '相關頁面修訂記錄',
 'recentchangeslinked-toolbox' => '相關頁面修訂記錄',
-'recentchangeslinked-title' => '$1 內連結頁面的修訂記錄',
+'recentchangeslinked-title'   => '$1 內連結頁面的修訂記錄',
 'recentchangeslinked-summary' => "這一個特殊頁面列示這一頁連出頁面的近期變動。在您監視列表中的頁面會以'''粗體'''表示。",
 
 # Upload
-'upload' => '上傳檔案',
-'reuploaddesc' => '返回上載表單。',
-'uploadtext' => "使用下面的表單來上傳用在頁面內新的圖片檔案。
+'upload'                      => '上傳檔案',
+'reuploaddesc'                => '返回上載表單。',
+'uploadtext'                  => "使用下面的表單來上傳用在頁面內新的圖片檔案。
 要檢視或搜尋以前上傳的圖片
 可以進入[[Special:FileList|圖片清單]],
 上傳和刪除將在[[Special:Log/upload|上傳日誌]]中記錄。
@@ -487,50 +495,50 @@ $messages = array(
 '''<nowiki>[[</nowiki>{{ns:file}}:file.jpg<nowiki>]]</nowiki>''',
 '''<nowiki>[[</nowiki>{{ns:file}}:file.png|替換文字<nowiki>]]</nowiki>''' 或
 '''<nowiki>[[</nowiki>{{ns:media}}:file.ogg<nowiki>]]</nowiki>'''。",
-'uploadlogpagetext' => '以下是最近上傳的檔案的一覽表。',
-'ignorewarning' => '忽略警告並儲存檔案。',
-'illegalfilename' => '檔案名"$1"包含有頁面標題所禁止的字符。請改名後重新上傳。',
-'badfilename' => '檔案名已被改為"$1"。',
-'hookaborted' => '您所嘗試的修改被擴展鉤捨棄。',
-'fileexists-thumbnail-yes' => "這個檔案好像是一幅圖片的縮圖版本''(縮圖)''。 [[$1|thumb]]
-請檢查清楚該檔案<strong>[[:$1]]</strong>
+'uploadlogpagetext'           => '以下是最近上傳的檔案的一覽表。',
+'ignorewarning'               => '忽略警告並儲存檔案。',
+'illegalfilename'             => '檔案名"$1"包含有頁面標題所禁止的字符。請改名後重新上傳。',
+'badfilename'                 => '檔案名已被改為"$1"。',
+'hookaborted'                 => '您所嘗試的修改被擴展鉤捨棄。',
+'fileexists-thumbnail-yes'    => "這個檔案好像是一幅圖片的縮圖版本''(縮圖)''。 [[$1|thumb]]
+請檢查清楚該檔案'''<tt>[[:$1]]</tt>'''
 如果檢查後的檔案是同原本圖片的大小是一樣的話,就不用再上載多一幅縮圖。",
-'file-thumbnail-no' => "該檔名是以<strong>$1</strong>開始。它好像一幅圖片的縮圖版本''(縮圖)''。
+'file-thumbnail-no'           => "該檔名是以'''<tt>$1</tt>'''開始。它好像一幅圖片的縮圖版本''(縮圖)''。
 如果你有該圖片的完整大小,如不是請再修改檔名。",
-'fileexists-forbidden' => '已存在相同名稱的檔案;請返回並用一個新的名稱來上傳此檔案。[[File:$1|thumb|center|$1]]',
+'fileexists-forbidden'        => '已存在相同名稱的檔案;請返回並用一個新的名稱來上傳此檔案。[[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => '在共享檔案庫中已存在此名稱的檔案;請返回並用一個新的名稱來上傳此檔案。[[File:$1|thumb|center|$1]]',
-'uploaddisabledtext' => '檔案上傳在此網站不可用。',
-'watchthisupload' => '監視此頁',
+'uploaddisabledtext'          => '檔案上傳在此網站不可用。',
+'watchthisupload'             => '監視此頁',
 
-'upload-proto-error' => '協訂錯誤',
+'upload-proto-error'     => '協訂錯誤',
 'upload-file-error-text' => '當試圖在伺服器上建立臨時檔案時發生內部錯誤。請與系統管理員聯繫。',
 'upload-misc-error-text' => '在上傳時發生未知的錯誤. 請驗証使用了正確並可訪問的 URL,然後進行重試。如果問題仍然存在,請與系統管理員聯繫。',
 
 # Special:ListFiles
 'listfiles_search_for' => '按圖片名稱搜尋:',
-'listfiles_user' => '使用者',
+'listfiles_user'       => '使用者',
 
 # File description page
-'filehist' => '檔案歷史',
+'filehist'           => '檔案歷史',
 'filehist-deleteone' => '刪除這個',
-'filehist-revert' => '復原',
-'filehist-datetime' => '日期/時間',
-'filehist-user' => '使用者',
-'imagelinks' => '連結',
+'filehist-revert'    => '復原',
+'filehist-datetime'  => '日期/時間',
+'filehist-user'      => '使用者',
+'imagelinks'         => '連結',
 
 # File reversion
-'filerevert' => '復原$1',
-'filerevert-legend' => '復原檔案',
-'filerevert-intro' => '<span class="plainlinks">您現正在復原\'\'\'[[Media:$1|$1]]\'\'\'到[$4 於$2 $3的版本]。</span>',
+'filerevert'                => '復原$1',
+'filerevert-legend'         => '復原檔案',
+'filerevert-intro'          => '<span class="plainlinks">您現正在復原\'\'\'[[Media:$1|$1]]\'\'\'到[$4 於$2 $3的版本]。</span>',
 'filerevert-defaultcomment' => '已經復原到於$1 $2的版本',
-'filerevert-submit' => '復原',
-'filerevert-success' => '<span class="plainlinks">\'\'\'[[Media:$1|$1]]\'\'\'已經復原到[$4 於$2 $3的版本]。</span>',
+'filerevert-submit'         => '復原',
+'filerevert-success'        => '<span class="plainlinks">\'\'\'[[Media:$1|$1]]\'\'\'已經復原到[$4 於$2 $3的版本]。</span>',
 
 # File deletion
-'filedelete-intro' => "您現正刪除'''[[Media:$1|$1]]'''。",
-'filedelete-intro-old' => '<span class="plainlinks">你現正刪除\'\'\'[[Media:$1|$1]]\'\'\'於[$4 $2 $3]的版本。</span>',
-'filedelete-comment' => '註解:',
-'filedelete-nofile' => "'''$1'''在這個網站中不存在。",
+'filedelete-intro'      => "您現正刪除'''[[Media:$1|$1]]'''。",
+'filedelete-intro-old'  => '<span class="plainlinks">你現正刪除\'\'\'[[Media:$1|$1]]\'\'\'於[$4 $2 $3]的版本。</span>',
+'filedelete-comment'    => '註解:',
+'filedelete-nofile'     => "'''$1'''在這個網站中不存在。",
 'filedelete-nofile-old' => "在已指定屬性的情況下,這裡沒有'''$1'''於 $2 $3 的版本。",
 
 # MIME search
@@ -548,57 +556,62 @@ $messages = array(
 # Statistics
 'statistics-header-users' => '使用者統計',
 
+'disambiguations'      => '消歧義',
+'disambiguations-text' => '以下的頁面都有到<b>消歧義頁</b>的鏈接,
+但它們應該是連到適當的標題。<br />
+個頁面會被視為消含糊頁如果它是連自[[MediaWiki:Disambiguationspage]]。',
+
 'withoutinterwiki-summary' => '以下的頁面是未有語言鏈接到其它語言版本:',
 
 # Miscellaneous special pages
-'lonelypagestext' => '以下頁面尚未被這個wiki中的其它頁面連結。',
+'lonelypagestext'     => '以下頁面尚未被這個wiki中的其它頁面連結。',
 'uncategorizedimages' => '待分類圖片',
-'unusedimages' => '未使用圖片',
-'popularpages' => '熱門頁面',
-'mostimages' => '最多連結圖片',
-'prefixindex' => '所有頁面之前綴',
-'deadendpagestext' => '以下頁面沒有連結到這個wiki中的其它頁面。',
-'listusers' => '使用者列表',
-'newpages-username' => '使用者帳號:',
-'move' => '移動',
-'unusedimagestext' => '請注意其它網站可能直接透過 URL 連結此圖片,所以這裡列出的圖片有可能依然被使用。',
-'notargettext' => '您還沒有指定一個目標頁面或使用者以進行此項操作。',
+'unusedimages'        => '未使用圖片',
+'popularpages'        => '熱門頁面',
+'mostimages'          => '最多連結圖片',
+'prefixindex'         => '所有頁面之前綴',
+'deadendpagestext'    => '以下頁面沒有連結到這個wiki中的其它頁面。',
+'listusers'           => '使用者列表',
+'newpages-username'   => '使用者帳號:',
+'move'                => '移動',
+'unusedimagestext'    => '請注意其它網站可能直接透過 URL 連結此圖片,所以這裡列出的圖片有可能依然被使用。',
+'notargettext'        => '您還沒有指定一個目標頁面或使用者以進行此項操作。',
 
 # Special:Log
 'specialloguserlabel' => '使用者:',
-'alllogstext' => '綜合顯示 {{SITENAME}} 的上傳、刪除、保護、查封以及站務日誌。',
+'alllogstext'         => '綜合顯示 {{SITENAME}} 的上傳、刪除、保護、查封以及站務日誌。',
 
 # Special:ListUsers
-'listusersfrom' => '給定顯示使用者條件:',
+'listusersfrom'      => '給定顯示使用者條件:',
 'listusers-noresult' => '找不到使用者。',
 
 # Special:ActiveUsers
 'activeusers-hidebots' => '隱藏機器人',
 
-# Email user
-'mailnologin' => '無E-mail地址',
+# E-mail user
+'mailnologin'     => '無E-mail地址',
 'mailnologintext' => '您必須先[[Special:UserLogin|登入]]
 並在[[Special:Preferences|偏好設定]]
 中有一個有效的e-mail地址才可以E-mail其他使用者。',
-'emailuser' => 'E-mail該使用者',
-'emailpage' => 'E-mail使用者',
-'emailpagetext' => '如果該使用者已經在他或她的偏好設定頁中輸入了有效的e-mail地址,以下的表格將寄一個訊息給該使用者。您在您偏好設定中所輸入的e-mail地址將出現在郵件「發件人」一欄中,這樣該使用者就可以回覆您。',
-'noemailtext' => '該使用者還沒有指定一個有效的e-mail地址,
+'emailuser'       => 'E-mail該使用者',
+'emailpage'       => 'E-mail使用者',
+'emailpagetext'   => '如果該使用者已經在他或她的偏好設定頁中輸入了有效的e-mail地址,以下的表格將寄一個訊息給該使用者。您在您偏好設定中所輸入的e-mail地址將出現在郵件「發件人」一欄中,這樣該使用者就可以回覆您。',
+'noemailtext'     => '該使用者還沒有指定一個有效的e-mail地址,
 或者選擇不接受來自其他使用者的e-mail。',
-'emailfrom' => '發件人',
-'emailto' => '收件人',
-'emailsubject' => '主題',
-'emailmessage' => '訊息',
-'emailccme' => '將我的消息的副本發送一份到我的E-mail信箱。',
+'emailfrom'       => '發件人',
+'emailto'         => '收件人',
+'emailsubject'    => '主題',
+'emailmessage'    => '訊息',
+'emailccme'       => '將我的消息的副本發送一份到我的E-mail信箱。',
 
 # Watchlist
-'addedwatchtext' => '已將頁面「[[:$1]]」加入您的[[Special:Watchlist|監視列表]],未來此頁面或其討論頁如有更動,都會在監視列表中列出。',
-'removedwatchtext' => '頁面「[[:$1]]」已經從您的監視頁面中移除。',
+'addedwatchtext'    => "頁面「[[:$1]]」已經被加入到您的[[Special:Watchlist|監視清單]]中。將來有關此頁面及其討論頁的任何修改將會在那裡列出,而且還會在[[Special:RecentChanges|近期變動]]中以'''粗體'''形式列出以使起更容易識別。",
+'removedwatchtext'  => '頁面「[[:$1]]」已經從您的監視頁面中移除。',
 'watchlist-details' => '不包含討論頁,您的監視列表共有 $1 頁。',
 
 'enotif_impersonal_salutation' => '{{SITENAME}}使用者',
-'enotif_anon_editor' => '匿名使用者$1',
-'enotif_body' => '親愛的 $WATCHINGUSERNAME,
+'enotif_anon_editor'           => '匿名使用者$1',
+'enotif_body'                  => '親愛的 $WATCHINGUSERNAME,
 
 $PAGEEDITOR 已經在 $PAGEEDITDATE $CHANGEDORCREATED{{SITENAME}}的 $PAGETITLE 頁面,請到 $PAGETITLE_URL 檢視目前版本。
 
@@ -626,77 +639,77 @@ $NEWPAGE
 # Delete
 'confirmdeletetext' => '您即將從資料庫中永遠刪除一個頁面或圖片以及其歷史。
 請確定您要進行此項操作,並且了解其後果,同時您的行為符合[[{{MediaWiki:Policy-url}}]]。',
-'deletedtext' => '「$1」已經被刪除。
+'deletedtext'       => '「$1」已經被刪除。
 最近刪除的紀錄請參見$2。',
-'dellogpagetext' => '以下是最近刪除的紀錄列表。
+'dellogpagetext'    => '以下是最近刪除的紀錄列表。
 所有的時間都是使用伺服器時間。',
-'reverted' => '復原到早期版本',
-'deletecomment' => '原因:',
+'reverted'          => '復原到早期版本',
+'deletecomment'     => '原因:',
 
 # Rollback
-'rollback' => '復原',
-'rollback_short' => '復原',
-'rollbacklink' => '復原',
-'rollbackfailed' => '無法復原',
-'cantrollback' => '無法復原編輯;最後的貢獻者是本文的唯一作者。',
-'alreadyrolled' => '無法復原由[[User:$2|$2]] ([[User talk:$2|討論]])進行的[[$1]]的最後編輯;
+'rollback'         => '復原',
+'rollback_short'   => '復原',
+'rollbacklink'     => '復原',
+'rollbackfailed'   => '無法復原',
+'cantrollback'     => '無法復原編輯;最後的貢獻者是本文的唯一作者。',
+'alreadyrolled'    => '無法復原由[[User:$2|$2]] ([[User talk:$2|討論]])進行的[[$1]]的最後編輯;
 其他人已經編輯或是復原了該頁。
 
 最後編輯者: [[User:$3|$3]] ([[User talk:$3|討論]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])。',
-'editcomment' => "編輯說明: \"''\$1''\"。",
-'revertpage' => '復原由[[Special:Contributions/$2|$2]] ([[User talk:$2|對話]])的編輯;更改回[[User:$1|$1]]的最後一個版本',
+'editcomment'      => "編輯說明: \"''\$1''\"。",
+'revertpage'       => '復原由[[Special:Contributions/$2|$2]] ([[User talk:$2|對話]])的編輯;更改回[[User:$1|$1]]的最後一個版本',
 'rollback-success' => '復原由$1的編輯;更改回$2的最後一個版本。',
 
 # Protect
-'protect-title' => '更改「$1」的保護等級',
-'protect-locked-blocked' => "您不能在被封鎖時更改保護級別。
+'protect-title'               => '更改「$1」的保護等級',
+'protect-locked-blocked'      => "您不能在被封鎖時更改保護級別。
 以下是'''$1'''現時的保護級別:",
-'protect-locked-access' => "您的帳號權限不能修改保護級別。
+'protect-locked-access'       => "您的帳號權限不能修改保護級別。
 以下是'''$1'''現時的保護級別:",
-'protect-cascadeon' => '以下的{{PLURAL:$1|一個|多個}}頁面包含著本頁面的同時,啟動了連鎖保護,因此本頁面目前也被保護,未能編輯。您可以設定本頁面的保護級別,但這並不會對連鎖保護有所影響。',
-'protect-default' => '(預設)',
+'protect-cascadeon'           => '以下的{{PLURAL:$1|一個|多個}}頁面包含著本頁面的同時,啟動了連鎖保護,因此本頁面目前也被保護,未能編輯。您可以設定本頁面的保護級別,但這並不會對連鎖保護有所影響。',
+'protect-default'             => '(預設)',
 'protect-level-autoconfirmed' => '禁止未註冊使用者',
-'protect-expiry-options' => '2小時:2 hours,1天:1 day,1周:1 week,2周:2 weeks,1個月:1 month,3個月:3 months,6個月:6 months,1年:1 year,永久:infinite',
-'maximum-size' => '最大大小',
+'protect-expiry-options'      => '2小時:2 hours,1天:1 day,1周:1 week,2周:2 weeks,1個月:1 month,3個月:3 months,6個月:6 months,1年:1 year,永久:infinite',
+'maximum-size'                => '最大大小',
 
 # Undelete
-'undelete' => '復原被刪頁面',
-'undeletepage' => '瀏覽及復原被刪頁面',
-'undeletepagetext' => '以下頁面已經被刪除,但依然在檔案中並可以被復原。
+'undelete'                     => '復原被刪頁面',
+'undeletepage'                 => '瀏覽及復原被刪頁面',
+'undeletepagetext'             => '以下頁面已經被刪除,但依然在檔案中並可以被復原。
 檔案庫可能被定時清理。',
-'undeleteextrahelp' => "復原整個頁面時,請清除所有複選框後按 '''''復原''''' 。 復原特定版本時,請選擇相應版本前的複選框後按'''''復原''''' 。按 '''''重設''''' 將清除評論內容及所有複選框。",
-'undeletehistory' => '如果您復原了該頁面,所有版本都會被復原到修訂沿革中。
+'undeleteextrahelp'            => "復原整個頁面時,請清除所有複選框後按 '''''復原''''' 。 復原特定版本時,請選擇相應版本前的複選框後按'''''復原''''' 。按 '''''重設''''' 將清除評論內容及所有複選框。",
+'undeletehistory'              => '如果您復原了該頁面,所有版本都會被復原到修訂沿革中。
 如果本頁刪除後有一個同名的新頁面建立,被復原的版本將會稱為較新的歷史。',
-'undeleterevdel' => '如果把最新修訂部份刪除,反刪除便無法進行。如果遇到這種情況,您必須反選或反隱藏最新已刪除的修訂。對於您沒有權限去檢視的修訂是無法復原的。',
-'undeletehistorynoadmin' => '這個頁面已經被刪除,刪除原因顯示在下方編輯摘要中。被刪除前的所有修訂版本,連同刪除前貢獻使用者等等細節只有管理員可以看見。',
-'undelete-revision' => '刪除$1時由$3(在$2)所編寫的修訂版本:',
-'undeleterevision-missing' => '此版本的內容不正確或已經遺失。可能連結錯誤、被移除或已經被復原。',
-'undeletebtn' => '復原',
-'undeletedrevisions' => '$1個修訂版本已經復原',
-'undeletedrevisions-files' => '$1 個版本和 $2 個檔案被復原',
-'undeletedfiles' => '$1 個檔案被復原',
-'cannotundelete' => '復原失敗;可能之前已經被其他人復原。',
-'undeletedpage' => "'''$1已經被復原''' 請參考[[Special:Log/delete|刪除日誌]]來查詢刪除及復原記錄。",
+'undeleterevdel'               => '如果把最新修訂部份刪除,反刪除便無法進行。如果遇到這種情況,您必須反選或反隱藏最新已刪除的修訂。對於您沒有權限去檢視的修訂是無法復原的。',
+'undeletehistorynoadmin'       => '這個頁面已經被刪除,刪除原因顯示在下方編輯摘要中。被刪除前的所有修訂版本,連同刪除前貢獻使用者等等細節只有管理員可以看見。',
+'undelete-revision'            => '刪除$1時由$3(在$2)所編寫的修訂版本:',
+'undeleterevision-missing'     => '此版本的內容不正確或已經遺失。可能連結錯誤、被移除或已經被復原。',
+'undeletebtn'                  => '復原',
+'undeletedrevisions'           => '$1個修訂版本已經復原',
+'undeletedrevisions-files'     => '$1 個版本和 $2 個檔案被復原',
+'undeletedfiles'               => '$1 個檔案被復原',
+'cannotundelete'               => '復原失敗;可能之前已經被其他人復原。',
+'undeletedpage'                => "'''$1已經被復原''' 請參考[[Special:Log/delete|刪除日誌]]來查詢刪除及復原記錄。",
 'undelete-missing-filearchive' => '由於檔案存檔 ID $1 不在資料庫中,不能在檔案存檔中復原。它可能已經反刪除了。',
 
 # Contributions
 'contributions' => '使用者編修記錄',
-'mycontris' => '編修記錄',
-'contribsub2' => '$1的編修記錄 ($2)',
-'uctop' => '(最新修改)',
+'mycontris'     => '我的編修記錄',
+'contribsub2'   => '$1的編修記錄 ($2)',
+'uctop'         => '(最新修改)',
 
-'sp-contributions-newbies' => '只顯示新建立之使用者的編修記錄',
-'sp-contributions-blocklog' => '封鎖記錄',
+'sp-contributions-newbies'    => '只顯示新建立之使用者的編修記錄',
+'sp-contributions-blocklog'   => '封鎖記錄',
 'sp-contributions-userrights' => '使用者權限管理',
-'sp-contributions-username' => 'IP位址或使用者名稱:',
+'sp-contributions-username'   => 'IP位址或使用者名稱:',
 
 # What links here
 'whatlinkshere-title' => '鏈接到$1的頁面',
 
 # Block/unblock
-'blockip' => '封鎖使用者',
-'ipadressorusername' => 'IP地址或使用者名稱:',
-'ipbreason-dropdown' => '*一般的封鎖理由
+'blockip'                     => '封鎖使用者',
+'ipadressorusername'          => 'IP地址或使用者名:',
+'ipbreason-dropdown'          => '*一般的封鎖理由
 ** 屢次增加不實資料
 ** 刪除頁面內容
 ** 外部連結廣告
@@ -704,49 +717,50 @@ $NEWPAGE
 ** 無禮的行為、攻擊/騷擾別人
 ** 濫用多個帳號
 ** 不能接受的使用者名',
-'ipbcreateaccount' => '阻止建立新帳號',
-'ipbemailban' => '阻止使用者傳送E-mail',
-'ipbenableautoblock' => '自動封鎖此使用者最後所用的IP位址,以及後來試圖編輯所用的所有位址',
-'ipbsubmit' => '封鎖該地址',
-'ipbhidename' => '在封鎖日誌、活躍封鎖列表以及使用者列表中隱藏使用者名/IP',
-'blockipsuccesssub' => '封鎖成功',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]]已經被封鎖。
+'ipbcreateaccount'            => '阻止建立新帳號',
+'ipbemailban'                 => '阻止使用者傳送E-mail',
+'ipbenableautoblock'          => '自動封鎖此使用者最後所用的IP位址,以及後來試圖編輯所用的所有位址',
+'ipbsubmit'                   => '封鎖該地址',
+'ipbhidename'                 => '在封鎖日誌、活躍封鎖列表以及使用者列表中隱藏使用者名/IP',
+'blockipsuccesssub'           => '封鎖成功',
+'blockipsuccesstext'          => '[[Special:Contributions/$1|$1]]已經被封鎖。
 <br />參看[[Special:BlockList|被封IP地址列表]]以覆審封鎖。',
-'ipb-edit-dropdown' => '編輯封鎖原因',
-'ipb-unblock-addr' => '解除封鎖$1',
-'ipb-unblock' => '解除禁封使用者名或IP地址',
-'ipb-blocklist' => '檢視現有的封鎖',
-'unblockip' => '解除禁封IP地址',
-'unblockiptext' => '用下面的表單來復原先前被禁封的IP地址的書寫權。',
-'ipusubmit' => '解除禁封',
-'unblocked' => '[[User:$1|$1]] 的封鎖已經解除。',
-'unblocked-id' => '封鎖 $1 已經被移除',
-'ipblocklist-legend' => '搜尋一位已經被封鎖的使用者',
-'anononlyblock' => '僅限匿名使用者',
-'noautoblockblock' => '禁用自動封鎖',
-'createaccountblock' => '禁止建立帳號',
-'ipblocklist-empty' => '封鎖列表為空。',
-'ipblocklist-no-results' => '所要求的IP地址/使用者名沒有被封鎖。',
-'blocklink' => '禁封',
-'blocklogentry' => '[[$1]]已被封鎖 $3 ,終止時間為$2',
-'blocklogtext' => '這是關於使用者封鎖和解除封鎖操作的記錄。被自動封鎖的IP地址沒有被列出。請參閱[[Special:BlockList|被封鎖的IP地址和使用者列表]]。',
-'block-log-flags-anononly' => '僅限匿名使用者',
-'block-log-flags-nocreate' => '禁止建立新帳號',
+'ipb-edit-dropdown'           => '編輯封鎖原因',
+'ipb-unblock-addr'            => '解除封鎖$1',
+'ipb-unblock'                 => '解除禁封使用者名或IP地址',
+'ipb-blocklist'               => '檢視現有的封鎖',
+'unblockip'                   => '解除禁封IP地址',
+'unblockiptext'               => '用下面的表單來復原先前被禁封的IP地址的書寫權。',
+'ipusubmit'                   => '解除禁封',
+'unblocked'                   => '[[User:$1|$1]] 的封鎖已經解除。',
+'unblocked-id'                => '封鎖 $1 已經被移除',
+'ipblocklist-legend'          => '搜尋一位已經被封鎖的使用者',
+'anononlyblock'               => '僅限匿名使用者',
+'noautoblockblock'            => '禁用自動封鎖',
+'createaccountblock'          => '禁止建立帳號',
+'ipblocklist-empty'           => '封鎖列表為空。',
+'ipblocklist-no-results'      => '所要求的IP地址/使用者名沒有被封鎖。',
+'blocklink'                   => '禁封',
+'blocklogentry'               => '[[$1]]已被封鎖 $3 ,終止時間為$2',
+'blocklogtext'                => '這是關於使用者封鎖和解除封鎖操作的記錄。被自動封鎖的IP地址沒有被列出。請參閱[[Special:BlockList|被封鎖的IP地址和使用者列表]]。',
+'block-log-flags-anononly'    => '僅限匿名使用者',
+'block-log-flags-nocreate'    => '禁止此IP/使用者建立新帳號',
 'block-log-flags-noautoblock' => '停用自動封鎖',
-'range_block_disabled' => '只有管理員才能建立禁止封鎖的範圍。',
-'ipb_cant_unblock' => '錯誤: 找不到封鎖ID$1。可能已經解除封鎖。',
-'ipb_blocked_as_range' => '錯誤: 該IP $1 無直接封鎖,不可以解除封鎖。但是它是在 $2 的封鎖範圍之內,該段範圍是可以解除封鎖的。',
-'sorbsreason' => '您的IP位址被 DNSBL列為屬於開放代理服務器.',
+'range_block_disabled'        => '只有管理員才能建立禁止封鎖的範圍。',
+'ipb_cant_unblock'            => '錯誤: 找不到封鎖ID$1。可能已經解除封鎖。',
+'ipb_blocked_as_range'        => '錯誤: 該IP $1 無直接封鎖,不可以解除封鎖。但是它是在 $2 的封鎖範圍之內,該段範圍是可以解除封鎖的。',
+'blockme'                     => '封鎖我',
+'sorbsreason'                 => '您的IP位址被 DNSBL列為屬於開放代理服務器.',
 'sorbs_create_account_reason' => '由於您的IP位址被 DNSBL列為屬於開放代理服務器,所以您無法建立帳號。',
 
 # Developer tools
-'lockdbtext' => '鎖住資料庫將禁止所有使用者進行編輯頁面、更改參數、編輯監視列表以及其他需要更改資料庫的操作。
+'lockdbtext'   => '鎖住資料庫將禁止所有使用者進行編輯頁面、更改參數、編輯監視列表以及其他需要更改資料庫的操作。
 請確認您的決定,並且保證您在維護工作結束後會重新開放資料庫。',
 'unlockdbtext' => '開放資料庫將會復原所有使用者進行編輯頁面、修改參數、編輯監視列表以及其他需要更改資料庫的操作。
 請確認您的決定。',
 
 # Move page
-'movepagetext' => "用下面的表單來重新命名一個頁面,並將其修訂沿革同時移動到新頁面。
+'movepagetext'    => "用下面的表單來重新命名一個頁面,並將其修訂沿革同時移動到新頁面。
 老的頁面將成為新頁面的重定向頁。
 連結到老頁面的連結並不會自動更改;
 請檢查雙重或損壞重定向連結。
@@ -762,13 +776,13 @@ $NEWPAGE
 請在行動前先了結其所可能帶來的後果。",
 'movenologintext' => '您必須是一名登記使用者並且[[Special:UserLogin|登入]]
 後才可移動一個頁面。',
-'movenotallowed' => '您在這個wiki中度並沒有許可權去移動頁面。',
-'movetalk' => '如果可能的話,請同時移動對話頁。',
+'movenotallowed'  => '您在這個wiki中度並沒有許可權去移動頁面。',
+'movetalk'        => '如果可能的話,請同時移動對話頁。',
 'movelogpagetext' => '以下是已經移動的頁面清單:',
-'revertmove' => '復原該移動',
+'revertmove'      => '復原該移動',
 
 # Export
-'exporttext' => '您可以將特定頁面或一組頁面的文字以及編輯歷史以 XML 格式匯出;這樣可以將有關頁面透過「[[Special:Import|匯入頁面]]」頁面匯入到另一個執行 MediaWiki 的網站。
+'exporttext'      => '您可以將特定頁面或一組頁面的文字以及編輯歷史以 XML 格式匯出;這樣可以將有關頁面透過「[[Special:Import|匯入頁面]]」頁面匯入到另一個執行 MediaWiki 的網站。
 
 要匯出頁面,請在下面的文字框中輸入頁面標題,每行一個標題,
 並選擇你是否需要匯出帶有修訂紀錄的以前的版本,
@@ -778,60 +792,59 @@ $NEWPAGE
 'export-download' => '提供一個檔案以供另存',
 
 # Namespace 8 related
-'allmessages' => '系統介面',
-'allmessagestext' => '這裡列出所有可定製的系統介面。',
+'allmessages'               => '系統介面',
+'allmessagestext'           => '這裡列出所有可定製的系統介面。',
 'allmessagesnotsupportedDB' => '系統介面功能處於關閉狀態 (wgUseDatabaseMessages)。',
 
 # Thumbnails
 'thumbnail_error' => '建立縮圖錯誤: $1',
 
 # Special:Import
-'import-interwiki-history' => '複製此頁的所有歷史版本',
+'import-interwiki-history'   => '複製此頁的所有歷史版本',
 'import-interwiki-namespace' => '將頁面轉移到名字空間:',
-'importtext' => '請使用 Special:Export 功能從源 wiki 匯出檔案,儲存到您的磁片並上傳到這裡。',
-'importfailed' => '匯入失敗: $1',
-'importsuccess' => '匯入成功﹗',
-'importhistoryconflict' => '存在衝突的修訂沿革(可能在之前已經匯入過此頁面)',
+'importtext'                 => '請使用 Special:Export 功能從源 wiki 匯出檔案,儲存到您的磁片並上傳到這裡。',
+'importfailed'               => '匯入失敗: $1',
+'importsuccess'              => '匯入成功﹗',
+'importhistoryconflict'      => '存在衝突的修訂沿革(可能在之前已經匯入過此頁面)',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => '用戶頁',
-'tooltip-pt-anonuserpage' => '您編輯本站所用IP的對應使用者頁',
-'tooltip-pt-mytalk' => '討論頁',
-'tooltip-pt-preferences' => '我的偏好設定',
-'tooltip-pt-watchlist' => '我的監視列表',
-'tooltip-pt-mycontris' => '編修記錄',
-'tooltip-ca-addsection' => '於本討論頁增加新的討論主題',
-'tooltip-ca-history' => '本頁面的早前版本。',
-'tooltip-ca-undelete' => '將這個頁面復原到被刪除以前的狀態',
-'tooltip-p-logo' => '首頁',
-'tooltip-n-help' => '尋求說明',
-'tooltip-feed-rss' => '訂閱本修訂記錄的RSS資訊',
-'tooltip-feed-atom' => '訂閱本修訂記錄的Atom訊息',
-'tooltip-t-contributions' => '檢視該使用者的編修記錄',
-'tooltip-t-emailuser' => '向該使用者發送電子郵件',
-'tooltip-t-upload' => '上傳圖片或多媒體檔',
-'tooltip-t-permalink' => '這個頁面版本的永久連結',
-'tooltip-ca-nstab-user' => '檢視使用者頁',
-'tooltip-ca-nstab-image' => '查詢圖片頁面',
-'tooltip-ca-nstab-template' => '檢視模板',
-'tooltip-ca-nstab-help' => '檢視說明頁面',
-'tooltip-ca-nstab-category' => '檢視分類頁面',
-'tooltip-minoredit' => '標記為細微修改',
+'tooltip-pt-userpage'             => '用戶頁',
+'tooltip-pt-anonuserpage'         => '您編輯本站所用IP的對應使用者頁',
+'tooltip-pt-mytalk'               => '討論頁',
+'tooltip-pt-preferences'          => '我的偏好設定',
+'tooltip-pt-watchlist'            => '我的監視列表',
+'tooltip-pt-mycontris'            => '編修記錄',
+'tooltip-ca-addsection'           => '於本討論頁增加新的討論主題',
+'tooltip-ca-history'              => '本頁面的早前版本。',
+'tooltip-ca-undelete'             => '將這個頁面復原到被刪除以前的狀態',
+'tooltip-p-logo'                  => '首頁',
+'tooltip-n-help'                  => '尋求說明',
+'tooltip-feed-rss'                => '訂閱本修訂記錄的RSS資訊',
+'tooltip-feed-atom'               => '訂閱本修訂記錄的Atom訊息',
+'tooltip-t-contributions'         => '檢視該使用者的編修記錄',
+'tooltip-t-emailuser'             => '向該使用者發送電子郵件',
+'tooltip-t-upload'                => '上傳圖片或多媒體檔',
+'tooltip-t-permalink'             => '這個頁面版本的永久連結',
+'tooltip-ca-nstab-user'           => '檢視使用者頁',
+'tooltip-ca-nstab-image'          => '查詢圖片頁面',
+'tooltip-ca-nstab-template'       => '檢視模板',
+'tooltip-ca-nstab-help'           => '檢視說明頁面',
+'tooltip-ca-nstab-category'       => '檢視分類頁面',
+'tooltip-minoredit'               => '標記為細微修改',
 'tooltip-compareselectedversions' => '檢視本頁被點選的兩個版本間的差異',
-'tooltip-rollback' => '『{{int:rollbacklink}}』可以一按恢復上一位貢獻者對這個頁面的編輯',
-'tooltip-undo' => '『{{int:editundo}}』可以在編輯模式上開啟編輯表格以便復原。它容許在摘要中加入原因。',
-'interlanguage-link-title' => '$1–$2',
+'tooltip-rollback'                => '『{{int:rollbacklink}}』可以一按恢復上一位貢獻者對這個頁面的編輯',
+'tooltip-undo'                    => '『{{int:editundo}}』可以在編輯模式上開啟編輯表格以便復原。它容許在摘要中加入原因。',
 
 # Attribution
 'anonymous' => '{{SITENAME}}的匿名{{PLURAL:$1|使用者|使用者}}',
-'siteuser' => '{{SITENAME}}使用者$1',
-'anonuser' => '{{SITENAME}}匿名使用者$1',
+'siteuser'  => '{{SITENAME}}使用者$1',
+'anonuser'  => '{{SITENAME}}匿名使用者$1',
 'siteusers' => '{{SITENAME}}{{PLURAL:$2|使用者|使用者}}$1',
 'anonusers' => '{{SITENAME}}匿名{{PLURAL:$2|使用者|使用者}}$1',
 
 # Spam protection
 'spamprotectiontext' => '垃圾過濾器禁止保存您剛才提交的頁面,這可能是由於您所加入的外部網站連結所產生的問題。',
-'spam_reverting' => '復原到不包含連結至$1的最近版本',
+'spam_reverting'     => '復原到不包含連結至$1的最近版本',
 
 # Patrolling
 'markedaspatrolledtext' => '選定的版本已被標記為已檢查.',
@@ -841,18 +854,18 @@ $NEWPAGE
 
 # Browsing diffs
 'previousdiff' => '←上一個',
-'nextdiff' => '下一個→',
+'nextdiff'     => '下一個→',
 
 # Media information
-'imagemaxsize' => '在圖片描述頁對圖片大小限制為:',
-'file-nohires' => '無更高解析度可提供。',
+'imagemaxsize'   => '在圖片描述頁對圖片大小限制為:',
+'file-nohires'   => '無更高解析度可提供。',
 'show-big-image' => '完整解析度',
 
 # Special:NewFiles
-'newimages' => '新建圖片畫廊',
+'newimages'     => '新建圖片畫廊',
 'imagelisttext' => '以下是按$2排列的$1個檔案列表。',
-'showhidebots' => '(機器人$1)',
-'noimages' => '無可檢視圖片。',
+'showhidebots'  => '(機器人$1)',
+'noimages'      => '無可檢視圖片。',
 
 # Bad image list
 'bad_image_list' => '請根據以下的格式去編寫:
@@ -860,10 +873,7 @@ $NEWPAGE
 只有列示項目(以 * 開頭的項目)會被考慮。第一個連結一定要連接去壞圖片中。
 然後在同一行的連結會考慮作例外,即是幅圖片可以在哪一個頁面中同時顯示。',
 
-/*
-Short names for language variants used for language conversion links.
-Variants for Chinese language
-*/
+# Variants for Chinese language
 'variantname-zh-tw' => '台灣繁體',
 
 # Metadata
@@ -871,82 +881,72 @@ Variants for Chinese language
 
 如果此檔案的源檔案已經被修改,一些訊息在修改後的檔案中將不能完全反映出來。',
 
-# Exif tags
-'exif-bitspersample' => '每像素位元數',
+# EXIF tags
+'exif-bitspersample'             => '每像素位元數',
 'exif-photometricinterpretation' => '像素合成',
-'exif-samplesperpixel' => '像素數',
-'exif-xresolution' => '水準解析度',
-'exif-yresolution' => '垂直解析度',
-'exif-stripoffsets' => '圖片數據區',
-'exif-imagedescription' => '圖片標題',
-'exif-compressedbitsperpixel' => '圖片壓縮模式',
-'exif-pixelydimension' => '有效圖片寬度',
-'exif-pixelxdimension' => '有效圖片高度',
-'exif-usercomment' => '使用者註釋',
-'exif-focalplanexresolution' => 'X軸焦平面解析度',
-'exif-focalplaneyresolution' => 'Y軸焦平面解析度',
-'exif-focalplaneresolutionunit' => '焦平面解析度單位',
-'exif-customrendered' => '自定義圖片處理',
-'exif-imageuniqueid' => '唯一圖片ID',
-'exif-gpsimgdirectionref' => '圖片方位參照',
-'exif-gpsimgdirection' => '圖片方位',
-
-'exif-lightsource-2' => '螢光燈',
+'exif-samplesperpixel'           => '像素數',
+'exif-xresolution'               => '水準解析度',
+'exif-yresolution'               => '垂直解析度',
+'exif-stripoffsets'              => '圖片數據區',
+'exif-imagedescription'          => '圖片標題',
+'exif-compressedbitsperpixel'    => '圖片壓縮模式',
+'exif-pixelydimension'           => '有效圖片寬度',
+'exif-pixelxdimension'           => '有效圖片高度',
+'exif-usercomment'               => '使用者註釋',
+'exif-focalplanexresolution'     => 'X軸焦平面解析度',
+'exif-focalplaneyresolution'     => 'Y軸焦平面解析度',
+'exif-focalplaneresolutionunit'  => '焦平面解析度單位',
+'exif-customrendered'            => '自定義圖片處理',
+'exif-imageuniqueid'             => '唯一圖片ID',
+'exif-gpsimgdirectionref'        => '圖片方位參照',
+'exif-gpsimgdirection'           => '圖片方位',
+
+'exif-lightsource-2'  => '螢光燈',
 'exif-lightsource-12' => '日光螢光燈(色溫 D 5700    7100K)',
 'exif-lightsource-13' => '日溫白色螢光燈(N 4600    5400K)',
 'exif-lightsource-14' => '冷白色螢光燈(W 3900    4500K)',
 'exif-lightsource-15' => '白色螢光 (WW 3200    3700K)',
 
-# Email address confirmation
-'confirmemail' => '確認電子郵件地址',
-'confirmemail_noemail' => '您沒有在您的[[Special:Preferences|使用者設定]]裡面輸入一個有效的 email 位址。',
-'confirmemail_text' => '此網站要求您在使用郵件功能之前驗證您的電子郵件地址。
+# External editor support
+'edit-externally-help' => '請參見[//www.mediawiki.org/wiki/Manual:External_editors 設定步驟]了解詳細資訊。',
+
+# E-mail address confirmation
+'confirmemail'            => '確認電子郵件地址',
+'confirmemail_noemail'    => '您沒有在您的[[Special:Preferences|使用者設定]]裡面輸入一個有效的 email 位址。',
+'confirmemail_text'       => '此網站要求您在使用郵件功能之前驗證您的電子郵件地址。
 點擊以下按鈕可向您的郵箱發送一封確認郵件。該郵件包含有一行代碼連結;
 請在您的瀏覽器中加載此連結以確認您的電子郵件地址是有效的。',
 'confirmemail_sendfailed' => '不能發送確認郵件,請檢查電子郵件地址是否包含非法字元。
 
 郵件傳送員回應: $1',
-'confirmemail_needlogin' => '您需要$1以確認您的電子郵件地址。',
-'confirmemail_success' => '您的郵箱已經被確認。您現下可以登錄並使用此網站了。',
-'confirmemail_loggedin' => '您的電子郵件地址現下已被確認。',
-'confirmemail_subject' => '{{SITENAME}}電子郵件地址確認',
+'confirmemail_needlogin'  => '您需要$1以確認您的電子郵件地址。',
+'confirmemail_success'    => '您的郵箱已經被確認。您現下可以登錄並使用此網站了。',
+'confirmemail_loggedin'   => '您的電子郵件地址現下已被確認。',
+'confirmemail_subject'    => '{{SITENAME}}電子郵件地址確認',
 
 # Scary transclusion
-'scarytranscludefailed' => '[抱歉,模板$1讀取失敗]',
+'scarytranscludefailed'  => '[抱歉,模板$1讀取失敗]',
 'scarytranscludetoolong' => '[抱歉,URL 地址太長]',
 
 # Delete conflict
 'confirmrecreate' => '在您編輯這個頁面後,使用者[[User:$1|$1]]([[User talk:$1|對話]])以下列原因刪除了這個頁面: $2。請在重新建立頁面前三思。',
 
 # Auto-summaries
-'autosumm-blank' => '移除所有頁面內容',
+'autosumm-blank'   => '移除所有頁面內容',
 'autosumm-replace' => "正在將頁面替換為 '$1'",
 'autoredircomment' => '正在重定向到 [[$1]]',
-'autosumm-new' => '新頁面: $1',
+'autosumm-new'     => '新頁面: $1',
 
 # Live preview
 'livepreview-failed' => '即時預覽失敗! 嘗試標準預覽。',
 
 # Special:Version
-'version-parserhooks' => '語法鉤',
-'version-hooks' => '鉤',
+'version-parserhooks'           => '語法鉤',
+'version-hooks'                 => '鉤',
 'version-parser-function-hooks' => '語法函數鉤',
-'version-hook-name' => '鉤名',
+'version-hook-name'             => '鉤名',
 
 # Special:SpecialPages
 'specialpages' => '特殊頁面',
 
-# Special:ExpandTemplates
-'expandtemplates' => '展開模板',
-'expand_templates_intro' => '本特殊頁面用於將一些文字中的模版展開,包括模版中引用的模版。同時也展開解譯器函數如<nowiki> {{</nowiki>#language:...}},以及變數如<nowiki>{{< /nowiki>CURRENTDAY}}&mdash;實際上,幾乎所有在雙括弧中的內容都被展開。本特殊頁面是通過使用 MediaWiki的相關解釋階段的功能完成的。',
-'expand_templates_title' => '上下文標題,用於 {{FULLPAGENAME}} 等:',
-'expand_templates_input' => '輸入文字:',
-'expand_templates_output' => '結果:',
-'expand_templates_xml_output' => 'XML輸出',
-'expand_templates_ok' => '確定',
-'expand_templates_remove_comments' => '移除註釋',
-'expand_templates_remove_nowiki' => '在結果中隱藏<nowiki>標記',
-'expand_templates_generate_xml' => '顯示XML解析樹',
-'expand_templates_preview' => '預覽',
-
 );
index 2cf277f..1e82dc1 100644 (file)
@@ -37,15 +37,21 @@ class AttachLatest extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->addOption( "fix", "Actually fix the entries, will dry run otherwise" );
+               $this->addOption( "regenerate-all",
+                       "Regenerate the page_latest field for all records in table page" );
                $this->mDescription = "Fix page_latest entries in the page table";
        }
 
        public function execute() {
                $this->output( "Looking for pages with page_latest set to 0...\n" );
                $dbw = wfGetDB( DB_MASTER );
+               $conds = array( 'page_latest' => 0 );
+               if ( $this->hasOption( 'regenerate-all' ) ) {
+                       $conds = '';
+               }
                $result = $dbw->select( 'page',
                        array( 'page_id', 'page_namespace', 'page_title' ),
-                       array( 'page_latest' => 0 ),
+                       $conds,
                        __METHOD__ );
 
                $n = 0;
index 978d44f..2b637cb 100644 (file)
@@ -99,9 +99,6 @@ $maintenance->finalSetup();
 // Some last includes
 require_once "$IP/includes/Setup.php";
 
-// Much much faster startup than creating a title object
-$wgTitle = null;
-
 // Do the work
 try {
        $maintenance->execute();
index dadc84a..c7df6c3 100644 (file)
@@ -42,6 +42,7 @@ if ( count( $args ) < 1 || isset( $options['help'] ) ) {
 
                        echo "\nUsing title '" . $title->getPrefixedText() . "'...";
                        if ( !$title->exists() || !isset( $options['nooverwrite'] ) ) {
+                               RequestContext::getMain()->setTitle( $title );
 
                                $text = file_get_contents( $filename );
                                $user = isset( $options['user'] ) ? $options['user'] : 'Maintenance script';
index d118747..44c117e 100644 (file)
@@ -70,10 +70,9 @@ class CommandLineInstaller extends Maintenance {
        }
 
        function execute() {
-               global $IP, $wgTitle;
+               global $IP;
                $siteName = isset( $this->mArgs[0] ) ? $this->mArgs[0] : "Don't care"; // Will not be set if used with --env-checks
                $adminName = isset( $this->mArgs[1] ) ? $this->mArgs[1] : null;
-               $wgTitle = Title::newFromText( 'Installer script' );
 
                $dbpassfile = $this->getOption( 'dbpassfile', false );
                if ( $dbpassfile !== false ) {
index aa138bd..adaf114 100644 (file)
@@ -10,7 +10,6 @@
                                        "mw.Message",
                                        "mw.loader",
                                        "mw.loader.store",
-                                       "mw.log",
                                        "mw.html",
                                        "mw.html.Cdata",
                                        "mw.html.Raw",
@@ -22,8 +21,6 @@
                                "classes": [
                                        "mw.Title",
                                        "mw.Uri",
-                                       "mw.inspect",
-                                       "mw.inspect.reports",
                                        "mw.notification",
                                        "mw.Notification_",
                                        "mw.user",
                                "classes": [
                                        "mw.Feedback"
                                ]
+                       },
+                       {
+                               "name": "Development",
+                               "classes": [
+                                       "mw.log",
+                                       "mw.inspect",
+                                       "mw.inspect.reports",
+                                       "mw.Debug"
+                               ]
                        }
                ]
        },
index 7326ed2..837c00c 100644 (file)
        "--external": "HTMLElement,HTMLDocument,Window",
        "--": [
                "./external.js",
-               "../../resources/mediawiki/mediawiki.js",
-               "../../resources/mediawiki/mediawiki.htmlform.js",
-               "../../resources/mediawiki/mediawiki.feedback.js",
-               "../../resources/mediawiki/mediawiki.log.js",
-               "../../resources/mediawiki/mediawiki.util.js",
-               "../../resources/mediawiki/mediawiki.Title.js",
-               "../../resources/mediawiki/mediawiki.Uri.js",
-               "../../resources/mediawiki/mediawiki.inspect.js",
-               "../../resources/mediawiki/mediawiki.jqueryMsg.js",
-               "../../resources/mediawiki/mediawiki.notify.js",
-               "../../resources/mediawiki/mediawiki.notification.js",
-               "../../resources/mediawiki/mediawiki.user.js",
+               "../../resources/mediawiki",
                "../../resources/mediawiki.action/mediawiki.action.edit.js",
                "../../resources/mediawiki.action/mediawiki.action.view.postEdit.js",
                "../../resources/mediawiki.page/mediawiki.page.startup.js",
index 46b0362..5502772 100644 (file)
@@ -279,7 +279,6 @@ $wgOptionalMessages = array(
        'feed-rss',
        'unit-pixel',
        'userrights-irreversible-marker',
-       'tog-noconvertlink',
        'variantname-zh-hans',
        'variantname-zh-hant',
        'variantname-zh-cn',
@@ -498,7 +497,6 @@ $wgOptionalMessages = array(
        'limitreport-expensivefunctioncount-value',
        'interlanguage-link-title',
        'img-lang-opt',
-       'quotation-marks',
        'recentchanges-legend-plusminus',
 );
 
index eab6cf6..c11d6aa 100644 (file)
@@ -63,7 +63,6 @@ $wgMessageStructure = array(
                'tog-ccmeonemails',
                'tog-diffonly',
                'tog-showhiddencats',
-               'tog-noconvertlink',
                'tog-norollbackdiff',
                'tog-useeditwarning',
                'tog-prefershttps'
@@ -559,6 +558,7 @@ $wgMessageStructure = array(
                'suspicious-userlogout',
                'createacct-another-realname-tip',
                'pt-login',
+               'pt-login-button',
                'pt-createaccount',
                'pt-userlogout',
        ),
@@ -810,6 +810,7 @@ $wgMessageStructure = array(
                'cantcreateaccounttitle',
                'cantcreateaccount-text',
                'cantcreateaccount-range-text',
+               'createaccount-hook-aborted',
        ),
        'history' => array(
                'viewpagelogs',
@@ -1326,11 +1327,23 @@ $wgMessageStructure = array(
                'rcnotefrom',
                'rclistfrom',
                'rcshowhideminor',
+               'rcshowhideminor-show',
+               'rcshowhideminor-hide',
                'rcshowhidebots',
+               'rcshowhidebots-show',
+               'rcshowhidebots-hide',
                'rcshowhideliu',
+               'rcshowhideliu-show',
+               'rcshowhideliu-hide',
                'rcshowhideanons',
+               'rcshowhideanons-show',
+               'rcshowhideanons-hide',
                'rcshowhidepatr',
+               'rcshowhidepatr-show',
+               'rcshowhidepatr-hide',
                'rcshowhidemine',
+               'rcshowhidemine-show',
+               'rcshowhidemine-hide',
                'rclinks',
                'diff',
                'hist',
@@ -1436,6 +1449,8 @@ $wgMessageStructure = array(
                'uploaddisabledtext',
                'php-uploaddisabledtext',
                'uploadscripted',
+               'uploadscriptednamespace',
+               'uploadinvalidxml',
                'uploadvirus',
                'uploadjava',
                'upload-source',
@@ -2239,8 +2254,10 @@ $wgMessageStructure = array(
                'sp-contributions-blocked-notice',
                'sp-contributions-blocked-notice-anon',
                'sp-contributions-search',
+               'sp-contributions-suppresslog',
                'sp-contributions-username',
                'sp-contributions-toponly',
+               'sp-contributions-newonly',
                'sp-contributions-submit',
                'sp-contributions-explain',
                'sp-contributions-footer',
index ff02468..95d2c08 100644 (file)
@@ -50,10 +50,7 @@ class NamespaceConflictChecker extends Maintenance {
        }
 
        public function execute() {
-               global $wgTitle;
-
                $this->db = wfGetDB( DB_MASTER );
-               $wgTitle = Title::newFromText( 'Namespace title conflict cleanup script' );
 
                $fix = $this->hasOption( 'fix' );
                $suffix = $this->getOption( 'suffix', '' );
diff --git a/maintenance/oracle/archives/patch-user_password_expire.sql b/maintenance/oracle/archives/patch-user_password_expire.sql
new file mode 100644 (file)
index 0000000..8e752da
--- /dev/null
@@ -0,0 +1,3 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.mwuser ADD user_password_expires TIMESTAMP(6) WITH TIME ZONE NULL DEFAULT NULL;
index b4d255a..b856baf 100644 (file)
@@ -47,8 +47,6 @@ class Orphans extends Maintenance {
        }
 
        public function execute() {
-               global $wgTitle;
-               $wgTitle = Title::newFromText( 'Orphan revision cleanup script' );
                $this->checkOrphans( $this->hasOption( 'fix' ) );
                $this->checkSeparation( $this->hasOption( 'fix' ) );
                # Does not work yet, do not use
index e482141..266cb3b 100644 (file)
@@ -12,18 +12,23 @@ SET client_min_messages = 'ERROR';
 DROP SEQUENCE IF EXISTS user_user_id_seq CASCADE;
 DROP SEQUENCE IF EXISTS page_page_id_seq CASCADE;
 DROP SEQUENCE IF EXISTS revision_rev_id_seq CASCADE;
-DROP SEQUENCE IF EXISTS page_restrictions_id_seq CASCADE;
+DROP SEQUENCE IF EXISTS text_old_id_seq CASCADE;
+DROP SEQUENCE IF EXISTS page_restrictions_pr_id_seq CASCADE;
 DROP SEQUENCE IF EXISTS ipblocks_ipb_id_seq CASCADE;
+DROP SEQUENCE IF EXISTS filearchive_fa_id_seq CASCADE;
+DROP SEQUENCE IF EXISTS uploadstash_us_id_seq CASCADE;
 DROP SEQUENCE IF EXISTS recentchanges_rc_id_seq CASCADE;
 DROP SEQUENCE IF EXISTS logging_log_id_seq CASCADE;
 DROP SEQUENCE IF EXISTS job_job_id_seq CASCADE;
 DROP SEQUENCE IF EXISTS category_cat_id_seq CASCADE;
 DROP SEQUENCE IF EXISTS archive_ar_id_seq CASCADE;
 DROP SEQUENCE IF EXISTS externallinks_el_id_seq CASCADE;
+DROP SEQUENCE IF EXISTS sites_site_id_seq CASCADE;
 DROP FUNCTION IF EXISTS page_deleted() CASCADE;
 DROP FUNCTION IF EXISTS ts2_page_title() CASCADE;
 DROP FUNCTION IF EXISTS ts2_page_text() CASCADE;
 DROP FUNCTION IF EXISTS add_interwiki(TEXT,INT,SMALLINT) CASCADE;
+DROP TYPE IF EXISTS media_type CASCADE;
 
 CREATE SEQUENCE user_user_id_seq MINVALUE 0 START WITH 0;
 CREATE TABLE mwuser ( -- replace reserved word 'user'
index 12ed9fa..6ce54b9 100644 (file)
@@ -49,7 +49,7 @@ class RebuildFileCache extends Maintenance {
 
        public function execute() {
                global $wgUseFileCache, $wgReadOnly, $wgContentNamespaces, $wgRequestTime;
-               global $wgTitle, $wgOut;
+               global $wgOut;
                if ( !$wgUseFileCache ) {
                        $this->error( "Nothing to do -- \$wgUseFileCache is disabled.", true );
                }
@@ -104,22 +104,22 @@ class RebuildFileCache extends Maintenance {
                                $rebuilt = false;
                                $wgRequestTime = microtime( true ); # bug 22852
 
-                               $wgTitle = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
-                               if ( null == $wgTitle ) {
+                               $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
+                               if ( null == $title ) {
                                        $this->output( "Page {$row->page_id} has bad title\n" );
                                        continue; // broken title?
                                }
 
                                $context = new RequestContext;
-                               $context->setTitle( $wgTitle );
-                               $article = Article::newFromTitle( $wgTitle, $context );
+                               $context->setTitle( $title );
+                               $article = Article::newFromTitle( $title, $context );
                                $context->setWikiPage( $article->getPage() );
 
                                $wgOut = $context->getOutput(); // set display title
 
                                // If the article is cacheable, then load it
                                if ( $article->isFileCacheable() ) {
-                                       $cache = HTMLFileCache::newFromTitle( $wgTitle, 'view' );
+                                       $cache = HTMLFileCache::newFromTitle( $title, 'view' );
                                        if ( $cache->isCacheGood() ) {
                                                if ( $overwrite ) {
                                                        $rebuilt = true;
@@ -151,11 +151,6 @@ class RebuildFileCache extends Maintenance {
                        $blockEnd += $this->mBatchSize;
                }
                $this->output( "Done!\n" );
-
-               // Remove these to be safe
-               if ( isset( $wgTitle ) ) {
-                       unset( $wgTitle );
-               }
        }
 }
 
index c651f72..722db26 100644 (file)
@@ -50,8 +50,6 @@ class RebuildTextIndex extends Maintenance {
        }
 
        public function execute() {
-               global $wgTitle;
-
                // Shouldn't be needed for Postgres
                $this->db = wfGetDB( DB_MASTER );
                if ( $this->db->getType() == 'postgres' ) {
@@ -68,8 +66,6 @@ class RebuildTextIndex extends Maintenance {
                        }
                }
 
-               $wgTitle = Title::newFromText( "Rebuild text index script" );
-
                if ( $this->db->getType() == 'mysql' ) {
                        $this->dropMysqlTextIndex();
                        $this->populateSearchIndex();
index 7c896d2..f7d5fc0 100644 (file)
@@ -47,8 +47,6 @@ class RunJobs extends Maintenance {
        }
 
        public function execute() {
-               global $wgTitle;
-
                if ( wfReadOnly() ) {
                        $this->error( "Unable to run jobs; the wiki is in read-only mode.", 1 ); // die
                }
@@ -69,7 +67,6 @@ class RunJobs extends Maintenance {
                $maxJobs = $this->getOption( 'maxjobs', false );
                $maxTime = $this->getOption( 'maxtime', false );
                $startTime = time();
-               $wgTitle = Title::newFromText( 'RunJobs.php' );
 
                $group = JobQueueGroup::singleton();
                // Handle any required periodic queue maintenance
index 9168d6f..854910f 100644 (file)
@@ -46,16 +46,6 @@ class ShowCacheStats extends Maintenance {
                if ( get_class( $wgMemc ) == 'EmptyBagOStuff' ) {
                        $this->error( "You are running EmptyBagOStuff, I can not provide any statistics.", true );
                }
-               $session = intval( $wgMemc->get( wfMemcKey( 'stats', 'request_with_session' ) ) );
-               $noSession = intval( $wgMemc->get( wfMemcKey( 'stats', 'request_without_session' ) ) );
-               $total = $session + $noSession;
-               if ( $total == 0 ) {
-                       $this->error( "You either have no stats or the cache isn't running. Aborting.", true );
-               }
-               $this->output( "Requests\n" );
-               $this->output( sprintf( "with session:      %-10d %6.2f%%\n", $session, $session / $total * 100 ) );
-               $this->output( sprintf( "without session:   %-10d %6.2f%%\n", $noSession, $noSession / $total * 100 ) );
-               $this->output( sprintf( "total:             %-10d %6.2f%%\n", $total, 100 ) );
 
                $this->output( "\nParser cache\n" );
                $hits = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_hit' ) ) );
index 85364ee..8c1ad17 100644 (file)
@@ -83,7 +83,7 @@ class UpdateMediaWiki extends Maintenance {
        }
 
        function execute() {
-               global $wgVersion, $wgTitle, $wgLang, $wgAllowSchemaUpdates;
+               global $wgVersion, $wgLang, $wgAllowSchemaUpdates;
 
                if ( !$wgAllowSchemaUpdates && !( $this->hasOption( 'force' ) || $this->hasOption( 'schema' ) || $this->hasOption( 'noschema' ) ) ) {
                        $this->error( "Do not run update.php on this wiki. If you're seeing this you should\n"
@@ -106,7 +106,6 @@ class UpdateMediaWiki extends Maintenance {
                }
 
                $wgLang = Language::factory( 'en' );
-               $wgTitle = Title::newFromText( "MediaWiki database updater" );
 
                define( 'MW_UPDATER', true );
 
index 52b9aa0..49b8fda 100644 (file)
@@ -759,7 +759,7 @@ return array(
        ),
        'mediawiki.debug' => array(
                'scripts' => 'resources/mediawiki/mediawiki.debug.js',
-               'styles' => 'resources/mediawiki/mediawiki.debug.css',
+               'styles' => 'resources/mediawiki/mediawiki.debug.less',
                'dependencies' => 'jquery.footHovzer',
                'position' => 'bottom',
        ),
@@ -1249,9 +1249,16 @@ return array(
        'mediawiki.special.userlogin.signup.js' => array(
                'scripts' => 'resources/mediawiki.special/mediawiki.special.userlogin.signup.js',
                'messages' => array(
+                       'createacct-error',
                        'createacct-emailrequired',
+                       'noname',
+                       'userexists',
+               ),
+               'dependencies' => array(
+                       'mediawiki.api',
+                       'mediawiki.jqueryMsg',
+                       'jquery.throttle-debounce',
                ),
-               'dependencies' => 'mediawiki.jqueryMsg',
        ),
        'mediawiki.special.javaScriptTest' => array(
                'scripts' => 'resources/mediawiki.special/mediawiki.special.javaScriptTest.js',
@@ -1369,10 +1376,15 @@ return array(
                'styles' => array(
                        'resources/oojs-ui/oojs-ui.svg.css',
                ),
+               'skinStyles' => array(
+                       'default' => 'resources/oojs-ui/oojs-ui-apex.css',
+                       'minerva' => array(),
+               ),
                'messages' => array(
                        'ooui-dialog-action-close',
                        'ooui-outline-control-move-down',
                        'ooui-outline-control-move-up',
+                       'ooui-outline-control-remove',
                        'ooui-toolbar-more',
                ),
                'dependencies' => array(
index 4c6a7ac..6689b7c 100644 (file)
@@ -20,7 +20,7 @@
                 *
                 * @param {Object} nav An object with atleast a 'userAgent' and 'platform' key.
                 * Defaults to the global Navigator object.
-                * @returns {Object} The resulting client object will be in the following format:
+                * @return {Object} The resulting client object will be in the following format:
                 *  {
                 *   'name': 'firefox',
                 *   'layout': 'gecko',
                 * @param {boolean} [exactMatchOnly=false] Only return true if the browser is matched, otherwise
                 * returns true if the browser is not found.
                 *
-                * @returns {boolean} The current browser is in the support map
+                * @return {boolean} The current browser is in the support map
                 */
                test: function ( map, profile, exactMatchOnly ) {
                        /*jshint evil: true */
index 8bc45c9..04f8047 100644 (file)
@@ -14,7 +14,7 @@
                var color;
 
                do {
-                       color = $.curCSS( elem, attr );
+                       color = $.css( elem, attr );
 
                        // Keep going until we find an element that has color, or we hit the body
                        if ( color !== '' && color !== 'transparent' || $.nodeName( elem, 'body' ) ) {
                'outlineColor'
        ], function ( i, attr ) {
                $.fx.step[attr] = function ( fx ) {
-                       if ( fx.state === 0 ) {
+                       if ( !fx.colorInit ) {
                                fx.start = getColor( fx.elem, attr );
                                fx.end = $.colorUtil.getRGB( fx.end );
+                               fx.colorInit = true;
                        }
 
                        fx.elem.style[attr] = 'rgb(' + [
index 70bfc4e..eb29db9 100644 (file)
@@ -16,8 +16,7 @@
  *
  * Uses window.devicePixelRatio if available, or CSS media queries on IE.
  *
- * @method
- * @returns {number} Device pixel ratio
+ * @return {number} Device pixel ratio
  */
 $.devicePixelRatio = function () {
        if ( window.devicePixelRatio !== undefined ) {
@@ -51,8 +50,7 @@ $.devicePixelRatio = function () {
  * Implement responsive images based on srcset attributes, if browser has no
  * native srcset support.
  *
- * @method
- * @returns {jQuery} This selection
+ * @return {jQuery} This selection
  */
 $.fn.hidpi = function () {
        var $target = this,
@@ -81,11 +79,11 @@ $.fn.hidpi = function () {
 /**
  * Match a srcset entry for the given device pixel ratio
  *
+ * Exposed for testing.
+ *
  * @param {number} devicePixelRatio
  * @param {string} srcset
  * @return {mixed} null or the matching src string
- *
- * Exposed for testing.
  */
 $.matchSrcSet = function ( devicePixelRatio, srcset ) {
        var candidates,
index d9a2b19..e0d9de2 100644 (file)
@@ -9,7 +9,7 @@
  *
  * @param {Object} options
  * @param {string} key
- * @returns {string} Localized message
+ * @return {string} Localized message
  */
 function msg( options, key ) {
        var args = options.params[key] || [];
index b3d7bb3..f9ee268 100644 (file)
        function buildHeaders( table, msg ) {
                var maxSeen = 0,
                        colspanOffset = 0,
-                       longest,
                        columns,
                        i,
                        $tableHeaders = $( [] ),
                if ( $tableRows.length <= 1 ) {
                        $tableHeaders = $tableRows.children( 'th' );
                } else {
-                       // We need to find the cells of the row containing the most columns
                        var rowspan,
-                               headersIndex = [];
-                       $tableRows.each( function ( rowIndex ) {
-                               $.each( this.cells, function( index2, cell ) {
+                               colspan,
+                               headerCount,
+                               longestTR,
+                               matrixRowIndex,
+                               matrixColumnIndex,
+                               exploded = [];
+
+                       // Loop through all the dom cells of the thead
+                       $tableRows.each( function ( rowIndex, row ) {
+                               $.each( row.cells, function( columnIndex, cell ) {
                                        rowspan = Number( cell.rowSpan );
-                                       for ( i = 0; i < rowspan; i++ ) {
-                                               if ( headersIndex[rowIndex+i] === undefined ) {
-                                                       headersIndex[rowIndex+i] = $( [] );
+                                       colspan = Number( cell.colSpan );
+
+                                       // Skip the spots in the exploded matrix that are already filled
+                                       while ( exploded[rowIndex] && exploded[rowIndex][columnIndex] !== undefined ) {
+                                               ++columnIndex;
+                                       }
+
+                                       // Find the actual dimensions of the thead, by placing each cell
+                                       // in the exploded matrix rowspan times colspan times, with the proper offsets
+                                       for ( matrixColumnIndex = columnIndex; matrixColumnIndex < columnIndex + colspan; ++matrixColumnIndex ) {
+                                               for ( matrixRowIndex = rowIndex; matrixRowIndex < rowIndex + rowspan; ++matrixRowIndex ) {
+                                                       if ( !exploded[matrixRowIndex] ) {
+                                                               exploded[matrixRowIndex] = [];
+                                                       }
+                                                       exploded[matrixRowIndex][matrixColumnIndex] = cell;
                                                }
-                                               headersIndex[rowIndex+i].push( cell );
                                        }
                                } );
                        } );
-                       $.each( headersIndex, function ( index, cellArray ) {
-                               if ( cellArray.length >= maxSeen ) {
-                                       maxSeen = cellArray.length;
-                                       longest = index;
+                       // We want to find the row that has the most columns (ignoring colspan)
+                       $.each( exploded, function ( index, cellArray ) {
+                               headerCount = $.unique( $(cellArray) ).length;
+                               if ( headerCount >= maxSeen ) {
+                                       maxSeen = headerCount;
+                                       longestTR = index;
                                }
                        } );
-                       $tableHeaders = headersIndex[longest];
+                       // We cannot use $.unique() here because it sorts into dom order, which is undesirable
+                       $tableHeaders = $( uniqueElements( exploded[longestTR] ) );
                }
 
                // as each header can span over multiple columns (using colspan=N),
                return false;
        }
 
+
+       function uniqueElements( array ) {
+               var uniques = [];
+               $.each( array, function( index, elem ) {
+                       if ( elem !== undefined && $.inArray( elem, uniques ) === -1 ) {
+                               uniques.push( elem );
+                       }
+               } );
+               return uniques;
+       }
+
        function setHeadersCss( table, $headers, list, css, msg, columnToHeader ) {
                // Remove all header information and reset titles to default message
                $headers.removeClass( css[0] ).removeClass( css[1] ).attr( 'title', msg[1] );
index d61c1c6..57eda3d 100644 (file)
@@ -3,6 +3,7 @@
  */
 ( function ( mw, $ ) {
 
+       var msg = 'Use of mediawiki.api callback params is deprecated. Use the Promise instead.';
        $.extend( mw.Api.prototype, {
                /**
                 * Determine if a category exists.
                                apiPromise;
 
                        // Backwards compatibility (< MW 1.20)
-                       d.done( ok ).fail( err );
+                       if ( ok || err ) {
+                               mw.track( 'mw.deprecate', 'api.cbParam' );
+                               mw.log.warn( msg );
+                               d.done( ok ).fail( err );
+                       }
 
                        apiPromise = this.get( {
                                        prop: 'categoryinfo',
                                apiPromise;
 
                        // Backwards compatibility (< MW 1.20)
-                       d.done( ok ).fail( err );
+                       if ( ok || err ) {
+                               mw.track( 'mw.deprecate', 'api.cbParam' );
+                               mw.log.warn( msg );
+                               d.done( ok ).fail( err );
+                       }
 
                        // Fetch with allpages to only get categories that have a corresponding description page.
                        apiPromise = this.get( {
                                apiPromise;
 
                        // Backwards compatibility (< MW 1.20)
-                       d.done( ok ).fail( err );
+                       if ( ok || err ) {
+                               mw.track( 'mw.deprecate', 'api.cbParam' );
+                               mw.log.warn( msg );
+                               d.done( ok ).fail( err );
+                       }
 
                        apiPromise = this.get( {
                                        prop: 'categories',
index cc83a4b..91d9b8f 100644 (file)
@@ -3,6 +3,7 @@
  */
 ( function ( mw, $ ) {
 
+       var msg = 'Use of mediawiki.api callback params is deprecated. Use the Promise instead.';
        $.extend( mw.Api.prototype, {
 
                /**
                 * @return {jQuery.Promise} See #post
                 */
                postWithEditToken: function ( params, ok, err ) {
+                       if ( ok || err ) {
+                               mw.track( 'mw.deprecate', 'api.cbParam' );
+                               mw.log.warn( msg );
+                       }
                        return this.postWithToken( 'edit', params ).done( ok ).fail( err );
                },
 
                /**
                 * Api helper to grab an edit token.
                 *
-                * @param {Function} [ok] Success callback
-                * @param {Function} [err] Error callback
+                * @param {Function} [ok] Success callback (deprecated)
+                * @param {Function} [err] Error callback (deprecated)
                 * @return {jQuery.Promise}
                 * @return {Function} return.done
                 * @return {string} return.done.token Received token.
                 */
                getEditToken: function ( ok, err ) {
+                       if ( ok || err ) {
+                               mw.track( 'mw.deprecate', 'api.cbParam' );
+                               mw.log.warn( msg );
+                       }
                        return this.getToken( 'edit' ).done( ok ).fail( err );
                },
 
                 * @param {mw.Title|String} title Target page
                 * @param {string} header
                 * @param {string} message wikitext message
-                * @param {Function} [ok] Success handler
-                * @param {Function} [err] Error handler
+                * @param {Function} [ok] Success handler (deprecated)
+                * @param {Function} [err] Error handler (deprecated)
                 * @return {jQuery.Promise}
                 */
                newSection: function ( title, header, message, ok, err ) {
+                       if ( ok || err ) {
+                               mw.track( 'mw.deprecate', 'api.cbParam' );
+                               mw.log.warn( msg );
+                       }
                        return this.postWithEditToken( {
                                action: 'edit',
                                section: 'new',
@@ -50,7 +63,7 @@
                                title: title.toString(),
                                summary: header,
                                text: message
-                       }, ok, err );
+                       } ).done( ok ).fail( err );
                }
        } );
 
index 3032f78..7490862 100644 (file)
                ajax: function ( parameters, ajaxOptions ) {
                        var token,
                                apiDeferred = $.Deferred(),
+                               msg = 'Use of mediawiki.api callback params is deprecated. Use the Promise instead.',
                                xhr;
 
                        parameters = $.extend( {}, this.defaults.parameters, parameters );
                        // Backwards compatibility: Before MediaWiki 1.20,
                        // callbacks were done with the 'ok' and 'err' property in ajaxOptions.
                        if ( ajaxOptions.ok ) {
+                               mw.track( 'mw.deprecate', 'api.cbParam' );
+                               mw.log.warn( msg );
                                apiDeferred.done( ajaxOptions.ok );
                                delete ajaxOptions.ok;
                        }
                        if ( ajaxOptions.err ) {
+                               mw.track( 'mw.deprecate', 'api.cbParam' );
+                               mw.log.warn( msg );
                                apiDeferred.fail( ajaxOptions.err );
                                delete ajaxOptions.err;
                        }
                        apiPromise = this.get( {
                                        action: 'tokens',
                                        type: type
-                               }, {
-                                       // Due to the API assuming we're logged out if we pass the callback-parameter,
-                                       // we have to disable jQuery's callback system, and instead parse JSON string,
-                                       // by setting 'jsonp' to false.
-                                       // TODO: This concern seems genuine but no other module has it. Is it still
-                                       // needed and/or should we pass this by default?
                                } )
                                .done( function ( data ) {
                                        // If token type is not available for this user,
index c4d23b8..1c04b17 100644 (file)
                                apiPromise;
 
                        // Backwards compatibility (< MW 1.20)
-                       d.done( ok ).fail( err );
+                       if ( ok || err ) {
+                               mw.track( 'mw.deprecate', 'api.cbParam' );
+                               mw.log.warn( 'Use of mediawiki.api callback params is deprecated. Use the Promise instead.' );
+                               d.done( ok ).fail( err );
+                       }
 
                        apiPromise = this.get( {
                                        action: 'parse',
index 49a4c62..653c90a 100644 (file)
@@ -8,29 +8,37 @@
         * @private
         * @context mw.Api
         *
-        * @param {String|mw.Title} page Full page name or instance of mw.Title
+        * @param {string|mw.Title|string[]|mw.Title[]} pages Full page name or instance of mw.Title, or an
+        *  array thereof. If an array is passed, the return value passed to the promise will also be an
+        *  array of appropriate objects.
         * @param {Function} [ok] Success callback (deprecated)
         * @param {Function} [err] Error callback (deprecated)
         * @return {jQuery.Promise}
         * @return {Function} return.done
-        * @return {Object} return.done.watch
+        * @return {Object|Object[]} return.done.watch Object or list of objects (depends on the `pages`
+        *  parameter)
         * @return {string} return.done.watch.title Full pagename
-        * @return {boolean} return.done.watch.watched
+        * @return {boolean} return.done.watch.watched Whether the page is now watched or unwatched
         * @return {string} return.done.watch.message Parsed HTML of the confirmational interface message
         */
-       function doWatchInternal( page, ok, err, addParams ) {
-               var params,
-                       d = $.Deferred(),
-                       apiPromise;
+       function doWatchInternal( pages, ok, err, addParams ) {
+               // XXX: Parameter addParams is undocumented because we inherit this
+               // documentation in the public method..
+               var params, apiPromise,
+                       d = $.Deferred();
 
                // Backwards compatibility (< MW 1.20)
-               d.done( ok ).fail( err );
+               if ( ok || err ) {
+                       mw.track( 'mw.deprecate', 'api.cbParam' );
+                       mw.log.warn( 'Use of mediawiki.api callback params is deprecated. Use the Promise instead.' );
+                       d.done( ok ).fail( err );
+               }
 
                params = {
                        action: 'watch',
-                       title: String( page ),
                        token: mw.user.tokens.get( 'watchToken' ),
-                       uselang: mw.config.get( 'wgUserLanguage' )
+                       uselang: mw.config.get( 'wgUserLanguage' ),
+                       titles: $.isArray( pages ) ? pages.join( '|' ) : String( pages )
                };
 
                if ( addParams ) {
@@ -39,7 +47,8 @@
 
                apiPromise = this.post( params )
                        .done( function ( data ) {
-                               d.resolve( data.watch );
+                               // If a single page was given (not an array) respond with a single item as well.
+                               d.resolve( $.isArray( pages ) ? data.watch : data.watch[0] );
                        } )
                        .fail( d.reject );
 
                 *
                 * @inheritdoc #doWatchInternal
                 */
-               watch: function ( page, ok, err ) {
-                       return doWatchInternal.call( this, page, ok, err );
+               watch: function ( pages, ok, err ) {
+                       return doWatchInternal.call( this, pages, ok, err );
                },
                /**
                 * Convenience method for `action=watch&unwatch=1`.
                 *
                 * @inheritdoc #doWatchInternal
                 */
-               unwatch: function ( page, ok, err ) {
-                       return doWatchInternal.call( this, page, ok, err, { unwatch: 1 } );
+               unwatch: function ( pages, ok, err ) {
+                       return doWatchInternal.call( this, pages, ok, err, { unwatch: 1 } );
                }
 
        } );
diff --git a/resources/mediawiki.less/mediawiki.mixins.animation.less b/resources/mediawiki.less/mediawiki.mixins.animation.less
new file mode 100644 (file)
index 0000000..ec3cddc
--- /dev/null
@@ -0,0 +1,12 @@
+.animation (...) {
+       -webkit-animation: @arguments;
+       -moz-animation: @arguments;
+       -o-animation: @arguments;
+       animation: @arguments;
+}
+
+.transform-rotate (@deg) {
+       -webkit-transform: rotate(@deg);
+       -moz-transform: rotate(@deg);
+       transform: rotate(@deg);
+}
\ No newline at end of file
index 82de5de..e28b333 100644 (file)
@@ -1,31 +1,33 @@
 // This is a separate file because importing the mixin causes
 // the keyframes blocks to be included in the output, regardless
 // of whether .rotation is used.
-@-webkit-keyframes rotate {
+@import "mediawiki.mixins.animation";
+
+.rotate-frames () {
        from {
-               -webkit-transform:rotate(0deg);
+               .transform-rotate(0deg);
        }
        to {
-               -webkit-transform:rotate(360deg);
+               .transform-rotate(360deg);
        }
 }
 
+@-webkit-keyframes rotate {
+       .rotate-frames;
+}
+
+@-moz-keyframes rotate {
+       .rotate-frames;
+}
+
+@-o-keyframes rotate {
+       .rotate-frames;
+}
+
 @keyframes rotate {
-       from {
-               transform: rotate(0deg);
-       }
-       to {
-               transform: rotate(360deg);
-       }
+       .rotate-frames;
 }
 
-.rotation(@time) {
-       -webkit-animation-name: rotate;
-       -webkit-animation-duration: @time;
-       -webkit-animation-iteration-count: infinite;
-       -webkit-animation-timing-function: linear;
-       animation-name: rotate;
-       animation-duration: @time;
-       animation-iteration-count: infinite;
-       animation-timing-function: linear;
+.rotation( @time ) {
+       .animation(rotate, @time, infinite, linear);
 }
index 3def37c..83c2524 100644 (file)
@@ -45,7 +45,7 @@ function pluralRuleParser(rule, number) {
        */
 
        // we don't evaluate the samples section of the rule. Ignore it.
-       rule = rule.split('@')[0].trim();
+       rule = rule.split('@')[0].replace(/^\s*/, '').replace(/\s*$/, '');
 
        if (!rule.length) {
                // empty rule or 'other' rule.
index 9489403..a491c6a 100644 (file)
@@ -72,7 +72,7 @@
                actionPaths = mw.config.get( 'wgActionPaths' );
 
                // TODO: Does MediaWiki give action path or query param
-               // precedence ? If the former, move this to the bottom
+               // precedence? If the former, move this to the bottom
                action = mw.util.getParamValue( 'action', url );
                if ( action !== null ) {
                        return action;
@@ -81,7 +81,7 @@
                for ( key in actionPaths ) {
                        if ( actionPaths.hasOwnProperty( key ) ) {
                                parts = actionPaths[key].split( '$1' );
-                               for ( i = 0; i < parts.length; i += 1 ) {
+                               for ( i = 0; i < parts.length; i++ ) {
                                        parts[i] = $.escapeRE( parts[i] );
                                }
                                m = new RegExp( parts.join( '(.+)' ) ).exec( url );
                        updateWatchLink( $link, action, 'loading' );
 
                        api = new mw.Api();
-                       api[action]( title )
-                       .done( function ( watchResponse ) {
-                               var otherAction;
 
-                               otherAction = action === 'watch' ? 'unwatch' : 'watch';
+                       api[action]( title )
+                               .done( function ( watchResponse ) {
+                                       var otherAction = action === 'watch' ? 'unwatch' : 'watch';
 
-                               mw.notify( $.parseHTML( watchResponse.message ), {
-                                       tag: 'watch-self'
-                               } );
+                                       mw.notify( $.parseHTML( watchResponse.message ), {
+                                               tag: 'watch-self'
+                                       } );
 
-                               // Set link to opposite
-                               updateWatchLink( $link, otherAction );
+                                       // Set link to opposite
+                                       updateWatchLink( $link, otherAction );
 
-                               // Bug 12395 - update the watch checkbox on edit pages when the
-                               // page is watched or unwatched via the tab.
-                               if ( watchResponse.watched !== undefined ) {
-                                       $( '#wpWatchthis' ).prop( 'checked', true );
-                               } else {
-                                       $( '#wpWatchthis' ).prop( 'checked', false );
-                               }
-                       } )
-                       .fail( function () {
-                               var cleanTitle, msg, link;
-
-                               // Reset link to non-loading mode
-                               updateWatchLink( $link, action );
-
-                               // Format error message
-                               cleanTitle = title.replace( /_/g, ' ' );
-                               link = mw.html.element(
-                                       'a', {
-                                               href: mw.util.getUrl( title ),
-                                               title: cleanTitle
-                                       }, cleanTitle
-                               );
-                               msg = mw.message( 'watcherrortext', link );
-
-                               // Report to user about the error
-                               mw.notify( msg, { tag: 'watch-self' } );
-                       } );
+                                       // Update the "Watch this page" checkbox on action=edit when the
+                                       // page is watched or unwatched via the tab (bug 12395).
+                                       $( '#wpWatchthis' ).prop( 'checked', watchResponse.watched !== undefined );
+                               } )
+                               .fail( function () {
+                                       var cleanTitle, msg, link;
+
+                                       // Reset link to non-loading mode
+                                       updateWatchLink( $link, action );
+
+                                       // Format error message
+                                       cleanTitle = title.replace( /_/g, ' ' );
+                                       link = mw.html.element(
+                                               'a', {
+                                                       href: mw.util.getUrl( title ),
+                                                       title: cleanTitle
+                                               }, cleanTitle
+                                       );
+                                       msg = mw.message( 'watcherrortext', link );
+
+                                       // Report to user about the error
+                                       mw.notify( msg, { tag: 'watch-self' } );
+                               } );
                } );
        } );
 
index ee4fc06..a877b74 100644 (file)
@@ -66,7 +66,8 @@ table.mw-listgrouprights-table tr {
 }
 
 /**** Special:Prefixindex ****/
-table#mw-prefixindex-list-table,
+table#mw-prefixindex-list-table, /* HTML backwards-compatibility, to be removed before 1.23 */
+table.mw-prefixindex-list-table,
 table#mw-prefixindex-nav-table {
        width: 98%;
 }
index c293f65..0615932 100644 (file)
@@ -3,7 +3,7 @@
  */
 ( function ( mw, $ ) {
        // When sending password by email, hide the password input fields.
-       function hidePasswordOnEmail() {
+       $( function () {
                // Always required if checked, otherwise it depends, so we use the original
                var $emailLabel = $( 'label[for="wpEmail"]' ),
                        originalText = $emailLabel.text(),
 
                $createByMailCheckbox.on( 'change', updateForCheckbox );
                updateForCheckbox();
-       }
+       } );
 
-       $( hidePasswordOnEmail );
+       // Check if the username is invalid or already taken
+       $( function () {
+               var
+                       // We need to hook to all of these events to be sure we are notified of all changes to the
+                       // value of an <input type=text> field.
+                       events = 'keyup keydown change mouseup cut paste focus blur',
+                       $input = $( '#wpName2' ),
+                       $statusContainer = $( '#mw-createacct-status-area' ),
+                       api = new mw.Api(),
+                       currentRequest;
+
+               // Hide any present status messages.
+               function clearStatus() {
+                       $statusContainer.slideUp( function () {
+                               $statusContainer
+                                       .removeAttr( 'class' )
+                                       .empty();
+                       } );
+               }
+
+               // Returns a promise receiving a { state:, username: } object, where:
+               // * 'state' is one of 'invalid', 'taken', 'ok'
+               // * 'username' is the validated username if 'state' is 'ok', null otherwise (if it's not
+               //   possible to register such an account)
+               function checkUsername( username ) {
+                       // We could just use .then() if we didn't have to pass on .abort()…
+                       var d, apiPromise;
+
+                       d = $.Deferred();
+                       apiPromise = api.get( {
+                               action: 'query',
+                               list: 'users',
+                               ususers: username // '|' in usernames is handled below
+                       } )
+                               .done( function ( resp ) {
+                                       var userinfo = resp.query.users[0];
+
+                                       if ( resp.query.users.length !== 1 ) {
+                                               // Happens if the user types '|' into the field
+                                               d.resolve( { state: 'invalid', username: null } );
+                                       } else if ( userinfo.invalid !== undefined ) {
+                                               d.resolve( { state: 'invalid', username: null } );
+                                       } else if ( userinfo.userid !== undefined ) {
+                                               d.resolve( { state: 'taken', username: null } );
+                                       } else {
+                                               d.resolve( { state: 'ok', username: username } );
+                                       }
+                               } )
+                               .fail( d.reject );
+
+                       return d.promise( { abort: apiPromise.abort } );
+               }
+
+               function updateUsernameStatus() {
+                       var
+                               username = $.trim( $input.val() ),
+                               currentRequestInternal;
+
+                       // Abort any pending requests.
+                       if ( currentRequest ) {
+                               currentRequest.abort();
+                       }
+
+                       if ( username === '' ) {
+                               clearStatus();
+                               return;
+                       }
+
+                       currentRequest = currentRequestInternal = checkUsername( username ).done( function ( info ) {
+                               var message;
+
+                               // Another request was fired in the meantime, the result we got here is no longer current.
+                               // This shouldn't happen as we abort pending requests, but you never know.
+                               if ( currentRequest !== currentRequestInternal ) {
+                                       return;
+                               }
+                               // If we're here, then the current request has finished, avoid calling .abort() needlessly.
+                               currentRequest = undefined;
+
+                               if ( info.state === 'ok' ) {
+                                       clearStatus();
+                               } else {
+                                       if ( info.state === 'invalid' ) {
+                                               message = mw.message( 'noname' ).text();
+                                       } else if ( info.state === 'taken' ) {
+                                               message = mw.message( 'userexists' ).text();
+                                       }
+
+                                       $statusContainer
+                                               .attr( 'class', 'errorbox' )
+                                               .empty()
+                                               .append(
+                                                       // Ugh…
+                                                       // @todo Change the HTML structure in includes/templates/Usercreate.php
+                                                       $( '<strong>' ).text( mw.message( 'createacct-error' ).text() ),
+                                                       $( '<br>' ),
+                                                       document.createTextNode( message )
+                                               )
+                                               .slideDown();
+                               }
+                       } ).fail( function () {
+                               clearStatus();
+                       } );
+               }
+
+               $input.on( events, $.debounce( 250, updateUsernameStatus ) );
+       } );
 }( mediaWiki, jQuery ) );
index 66f4487..5c6aa6a 100644 (file)
@@ -66,7 +66,7 @@
                        .box-sizing(border-box);
                        .agora-label-styling();
                        width: auto;
-                       margin: 0 0 0.2em 0;
+                       margin: 0 0 0.2em;
                        padding: 0;
                }
 
        .error {
                .box-sizing(border-box);
                font-size: 0.9em;
-               margin: 0 0 1em 0;
+               margin: 0 0 1em;
                padding: 0.5em;
                color: #cc0000;
                border: 1px solid #fac5c5;
 // XXX DRY: This repeats earlier styling, use an @include agora-div-styling ?
 .mw-ui-vform-div {
        display: block;
-       margin: 0 0 15px 0;
+       margin: 0 0 15px;
        padding: 0;
        width: 100%;
 }
index b32e4e7..20f42a0 100644 (file)
@@ -12,7 +12,7 @@
                        outline: 0; // Removes OS field focus
                }
 
-               box-shadow: @colorProgressiveShadow 0px 0px 5px;
+               box-shadow: @colorProgressiveShadow 0 0 5px;
 
                border-color: @colorProgressiveShadow;
        }
@@ -46,7 +46,7 @@
        & > input[type="radio"] {
                width: auto;
                height: auto;
-               margin: 0 0.1em 0em 0;
+               margin: 0 0.1em 0 0;
                padding: 0;
                border: 1px solid @colorGrayLight;
                cursor: pointer;
diff --git a/resources/mediawiki/mediawiki.debug.css b/resources/mediawiki/mediawiki.debug.css
deleted file mode 100644 (file)
index 513cb84..0000000
+++ /dev/null
@@ -1,183 +0,0 @@
-.mw-debug {
-       width: 100%;
-       background-color: #eee;
-       border-top: 1px solid #aaa;
-}
-
-.mw-debug pre {
-       font-size: 11px;
-       padding: 0;
-       margin: 0;
-       background: none;
-       border: none;
-}
-
-.mw-debug table {
-       border-spacing: 0;
-       width: 100%;
-       table-layout: fixed;
-}
-
-.mw-debug table tr {
-       background-color: #fff;
-}
-
-.mw-debug table tr:nth-child(even) {
-       background-color: #f9f9f9;
-}
-
-.mw-debug table td, .mw-debug table th  {
-       padding: 4px 10px;
-}
-
-.mw-debug table td {
-       border-bottom: 1px solid #eee;
-       word-wrap: break-word;
-}
-
-.mw-debug table td.nr {
-       text-align: right;
-}
-
-.mw-debug table td span.stats {
-       color: #808080;
-}
-
-.mw-debug ul {
-       margin: 0;
-       list-style: none;
-}
-
-.mw-debug li {
-       padding: 4px 0;
-       width: 100%;
-}
-
-.mw-debug-bits {
-       text-align: center;
-       border-bottom: 1px solid #aaa;
-}
-
-.mw-debug-bit {
-       display: inline-block;
-       padding: 10px 5px;
-       font-size: 13px;
-       /* IE-hack for display: inline-block */
-       zoom: 1;
-       *display:inline;
-}
-
-.mw-debug-panelink {
-       background-color: #eee;
-       border-right: 1px solid #ccc;
-}
-
-.mw-debug-panelink:first-child {
-       border-left: 1px solid #ccc;
-}
-
-.mw-debug-panelink:hover {
-       background-color: #fefefe;
-       cursor: pointer;
-}
-.mw-debug-panelink.current {
-       background-color: #dedede;
-
-}
-a.mw-debug-panelabel,
-a.mw-debug-panelabel:visited {
-       color: #000;
-}
-
-.mw-debug-pane {
-       height: 300px;
-       overflow: scroll;
-       display: none;
-       font-size: 11px;
-       background-color: #e1eff2;
-       box-sizing: border-box;
-}
-
-#mw-debug-pane-debuglog,
-#mw-debug-pane-request {
-       padding: 20px;
-}
-
-#mw-debug-pane-request table {
-       width: 100%;
-       margin: 10px 0 30px;
-}
-
-#mw-debug-pane-request tr,
-#mw-debug-pane-request th,
-#mw-debug-pane-request td,
-#mw-debug-pane-request table {
-       border: 1px solid #D0DBB3;
-       border-collapse: collapse;
-       margin: 0;
-}
-
-#mw-debug-pane-request th,
-#mw-debug-pane-request td {
-       font-size: 12px;
-       padding: 8px 10px;
-}
-
-#mw-debug-pane-request th {
-       background-color: #F1F7E2;
-       font-weight: bold;
-}
-
-#mw-debug-pane-request td {
-       background-color: white;
-}
-
-#mw-debug-console tr td:first-child {
-       font-weight: bold;
-       vertical-align: top;
-}
-
-#mw-debug-console tr td:last-child {
-       vertical-align: top;
-}
-
-.mw-debug-console-log {
-       background-color: #add8e6;
-}
-
-.mw-debug-console-warn {
-       background-color: #ffa07a;
-}
-
-.mw-debug-console-deprecated {
-       background-color: #ffb6c1;
-}
-
-.mw-debug-backtrace {
-       padding: 5px 10px;
-       margin: 5px;
-       background-color: #dedede;
-}
-
-.mw-debug-backtrace span {
-       font-weight: bold;
-       color: #111;
-}
-
-.mw-debug-backtrace ul {
-       padding-left: 10px;
-}
-
-.mw-debug-backtrace li {
-       width: auto;
-       padding: 0;
-       color: #333;
-       font-size: 10px;
-       margin-bottom: 0;
-       line-height: 1em;
-}
-
-/* Cheapo hack to hide the first 3 lines of the backtrace */
-.mw-debug-backtrace li:nth-child(-n+3) {
-       display: none;
-}
index 04cfbb0..b6cc2b7 100644 (file)
@@ -1,37 +1,41 @@
-/**
- * JavaScript for the new debug toolbar, enabled through $wgDebugToolbar.
- *
- * @author John Du Hart
- * @since 1.19
- */
-
 ( function ( mw, $ ) {
        'use strict';
 
        var debug,
                hovzer = $.getFootHovzer();
 
+       /**
+        * Debug toolbar.
+        *
+        * Enabled server-side through `$wgDebugToolbar`.
+        *
+        * @class mw.Debug
+        * @singleton
+        * @author John Du Hart
+        * @since 1.19
+        */
        debug = mw.Debug = {
                /**
                 * Toolbar container element
                 *
-                * @var {jQuery}
+                * @property {jQuery}
                 */
                $container: null,
 
                /**
                 * Object containing data for the debug toolbar
                 *
-                * @var {Object}
+                * @property {Object}
                 */
                data: {},
 
                /**
-                * Initializes the debugging pane.
+                * Initialize the debugging pane
+                *
                 * Shouldn't be called before the document is ready
                 * (since it binds to elements on the page).
                 *
-                * @param {Object} data, defaults to 'debugInfo' from mw.config
+                * @param {Object} [data] Defaults to 'debugInfo' from mw.config
                 */
                init: function ( data ) {
 
                },
 
                /**
-                * Switches between panes
+                * Switch between panes
+                *
+                * Should be called with an HTMLElement as its thisArg,
+                * because it's meant to be an event handler.
+                *
+                * TODO: Store cookie for last pane open.
                 *
-                * @todo Store cookie for last pane open
-                * @context {Element}
                 * @param {jQuery.Event} e
                 */
                switchPane: function ( e ) {
@@ -91,7 +98,7 @@
                },
 
                /**
-                * Constructs the HTML for the debugging toolbar
+                * Construct the HTML for the debugging toolbar
                 */
                buildHtml: function () {
                        var $container, $bits, panes, id, gitInfo;
                        /**
                         * Returns a jQuery element for a debug-bit div
                         *
-                        * @param id
+                        * @ignore
+                        * @param {string} id
                         * @return {jQuery}
                         */
                        function bitDiv( id ) {
                        /**
                         * Returns a jQuery element for a pane link
                         *
-                        * @param id
-                        * @param text
+                        * @ignore
+                        * @param {string} id
+                        * @param {string} text
                         * @return {jQuery}
                         */
                        function paneLabel( id, text ) {
                        /**
                         * Returns a jQuery element for a debug-bit div with a for a pane link
                         *
-                        * @param id CSS id snippet. Will be prefixed with 'mw-debug-'
-                        * @param text Text to show
-                        * @param count Optional count to show
+                        * @ignore
+                        * @param {string} id CSS id snippet. Will be prefixed with 'mw-debug-'
+                        * @param {string} text Text to show
+                        * @param {string} count Optional count to show
                         * @return {jQuery}
                         */
                        function paneTriggerBitDiv( id, text, count ) {
                },
 
                /**
-                * Builds the console panel
+                * Build the console panel
                 */
                buildConsoleTable: function () {
                        var $table, entryTypeText, i, length, entry;
                },
 
                /**
-                * Query list pane
+                * Build query list pane
+                *
+                * @return {jQuery}
                 */
                buildQueryTable: function () {
                        var $table, i, length, query;
                },
 
                /**
-                * Legacy debug log pane
+                * Build legacy debug log pane
+                *
+                * @return {jQuery}
                 */
                buildDebugLogTable: function () {
                        var $list, i, length, line;
                },
 
                /**
-                * Request information pane
+                * Build request information pane
+                *
+                * @return {jQuery}
                 */
                buildRequestPane: function () {
 
                },
 
                /**
-                * Included files pane
+                * Build included files pane
+                *
+                * @return {jQuery}
                 */
                buildIncludesPane: function () {
                        var $table, i, length, file;
diff --git a/resources/mediawiki/mediawiki.debug.less b/resources/mediawiki/mediawiki.debug.less
new file mode 100644 (file)
index 0000000..949c558
--- /dev/null
@@ -0,0 +1,189 @@
+.mw-debug {
+       width: 100%;
+       background-color: #eee;
+       border-top: 1px solid #aaa;
+
+       pre {
+               font-size: 11px;
+               padding: 0;
+               margin: 0;
+               background: none;
+               border: none;
+       }
+
+       table {
+               border-spacing: 0;
+               width: 100%;
+               table-layout: fixed;
+
+               td,
+               th {
+                       padding: 4px 10px;
+               }
+
+               td {
+                       border-bottom: 1px solid #eee;
+                       word-wrap: break-word;
+
+                       &.nr {
+                               text-align: right;
+                       }
+
+                       span.stats {
+                               color: #808080;
+                       }
+               }
+
+               tr {
+                       background-color: #fff;
+
+                       &:nth-child(even) {
+                               background-color: #f9f9f9;
+                       }
+               }
+       }
+
+       ul {
+               margin: 0;
+               list-style: none;
+       }
+
+       li {
+               padding: 4px 0;
+               width: 100%;
+       }
+}
+
+.mw-debug-bits {
+       text-align: center;
+       border-bottom: 1px solid #aaa;
+}
+
+.mw-debug-bit {
+       display: inline-block;
+       padding: 10px 5px;
+       font-size: 13px;
+       /* IE-hack for display: inline-block */
+       zoom: 1;
+       *display:inline;
+}
+
+.mw-debug-panelink {
+       background-color: #eee;
+       border-right: 1px solid #ccc;
+
+       &:first-child {
+               border-left: 1px solid #ccc;
+       }
+
+       &:hover {
+               background-color: #fefefe;
+               cursor: pointer;
+       }
+
+       &.current {
+               background-color: #dedede;
+       }
+}
+
+a.mw-debug-panelabel,
+a.mw-debug-panelabel:visited {
+       color: #000;
+}
+
+.mw-debug-pane {
+       height: 300px;
+       overflow: scroll;
+       display: none;
+       font-size: 11px;
+       background-color: #e1eff2;
+       box-sizing: border-box;
+}
+
+#mw-debug-pane-debuglog,
+#mw-debug-pane-request {
+       padding: 20px;
+}
+
+#mw-debug-pane-request {
+       table {
+               width: 100%;
+               margin: 10px 0 30px;
+       }
+
+       tr,
+       th,
+       td,
+       table {
+               border: 1px solid #D0DBB3;
+               border-collapse: collapse;
+               margin: 0;
+       }
+
+       th,
+       td {
+               font-size: 12px;
+               padding: 8px 10px;
+       }
+
+       th {
+               background-color: #F1F7E2;
+               font-weight: bold;
+       }
+
+       td {
+               background-color: white;
+       }
+}
+
+#mw-debug-console tr td {
+       &:first-child {
+               font-weight: bold;
+               vertical-align: top;
+       }
+
+       &:last-child {
+               vertical-align: top;
+       }
+}
+
+.mw-debug-backtrace {
+       padding: 5px 10px;
+       margin: 5px;
+       background-color: #dedede;
+
+       span {
+               font-weight: bold;
+               color: #111;
+       }
+
+       ul {
+               padding-left: 10px;
+       }
+
+       li {
+               width: auto;
+               padding: 0;
+               color: #333;
+               font-size: 10px;
+               margin-bottom: 0;
+               line-height: 1em;
+       }
+}
+
+.mw-debug-console-log {
+       background-color: #add8e6;
+}
+
+.mw-debug-console-warn {
+       background-color: #ffa07a;
+}
+
+.mw-debug-console-deprecated {
+       background-color: #ffb6c1;
+}
+
+/* Cheapo hack to hide the first 3 lines of the backtrace */
+.mw-debug-backtrace li:nth-child(-n+3) {
+       display: none;
+}
index a498484..6dd4f88 100644 (file)
@@ -29,6 +29,8 @@
         * You can also launch the feedback form with a prefilled subject and body.
         * See the docs for the #launch() method.
         *
+        * @class
+        * @constructor
         * @param {Object} [options]
         * @param {mw.Api} [options.api] if omitted, will just create a standard API
         * @param {mw.Title} [options.title="Feedback"] The title of the page where you collect
index c21dfec..adcb810 100644 (file)
@@ -1,6 +1,6 @@
-/**
      Stylesheet for mediawiki.hlist module
      @author [[User:Edokter]]
+/*!
* Stylesheet for mediawiki.hlist module
* @author [[User:Edokter]]
  */
 .hlist dl,
 .hlist ol,
index 77d8fdc..0bbf8fa 100644 (file)
@@ -1,7 +1,7 @@
-/**
      .hlist fallbacks for IE 6, 7 and 8.
      @author [[User:Edokter]]
-*/
+/*!
* .hlist fallbacks for IE 6, 7 and 8.
* @author [[User:Edokter]]
+ */
 ( function ( mw, $ ) {
        var profile = $.client.profile();
 
index 8b78370..1080df3 100644 (file)
@@ -381,7 +381,7 @@ var mw = ( function ( $, undefined ) {
                 * values with microsecond precision that are guaranteed to be monotonic. On all other browsers,
                 * it will fall back to using `Date`.
                 *
-                * @returns {number} Current time
+                * @return {number} Current time
                 */
                now: ( function () {
                        var perf = window.performance,
@@ -558,20 +558,19 @@ var mw = ( function ( $, undefined ) {
                        log.deprecate = !Object.defineProperty ? function ( obj, key, val ) {
                                obj[key] = val;
                        } : function ( obj, key, val, msg ) {
-                               msg = 'MWDeprecationWarning: Use of "' + key + '" property is deprecated.' +
-                                       ( msg ? ( ' ' + msg ) : '' );
+                               msg = 'Use of "' + key + '" is deprecated.' + ( msg ? ( ' ' + msg ) : '' );
                                try {
                                        Object.defineProperty( obj, key, {
                                                configurable: true,
                                                enumerable: true,
                                                get: function () {
                                                        mw.track( 'mw.deprecate', key );
-                                                       log.warn( msg );
+                                                       mw.log.warn( msg );
                                                        return val;
                                                },
                                                set: function ( newVal ) {
                                                        mw.track( 'mw.deprecate', key );
-                                                       log.warn( msg );
+                                                       mw.log.warn( msg );
                                                        val = newVal;
                                                }
                                        } );
@@ -768,11 +767,11 @@ var mw = ( function ( $, undefined ) {
                                        return;
                                }
 
-                               // By default, always create a new <style>. Appending text
-                               // to a <style> tag means the contents have to be re-parsed (bug 45810).
-                               // Except, of course, in IE below 9, in there we default to
-                               // re-using and appending to a <style> tag due to the
-                               // IE stylesheet limit (bug 31676).
+                               // By default, always create a new <style>. Appending text to a <style>
+                               // tag is bad as it means the contents have to be re-parsed (bug 45810).
+                               //
+                               // Except, of course, in IE 9 and below. In there we default to re-using and
+                               // appending to a <style> tag due to the IE stylesheet limit (bug 31676).
                                if ( 'documentMode' in document && document.documentMode <= 9 ) {
 
                                        $style = getMarker().prev();
@@ -1139,11 +1138,14 @@ var mw = ( function ( $, undefined ) {
                                 */
                                function addLink( media, url ) {
                                        var el = document.createElement( 'link' );
-                                       getMarker().before( el ); // IE: Insert in dom before setting href
+                                       // For IE: Insert in document *before* setting href
+                                       getMarker().before( el );
                                        el.rel = 'stylesheet';
                                        if ( media && media !== 'all' ) {
                                                el.media = media;
                                        }
+                                       // If you end up here from an IE exception "SCRIPT: Invalid property value.",
+                                       // see #addEmbeddedCSS, bug 31676, and bug 47277 for details.
                                        el.href = url;
                                }
 
@@ -1173,7 +1175,9 @@ var mw = ( function ( $, undefined ) {
                                                        nestedAddScript( script, markModuleReady, registry[module].async, 0 );
                                                } else if ( $.isFunction( script ) ) {
                                                        registry[module].state = 'ready';
-                                                       script( $ );
+                                                       // Pass jQuery twice so that the signature of the closure which wraps
+                                                       // the script can bind both '$' and 'jQuery'.
+                                                       script( $, $ );
                                                        handlePending( module );
                                                }
                                        } catch ( e ) {
@@ -1403,7 +1407,7 @@ var mw = ( function ( $, undefined ) {
                                 */
                                work: function () {
                                        var     reqBase, splits, maxQueryLength, q, b, bSource, bGroup, bSourceGroup,
-                                               source, concatSource, group, g, i, modules, maxVersion, sourceLoadScript,
+                                               source, concatSource, origBatch, group, g, i, modules, maxVersion, sourceLoadScript,
                                                currReqBase, currReqBaseLength, moduleMap, l,
                                                lastDotIndex, prefix, suffix, bytesAdded, async;
 
@@ -1433,6 +1437,7 @@ var mw = ( function ( $, undefined ) {
                                        mw.loader.store.init();
                                        if ( mw.loader.store.enabled ) {
                                                concatSource = [];
+                                               origBatch = batch;
                                                batch = $.grep( batch, function ( module ) {
                                                        var source = mw.loader.store.get( module );
                                                        if ( source ) {
@@ -1441,7 +1446,29 @@ var mw = ( function ( $, undefined ) {
                                                        }
                                                        return true;
                                                } );
-                                               $.globalEval( concatSource.join( ';' ) );
+                                               try {
+                                                       $.globalEval( concatSource.join( ';' ) );
+                                               } catch ( err ) {
+                                                       // Not good, the cached mw.loader.implement calls failed! This should
+                                                       // never happen, barring ResourceLoader bugs, browser bugs and PEBKACs.
+                                                       // Depending on how corrupt the string is, it is likely that some
+                                                       // modules' implement() succeeded while the ones after the error will
+                                                       // never run and leave their modules in the 'loading' state forever.
+
+                                                       // Since this is an error not caused by an individual module but by
+                                                       // something that infected the implement call itself, don't take any
+                                                       // risks and clear everything in this cache.
+                                                       mw.loader.store.clear();
+                                                       // Re-add the ones still pending back to the batch and let the server
+                                                       // repopulate these modules to the cache.
+                                                       // This means that at most one module will be useless (the one that had
+                                                       // the error) instead of all of them.
+                                                       log( 'Error while evaluating data from mw.loader.store', err );
+                                                       origBatch = $.grep( origBatch, function ( module ) {
+                                                               return registry[module].state === 'loading';
+                                                       } );
+                                                       batch = batch.concat( origBatch );
+                                               }
                                        }
 
                                        // Early exit if there's nothing to load...
@@ -2091,6 +2118,14 @@ var mw = ( function ( $, undefined ) {
                                                }
                                        },
 
+                                       /**
+                                        * Clear the entire module store right now.
+                                        */
+                                       clear: function () {
+                                               mw.loader.store.items = {};
+                                               localStorage.removeItem( mw.loader.store.getStoreKey() );
+                                       },
+
                                        /**
                                         * Sync modules to localStorage.
                                         *
@@ -2353,7 +2388,8 @@ var mw = ( function ( $, undefined ) {
 }( jQuery ) );
 
 // Alias $j to jQuery for backwards compatibility
-window.$j = jQuery;
+// @deprecated since 1.23 Use $ or jQuery instead
+mw.log.deprecate( window, '$j', jQuery, 'Use $ or jQuery instead.' );
 
 // Attach to window and globally alias
 window.mw = window.mediaWiki = mw;
index 3aa358a..0c8152e 100644 (file)
@@ -1,7 +1,3 @@
-/**
- * Stylesheet for mediawiki.notification module
- */
-
 .mw-notification-area {
        position: absolute;
        top: 0;
index e22a3d3..6999610 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * Add search suggestions to the search form.
  */
 ( function ( mw, $ ) {
index 3279900..6eb8552 100644 (file)
@@ -1,3 +1,8 @@
+/**
+ * @private
+ * @singleton
+ * @class mw.toc
+ */
 ( function ( mw, $ ) {
        'use strict';
 
index 78febd2..8344111 100644 (file)
                 *         expires: 7
                 *     } );
                 *
+                * @deprecated since 1.23
                 * @param {string} key Name of bucket
                 * @param {Object} options Bucket configuration options
                 * @param {Object} options.buckets List of bucket-name/relative-probability pairs (required,
index 959ea23..fe6ea0a 100644 (file)
@@ -9,5 +9,6 @@
     "ooui-dialog-action-close": "Zarrar",
     "ooui-outline-control-move-down": "Mover abaxo l'elementu",
     "ooui-outline-control-move-up": "Mover arriba l'elementu",
+    "ooui-outline-control-remove": "Desaniciar elementu",
     "ooui-toolbar-more": "Más"
 }
\ No newline at end of file
index 67e664b..939719b 100644 (file)
@@ -3,9 +3,11 @@
         "authors": [
             "DCLXVI",
             "Hristofor.mirchev",
-            "පසිඳු කාවින්ද"
+            "පසිඳු කාවින්ද",
+            "Mitzev"
         ]
     },
     "ooui-dialog-action-close": "Затваряне",
+    "ooui-outline-control-remove": "Премахване на обекти",
     "ooui-toolbar-more": "Още"
 }
\ No newline at end of file
index 1e145ea..ff14ff3 100644 (file)
@@ -8,5 +8,6 @@
     "ooui-dialog-action-close": "ДӀачӀагӀа",
     "ooui-outline-control-move-down": "Лаха яккха элемент",
     "ooui-outline-control-move-up": "Лаккха яккха элемент",
+    "ooui-outline-control-remove": "ДӀадаха меттиг",
     "ooui-toolbar-more": "Кхин тӀе"
 }
\ No newline at end of file
index 9661ec6..670073f 100644 (file)
@@ -16,5 +16,6 @@
     "ooui-dialog-action-close": "Zavřít",
     "ooui-outline-control-move-down": "Přesunout položku dolů",
     "ooui-outline-control-move-up": "Přesunout položku nahoru",
+    "ooui-outline-control-remove": "Odstranit položku",
     "ooui-toolbar-more": "Další"
 }
\ No newline at end of file
index fa9b1cf..55594c1 100644 (file)
@@ -4,5 +4,6 @@
             "ОйЛ"
         ]
     },
-    "ooui-dialog-action-close": "ꙁакрꙑи"
+    "ooui-dialog-action-close": "ꙁакрꙑи",
+    "ooui-toolbar-more": "вѧщє"
 }
\ No newline at end of file
index 3a66648..bed2b2c 100644 (file)
@@ -16,5 +16,6 @@
     "ooui-dialog-action-close": "Schließen",
     "ooui-outline-control-move-down": "Element nach unten verschieben",
     "ooui-outline-control-move-up": "Element nach oben verschieben",
+    "ooui-outline-control-remove": "Element entfernen",
     "ooui-toolbar-more": "Mehr"
 }
\ No newline at end of file
index d402de8..5ff9915 100644 (file)
@@ -19,5 +19,6 @@
     "ooui-dialog-action-close": "Close",
     "ooui-outline-control-move-down": "Move item down",
     "ooui-outline-control-move-up": "Move item up",
+    "ooui-outline-control-remove": "Remove item",
     "ooui-toolbar-more": "More"
 }
index 173acd7..3f1ad0c 100644 (file)
@@ -9,11 +9,13 @@
             "Nojan Madinehi",
             "Reza1615",
             "Taha",
-            "درفش کاویانی"
+            "درفش کاویانی",
+            "Armin1392"
         ]
     },
     "ooui-dialog-action-close": "بستن",
     "ooui-outline-control-move-down": "انتقال مورد به پایین",
     "ooui-outline-control-move-up": "انتقال مورد به بالا",
+    "ooui-outline-control-remove": "حذف مورد",
     "ooui-toolbar-more": "بیشتر"
 }
\ No newline at end of file
index dcd367f..ce2f6d0 100644 (file)
@@ -19,5 +19,6 @@
     "ooui-dialog-action-close": "Sulje",
     "ooui-outline-control-move-down": "Siirrä kohdetta alaspäin",
     "ooui-outline-control-move-up": "Siirrä kohdetta ylöspäin",
+    "ooui-outline-control-remove": "Poista kohde",
     "ooui-toolbar-more": "Lisää"
 }
\ No newline at end of file
index eb24b5a..7674d2f 100644 (file)
@@ -31,5 +31,6 @@
     "ooui-dialog-action-close": "Fermer",
     "ooui-outline-control-move-down": "Faire descendre l’élément",
     "ooui-outline-control-move-up": "Faire monter l’élément",
+    "ooui-outline-control-remove": "Supprimer l’élément",
     "ooui-toolbar-more": "Plus"
 }
\ No newline at end of file
index 5d0928f..a029456 100644 (file)
@@ -9,5 +9,6 @@
     "ooui-dialog-action-close": "Pechar",
     "ooui-outline-control-move-down": "Mover o elemento abaixo",
     "ooui-outline-control-move-up": "Mover o elemento arriba",
+    "ooui-outline-control-remove": "Eliminar o elemento",
     "ooui-toolbar-more": "Máis"
 }
\ No newline at end of file
index 31b693c..404dc82 100644 (file)
@@ -18,5 +18,6 @@
     "ooui-dialog-action-close": "סגירה",
     "ooui-outline-control-move-down": "להזיז את הפריט מטה",
     "ooui-outline-control-move-up": "להזיז את הפריט מעלה",
+    "ooui-outline-control-remove": "הסרת פריט",
     "ooui-toolbar-more": "עוד"
 }
\ No newline at end of file
index b20c5f3..f674cd2 100644 (file)
@@ -8,5 +8,6 @@
     "ooui-dialog-action-close": "Začinić",
     "ooui-outline-control-move-down": "Zapisk dele přesunyć",
     "ooui-outline-control-move-up": "Zapisk horje přesunyć",
+    "ooui-outline-control-remove": "Zapisk wotstronić",
     "ooui-toolbar-more": "Wjace"
 }
\ No newline at end of file
index 9f7b435..b2cf2c0 100644 (file)
@@ -4,11 +4,13 @@
             "Dj",
             "Einstein2",
             "Misibacsi",
-            "ViDam"
+            "ViDam",
+            "Tacsipacsi"
         ]
     },
     "ooui-dialog-action-close": "Bezár",
     "ooui-outline-control-move-down": "Elem mozgatása lefelé",
     "ooui-outline-control-move-up": "Elem mozgatása felfelé",
+    "ooui-outline-control-remove": "Elem eltávolítása",
     "ooui-toolbar-more": "Tovább..."
 }
\ No newline at end of file
index f6cb90b..4cb8821 100644 (file)
@@ -8,5 +8,6 @@
     "ooui-dialog-action-close": "Փակել",
     "ooui-outline-control-move-down": "Իջեցնել կետը",
     "ooui-outline-control-move-up": "Բարձրացնել կետը",
+    "ooui-outline-control-remove": "Հեռացնել տարրը",
     "ooui-toolbar-more": "Ավելին"
 }
\ No newline at end of file
index 15f42e5..838face 100644 (file)
@@ -7,5 +7,6 @@
     "ooui-dialog-action-close": "Irekep",
     "ooui-outline-control-move-down": "Ipababa ti banag",
     "ooui-outline-control-move-up": "Ipangato ti banag",
+    "ooui-outline-control-remove": "Ikkaten ti banag",
     "ooui-toolbar-more": "Adu pay"
 }
\ No newline at end of file
index efe0e67..fbdb5d1 100644 (file)
@@ -6,7 +6,7 @@
         ]
     },
     "ooui-dialog-action-close": "Loka",
-    "ooui-outline-control-move-down": "Færa atriða niður",
-    "ooui-outline-control-move-up": "Færa atriða upp",
+    "ooui-outline-control-move-down": "Færa atriði niður",
+    "ooui-outline-control-move-up": "Færa atriði upp",
     "ooui-toolbar-more": "Fleira"
 }
\ No newline at end of file
index 6158cff..747ec79 100644 (file)
@@ -17,5 +17,6 @@
     "ooui-dialog-action-close": "Chiudi",
     "ooui-outline-control-move-down": "Sposta in basso",
     "ooui-outline-control-move-up": "Sposta in alto",
+    "ooui-outline-control-remove": "Rimuovi elemento",
     "ooui-toolbar-more": "Altro"
 }
\ No newline at end of file
index 789fbeb..c7c0851 100644 (file)
@@ -10,5 +10,6 @@
     "ooui-dialog-action-close": "閉じる",
     "ooui-outline-control-move-down": "項目を下に移動させる",
     "ooui-outline-control-move-up": "項目を上に移動させる",
+    "ooui-outline-control-remove": "項目を除去",
     "ooui-toolbar-more": "その他"
 }
\ No newline at end of file
index 78180af..c9d2774 100644 (file)
@@ -7,10 +7,12 @@
             "ITshnik",
             "MIKHEIL",
             "NoiX180",
-            "Pras"
+            "Pras",
+            "Tokoko"
         ]
     },
     "ooui-dialog-action-close": "დახურვა",
     "ooui-outline-control-move-down": "ელემენტის ქვემოთ გადატანა",
-    "ooui-outline-control-move-up": "ელემენტის ზემოთ გადატანა"
+    "ooui-outline-control-move-up": "ელემენტის ზემოთ გადატანა",
+    "ooui-toolbar-more": "მეტი"
 }
\ No newline at end of file
index f1f61df..25749ce 100644 (file)
@@ -11,5 +11,6 @@
     "ooui-dialog-action-close": "닫기",
     "ooui-outline-control-move-down": "항목을 아래로 옮기기",
     "ooui-outline-control-move-up": "항목을 위로 옮기기",
+    "ooui-outline-control-remove": "항목 지우기",
     "ooui-toolbar-more": "더 보기"
 }
\ No newline at end of file
index a18894e..6359026 100644 (file)
@@ -13,5 +13,6 @@
     "ooui-dialog-action-close": "Zoumaachen",
     "ooui-outline-control-move-down": "Element erof réckelen",
     "ooui-outline-control-move-up": "Element erop réckelen",
+    "ooui-outline-control-remove": "Element ewechhuelen",
     "ooui-toolbar-more": "Méi"
 }
\ No newline at end of file
index b3a16e8..db679bc 100644 (file)
@@ -2,8 +2,10 @@
     "@metadata": {
         "authors": [
             "Audriusa",
-            "Eitvys200"
+            "Eitvys200",
+            "Mantak111"
         ]
     },
-    "ooui-dialog-action-close": "Uždaryti"
+    "ooui-dialog-action-close": "Uždaryti",
+    "ooui-outline-control-remove": "Šalinti elementus"
 }
\ No newline at end of file
index b363a45..22fd037 100644 (file)
@@ -9,5 +9,6 @@
     "ooui-dialog-action-close": "Затвори",
     "ooui-outline-control-move-down": "Помести надолу",
     "ooui-outline-control-move-up": "Помести нагоре",
+    "ooui-outline-control-remove": "Отстрани ставка",
     "ooui-toolbar-more": "Повеќе"
 }
\ No newline at end of file
index 75db0a7..549fad2 100644 (file)
             "Saruman",
             "Siebrand",
             "Southparkfan",
-            "सरोज कुमार ढकाल"
+            "सरोज कुमार ढकाल",
+            "Sjoerddebruin"
         ]
     },
     "ooui-dialog-action-close": "Sluiten",
     "ooui-outline-control-move-down": "Item omlaag verplaatsen",
     "ooui-outline-control-move-up": "Item omhoog verplaatsen",
+    "ooui-outline-control-remove": "Item verwijderen",
     "ooui-toolbar-more": "Meer"
 }
\ No newline at end of file
index dca7b7d..cd22c40 100644 (file)
@@ -8,5 +8,6 @@
     "ooui-dialog-action-close": "Cufi",
     "ooui-outline-control-move-down": "Gad buusi",
     "ooui-outline-control-move-up": "Ol baasi",
+    "ooui-outline-control-remove": "Balleessi",
     "ooui-toolbar-more": "Dabalata"
 }
\ No newline at end of file
index ba33322..8798603 100644 (file)
             "Ty221",
             "WTM",
             "Woytecr",
-            "Wpedzich"
+            "Wpedzich",
+            "Jacenty359"
         ]
     },
     "ooui-dialog-action-close": "Zamknij",
     "ooui-outline-control-move-down": "Przenieś niżej",
     "ooui-outline-control-move-up": "Przenieś wyżej",
+    "ooui-outline-control-remove": "Usuń przedmiot",
     "ooui-toolbar-more": "Więcej"
 }
\ No newline at end of file
index a4dba27..53b5280 100644 (file)
@@ -9,11 +9,13 @@
             "Jaideraf",
             "Jdforrester",
             "Luckas",
-            "Vitorvicentevalente"
+            "Vitorvicentevalente",
+            "SandroHc"
         ]
     },
     "ooui-dialog-action-close": "Fechar",
     "ooui-outline-control-move-down": "Mover item para baixo",
     "ooui-outline-control-move-up": "Mover item para cima",
+    "ooui-outline-control-remove": "Remover elemento",
     "ooui-toolbar-more": "Mais"
 }
\ No newline at end of file
index 78a70d9..75bbec4 100644 (file)
@@ -22,5 +22,6 @@
     "ooui-dialog-action-close": "Label text for button to exit from dialog.\n\n{{Identical|Close}}",
     "ooui-outline-control-move-down": "Tool tip for a button that moves items in a list down one place",
     "ooui-outline-control-move-up": "Tool tip for a button that moves items in a list up one place",
+    "ooui-outline-control-remove": "Tool tip for a button that removes items from a list.\n{{Identical|Remove item}}",
     "ooui-toolbar-more": "Label for the toolbar group that contains a list of all other available tools.\n{{Identical|More}}"
 }
\ No newline at end of file
index 861b2fe..4892975 100644 (file)
@@ -10,5 +10,6 @@
     "ooui-dialog-action-close": "Închide",
     "ooui-outline-control-move-down": "Mută elementul mai jos",
     "ooui-outline-control-move-up": "Mută elementul mai sus",
+    "ooui-outline-control-remove": "Elimină elementul",
     "ooui-toolbar-more": "Mai mult"
 }
\ No newline at end of file
index be7c6a5..f6e76a6 100644 (file)
@@ -21,5 +21,6 @@
     "ooui-dialog-action-close": "Закрыть",
     "ooui-outline-control-move-down": "Переместить элемент вниз",
     "ooui-outline-control-move-up": "Переместить элемент вверх",
+    "ooui-outline-control-remove": "Удалить пункт",
     "ooui-toolbar-more": "Ещё"
 }
\ No newline at end of file
index d5bffd9..b14d47b 100644 (file)
@@ -10,5 +10,6 @@
     "ooui-dialog-action-close": "Zapri",
     "ooui-outline-control-move-down": "Prestavi predmet nižje",
     "ooui-outline-control-move-up": "Prestavi predmet višje",
+    "ooui-outline-control-remove": "Odstrani vnos",
     "ooui-toolbar-more": "Več"
 }
\ No newline at end of file
index 424f1be..24a5af2 100644 (file)
@@ -1,11 +1,14 @@
 {
     "@metadata": {
         "authors": [
-            "Euriditi"
+            "Euriditi",
+            "Kushtrim",
+            "Elioqoshi"
         ]
     },
     "ooui-dialog-action-close": "Mbylle",
     "ooui-outline-control-move-down": "Zhvendose artikullin më poshtë",
     "ooui-outline-control-move-up": "Zhvendose artikullin më lart",
+    "ooui-outline-control-remove": "Hiq artikullin",
     "ooui-toolbar-more": "Më tepër..."
 }
\ No newline at end of file
index 973baec..7eaaacd 100644 (file)
@@ -9,5 +9,6 @@
     "ooui-dialog-action-close": "Затвори",
     "ooui-outline-control-move-down": "Премести ставку на доле",
     "ooui-outline-control-move-up": "Премести ставку на горе",
+    "ooui-outline-control-remove": "Уклони ставку",
     "ooui-toolbar-more": "Више"
 }
\ No newline at end of file
index 74d654b..f7d6f04 100644 (file)
             "Per",
             "Sendelbach",
             "Skalman",
-            "WikiPhoenix"
+            "WikiPhoenix",
+            "Lokal Profil"
         ]
     },
     "ooui-dialog-action-close": "Stäng",
     "ooui-outline-control-move-down": "Flytta ned objekt",
     "ooui-outline-control-move-up": "Flytta upp objekt",
+    "ooui-outline-control-remove": "Ta bort objekt",
     "ooui-toolbar-more": "Mer"
 }
\ No newline at end of file
index 9a47ad7..42487c9 100644 (file)
@@ -20,5 +20,6 @@
     "ooui-dialog-action-close": "Закрити",
     "ooui-outline-control-move-down": "Перемістити елемент униз",
     "ooui-outline-control-move-up": "Перемістити елемент вгору",
+    "ooui-outline-control-remove": "Видалити елемент",
     "ooui-toolbar-more": "Більше"
 }
\ No newline at end of file
index b545ce6..342ad6f 100644 (file)
@@ -9,5 +9,6 @@
     "ooui-dialog-action-close": "Đóng",
     "ooui-outline-control-move-down": "Chuyển mục xuống",
     "ooui-outline-control-move-up": "Chuyển mục lên",
+    "ooui-outline-control-remove": "Xóa khoản",
     "ooui-toolbar-more": "Thêm"
 }
\ No newline at end of file
index 46cbae3..58e8ebe 100644 (file)
@@ -21,5 +21,6 @@
     "ooui-dialog-action-close": "关闭",
     "ooui-outline-control-move-down": "下移项",
     "ooui-outline-control-move-up": "上移项",
+    "ooui-outline-control-remove": "移除项",
     "ooui-toolbar-more": "更多"
 }
\ No newline at end of file
index 9aace2f..6e7b12e 100644 (file)
@@ -18,5 +18,6 @@
     "ooui-dialog-action-close": "關閉",
     "ooui-outline-control-move-down": "向下移項",
     "ooui-outline-control-move-up": "向上移項",
+    "ooui-outline-control-remove": "移除項",
     "ooui-toolbar-more": "更多"
 }
\ No newline at end of file
index aa36cd0..5cf353f 100644 (file)
Binary files a/resources/oojs-ui/images/icons/add-item.png and b/resources/oojs-ui/images/icons/add-item.png differ
index ff95399..2620e76 100644 (file)
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="iso-8859-1"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24" height="24" viewBox="0, 0, 24, 24">
-  <g id="add-item">
-    <path d="M13,8 L11,8 L11,11 L8,11 L8,13 L11,13 L11,16 L13,16 L13,13 L16,13 L16,11 L13,11 z" fill="#000000"/>
-  </g>
-  <defs/>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="apply" style="opacity:0.75;">
+       <path d="M13,8 L11,8 L11,11 L8,11 L8,13 L11,13 L11,16 L13,16 L13,13 L16,13 L16,11 L13,11 z"/>
+</g>
 </svg>
diff --git a/resources/oojs-ui/oojs-ui-apex.css b/resources/oojs-ui/oojs-ui-apex.css
new file mode 100644 (file)
index 0000000..66a8072
--- /dev/null
@@ -0,0 +1,663 @@
+.oo-ui-dialog {
+  background-color: #fff;
+  background-color: rgba(255, 255, 255, 0.5);
+  opacity: 0;
+  -webkit-transition: all 250ms ease-in-out;
+     -moz-transition: all 250ms ease-in-out;
+      -ms-transition: all 250ms ease-in-out;
+       -o-transition: all 250ms ease-in-out;
+          transition: all 250ms ease-in-out;
+}
+
+.oo-ui-dialog .oo-ui-window-frame {
+  background-color: #fff;
+  border: solid 1px #ccc;
+  border-radius: 0.5em;
+  -webkit-transform: scale(0.5);
+     -moz-transform: scale(0.5);
+      -ms-transform: scale(0.5);
+       -o-transform: scale(0.5);
+          transform: scale(0.5);
+  box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
+  -webkit-transition: all 250ms ease-in-out;
+     -moz-transition: all 250ms ease-in-out;
+      -ms-transition: all 250ms ease-in-out;
+       -o-transition: all 250ms ease-in-out;
+          transition: all 250ms ease-in-out;
+}
+
+.oo-ui-dialog-open {
+  opacity: 1;
+}
+
+.oo-ui-dialog-open .oo-ui-window-frame {
+  -webkit-transform: scale(1);
+     -moz-transform: scale(1);
+      -ms-transform: scale(1);
+       -o-transform: scale(1);
+          transform: scale(1);
+}
+
+.oo-ui-dialog-content .oo-ui-window-body {
+  box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
+}
+
+.oo-ui-toolbar-bar {
+  background: #f8fbfd;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #f1f7fb));
+  background-image: -webkit-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+  background-image: -moz-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+  background-image: -ms-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+  background-image: -o-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+  background-image: linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+  border-bottom: solid 1px #ccc;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#f1f7fb');
+}
+
+.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
+  background: none;
+  border: none;
+}
+
+.oo-ui-toolbar-shadow {
+  bottom: -9px;
+  height: 9px;
+  background-image: /* @embed */ url(images/toolbar-shadow.png);
+  opacity: 0.125;
+  -webkit-transition: opacity 500ms ease-in-out;
+     -moz-transition: opacity 500ms ease-in-out;
+      -ms-transition: opacity 500ms ease-in-out;
+       -o-transition: opacity 500ms ease-in-out;
+          transition: opacity 500ms ease-in-out;
+}
+
+.oo-ui-toolGroup {
+  border: solid 1px transparent;
+  border-radius: 0.25em;
+  -webkit-transition: border-color 300ms ease-in-out;
+     -moz-transition: border-color 300ms ease-in-out;
+      -ms-transition: border-color 300ms ease-in-out;
+       -o-transition: border-color 300ms ease-in-out;
+          transition: border-color 300ms ease-in-out;
+}
+
+.oo-ui-toolGroup:hover {
+  border-color: rgba(0, 0, 0, 0.1);
+}
+
+.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  color: #000;
+}
+
+.oo-ui-window-title {
+  color: #333;
+}
+
+.oo-ui-window-overlay {
+  font-family: sans-serif;
+  font-size: 1em;
+  line-height: 1.5em;
+}
+
+.oo-ui-buttonedElement .oo-ui-buttonedElement-button {
+  color: #333;
+}
+
+.oo-ui-buttonedElement.oo-ui-indicatedElement .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator,
+.oo-ui-buttonedElement.oo-ui-iconedElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  opacity: 0.8;
+}
+
+.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  -webkit-transition: opacity 200ms;
+     -moz-transition: opacity 200ms;
+      -ms-transition: opacity 200ms;
+       -o-transition: opacity 200ms;
+          transition: opacity 200ms;
+}
+
+.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button:hover > .oo-ui-iconedElement-icon,
+.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button:focus > .oo-ui-iconedElement-icon {
+  opacity: 1;
+}
+
+.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button:hover > .oo-ui-labeledElement-label,
+.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button:focus > .oo-ui-labeledElement-label {
+  color: #000;
+}
+
+.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
+  color: #333;
+}
+
+.oo-ui-buttonedElement-frameless.oo-ui-widget-disabled .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  opacity: 0.2;
+}
+
+.oo-ui-buttonedElement-frameless.oo-ui-widget-disabled .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
+  color: #ccc;
+}
+
+.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
+  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
+  background: #eeeeee;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
+  background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  border: 1px #c9c9c9 solid;
+  border-radius: 0.3em;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
+  -webkit-transition: border-color 100ms ease-in-out;
+     -moz-transition: border-color 100ms ease-in-out;
+      -ms-transition: border-color 100ms ease-in-out;
+       -o-transition: border-color 100ms ease-in-out;
+          transition: border-color 100ms ease-in-out;
+}
+
+.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button:hover,
+.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button:focus {
+  border-color: #aaa;
+}
+
+.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
+.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
+  color: black;
+  background: #eeeeee;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  border-color: #c9c9c9;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
+  box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary .oo-ui-buttonedElement-button {
+  background: #cde7f4;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #eaf4fa), color-stop(100%, #b0d9ee));
+  background-image: -webkit-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+  background-image: -moz-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+  background-image: -ms-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+  background-image: -o-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+  background-image: linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+  border: solid 1px #a6cee1;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#eaf4fa', endColorstr='#b0d9ee');
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary .oo-ui-buttonedElement-button:hover,
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary .oo-ui-buttonedElement-button:focus {
+  border-color: #9dc2d4;
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
+  background: #cde7f4;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
+  background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  border: solid 1px #a6cee1;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive .oo-ui-buttonedElement-button {
+  background: #daf0be;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f0fbe1), color-stop(100%, #c3e59a));
+  background-image: -webkit-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+  background-image: -moz-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+  background-image: -ms-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+  background-image: -o-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+  background-image: linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+  border: solid 1px #b8d892;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f0fbe1', endColorstr='#c3e59a');
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive .oo-ui-buttonedElement-button:hover,
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive .oo-ui-buttonedElement-button:focus {
+  border-color: #adcb89;
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
+  background: #daf0be;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #c3e59a), color-stop(100%, #f0fbe1));
+  background-image: -webkit-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+  background-image: -moz-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+  background-image: -ms-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+  background-image: -o-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+  background-image: linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+  border: solid 1px #b8d892;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#c3e59a', endColorstr='#f0fbe1');
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-destructive .oo-ui-buttonedElement-button {
+  color: #d45353;
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
+  color: #333;
+  background: #eee;
+  opacity: 0.5;
+  box-shadow: none;
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button:hover,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active:hover,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed:hover,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button:focus,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active:focus,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed:focus {
+  border-color: #ccc;
+  box-shadow: none;
+}
+
+.oo-ui-bookletLayout > .oo-ui-gridLayout > .oo-ui-panelLayout {
+  -webkit-transition: width 250ms ease-in-out, height 250ms ease-in-out, top 250ms ease-in-out, left 250ms ease-in-out;
+     -moz-transition: width 250ms ease-in-out, height 250ms ease-in-out, top 250ms ease-in-out, left 250ms ease-in-out;
+      -ms-transition: width 250ms ease-in-out, height 250ms ease-in-out, top 250ms ease-in-out, left 250ms ease-in-out;
+       -o-transition: width 250ms ease-in-out, height 250ms ease-in-out, top 250ms ease-in-out, left 250ms ease-in-out;
+          transition: width 250ms ease-in-out, height 250ms ease-in-out, top 250ms ease-in-out, left 250ms ease-in-out;
+}
+
+.oo-ui-bookletLayout-outlinePanel {
+  border-right: solid 1px #ddd;
+}
+
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+  box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
+}
+
+.oo-ui-fieldsetLayout {
+  border: none;
+}
+
+.oo-ui-fieldsetLayout > legend.oo-ui-labeledElement-label {
+  font-size: 1.5em;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool {
+  margin: -1px 0 -1px -1px;
+  border: solid 1px transparent;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool:first-child {
+  border-bottom-left-radius: 0.25em;
+  border-top-left-radius: 0.25em;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool:last-child {
+  margin-right: -1px;
+  border-top-right-radius: 0.25em;
+  border-bottom-right-radius: 0.25em;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-barToolGroup .oo-ui-tool-active.oo-ui-widget-enabled {
+  background: #f8fbfd;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  border-color: rgba(0, 0, 0, 0.2);
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
+  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+}
+
+.oo-ui-barToolGroup .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
+  border-left-color: rgba(0, 0, 0, 0.1);
+}
+
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  opacity: 0.8;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  opacity: 0.2;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  opacity: 0.8;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  opacity: 1;
+}
+
+.oo-ui-listToolGroup.oo-ui-popupToolGroup-active {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-listToolGroup .oo-ui-tool {
+  margin: -1px 0;
+  border: solid 1px transparent;
+}
+
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled {
+  background: #f8fbfd;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  border-color: rgba(0, 0, 0, 0.1);
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
+  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+}
+
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
+  border-top-color: rgba(0, 0, 0, 0.1);
+}
+
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  opacity: 0.8;
+}
+
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  opacity: 1;
+}
+
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
+  color: #ccc;
+}
+
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  opacity: 0.2;
+}
+
+.oo-ui-menuToolGroup {
+  border-color: rgba(0, 0, 0, 0.1);
+}
+
+.oo-ui-menuToolGroup:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
+  border-color: rgba(0, 0, 0, 0.25);
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool:hover {
+  background-color: #e1f3ff;
+}
+
+.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon {
+  opacity: 0.8;
+}
+
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  background-color: white;
+  border: solid 1px #ccc;
+  box-shadow: 0 0.25em 1em rgba(0, 0, 0, 0.25);
+}
+
+.oo-ui-popupToolGroup-active.oo-ui-widget-enabled {
+  background: #f8fbfd;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
+  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+}
+
+.oo-ui-optionWidget-highlighted {
+  background-color: #e1f3ff;
+}
+
+.oo-ui-optionWidget-selected {
+  background-color: #a7dcff;
+}
+
+.oo-ui-menuWidget {
+  margin-top: -1px;
+  background: #fff;
+  border: solid 1px #ccc;
+  border-radius: 0 0 0.25em 0.25em;
+  box-shadow: 0 0.15em 1em 0 rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-popupWidget-popup {
+  background-color: #fff;
+  border: solid 1px #ccc;
+  border-radius: 0.25em;
+  box-shadow: 0 0.15em 0.5em 0 rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-popupWidget-tailed .oo-ui-popupWidget-tail {
+  width: 15px;
+  height: 8px;
+  margin-left: -7px;
+  background-image: /* @embed */ url(images/tail.svg);
+}
+
+.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
+  -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+     -moz-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+      -ms-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+       -o-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+          transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+}
+
+.oo-ui-popupWidget-body {
+  box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
+}
+
+.oo-ui-buttonGroupWidget {
+  display: inline-block;
+  white-space: nowrap;
+}
+
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
+  background-color: transparent;
+}
+
+.oo-ui-buttonSelectWidget {
+  border-radius: 0.3em;
+}
+
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonedElement-button {
+  margin-left: -1px;
+  border-radius: 0;
+}
+
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonedElement-button {
+  margin-left: 0;
+  border-bottom-left-radius: 0.3em;
+  border-top-left-radius: 0.3em;
+}
+
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonedElement-button {
+  border-top-right-radius: 0.3em;
+  border-bottom-right-radius: 0.3em;
+}
+
+.oo-ui-inlineMenuWidget-handle {
+  border: solid 1px rgba(0, 0, 0, 0.1);
+  border-radius: 0.25em;
+}
+
+.oo-ui-inlineMenuWidget-handle:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon {
+  opacity: 0.8;
+}
+
+.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted {
+  background-color: #e1f3ff;
+}
+
+.oo-ui-menuSectionItemWidget {
+  color: #888;
+}
+
+.oo-ui-outlineControlsWidget {
+  background-color: #fff;
+}
+
+.oo-ui-outlineControlsWidget > .oo-ui-iconedElement-icon {
+  opacity: 0.2;
+}
+
+.oo-ui-outlineItemWidget {
+  font-size: 1.1em;
+}
+
+.oo-ui-outlineItemWidget.oo-ui-optionWidget-selected {
+  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
+  background-color: #a7dcff;
+}
+
+.oo-ui-outlineItemWidget.oo-ui-flaggableElement-important {
+  font-weight: bold;
+}
+
+.oo-ui-outlineItemWidget.oo-ui-flaggableElement-placeholder {
+  font-style: italic;
+}
+
+.oo-ui-outlineItemWidget.oo-ui-flaggableElement-empty .oo-ui-iconedElement-icon,
+.oo-ui-outlineItemWidget.oo-ui-flaggableElement-empty .oo-ui-indicatedElement-indicator {
+  opacity: 0.5;
+}
+
+.oo-ui-outlineItemWidget.oo-ui-flaggableElement-empty .oo-ui-labeledElement-label {
+  color: #777;
+}
+
+.oo-ui-searchWidget-query {
+  box-shadow: 0 0 0.5em rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+  font-family: sans-serif;
+  font-size: 1em;
+  background-color: #fff;
+  border: solid 1px #ccc;
+  border-radius: 0.25em;
+  box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #ddd;
+  -webkit-transition: border-color 200ms, box-shadow 200ms;
+     -moz-transition: border-color 200ms, box-shadow 200ms;
+      -ms-transition: border-color 200ms, box-shadow 200ms;
+       -o-transition: border-color 200ms, box-shadow 200ms;
+          transition: border-color 200ms, box-shadow 200ms;
+}
+
+.oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
+  border-color: #a7dcff;
+  outline: none;
+  box-shadow: 0 0 0.3em #a7dcff, 0 0 0 white;
+}
+
+.oo-ui-textInputWidget input[readonly],
+.oo-ui-textInputWidget textarea[readonly] {
+  color: #777;
+  text-shadow: 0 1px 1px #fff;
+}
+
+.oo-ui-textInputWidget-pending input,
+.oo-ui-textInputWidget-pending textarea {
+  background-color: transparent;
+}
+
+.oo-ui-textInputWidget.oo-ui-widget-disabled input,
+.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
+  color: #ccc;
+  text-shadow: 0 1px 1px #fff;
+  background-color: #f3f3f3;
+  border-color: #ddd;
+}
+
+.oo-ui-toggleSwitchWidget {
+  background: #eeeeee;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  border: solid 1px #ccc;
+  border-radius: 1em;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
+  box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #ddd;
+}
+
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+  opacity: 0.5;
+}
+
+.oo-ui-toggleSwitchWidget-grip {
+  background: #eeeeee;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
+  background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  border: 1px #c9c9c9 solid;
+  border-radius: 1em;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
+  box-shadow: 0 0.1em 0.25em rgba(0, 0, 0, 0.1);
+}
+
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover,
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover .oo-ui-toggleSwitchWidget-grip {
+  border-color: #aaa;
+}
+
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+  background: #cde7f4;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
+  background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  border-radius: 1em;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
+  box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
+}
+
+.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
+  opacity: 1;
+}
+
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+  display: block;
+  opacity: 0;
+}
\ No newline at end of file
index 6f0b354..a27c53e 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (ddcf828854)
+ * OOjs UI v0.1.0-pre (ac0cc69508)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: Fri Feb 21 2014 19:44:50 GMT-0800 (PST)
+ * Date: Thu Mar 13 2014 17:11:12 GMT-0700 (PDT)
  */
 ( function () {
 
@@ -21,6 +21,28 @@ OO.ui = {};
 
 OO.ui.bind = $.proxy;
 
+/**
+ * @property {Object}
+ */
+OO.ui.Keys = {
+       'UNDEFINED': 0,
+       'BACKSPACE': 8,
+       'DELETE': 46,
+       'LEFT': 37,
+       'RIGHT': 39,
+       'UP': 38,
+       'DOWN': 40,
+       'ENTER': 13,
+       'END': 35,
+       'HOME': 36,
+       'TAB': 9,
+       'PAGEUP': 33,
+       'PAGEDOWN': 34,
+       'ESCAPE': 27,
+       'SHIFT': 16,
+       'SPACE': 32
+};
+
 /**
  * Get the user's language and any fallback languages.
  *
@@ -29,7 +51,7 @@ OO.ui.bind = $.proxy;
  * In environments that provide a localization system, this function should be overridden to
  * return the user's language(s). The default implementation returns English (en) only.
  *
- * @returns {string[]} Language codes, in descending order of priority
+ * @return {string[]} Language codes, in descending order of priority
  */
 OO.ui.getUserLanguages = function () {
        return [ 'en' ];
@@ -41,7 +63,7 @@ OO.ui.getUserLanguages = function () {
  * @param {Object.<string,Mixed>} obj Object keyed by language code
  * @param {string|null} [lang] Language code, if omitted or null defaults to any user language
  * @param {string} [fallback] Fallback code, used if no matching language can be found
- * @returns {Mixed} Local value
+ * @return {Mixed} Local value
  */
 OO.ui.getLocalValue = function ( obj, lang, fallback ) {
        var i, len, langs;
@@ -87,6 +109,8 @@ var messages = {
        'ooui-outline-control-move-down': 'Move item down',
        // Tool tip for a button that moves items in a list up one place
        'ooui-outline-control-move-up': 'Move item up',
+       // Tool tip for a button that removes items from a list
+       'ooui-outline-control-remove': 'Remove item',
        // Label for the toolbar group that contains a list of all other available tools
        'ooui-toolbar-more': 'More'
 };
@@ -106,7 +130,7 @@ var messages = {
  * @abstract
  * @param {string} key Message key
  * @param {Mixed...} [params] Message parameters
- * @returns {string} Translated message with parameters substituted
+ * @return {string} Translated message with parameters substituted
  */
 OO.ui.msg = function ( key ) {
        var message = messages[key], params = Array.prototype.slice.call( arguments, 1 );
@@ -123,12 +147,14 @@ OO.ui.msg = function ( key ) {
        return message;
 };
 
+/** */
 OO.ui.deferMsg = function ( key ) {
        return function () {
                return OO.ui.msg( key );
        };
 };
 
+/** */
 OO.ui.resolveMsg = function ( msg ) {
        if ( $.isFunction( msg ) ) {
                return msg();
@@ -137,31 +163,11 @@ OO.ui.resolveMsg = function ( msg ) {
 };
 
 } )();
-
-// Add more as you need
-OO.ui.Keys = {
-       'UNDEFINED': 0,
-       'BACKSPACE': 8,
-       'DELETE': 46,
-       'LEFT': 37,
-       'RIGHT': 39,
-       'UP': 38,
-       'DOWN': 40,
-       'ENTER': 13,
-       'END': 35,
-       'HOME': 36,
-       'TAB': 9,
-       'PAGEUP': 33,
-       'PAGEDOWN': 34,
-       'ESCAPE': 27,
-       'SHIFT': 16,
-       'SPACE': 32
-};
 /**
  * DOM element abstraction.
  *
- * @class
  * @abstract
+ * @class
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -189,11 +195,6 @@ OO.ui.Element = function OoUiElement( config ) {
 
 /* Static Properties */
 
-/**
- * @static
- * @property
- * @inheritable
- */
 OO.ui.Element.static = {};
 
 /**
@@ -210,12 +211,12 @@ OO.ui.Element.static.tagName = 'div';
 /* Static Methods */
 
 /**
- * Gets a jQuery function within a specific document.
+ * Get a jQuery function within a specific document.
  *
  * @static
  * @param {jQuery|HTMLElement|HTMLDocument|Window} context Context to bind the function to
  * @param {OO.ui.Frame} [frame] Frame of the document context
- * @returns {Function} Bound jQuery function
+ * @return {Function} Bound jQuery function
  */
 OO.ui.Element.getJQuery = function ( context, frame ) {
        function wrapper( selector ) {
@@ -236,7 +237,7 @@ OO.ui.Element.getJQuery = function ( context, frame ) {
  *
  * @static
  * @param {jQuery|HTMLElement|HTMLDocument|Window} obj Object to get the document for
- * @returns {HTMLDocument} Document object
+ * @return {HTMLDocument} Document object
  * @throws {Error} If context is invalid
  */
 OO.ui.Element.getDocument = function ( obj ) {
@@ -264,7 +265,7 @@ OO.ui.Element.getDocument = function ( obj ) {
  *
  * @static
  * @param {jQuery|HTMLElement|HTMLDocument|Window} obj Context to get the window for
- * @returns {Window} Window object
+ * @return {Window} Window object
  */
 OO.ui.Element.getWindow = function ( obj ) {
        var doc = this.getDocument( obj );
@@ -276,7 +277,7 @@ OO.ui.Element.getWindow = function ( obj ) {
  *
  * @static
  * @param {jQuery|HTMLElement|HTMLDocument|Window} obj Context to get the direction for
- * @returns {string} Text direction, either `ltr` or `rtl`
+ * @return {string} Text direction, either `ltr` or `rtl`
  */
 OO.ui.Element.getDir = function ( obj ) {
        var isDoc, isWin;
@@ -304,7 +305,7 @@ OO.ui.Element.getDir = function ( obj ) {
  * @param {Window} from Window of the child frame
  * @param {Window} [to=window] Window of the parent frame
  * @param {Object} [offset] Offset to start with, used internally
- * @returns {Object} Offset object, containing left and top properties
+ * @return {Object} Offset object, containing left and top properties
  */
 OO.ui.Element.getFrameOffset = function ( from, to, offset ) {
        var i, len, frames, frame, rect;
@@ -346,7 +347,7 @@ OO.ui.Element.getFrameOffset = function ( from, to, offset ) {
  * @static
  * @param {jQuery} $from
  * @param {jQuery} $to
- * @returns {Object} Translated position coordinates, containing top and left properties
+ * @return {Object} Translated position coordinates, containing top and left properties
  */
 OO.ui.Element.getRelativePosition = function ( $from, $to ) {
        var from = $from.offset(),
@@ -463,7 +464,7 @@ OO.ui.Element.getClosestScrollableContainer = function ( el, dimension ) {
 };
 
 /**
- * Scroll element into view
+ * Scroll element into view.
  *
  * @static
  * @param {HTMLElement} el Element to scroll into view
@@ -526,7 +527,7 @@ OO.ui.Element.scrollIntoView = function ( el, config ) {
  *
  * Override this method to base the result on instance information.
  *
- * @returns {string} HTML tag name
+ * @return {string} HTML tag name
  */
 OO.ui.Element.prototype.getTagName = function () {
        return this.constructor.static.tagName;
@@ -535,7 +536,7 @@ OO.ui.Element.prototype.getTagName = function () {
 /**
  * Get the DOM document.
  *
- * @returns {HTMLDocument} Document object
+ * @return {HTMLDocument} Document object
  */
 OO.ui.Element.prototype.getElementDocument = function () {
        return OO.ui.Element.getDocument( this.$element );
@@ -544,7 +545,7 @@ OO.ui.Element.prototype.getElementDocument = function () {
 /**
  * Get the DOM window.
  *
- * @returns {Window} Window object
+ * @return {Window} Window object
  */
 OO.ui.Element.prototype.getElementWindow = function () {
        return OO.ui.Element.getWindow( this.$element );
@@ -553,7 +554,6 @@ OO.ui.Element.prototype.getElementWindow = function () {
 /**
  * Get closest scrollable container.
  *
- * @method
  * @see #static-method-getClosestScrollableContainer
  */
 OO.ui.Element.prototype.getClosestScrollableElementContainer = function () {
@@ -563,7 +563,7 @@ OO.ui.Element.prototype.getClosestScrollableElementContainer = function () {
 /**
  * Get group element is in.
  *
- * @returns {OO.ui.GroupElement|null} Group element, null if none
+ * @return {OO.ui.GroupElement|null} Group element, null if none
  */
 OO.ui.Element.prototype.getElementGroup = function () {
        return this.elementGroup;
@@ -581,9 +581,8 @@ OO.ui.Element.prototype.setElementGroup = function ( group ) {
 };
 
 /**
- * Scroll element into view
+ * Scroll element into view.
  *
- * @method
  * @see #static-method-scrollIntoView
  * @param {Object} [config={}]
  */
@@ -710,6 +709,10 @@ OO.mixinClass( OO.ui.Frame, OO.EventEmitter );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.Frame.static.tagName = 'iframe';
 
 /* Events */
@@ -919,8 +922,8 @@ OO.ui.Frame.prototype.setSize = function ( width, height ) {
  * There are two ways to specify a title: set the static `title` property or provide a `title`
  * property in the configuration options. The latter will override the former.
  *
- * @class
  * @abstract
+ * @class
  * @extends OO.ui.Element
  * @mixins OO.EventEmitter
  *
@@ -1027,8 +1030,7 @@ OO.ui.Window.static.title = null;
 /**
  * Check if window is visible.
  *
- * @method
- * @returns {boolean} Window is visible
+ * @return {boolean} Window is visible
  */
 OO.ui.Window.prototype.isVisible = function () {
        return this.visible;
@@ -1037,8 +1039,7 @@ OO.ui.Window.prototype.isVisible = function () {
 /**
  * Check if window is opening.
  *
- * @method
- * @returns {boolean} Window is opening
+ * @return {boolean} Window is opening
  */
 OO.ui.Window.prototype.isOpening = function () {
        return this.opening;
@@ -1047,8 +1048,7 @@ OO.ui.Window.prototype.isOpening = function () {
 /**
  * Check if window is closing.
  *
- * @method
- * @returns {boolean} Window is closing
+ * @return {boolean} Window is closing
  */
 OO.ui.Window.prototype.isClosing = function () {
        return this.closing;
@@ -1057,8 +1057,7 @@ OO.ui.Window.prototype.isClosing = function () {
 /**
  * Get the window frame.
  *
- * @method
- * @returns {OO.ui.Frame} Frame of window
+ * @return {OO.ui.Frame} Frame of window
  */
 OO.ui.Window.prototype.getFrame = function () {
        return this.frame;
@@ -1067,7 +1066,7 @@ OO.ui.Window.prototype.getFrame = function () {
 /**
  * Get the title of the window.
  *
- * @returns {string} Title text
+ * @return {string} Title text
  */
 OO.ui.Window.prototype.getTitle = function () {
        return this.title;
@@ -1076,7 +1075,7 @@ OO.ui.Window.prototype.getTitle = function () {
 /**
  * Get the window icon.
  *
- * @returns {string} Symbolic name of icon
+ * @return {string} Symbolic name of icon
  */
 OO.ui.Window.prototype.getIcon = function () {
        return this.icon;
@@ -1135,7 +1134,7 @@ OO.ui.Window.prototype.setIcon = function ( icon ) {
 };
 
 /**
- * Set the position of window to fit with contents..
+ * Set the position of window to fit with contents.
  *
  * @param {string} left Left offset
  * @param {string} top Top offset
@@ -1188,7 +1187,6 @@ OO.ui.Window.prototype.fitWidthToContents = function ( min, max ) {
  *
  * Once this method is called, this.$$ can be used to create elements within the frame.
  *
- * @method
  * @fires initialize
  * @chainable
  */
@@ -1229,7 +1227,6 @@ OO.ui.Window.prototype.initialize = function () {
  *
  * When you override this method, you must call the parent method at the very beginning.
  *
- * @method
  * @abstract
  * @param {Object} [data] Window opening data
  */
@@ -1245,7 +1242,6 @@ OO.ui.Window.prototype.setup = function () {
  *
  * When you override this method, you must call the parent method at the very end.
  *
- * @method
  * @abstract
  * @param {Object} [data] Window closing data
  */
@@ -1258,7 +1254,6 @@ OO.ui.Window.prototype.teardown = function () {
  *
  * Do not override this method. See #setup for a way to make changes each time the window opens.
  *
- * @method
  * @param {Object} [data] Window opening data
  * @fires open
  * @chainable
@@ -1285,7 +1280,6 @@ OO.ui.Window.prototype.open = function ( data ) {
  *
  * See #teardown for a way to do something each time the window closes.
  *
- * @method
  * @param {Object} [data] Window closing data
  * @fires close
  * @chainable
@@ -1326,13 +1320,15 @@ OO.ui.WindowSet = function OoUiWindowSet( factory, config ) {
        this.factory = factory;
 
        /**
-        * List of all windows associated with this window set
+        * List of all windows associated with this window set.
+        *
         * @property {OO.ui.Window[]}
         */
        this.windowList = [];
 
        /**
         * Mapping of OO.ui.Window objects created by name from the #factory.
+        *
         * @property {Object}
         */
        this.windows = {};
@@ -1379,7 +1375,6 @@ OO.mixinClass( OO.ui.WindowSet, OO.EventEmitter );
 /**
  * Handle a window that's being opened.
  *
- * @method
  * @param {OO.ui.Window} win Window that's being opened
  * @param {Object} [config] Window opening information
  * @fires opening
@@ -1395,7 +1390,6 @@ OO.ui.WindowSet.prototype.onWindowOpening = function ( win, config ) {
 /**
  * Handle a window that's been opened.
  *
- * @method
  * @param {OO.ui.Window} win Window that's been opened
  * @param {Object} [config] Window opening information
  * @fires open
@@ -1407,7 +1401,6 @@ OO.ui.WindowSet.prototype.onWindowOpen = function ( win, config ) {
 /**
  * Handle a window that's being closed.
  *
- * @method
  * @param {OO.ui.Window} win Window that's being closed
  * @param {Object} [config] Window closing information
  * @fires closing
@@ -1420,7 +1413,6 @@ OO.ui.WindowSet.prototype.onWindowClosing = function ( win, config ) {
 /**
  * Handle a window that's been closed.
  *
- * @method
  * @param {OO.ui.Window} win Window that's been closed
  * @param {Object} [config] Window closing information
  * @fires close
@@ -1432,8 +1424,7 @@ OO.ui.WindowSet.prototype.onWindowClose = function ( win, config ) {
 /**
  * Get the current window.
  *
- * @method
- * @returns {OO.ui.Window} Current window
+ * @return {OO.ui.Window} Current window
  */
 OO.ui.WindowSet.prototype.getCurrentWindow = function () {
        return this.currentWindow;
@@ -1452,12 +1443,22 @@ OO.ui.WindowSet.prototype.getWindow = function ( name ) {
                throw new Error( 'Unknown window: ' + name );
        }
        if ( !( name in this.windows ) ) {
-               win = this.windows[name] = this.factory.create( name, this, { '$': this.$ } );
+               win = this.windows[name] = this.createWindow( name );
                this.addWindow( win );
        }
        return this.windows[name];
 };
 
+/**
+ * Create a window for use in this window set.
+ *
+ * @param {string} name Symbolic name of window
+ * @return {OO.ui.Window} Window with specified name
+ */
+OO.ui.WindowSet.prototype.createWindow = function ( name ) {
+       return this.factory.create( name, { '$': this.$ } );
+};
+
 /**
  * Add a given window to this window set.
  *
@@ -1482,20 +1483,18 @@ OO.ui.WindowSet.prototype.addWindow = function ( win ) {
        this.$element.append( win.$element );
 };
 /**
- * Modal dialog box.
- *
- * @class
  * @abstract
+ * @class
  * @extends OO.ui.Window
  *
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {boolean} [footless] Hide foot
- * @cfg {boolean} [small] Make the dialog small
+ * @cfg {string} [size='large'] Symbolic name of dialog size, `small`, `medium` or `large`
  */
 OO.ui.Dialog = function OoUiDialog( config ) {
        // Configuration initialization
-       config = config || {};
+       config = $.extend( { 'size': 'large' }, config );
 
        // Parent constructor
        OO.ui.Window.call( this, config );
@@ -1503,7 +1502,7 @@ OO.ui.Dialog = function OoUiDialog( config ) {
        // Properties
        this.visible = false;
        this.footless = !!config.footless;
-       this.small = !!config.small;
+       this.size = null;
        this.onWindowMouseWheelHandler = OO.ui.bind( this.onWindowMouseWheel, this );
        this.onDocumentKeyDownHandler = OO.ui.bind( this.onDocumentKeyDown, this );
 
@@ -1513,6 +1512,7 @@ OO.ui.Dialog = function OoUiDialog( config ) {
 
        // Initialization
        this.$element.addClass( 'oo-ui-dialog' );
+       this.setSize( config.size );
 };
 
 /* Inheritance */
@@ -1531,12 +1531,23 @@ OO.inheritClass( OO.ui.Dialog, OO.ui.Window );
  */
 OO.ui.Dialog.static.name = '';
 
+/**
+ * Map of symbolic size names and CSS classes.
+ *
+ * @static
+ * @property {Object}
+ * @inheritable
+ */
+OO.ui.Dialog.static.sizeCssClasses = {
+       'small': 'oo-ui-dialog-small',
+       'medium': 'oo-ui-dialog-medium',
+       'large': 'oo-ui-dialog-large'
+};
+
 /* Methods */
 
 /**
  * Handle close button click events.
- *
- * @method
  */
 OO.ui.Dialog.prototype.onCloseButtonClick = function () {
        this.close( { 'action': 'cancel' } );
@@ -1545,7 +1556,6 @@ OO.ui.Dialog.prototype.onCloseButtonClick = function () {
 /**
  * Handle window mouse wheel events.
  *
- * @method
  * @param {jQuery.Event} e Mouse wheel event
  */
 OO.ui.Dialog.prototype.onWindowMouseWheel = function () {
@@ -1555,7 +1565,6 @@ OO.ui.Dialog.prototype.onWindowMouseWheel = function () {
 /**
  * Handle document key down events.
  *
- * @method
  * @param {jQuery.Event} e Key down event
  */
 OO.ui.Dialog.prototype.onDocumentKeyDown = function ( e ) {
@@ -1576,7 +1585,6 @@ OO.ui.Dialog.prototype.onDocumentKeyDown = function ( e ) {
 /**
  * Handle frame document key down events.
  *
- * @method
  * @param {jQuery.Event} e Key down event
  */
 OO.ui.Dialog.prototype.onFrameDocumentKeyDown = function ( e ) {
@@ -1591,6 +1599,29 @@ OO.ui.Dialog.prototype.onOpening = function () {
        this.$element.addClass( 'oo-ui-dialog-open' );
 };
 
+/**
+ * Set dialog size.
+ *
+ * @param {string} [size='large'] Symbolic name of dialog size, `small`, `medium` or `large`
+ */
+OO.ui.Dialog.prototype.setSize = function ( size ) {
+       var name, state, cssClass,
+               sizeCssClasses = OO.ui.Dialog.static.sizeCssClasses;
+
+       if ( !sizeCssClasses[size] ) {
+               size = 'large';
+       }
+       this.size = size;
+       for ( name in sizeCssClasses ) {
+               state = name === size;
+               cssClass = sizeCssClasses[name];
+               this.$element.toggleClass( cssClass, state );
+               if ( this.frame.$content ) {
+                       this.frame.$content.toggleClass( cssClass, state );
+               }
+       }
+};
+
 /**
  * @inheritdoc
  */
@@ -1615,9 +1646,6 @@ OO.ui.Dialog.prototype.initialize = function () {
        if ( this.footless ) {
                this.frame.$content.addClass( 'oo-ui-dialog-content-footless' );
        }
-       if ( this.small ) {
-               this.$frame.addClass( 'oo-ui-window-frame-small' );
-       }
        this.closeButton.$element.addClass( 'oo-ui-window-closeButton' );
        this.$head.append( this.closeButton.$element );
 };
@@ -1664,8 +1692,8 @@ OO.ui.Dialog.prototype.close = function ( data ) {
 /**
  * Container for elements.
  *
- * @class
  * @abstract
+ * @class
  * @extends OO.ui.Element
  * @mixins OO.EventEmitter
  *
@@ -1694,8 +1722,8 @@ OO.mixinClass( OO.ui.Layout, OO.EventEmitter );
 /**
  * User interface control.
  *
- * @class
  * @abstract
+ * @class
  * @extends OO.ui.Element
  * @mixins OO.EventEmitter
  *
@@ -1740,7 +1768,6 @@ OO.mixinClass( OO.ui.Widget, OO.EventEmitter );
 /**
  * Check if the widget is disabled.
  *
- * @method
  * @param {boolean} Button is disabled
  */
 OO.ui.Widget.prototype.isDisabled = function () {
@@ -1750,7 +1777,6 @@ OO.ui.Widget.prototype.isDisabled = function () {
 /**
  * Update the disabled state, in case of changes in parent widget.
  *
- * @method
  * @chainable
  */
 OO.ui.Widget.prototype.updateDisabled = function () {
@@ -1763,7 +1789,6 @@ OO.ui.Widget.prototype.updateDisabled = function () {
  *
  * This should probably change the widgets's appearance and prevent it from being used.
  *
- * @method
  * @param {boolean} disabled Disable widget
  * @chainable
  */
@@ -1774,6 +1799,7 @@ OO.ui.Widget.prototype.setDisabled = function ( disabled ) {
        isDisabled = this.isDisabled();
        if ( isDisabled !== this.wasDisabled ) {
                this.$element.toggleClass( 'oo-ui-widget-disabled', isDisabled );
+               this.$element.toggleClass( 'oo-ui-widget-enabled', !isDisabled );
                this.emit( 'disable', isDisabled );
        }
        this.wasDisabled = isDisabled;
@@ -1789,7 +1815,7 @@ OO.ui.Widget.prototype.setDisabled = function ( disabled ) {
  * @param {jQuery} $button Button node, assigned to #$button
  * @param {Object} [config] Configuration options
  * @cfg {boolean} [frameless] Render button without a frame
- * @cfg {number} [tabIndex] Button's tab index
+ * @cfg {number} [tabIndex=0] Button's tab index, use -1 to prevent tab focusing
  */
 OO.ui.ButtonedElement = function OoUiButtonedElement( $button, config ) {
        // Configuration initialization
@@ -1828,7 +1854,9 @@ OO.ui.ButtonedElement = function OoUiButtonedElement( $button, config ) {
 OO.ui.ButtonedElement.prototype.onMouseDown = function () {
        this.tabIndex = this.$button.attr( 'tabIndex' );
        // Remove the tab-index while the button is down to prevent the button from stealing focus
-       this.$button.removeAttr( 'tabIndex' );
+       this.$button
+               .removeAttr( 'tabIndex' )
+               .addClass( 'oo-ui-buttonedElement-pressed' );
        this.getElementDocument().addEventListener( 'mouseup', this.onMouseUpHandler, true );
 };
 
@@ -1840,7 +1868,9 @@ OO.ui.ButtonedElement.prototype.onMouseDown = function () {
  */
 OO.ui.ButtonedElement.prototype.onMouseUp = function () {
        // Restore the tab-index after the button is up to restore the button's accesssibility
-       this.$button.attr( 'tabIndex', this.tabIndex );
+       this.$button
+               .attr( 'tabIndex', this.tabIndex )
+               .removeClass( 'oo-ui-buttonedElement-pressed' );
        this.getElementDocument().removeEventListener( 'mouseup', this.onMouseUpHandler, true );
 };
 
@@ -1852,7 +1882,7 @@ OO.ui.ButtonedElement.prototype.onMouseUp = function () {
  * @chainable
  */
 OO.ui.ButtonedElement.prototype.setActive = function ( value ) {
-       this.$element.toggleClass( 'oo-ui-buttonedElement-active', !!value );
+       this.$button.toggleClass( 'oo-ui-buttonedElement-active', !!value );
        return this;
 };
 /**
@@ -2429,6 +2459,7 @@ OO.ui.IndicatedElement.prototype.getIndicatorTitle = function () {
  * @param {jQuery} $label Label node, assigned to #$label
  * @param {Object} [config] Configuration options
  * @cfg {jQuery|string|Function} [label] Label nodes, text or a function that returns nodes or text
+ * @cfg {boolean} [autoFitLabel=true] Whether to fit the label or not.
  */
 OO.ui.LabeledElement = function OoUiLabeledElement( $label, config ) {
        // Config intialization
@@ -2441,6 +2472,7 @@ OO.ui.LabeledElement = function OoUiLabeledElement( $label, config ) {
        // Initialization
        this.$label.addClass( 'oo-ui-labeledElement-label' );
        this.setLabel( config.label || this.constructor.static.label );
+       this.autoFitLabel = config.autoFitLabel === undefined || !!config.autoFitLabel;
 };
 
 /* Static Properties */
@@ -2511,7 +2543,7 @@ OO.ui.LabeledElement.prototype.getLabel = function () {
  * @chainable
  */
 OO.ui.LabeledElement.prototype.fitLabel = function () {
-       if ( this.$label.autoEllipsis ) {
+       if ( this.$label.autoEllipsis && this.autoFitLabel ) {
                this.$label.autoEllipsis( { 'hasSpan': false, 'tooltip': true } );
        }
        return this;
@@ -2640,8 +2672,8 @@ OO.ui.TitledElement.prototype.getTitle = function () {
 /**
  * Generic toolbar tool.
  *
- * @class
  * @abstract
+ * @class
  * @extends OO.ui.Widget
  * @mixins OO.ui.IconedElement
  *
@@ -2700,6 +2732,10 @@ OO.mixinClass( OO.ui.Tool, OO.ui.IconedElement );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.Tool.static.tagName = 'span';
 
 /**
@@ -2749,11 +2785,11 @@ OO.ui.Tool.static.autoAdd = true;
 /**
  * Check if this tool is compatible with given data.
  *
- * @method
  * @static
+ * @method
  * @inheritable
  * @param {Mixed} data Data to check
- * @returns {boolean} Tool can be used with data
+ * @return {boolean} Tool can be used with data
  */
 OO.ui.Tool.static.isCompatibleWith = function () {
        return false;
@@ -2767,7 +2803,6 @@ OO.ui.Tool.static.isCompatibleWith = function () {
  * This is an abstract method that must be overridden in a concrete subclass.
  *
  * @abstract
- * @method
  */
 OO.ui.Tool.prototype.onUpdateState = function () {
        throw new Error(
@@ -2781,7 +2816,6 @@ OO.ui.Tool.prototype.onUpdateState = function () {
  * This is an abstract method that must be overridden in a concrete subclass.
  *
  * @abstract
- * @method
  */
 OO.ui.Tool.prototype.onSelect = function () {
        throw new Error(
@@ -2792,7 +2826,6 @@ OO.ui.Tool.prototype.onSelect = function () {
 /**
  * Check if the button is active.
  *
- * @method
  * @param {boolean} Button is active
  */
 OO.ui.Tool.prototype.isActive = function () {
@@ -2802,7 +2835,6 @@ OO.ui.Tool.prototype.isActive = function () {
 /**
  * Make the button appear active or inactive.
  *
- * @method
  * @param {boolean} state Make button appear active
  */
 OO.ui.Tool.prototype.setActive = function ( state ) {
@@ -2817,7 +2849,6 @@ OO.ui.Tool.prototype.setActive = function ( state ) {
 /**
  * Get the tool title.
  *
- * @method
  * @param {string|Function} title Title text or a function that returns text
  * @chainable
  */
@@ -2830,8 +2861,7 @@ OO.ui.Tool.prototype.setTitle = function ( title ) {
 /**
  * Get the tool title.
  *
- * @method
- * @returns {string} Title text
+ * @return {string} Title text
  */
 OO.ui.Tool.prototype.getTitle = function () {
        return this.title;
@@ -2840,8 +2870,7 @@ OO.ui.Tool.prototype.getTitle = function () {
 /**
  * Get the tool's symbolic name.
  *
- * @method
- * @returns {string} Symbolic name of tool
+ * @return {string} Symbolic name of tool
  */
 OO.ui.Tool.prototype.getName = function () {
        return this.constructor.static.name;
@@ -2849,8 +2878,6 @@ OO.ui.Tool.prototype.getName = function () {
 
 /**
  * Update the title.
- *
- * @method
  */
 OO.ui.Tool.prototype.updateTitle = function () {
        var titleTooltips = this.toolGroup.constructor.static.titleTooltips,
@@ -2881,8 +2908,6 @@ OO.ui.Tool.prototype.updateTitle = function () {
 
 /**
  * Destroy tool.
- *
- * @method
  */
 OO.ui.Tool.prototype.destroy = function () {
        this.toolbar.disconnect( this );
@@ -2952,8 +2977,7 @@ OO.mixinClass( OO.ui.Toolbar, OO.ui.GroupElement );
 /**
  * Get the tool factory.
  *
- * @method
- * @returns {OO.Factory} Tool factory
+ * @return {OO.Factory} Tool factory
  */
 OO.ui.Toolbar.prototype.getToolFactory = function () {
        return this.toolFactory;
@@ -2962,7 +2986,6 @@ OO.ui.Toolbar.prototype.getToolFactory = function () {
 /**
  * Handles mouse down events.
  *
- * @method
  * @param {jQuery.Event} e Mouse down event
  */
 OO.ui.Toolbar.prototype.onMouseDown = function ( e ) {
@@ -2985,11 +3008,11 @@ OO.ui.Toolbar.prototype.initialize = function () {
  * Setup toolbar.
  *
  * Tools can be specified in the following ways:
- *  - A specific tool: `{ 'name': 'tool-name' }` or `'tool-name'`
- *  - All tools in a group: `{ 'group': 'group-name' }`
- *  - All tools: `'*'` - Using this will make the group a list with a "More" label by default
  *
- * @method
+ * - A specific tool: `{ 'name': 'tool-name' }` or `'tool-name'`
+ * - All tools in a group: `{ 'group': 'group-name' }`
+ * - All tools: `'*'` - Using this will make the group a list with a "More" label by default
+ *
  * @param {Object.<string,Array>} groups List of tool group configurations
  * @param {Array|string} [groups.include] Tools to include
  * @param {Array|string} [groups.exclude] Tools to exclude
@@ -3088,7 +3111,7 @@ OO.ui.Toolbar.prototype.releaseTool = function ( tool ) {
  * This is a stub that should be overridden to provide access to accelerator information.
  *
  * @param {string} name Symbolic name of tool
- * @returns {string|undefined} Tool accelerator label if available
+ * @return {string|undefined} Tool accelerator label if available
  */
 OO.ui.Toolbar.prototype.getToolAccelerator = function () {
        return undefined;
@@ -3111,6 +3134,7 @@ OO.inheritClass( OO.ui.ToolFactory, OO.Factory );
 
 /* Methods */
 
+/** */
 OO.ui.ToolFactory.prototype.getTools = function ( include, exclude, promote, demote ) {
        var i, len, included, promoted, demoted,
                auto = [],
@@ -3137,14 +3161,15 @@ OO.ui.ToolFactory.prototype.getTools = function ( include, exclude, promote, dem
  * Get a flat list of names from a list of names or groups.
  *
  * Tools can be specified in the following ways:
- *  - A specific tool: `{ 'name': 'tool-name' }` or `'tool-name'`
- *  - All tools in a group: `{ 'group': 'group-name' }`
- *  - All tools: `'*'`
+ *
+ * - A specific tool: `{ 'name': 'tool-name' }` or `'tool-name'`
+ * - All tools in a group: `{ 'group': 'group-name' }`
+ * - All tools: `'*'`
  *
  * @private
  * @param {Array|string} collection List of tools
  * @param {Object} [used] Object with names that should be skipped as properties; extracted
- *   names will be added as properties
+ *  names will be added as properties
  * @return {string[]} List of extracted names
  */
 OO.ui.ToolFactory.prototype.extract = function ( collection, used ) {
@@ -3207,16 +3232,17 @@ OO.ui.ToolFactory.prototype.extract = function ( collection, used ) {
 /**
  * Collection of tools.
  *
- * @class
+ * Tools can be specified in the following ways:
+ *
+ * - A specific tool: `{ 'name': 'tool-name' }` or `'tool-name'`
+ * - All tools in a group: `{ 'group': 'group-name' }`
+ * - All tools: `'*'`
+ *
  * @abstract
+ * @class
  * @extends OO.ui.Widget
  * @mixins OO.ui.GroupElement
  *
- * Tools can be specified in the following ways:
- *  - A specific tool: `{ 'name': 'tool-name' }` or `'tool-name'`
- *  - All tools in a group: `{ 'group': 'group-name' }`
- *  - All tools: `'*'`
- *
  * @constructor
  * @param {OO.ui.Toolbar} toolbar
  * @param {Object} [config] Configuration options
@@ -3299,7 +3325,6 @@ OO.ui.ToolGroup.static.accelTooltips = false;
 /**
  * Handle mouse down events.
  *
- * @method
  * @param {jQuery.Event} e Mouse down event
  */
 OO.ui.ToolGroup.prototype.onMouseDown = function ( e ) {
@@ -3318,7 +3343,6 @@ OO.ui.ToolGroup.prototype.onMouseDown = function ( e ) {
 /**
  * Handle captured mouse up events.
  *
- * @method
  * @param {Event} e Mouse up event
  */
 OO.ui.ToolGroup.prototype.onCapturedMouseUp = function ( e ) {
@@ -3331,7 +3355,6 @@ OO.ui.ToolGroup.prototype.onCapturedMouseUp = function ( e ) {
 /**
  * Handle mouse up events.
  *
- * @method
  * @param {jQuery.Event} e Mouse up event
  */
 OO.ui.ToolGroup.prototype.onMouseUp = function ( e ) {
@@ -3348,7 +3371,6 @@ OO.ui.ToolGroup.prototype.onMouseUp = function ( e ) {
 /**
  * Handle mouse over events.
  *
- * @method
  * @param {jQuery.Event} e Mouse over event
  */
 OO.ui.ToolGroup.prototype.onMouseOver = function ( e ) {
@@ -3362,7 +3384,6 @@ OO.ui.ToolGroup.prototype.onMouseOver = function ( e ) {
 /**
  * Handle mouse out events.
  *
- * @method
  * @param {jQuery.Event} e Mouse out event
  */
 OO.ui.ToolGroup.prototype.onMouseOut = function ( e ) {
@@ -3379,10 +3400,9 @@ OO.ui.ToolGroup.prototype.onMouseOut = function ( e ) {
  * Only tool links are considered, which prevents other elements in the tool such as popups from
  * triggering tool group interactions.
  *
- * @method
  * @private
  * @param {jQuery.Event} e
- * @returns {OO.ui.Tool|null} Tool, `null` if none was found
+ * @return {OO.ui.Tool|null} Tool, `null` if none was found
  */
 OO.ui.ToolGroup.prototype.getTargetTool = function ( e ) {
        var tool,
@@ -3399,6 +3419,7 @@ OO.ui.ToolGroup.prototype.getTargetTool = function ( e ) {
  * Handle tool registry register events.
  *
  * If a tool is registered after the group is created, we must repopulate the list to account for:
+ *
  * - a tool being added that may be included
  * - a tool already included being overridden
  *
@@ -3419,8 +3440,6 @@ OO.ui.ToolGroup.prototype.getToolbar = function () {
 
 /**
  * Add and remove tools based on configuration.
- *
- * @method
  */
 OO.ui.ToolGroup.prototype.populate = function () {
        var i, len, name, tool,
@@ -3476,8 +3495,6 @@ OO.ui.ToolGroup.prototype.populate = function () {
 
 /**
  * Destroy tool group.
- *
- * @method
  */
 OO.ui.ToolGroup.prototype.destroy = function () {
        var name;
@@ -3835,6 +3852,7 @@ OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
        this.ignoreFocus = false;
        this.stackLayout = new OO.ui.StackLayout( { '$': this.$, 'continuous': !!config.continuous } );
        this.autoFocus = !!config.autoFocus;
+       this.outlineVisible = false;
        this.outlined = !!config.outlined;
        if ( this.outlined ) {
                this.editable = !!config.editable;
@@ -3845,6 +3863,7 @@ OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
                this.gridLayout = new OO.ui.GridLayout(
                        [this.outlinePanel, this.stackLayout], { '$': this.$, 'widths': [1, 2] }
                );
+               this.outlineVisible = true;
                if ( this.editable ) {
                        this.outlineControlsWidget = new OO.ui.OutlineControlsWidget(
                                this.outlineWidget,
@@ -3857,6 +3876,8 @@ OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
        this.stackLayout.connect( this, { 'set': 'onStackLayoutSet' } );
        if ( this.outlined ) {
                this.outlineWidget.connect( this, { 'select': 'onOutlineWidgetSelect' } );
+       }
+       if ( this.autoFocus ) {
                // Event 'focus' does not bubble, but 'focusin' does
                this.stackLayout.onDOMEvent( 'focusin', OO.ui.bind( this.onStackLayoutFocus, this ) );
        }
@@ -3934,6 +3955,7 @@ OO.ui.BookletLayout.prototype.onStackLayoutFocus = function ( e ) {
  */
 OO.ui.BookletLayout.prototype.onStackLayoutSet = function ( page ) {
        if ( page ) {
+               this.stackLayout.$element.find( ':focus' ).blur();
                page.scrollElementIntoView( { 'complete': OO.ui.bind( function () {
                        this.ignoreFocus = true;
                        if ( this.autoFocus ) {
@@ -3976,6 +3998,67 @@ OO.ui.BookletLayout.prototype.isEditable = function () {
        return this.editable;
 };
 
+/**
+ * Check if booklet has editing controls.
+ *
+ * @method
+ * @returns {boolean} Booklet is outlined
+ */
+OO.ui.BookletLayout.prototype.isOutlineVisible = function () {
+       return this.outlined && this.outlineVisible;
+};
+
+/**
+ * Hide or show the outline.
+ *
+ * @param {boolean} [show] Show outline, omit to invert current state
+ * @chainable
+ */
+OO.ui.BookletLayout.prototype.toggleOutline = function ( show ) {
+       if ( this.outlined ) {
+               show = show === undefined ? !this.outlineVisible : !!show;
+               this.outlineVisible = show;
+               this.gridLayout.layout( show ? [ 1, 2 ] : [ 0, 1 ], [ 1 ] );
+       }
+
+       return this;
+};
+
+/**
+ * Get the outline widget.
+ *
+ * @method
+ * @param {OO.ui.PageLayout} page Page to be selected
+ * @returns {OO.ui.PageLayout|null} Closest page to another
+ */
+OO.ui.BookletLayout.prototype.getClosestPage = function ( page ) {
+       var next, prev, level,
+               pages = this.stackLayout.getItems(),
+               index = $.inArray( page, pages );
+
+       if ( index !== -1 ) {
+               next = pages[index + 1];
+               prev = pages[index - 1];
+               // Prefer adjacent pages at the same level
+               if ( this.outlined ) {
+                       level = this.outlineWidget.getItemFromData( page.getName() ).getLevel();
+                       if (
+                               prev &&
+                               level === this.outlineWidget.getItemFromData( prev.getName() ).getLevel()
+                       ) {
+                               return prev;
+                       }
+                       if (
+                               next &&
+                               level === this.outlineWidget.getItemFromData( next.getName() ).getLevel()
+                       ) {
+                               return next;
+                       }
+               }
+       }
+       return prev || next || null;
+};
+
 /**
  * Get the outline widget.
  *
@@ -4030,17 +4113,33 @@ OO.ui.BookletLayout.prototype.getPageName = function () {
  * @chainable
  */
 OO.ui.BookletLayout.prototype.addPages = function ( pages, index ) {
-       var i, len, name, page, item,
-               items = [],
-               remove = [];
+       var i, len, name, page, item, currentIndex,
+               stackLayoutPages = this.stackLayout.getItems(),
+               remove = [],
+               items = [];
 
+       // Remove pages with same names
        for ( i = 0, len = pages.length; i < len; i++ ) {
                page = pages[i];
                name = page.getName();
-               if ( name in this.pages ) {
-                       // Remove page with same name
+
+               if ( Object.prototype.hasOwnProperty.call( this.pages, name ) ) {
+                       // Correct the insertion index
+                       currentIndex = $.inArray( this.pages[name], stackLayoutPages );
+                       if ( currentIndex !== -1 && currentIndex + 1 < index ) {
+                               index--;
+                       }
                        remove.push( this.pages[name] );
                }
+       }
+       if ( remove.length ) {
+               this.removePages( remove );
+       }
+
+       // Add new pages
+       for ( i = 0, len = pages.length; i < len; i++ ) {
+               page = pages[i];
+               name = page.getName();
                this.pages[page.getName()] = page;
                if ( this.outlined ) {
                        item = new OO.ui.OutlineItemWidget( name, page, { '$': this.$ } );
@@ -4048,9 +4147,6 @@ OO.ui.BookletLayout.prototype.addPages = function ( pages, index ) {
                        items.push( item );
                }
        }
-       if ( remove.length ) {
-               this.removePages( remove );
-       }
 
        if ( this.outlined && items.length ) {
                this.outlineWidget.addItems( items, index );
@@ -4129,17 +4225,22 @@ OO.ui.BookletLayout.prototype.setPage = function ( name ) {
        var selectedItem,
                page = this.pages[name];
 
-       if ( this.outlined ) {
-               selectedItem = this.outlineWidget.getSelectedItem();
-               if ( selectedItem && selectedItem.getData() !== name ) {
-                       this.outlineWidget.selectItem( this.outlineWidget.getItemFromData( name ) );
+       if ( name !== this.currentPageName ) {
+               if ( this.outlined ) {
+                       selectedItem = this.outlineWidget.getSelectedItem();
+                       if ( selectedItem && selectedItem.getData() !== name ) {
+                               this.outlineWidget.selectItem( this.outlineWidget.getItemFromData( name ) );
+                       }
+               }
+               if ( page ) {
+                       if ( this.currentPageName && this.pages[this.currentPageName] ) {
+                               this.pages[this.currentPageName].setActive( false );
+                       }
+                       this.currentPageName = name;
+                       this.stackLayout.setItem( page );
+                       page.setActive( true );
+                       this.emit( 'set', page );
                }
-       }
-
-       if ( page ) {
-               this.currentPageName = name;
-               this.stackLayout.setItem( page );
-               this.emit( 'set', page );
        }
 };
 
@@ -4213,6 +4314,7 @@ OO.ui.PageLayout = function OoUiPageLayout( name, config ) {
        // Properties
        this.name = name;
        this.outlineItem = config.outlineItem || null;
+       this.active = false;
 
        // Initialization
        this.$element.addClass( 'oo-ui-pageLayout' );
@@ -4222,6 +4324,13 @@ OO.ui.PageLayout = function OoUiPageLayout( name, config ) {
 
 OO.inheritClass( OO.ui.PageLayout, OO.ui.PanelLayout );
 
+/* Events */
+
+/**
+ * @event active
+ * @param {boolean} active Page is active
+ */
+
 /* Methods */
 
 /**
@@ -4233,6 +4342,15 @@ OO.ui.PageLayout.prototype.getName = function () {
        return this.name;
 };
 
+/**
+ * Check if page is active.
+ *
+ * @returns {boolean} Page is active
+ */
+OO.ui.PageLayout.prototype.isActive = function () {
+       return this.active;
+};
+
 /**
  * Get outline item.
  *
@@ -4252,6 +4370,22 @@ OO.ui.PageLayout.prototype.setOutlineItem = function ( outlineItem ) {
        this.outlineItem = outlineItem;
        return this;
 };
+
+/**
+ * Set page active state.
+ *
+ * @param {boolean} Page is active
+ * @fires active
+ */
+OO.ui.PageLayout.prototype.setActive = function ( active ) {
+       active = !!active;
+
+       if ( active !== this.active ) {
+               this.active = active;
+               this.$element.toggleClass( 'oo-ui-pageLayout-active', active );
+               this.emit( 'active', this.active );
+       }
+};
 /**
  * Layout containing a series of mutually exclusive pages.
  *
@@ -4370,18 +4504,20 @@ OO.ui.StackLayout.prototype.clearItems = function () {
  * @chainable
  */
 OO.ui.StackLayout.prototype.setItem = function ( item ) {
-       if ( !this.continuous ) {
-               this.$items.css( 'display', '' );
-       }
-       if ( $.inArray( item, this.items ) !== -1 ) {
+       if ( item !== this.currentItem ) {
                if ( !this.continuous ) {
-                       item.$element.css( 'display', 'block' );
+                       this.$items.css( 'display', '' );
                }
-       } else {
-               item = null;
+               if ( $.inArray( item, this.items ) !== -1 ) {
+                       if ( !this.continuous ) {
+                               item.$element.css( 'display', 'block' );
+                       }
+               } else {
+                       item = null;
+               }
+               this.currentItem = item;
+               this.emit( 'set', item );
        }
-       this.currentItem = item;
-       this.emit( 'set', item );
 
        return this;
 };
@@ -4497,17 +4633,12 @@ OO.ui.PopupToolGroup.prototype.onBlur = function ( e ) {
  * @inheritdoc
  */
 OO.ui.PopupToolGroup.prototype.onMouseUp = function ( e ) {
-       this.setActive( false );
+       if ( !this.disabled && e.which === 1 ) {
+               this.setActive( false );
+       }
        return OO.ui.ToolGroup.prototype.onMouseUp.call( this, e );
 };
 
-/**
- * @inheritdoc
- */
-OO.ui.PopupToolGroup.prototype.onMouseDown = function ( e ) {
-       return OO.ui.ToolGroup.prototype.onMouseDown.call( this, e );
-};
-
 /**
  * Handle mouse up events.
  *
@@ -4783,6 +4914,78 @@ OO.ui.ItemWidget.prototype.setElementGroup = function ( group ) {
 
        return this;
 };
+/**
+ * Creates an OO.ui.IconWidget object.
+ *
+ * @class
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.IconedElement
+ * @mixins OO.ui.TitledElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.IconWidget = function OoUiIconWidget( config ) {
+       // Config intialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.Widget.call( this, config );
+
+       // Mixin constructors
+       OO.ui.IconedElement.call( this, this.$element, config );
+       OO.ui.TitledElement.call( this, this.$element, config );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-iconWidget' );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.IconWidget, OO.ui.Widget );
+
+OO.mixinClass( OO.ui.IconWidget, OO.ui.IconedElement );
+OO.mixinClass( OO.ui.IconWidget, OO.ui.TitledElement );
+
+/* Static Properties */
+
+OO.ui.IconWidget.static.tagName = 'span';
+/**
+ * Creates an OO.ui.IndicatorWidget object.
+ *
+ * @class
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.IndicatedElement
+ * @mixins OO.ui.TitledElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.IndicatorWidget = function OoUiIndicatorWidget( config ) {
+       // Config intialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.Widget.call( this, config );
+
+       // Mixin constructors
+       OO.ui.IndicatedElement.call( this, this.$element, config );
+       OO.ui.TitledElement.call( this, this.$element, config );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-indicatorWidget' );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.IndicatorWidget, OO.ui.Widget );
+
+OO.mixinClass( OO.ui.IndicatorWidget, OO.ui.IndicatedElement );
+OO.mixinClass( OO.ui.IndicatorWidget, OO.ui.TitledElement );
+
+/* Static Properties */
+
+OO.ui.IndicatorWidget.static.tagName = 'span';
 /**
  * Container for multiple related buttons.
  *
@@ -5481,8 +5684,6 @@ OO.ui.LookupInputWidget.prototype.getLookupMenuItemsFromData = function () {
  * @constructor
  * @param {Mixed} data Option data
  * @param {Object} [config] Configuration options
- * @cfg {boolean} [selected=false] Select option
- * @cfg {boolean} [highlighted=false] Highlight option
  * @cfg {string} [rel] Value for `rel` attribute in DOM, allowing per-option styling
  */
 OO.ui.OptionWidget = function OoUiOptionWidget( data, config ) {
@@ -5510,10 +5711,6 @@ OO.ui.OptionWidget = function OoUiOptionWidget( data, config ) {
                .attr( 'rel', config.rel )
                .addClass( 'oo-ui-optionWidget' )
                .append( this.$label );
-       this.setSelected( config.selected );
-       this.setHighlighted( config.highlighted );
-
-       // Options
        this.$element
                .prepend( this.$icon )
                .append( this.$indicator );
@@ -6517,26 +6714,21 @@ OO.inheritClass( OO.ui.OutlineWidget, OO.ui.SelectWidget );
  * @constructor
  * @param {OO.ui.OutlineWidget} outline Outline to control
  * @param {Object} [config] Configuration options
- * @cfg {Object[]} [adders] List of icons to show as addable item types, each an object with
- *  name, title and icon properties
  */
 OO.ui.OutlineControlsWidget = function OoUiOutlineControlsWidget( outline, config ) {
        // Configuration initialization
-       config = config || {};
+       config = $.extend( { 'icon': 'add-item' }, config );
 
        // Parent constructor
        OO.ui.Widget.call( this, config );
 
+       // Mixin constructors
+       OO.ui.GroupElement.call( this, this.$( '<div>' ), config );
+       OO.ui.IconedElement.call( this, this.$( '<div>' ), config );
+
        // Properties
        this.outline = outline;
-       this.adders = {};
-       this.$adders = this.$( '<div>' );
        this.$movers = this.$( '<div>' );
-       this.addButton = new OO.ui.ButtonWidget( {
-               '$': this.$,
-               'frameless': true,
-               'icon': 'add-item'
-       } );
        this.upButton = new OO.ui.ButtonWidget( {
                '$': this.$,
                'frameless': true,
@@ -6549,6 +6741,12 @@ OO.ui.OutlineControlsWidget = function OoUiOutlineControlsWidget( outline, confi
                'icon': 'expand',
                'title': OO.ui.msg( 'ooui-outline-control-move-down' )
        } );
+       this.removeButton = new OO.ui.ButtonWidget( {
+               '$': this.$,
+               'frameless': true,
+               'icon': 'remove',
+               'title': OO.ui.msg( 'ooui-outline-control-remove' )
+       } );
 
        // Events
        outline.connect( this, {
@@ -6558,23 +6756,24 @@ OO.ui.OutlineControlsWidget = function OoUiOutlineControlsWidget( outline, confi
        } );
        this.upButton.connect( this, { 'click': ['emit', 'move', -1] } );
        this.downButton.connect( this, { 'click': ['emit', 'move', 1] } );
+       this.removeButton.connect( this, { 'click': ['emit', 'remove'] } );
 
        // Initialization
        this.$element.addClass( 'oo-ui-outlineControlsWidget' );
-       this.$adders.addClass( 'oo-ui-outlineControlsWidget-adders' );
+       this.$group.addClass( 'oo-ui-outlineControlsWidget-adders' );
        this.$movers
                .addClass( 'oo-ui-outlineControlsWidget-movers' )
-               .append( this.upButton.$element, this.downButton.$element );
-       this.$element.append( this.$adders, this.$movers );
-       if ( config.adders && config.adders.length ) {
-               this.setupAdders( config.adders );
-       }
+               .append( this.removeButton.$element, this.upButton.$element, this.downButton.$element );
+       this.$element.append( this.$icon, this.$group, this.$movers );
 };
 
 /* Inheritance */
 
 OO.inheritClass( OO.ui.OutlineControlsWidget, OO.ui.Widget );
 
+OO.mixinClass( OO.ui.OutlineControlsWidget, OO.ui.GroupElement );
+OO.mixinClass( OO.ui.OutlineControlsWidget, OO.ui.IconedElement );
+
 /* Events */
 
 /**
@@ -6582,6 +6781,10 @@ OO.inheritClass( OO.ui.OutlineControlsWidget, OO.ui.Widget );
  * @param {number} places Number of places to move
  */
 
+/**
+ * @event remove
+ */
+
 /* Methods */
 
 /**
@@ -6591,12 +6794,12 @@ OO.inheritClass( OO.ui.OutlineControlsWidget, OO.ui.Widget );
  */
 OO.ui.OutlineControlsWidget.prototype.onOutlineChange = function () {
        var i, len, firstMovable, lastMovable,
-               movable = false,
                items = this.outline.getItems(),
-               selectedItem = this.outline.getSelectedItem();
+               selectedItem = this.outline.getSelectedItem(),
+               movable = selectedItem && selectedItem.isMovable(),
+               removable = selectedItem && selectedItem.isRemovable();
 
-       if ( selectedItem && selectedItem.isMovable() ) {
-               movable = true;
+       if ( movable ) {
                i = -1;
                len = items.length;
                while ( ++i < len ) {
@@ -6615,30 +6818,7 @@ OO.ui.OutlineControlsWidget.prototype.onOutlineChange = function () {
        }
        this.upButton.setDisabled( !movable || selectedItem === firstMovable );
        this.downButton.setDisabled( !movable || selectedItem === lastMovable );
-};
-
-/**
- * Setup adders icons.
- *
- * @method
- * @param {Object[]} adders List of configuations for adder buttons, each containing a name, title
- *  and icon property
- */
-OO.ui.OutlineControlsWidget.prototype.setupAdders = function ( adders ) {
-       var i, len, addition, button,
-               $buttons = this.$( [] );
-
-       this.$adders.append( this.addButton.$element );
-       for ( i = 0, len = adders.length; i < len; i++ ) {
-               addition = adders[i];
-               button = new OO.ui.ButtonWidget( {
-                       '$': this.$, 'frameless': true, 'icon': addition.icon, 'title': addition.title
-               } );
-               button.connect( this, { 'click': ['emit', 'add', addition.name] } );
-               this.adders[addition.name] = button;
-               this.$adders.append( button.$element );
-               $buttons = $buttons.add( button.$element );
-       }
+       this.removeButton.setDisabled( !removable );
 };
 /**
  * Creates an OO.ui.OutlineItemWidget object.
@@ -6662,6 +6842,7 @@ OO.ui.OutlineItemWidget = function OoUiOutlineItemWidget( data, config ) {
        // Properties
        this.level = 0;
        this.movable = !!config.movable;
+       this.removable = !!config.removable;
 
        // Initialization
        this.$element.addClass( 'oo-ui-outlineItemWidget' );
@@ -6695,6 +6876,17 @@ OO.ui.OutlineItemWidget.prototype.isMovable = function () {
        return this.movable;
 };
 
+/**
+ * Check if item is removable.
+ *
+ * Removablilty is used by outline controls.
+ *
+ * @returns {boolean} Item is removable
+ */
+OO.ui.OutlineItemWidget.prototype.isRemovable = function () {
+       return this.removable;
+};
+
 /**
  * Get indentation level.
  *
@@ -6717,6 +6909,19 @@ OO.ui.OutlineItemWidget.prototype.setMovable = function ( movable ) {
        return this;
 };
 
+/**
+ * Set removability.
+ *
+ * Removablilty is used by outline controls.
+ *
+ * @param {boolean} movable Item is removable
+ * @chainable
+ */
+OO.ui.OutlineItemWidget.prototype.setRemovable = function ( removable ) {
+       this.removable = !!removable;
+       return this;
+};
+
 /**
  * Set indentation level.
  *
@@ -6741,7 +6946,7 @@ OO.ui.OutlineItemWidget.prototype.setLevel = function ( level ) {
        return this;
 };
 /**
- * Create an OO.ui.ButtonSelect object.
+ * Create an OO.ui.ButtonOptionWidget object.
  *
  * @class
  * @extends OO.ui.OptionWidget
@@ -7283,9 +7488,10 @@ OO.ui.SearchWidget.prototype.getResults = function () {
  * @cfg {string} [icon] Symbolic name of icon
  * @cfg {boolean} [multiline=false] Allow multiple lines of text
  * @cfg {boolean} [autosize=false] Automatically resize to fit content
+ * @cfg {boolean} [maxRows=10] Maximum number of rows to make visible when autosizing
  */
 OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
-       config = config || {};
+       config = $.extend( { 'maxRows': 10 }, config );
 
        // Parent constructor
        OO.ui.InputWidget.call( this, config );
@@ -7294,9 +7500,11 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
        this.pending = 0;
        this.multiline = !!config.multiline;
        this.autosize = !!config.autosize;
+       this.maxRows = config.maxRows;
 
        // Events
        this.$input.on( 'keypress', OO.ui.bind( this.onKeyPress, this ) );
+       this.$element.on( 'DOMNodeInsertedIntoDocument', OO.ui.bind( this.onElementAttach, this ) );
 
        // Initialization
        this.$element.addClass( 'oo-ui-textInputWidget' );
@@ -7344,13 +7552,35 @@ OO.ui.TextInputWidget.prototype.onKeyPress = function ( e ) {
        }
 };
 
+/**
+ * Handles element attach events.
+ *
+ * @param {jQuery.Event} e Element attach event
+ */
+OO.ui.TextInputWidget.prototype.onElementAttach = function () {
+       this.adjustSize();
+};
+
 /**
  * @inheritdoc
  */
 OO.ui.TextInputWidget.prototype.onEdit = function () {
-       var $clone, scrollHeight, innerHeight, outerHeight;
+       this.adjustSize();
+
+       // Parent method
+       return OO.ui.InputWidget.prototype.onEdit.call( this );
+};
+
+/**
+ * Automatically adjust the size of the text input.
+ *
+ * This only affects multi-line inputs that are auto-sized.
+ *
+ * @chainable
+ */
+OO.ui.TextInputWidget.prototype.adjustSize = function() {
+       var $clone, scrollHeight, innerHeight, outerHeight, maxInnerHeight, idealHeight;
 
-       // Automatic size adjustment
        if ( this.multiline && this.autosize ) {
                $clone = this.$input.clone()
                        .val( this.$input.val() )
@@ -7362,17 +7592,20 @@ OO.ui.TextInputWidget.prototype.onEdit = function () {
                $clone.css( 'height', '' );
                innerHeight = $clone.innerHeight();
                outerHeight = $clone.outerHeight();
+               // Measure max rows height
+               $clone.attr( 'rows', this.maxRows ).css( 'height', 'auto' );
+               maxInnerHeight = $clone.innerHeight();
+               $clone.removeAttr( 'rows' ).css( 'height', '' );
                $clone.remove();
+               idealHeight = Math.min( maxInnerHeight, scrollHeight );
                // Only apply inline height when expansion beyond natural height is needed
                this.$input.css(
                        'height',
                        // Use the difference between the inner and outer height as a buffer
-                       scrollHeight > outerHeight ? scrollHeight + ( outerHeight - innerHeight ) : ''
+                       idealHeight > outerHeight ? idealHeight + ( outerHeight - innerHeight ) : ''
                );
        }
-
-       // Parent method
-       return OO.ui.InputWidget.prototype.onEdit.call( this );
+       return this;
 };
 
 /**
@@ -7688,18 +7921,18 @@ OO.ui.ToggleSwitchWidget = function OoUiToggleSwitchWidget( config ) {
        this.dragging = false;
        this.dragStart = null;
        this.sliding = false;
-       this.$on = this.$( '<span>' );
+       this.$glow = this.$( '<span>' );
        this.$grip = this.$( '<span>' );
 
        // Events
        this.$element.on( 'click', OO.ui.bind( this.onClick, this ) );
 
        // Initialization
-       this.$on.addClass( 'oo-ui-toggleSwitchWidget-on' );
+       this.$glow.addClass( 'oo-ui-toggleSwitchWidget-glow' );
        this.$grip.addClass( 'oo-ui-toggleSwitchWidget-grip' );
        this.$element
                .addClass( 'oo-ui-toggleSwitchWidget' )
-               .append( this.$on, this.$grip );
+               .append( this.$glow, this.$grip );
 };
 
 /* Inheritance */
index e140423..2a6fab2 100644 (file)
 /*!
- * OOjs UI v0.1.0-pre-svg (ddcf828854)
+ * OOjs UI v0.1.0-pre (ac0cc69508)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: Fri Feb 21 2014 19:44:50 GMT-0800 (PST)
+ * Date: Thu Mar 13 2014 17:11:12 GMT-0700 (PDT)
  */
-/*csslint vendor-prefix:false */
 
 /* Textures */
 
 .oo-ui-texture-pending {
-       /* @embed */
-       background-image: url(images/textures/pending.gif);
+  background-image: /* @embed */ url(images/textures/pending.gif);
 }
 
 .oo-ui-texture-transparency {
-       /* @embed */
-       background-image: url(images/textures/transparency.png);
+  background-image: /* @embed */ url(images/textures/transparency.png);
 }
 
 /* RTL Definitions */
 
 /* @noflip */
+
 .oo-ui-rtl {
-       direction: rtl;
+  direction: rtl;
 }
+
 /* @noflip */
+
 .oo-ui-ltr {
-       direction: ltr;
+  direction: ltr;
 }
+
 .oo-ui-dialog {
-       position: fixed;
-       top: 0;
-       right: 0;
-       bottom: 0;
-       left: 0;
-       padding: 1em;
-       line-height: 1em;
-       background-color: #fff;
-       background-color: rgba(255,255,255,0.5);
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  padding: 1em;
+  line-height: 1em;
+  /* Fix for strange opacity-related rendering issues.
+          CAUTION: -webkit-backface-visibility: hidden; is EXTREMELY DANGEROUS.
+          If applied to a VE surface directly, it will break selection of
+          FocusableNodes, and in the past it's caused transparent PNGs to
+          render as opaque black images. For some reason applying it to the dialog
+          wrapper in the main document fixes opacity-related behavior in the iframe
+          document, but doesn't break the surface inside the iframe. */
+
+  -webkit-backface-visibility: hidden;
+          backface-visibility: hidden;
+}
+
+.oo-ui-dialog .oo-ui-window-frame {
+  position: fixed;
+  top: 1em;
+  right: 0;
+  bottom: 1em;
+  left: 0;
+  min-height: 12em;
+  margin: auto;
+  overflow: hidden;
+}
 
-       opacity: 0;
+.oo-ui-dialog-small .oo-ui-window-frame {
+  width: 400px;
+  max-height: 230px;
+}
 
-       -webkit-transition: all 250ms ease-in-out;
-       -moz-transition: all 250ms ease-in-out;
-       -o-transition: all 250ms ease-in-out;
-       transition: all 250ms ease-in-out;
+.oo-ui-dialog-medium .oo-ui-window-frame {
+  width: 600px;
+  max-height: 460px;
 }
 
-.oo-ui-dialog .oo-ui-window-frame {
-       position: fixed;
-       top: 1em;
-       right: 0;
-       bottom: 1em;
-       left: 0;
-       margin: auto;
-       width: 800px;
-       min-height: 12em;
-       max-height: 600px;
-       background-color: #fff;
-       border: solid 1px #ccc;
-       border-radius: 0.5em;
-       box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
-       overflow: hidden;
-
-       -webkit-transform: scale(0.5);
-       -moz-transform: scale(0.5);
-       -ms-transform: scale(0.5);
-       -o-transform: scale(0.5);
-       transform: scale(0.5);
-
-       -webkit-transition: all 250ms ease-in-out;
-       -moz-transition: all 250ms ease-in-out;
-       -o-transition: all 250ms ease-in-out;
-       transition: all 250ms ease-in-out;
-}
-
-.oo-ui-dialog-open {
-       opacity: 1;
-}
-
-.oo-ui-dialog-open .oo-ui-window-frame  {
-       -webkit-transform: scale(1);
-       -moz-transform: scale(1);
-       -ms-transform: scale(1);
-       -o-transform: scale(1);
-       transform: scale(1);
-}
-
-.oo-ui-dialog .oo-ui-window-frame.oo-ui-window-frame-small {
-       max-width: 600px;
-       max-height: 400px;
+.oo-ui-dialog-large .oo-ui-window-frame {
+  width: 800px;
+  max-height: 690px;
 }
 
 .oo-ui-dialog .oo-ui-frame {
-       width: 100%;
-       height: 100%;
+  width: 100%;
+  height: 100%;
 }
 
 .oo-ui-dialog-content .oo-ui-window-head,
 .oo-ui-dialog-content .oo-ui-window-body,
 .oo-ui-dialog-content .oo-ui-window-foot {
-       position: absolute;
-       left: 0;
-       right: 0;
-       -webkit-box-sizing: border-box;
-       -moz-box-sizing: border-box;
-       box-sizing: border-box;
-       overflow: hidden;
+  position: absolute;
+  right: 0;
+  left: 0;
+  overflow: hidden;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
 }
 
 .oo-ui-dialog-content .oo-ui-window-head {
-       top: 0;
-       height: 3.8em;
-       padding: 0.5em;
+  top: 0;
+  height: 3.8em;
+  padding: 0.5em;
 }
 
-.oo-ui-dialog-content .oo-ui-window-foot {
-       bottom: 0;
-       height: 4.8em;
-       padding: 1em;
+.oo-ui-dialog-content .oo-ui-window-title {
+  line-height: 2.8em;
 }
 
-.oo-ui-dialog-content .oo-ui-window-body {
-       box-shadow: 0 0 0.66em rgba(0,0,0,0.25);
-       top: 3.8em;
-       bottom: 4.8em;
+.oo-ui-dialog-content .oo-ui-window-icon {
+  width: 2.4em;
+  height: 2.8em;
+  line-height: 2.8em;
 }
 
-.oo-ui-dialog-content-footless .oo-ui-window-body {
-       bottom: 0;
+.oo-ui-dialog-content .oo-ui-window-closeButton {
+  float: right;
+  margin: 0.25em 0.25em;
 }
 
-.oo-ui-dialog-content-footless .oo-ui-window-foot {
-       display: none;
+.oo-ui-dialog-content .oo-ui-window-body {
+  top: 3.8em;
+  bottom: 4.8em;
 }
 
-.oo-ui-dialog-content .oo-ui-window-icon {
-       width: 2.4em;
-       height: 2.8em;
-       line-height: 2.8em;
+.oo-ui-dialog-content .oo-ui-window-foot {
+  bottom: 0;
+  height: 4.8em;
+  padding: 1em;
 }
 
-.oo-ui-dialog-content .oo-ui-window-title {
-       line-height: 2.8em;
+.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-buttonedElement-framed {
+  float: left;
+  margin: 0.125em 0.25em;
 }
 
-.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-buttonedElement-framed {
-       float: left;
-       margin: 0.125em 0.25em;
+.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-flaggableElement-primary,
+.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-flaggableElement-constructive,
+.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-flaggableElement-destructive {
+  float: right;
 }
 
-.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary,
-.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive,
-.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-buttonedElement-framed.oo-ui-flaggableElement-destructive {
-       float: right;
+.oo-ui-dialog-content-footless .oo-ui-window-body {
+  bottom: 0;
 }
 
-.oo-ui-dialog-content .oo-ui-window-closeButton {
-       float: right;
-       margin: 0.25em 0.25em;
+.oo-ui-dialog-content-footless .oo-ui-window-foot {
+  display: none;
 }
 
-/* OO.ui.ButtonedElement */
+.oo-ui-frame {
+  padding: 0;
+  margin: 0;
+}
 
-a.oo-ui-buttonedElement-button {
-       color: #333;
-       cursor: pointer;
-       display: inline-block;
-       vertical-align: middle;
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-       -moz-user-select: none;
-       -ms-user-select: none;
-       user-select: none;
+.oo-ui-frame-body {
+  padding: 0;
+  margin: 0;
+  background: none;
 }
 
-.oo-ui-buttonedElement .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator,
-.oo-ui-buttonedElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-       display: none;
+.oo-ui-frame-content {
+  font-family: sans-serif;
+  font-size: 0.8em;
 }
 
-.oo-ui-buttonedElement.oo-ui-indicatedElement .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator,
-.oo-ui-buttonedElement.oo-ui-iconedElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-       opacity: 0.8;
-       display: inline-block;
-       vertical-align: middle;
-       background-position: center center;
-       background-repeat: no-repeat;
-       width: 1.9em;
-       height: 1.9em;
+.oo-ui-toolbar {
+  clear: both;
 }
 
-.oo-ui-buttonedElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-       margin-left: 0;
+.oo-ui-toolbar-bar {
+  line-height: 1em;
 }
 
-.oo-ui-buttonedElement .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator {
-       margin-right: -0.75em;
+.oo-ui-toolbar-bottom .oo-ui-toolbar-bar {
+  position: absolute;
 }
-.oo-ui-buttonedElement.oo-ui-widget-disabled .oo-ui-buttonedElement-button {
-       cursor: default;
+
+.oo-ui-toolbar-actions {
+  float: right;
 }
 
-.oo-ui-buttonedElement-frameless {
-       display: inline-block;
-       position: relative;
-       -webkit-transition: opacity 200ms;
-       -moz-transition: opacity 200ms;
-       -o-transition: opacity 200ms;
-       transition: opacity 200ms;
+.oo-ui-toolbar-tools {
+  float: left;
 }
 
-.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button:hover > .oo-ui-iconedElement-icon,
-.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button:focus > .oo-ui-iconedElement-icon {
-       opacity: 1;
+.oo-ui-toolbar-tools,
+.oo-ui-toolbar-actions,
+.oo-ui-toolbar-shadow {
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
 }
 
-.oo-ui-buttonedElement-frameless.oo-ui-widget-disabled .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-       opacity: 0.2;
+.oo-ui-toolbar-actions .oo-ui-popupWidget {
+  -webkit-user-select: all;
+     -moz-user-select: all;
+      -ms-user-select: all;
+          user-select: all;
+  -webkit-touch-callout: default;
 }
 
-.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
-       display: inline-block;
-       vertical-align: middle;
-       margin-left: 0.25em;
-       color: #333;
+.oo-ui-toolbar-shadow {
+  position: absolute;
+  width: 100%;
+  pointer-events: none;
+  background-position: left top;
+  background-repeat: repeat-x;
 }
 
-.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button:hover > .oo-ui-labeledElement-label,
-.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button:focus > .oo-ui-labeledElement-label {
-       color: #000;
+.oo-ui-toolGroup {
+  display: inline-block;
+  margin: 0.3em;
+  vertical-align: middle;
 }
 
-.oo-ui-buttonedElement-frameless.oo-ui-widget-disabled .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
-       color: #ccc;
+.oo-ui-toolGroup-empty {
+  display: none;
 }
 
-/* OO.ui.ButtonWidget */
+.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  background-position: center center;
+  background-repeat: no-repeat;
+}
 
-.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
-       display: inline-block;
-       font-size: 1em;
-       margin: 0.1em 0;
-       padding: 0.2em 0.8em;
-       border-radius: 0.3em;
-       vertical-align: top;
-       text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
-       text-align: center;
-
-       /* Animation */
-       -webkit-transition: border-color 100ms;
-       -moz-transition: border-color 100ms;
-       -o-transition: border-color 100ms;
-       transition: border-color 100ms;
-
-       /* Gray */
-       border: 1px #c9c9c9 solid;
-       background-color: #dddddd;
-       filter: progid:DXImageTransform.Microsoft.gradient(
-               GradientType=0,startColorstr=#ffffff, endColorstr=#dddddd
-       );
-       background-image: -webkit-gradient(
-               linear, right top, right bottom, color-stop(0%,#ffffff), color-stop(100%,#dddddd)
-       );
-       background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image: -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image: -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image: -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image: linear-gradient(top, #ffffff 0%, #dddddd 100%);
-}
-
-.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button:hover,
-.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button:focus {
-       border-color: #aaa;
-}
-
-.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button:active,
-.oo-ui-buttonedElement-framed.oo-ui-buttonedElement-active .oo-ui-buttonedElement-button {
-       box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
-       color: black;
-
-       /* Gray */
-       border-color: #c9c9c9;
-       background-color: #dddddd;
-       filter: progid:DXImageTransform.Microsoft.gradient(
-               GradientType=0,startColorstr=#dddddd, endColorstr=#ffffff
-       );
-       background-image: -webkit-gradient(
-               linear, right top, right bottom, color-stop(0%,#dddddd), color-stop(100%,#ffffff)
-       );
-       background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image: -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image: -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image: -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image: linear-gradient(top, #dddddd 0%, #ffffff 100%);
+.oo-ui-window-head {
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
 }
 
-.oo-ui-buttonedElement-framed.oo-ui-iconedElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-       margin-left: -0.5em;
-       margin-right: -0.5em;
+.oo-ui-window-body {
+  padding: 0 0.75em;
 }
 
-.oo-ui-buttonedElement-framed.oo-ui-iconedElement.oo-ui-labeledElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-       margin-left: -0.5em;
-       margin-right: 0;
+.oo-ui-window-icon {
+  float: left;
+  width: 2em;
+  height: 2em;
+  margin-right: 0.5em;
+  line-height: 2em;
+  background-position: right center;
+  background-repeat: no-repeat;
 }
 
-.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
-       display: inline-block;
-       vertical-align: middle;
-       line-height: 1.9em;
-}
-
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-destructive .oo-ui-buttonedElement-button {
-       /* Red text */
-       color: #d45353;
-}
-
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive .oo-ui-buttonedElement-button {
-       /* Green */
-       border: solid 1px #b8d892;
-       background-color: #f0fbe1;
-       filter: progid:DXImageTransform.Microsoft.gradient(
-               GradientType=0,startColorstr=#f0fbe1, endColorstr=#c3e59a
-       );
-       background-image: -webkit-gradient(
-               linear, right top, right bottom, color-stop(0%,#f0fbe1), color-stop(100%,#c3e59a)
-       );
-       background-image: -webkit-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-       background-image: -moz-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-       background-image: -ms-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-       background-image: -o-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-       background-image: linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-}
-
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive .oo-ui-buttonedElement-button:hover,
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive .oo-ui-buttonedElement-button:focus {
-       border-color: #adcb89;
-}
-
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive .oo-ui-buttonedElement-button:active,
-.oo-ui-buttonedElement-framed.oo-ui-buttonedElement-active.oo-ui-flaggableElement-constructive .oo-ui-buttonedElement-button {
-       /* Green */
-       border: solid 1px #b8d892;
-       background-color: #c3e59a;
-       filter: progid:DXImageTransform.Microsoft.gradient(
-               GradientType=0,startColorstr=#c3e59a, endColorstr=#f0fbe1
-       );
-       background-image: -webkit-gradient(
-               linear, right top, right bottom, color-stop(0%,#c3e59a), color-stop(100%,#f0fbe1)
-       );
-       background-image: -webkit-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-       background-image: -moz-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-       background-image: -ms-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-       background-image: -o-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-       background-image: linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-}
-
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary .oo-ui-buttonedElement-button {
-       /* Blue */
-       border: solid 1px #a6cee1;
-       background-color: #eaf4fa;
-       filter: progid:DXImageTransform.Microsoft.gradient(
-               GradientType=0,startColorstr=#eaf4fa, endColorstr=#b0d9ee
-       );
-       background-image: -webkit-gradient(
-               linear, right top, right bottom, color-stop(0%,#eaf4fa), color-stop(100%,#b0d9ee)
-       );
-       background-image: -webkit-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image: -moz-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image: -ms-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image: -o-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image: linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-}
-
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary .oo-ui-buttonedElement-button:hover,
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary .oo-ui-buttonedElement-button:focus {
-       border-color: #9dc2d4;
-}
-
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary .oo-ui-buttonedElement-button:active,
-.oo-ui-buttonedElement-framed.oo-ui-buttonedElement-active.oo-ui-flaggableElement-primary .oo-ui-buttonedElement-button {
-       /* Blue */
-       border: solid 1px #a6cee1;
-       background-color: #b0d9ee;
-       filter: progid:DXImageTransform.Microsoft.gradient(
-               GradientType=0,startColorstr=#b0d9ee, endColorstr=#eaf4fa
-       );
-       background-image: -webkit-gradient(
-               linear, right top, right bottom, color-stop(0%,#b0d9ee), color-stop(100%,#eaf4fa)
-       );
-       background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image: -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image: -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image: -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image: linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+.oo-ui-window-title {
+  float: left;
+  line-height: 2em;
+  white-space: nowrap;
+  cursor: default;
 }
 
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button:active,
-.oo-ui-buttonedElement-framed.oo-ui-buttonedElement-active.oo-ui-widget-disabled .oo-ui-buttonedElement-button:active {
-       opacity: 0.5;
-       cursor: default;
-       box-shadow: none;
-       color: #333;
-       background: #eee;
+.oo-ui-window-overlay {
+  position: absolute;
+  top: 0;
+  left: 0;
 }
 
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button:hover,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button:focus {
-       border-color: #ccc;
-       box-shadow: none;
+.oo-ui-buttonedElement .oo-ui-buttonedElement-button {
+  display: inline-block;
+  vertical-align: middle;
+  cursor: pointer;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
 }
 
-/* OO.ui.LabeledElement */
+.oo-ui-buttonedElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  display: none;
+  margin-left: 0;
+}
 
-.oo-ui-labeledElement-label {
-       display: block;
+.oo-ui-buttonedElement .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator {
+  display: none;
+  margin-right: -0.75em;
 }
 
-.oo-ui-clippableElement-clippable {
-       -webkit-box-sizing: border-box;
-       -moz-box-sizing: border-box;
-       box-sizing: border-box;
+.oo-ui-buttonedElement.oo-ui-widget-disabled .oo-ui-buttonedElement-button {
+  cursor: default;
 }
-.oo-ui-frame {
-       margin: 0;
-       padding: 0;
+
+.oo-ui-buttonedElement.oo-ui-indicatedElement .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator,
+.oo-ui-buttonedElement.oo-ui-iconedElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  display: inline-block;
+  width: 1.9em;
+  height: 1.9em;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
 }
 
-.oo-ui-frame-body {
-       margin: 0;
-       padding: 0;
-       background: none;
+.oo-ui-buttonedElement-frameless {
+  position: relative;
+  display: inline-block;
 }
 
-.oo-ui-frame-content {
-       font-family: sans-serif;
-       font-size: 0.8em;
+.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
+  display: inline-block;
+  margin-left: 0.25em;
+  vertical-align: middle;
 }
-/* OO.ui.GridLayout */
-/* OO.ui.PanelLayout */
 
-.oo-ui-gridLayout,
-.oo-ui-panelLayout {
-       position: absolute;
-       top: 0;
-       left: 0;
-       right: 0;
-       bottom: 0;
+.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
+  display: inline-block;
+  padding: 0.2em 0.8em;
+  margin: 0.1em 0;
+  text-align: center;
+  vertical-align: top;
 }
 
-.oo-ui-panelLayout-scrollable {
-       overflow-y: auto;
+.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
+  display: inline-block;
+  line-height: 1.9em;
+  vertical-align: middle;
 }
 
-.oo-ui-panelLayout-padded {
-       padding: 2em;
+.oo-ui-buttonedElement-framed.oo-ui-iconedElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  margin-right: -0.5em;
+  margin-left: -0.5em;
 }
 
-/* OO.ui.FieldsetLayout */
+.oo-ui-buttonedElement-framed.oo-ui-iconedElement.oo-ui-labeledElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  margin-right: 0.3em;
+  margin-left: -0.5em;
+}
 
-.oo-ui-fieldsetLayout {
-       position: relative;
-       border: none;
-       margin: 0;
-       padding: 0;
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
+  cursor: default;
 }
 
-.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
-       margin-top: 2em;
+.oo-ui-clippableElement-clippable {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
 }
 
-.oo-ui-fieldsetLayout-labeled {
-       margin-top: -0.75em;
+.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
+  overflow-y: hidden;
 }
 
-.oo-ui-fieldsetLayout > legend.oo-ui-labeledElement-label {
-       font-size: 1.5em;
-       margin-bottom: 0.5em;
-       padding-left: 0;
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+  width: 100%;
+  padding: 1.5em;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
 }
 
-.oo-ui-fieldsetLayout.oo-ui-iconedElement > legend.oo-ui-labeledElement-label {
-       padding-left: 1.75em;
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
+  overflow-y: auto;
 }
 
-.oo-ui-fieldsetLayout.oo-ui-iconedElement > .oo-ui-iconedElement-icon {
-       display: block;
-       position: absolute;
-       left: 0;
-       top: 0.5em;
-       width: 2em;
-       height: 2em;
-       background-position: center center;
-       background-repeat: no-repeat;
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
+  padding: 2em;
 }
 
-/* OO.ui.FieldLayout */
+.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 3em;
+  left: 0;
+  overflow-y: auto;
+}
+
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  left: 0;
+}
 
 .oo-ui-fieldLayout {
-       margin-bottom: 1em;
+  margin-bottom: 1em;
 }
 
 .oo-ui-fieldLayout:last-child {
-       margin-bottom: 0;
+  margin-bottom: 0;
 }
 
 .oo-ui-fieldLayout:before,
 .oo-ui-fieldLayout:after {
-    content: " ";
-    display: table;
+  display: table;
+  content: " ";
 }
 
 .oo-ui-fieldLayout:after {
-    clear: both;
+  clear: both;
 }
 
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labeledElement-label,
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labeledElement-label {
-       display: block;
-       float: left;
-       width: 35%;
-       padding-top: 0.5em;
-       margin-right: 5%;
+  display: block;
+  float: left;
+  width: 35%;
+  padding-top: 0.5em;
+  margin-right: 5%;
 }
 
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
-       display: block;
-       float: left;
-       width: 60%;
+  display: block;
+  float: left;
+  width: 60%;
 }
 
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labeledElement-label {
-       text-align: right;
+  text-align: right;
 }
 
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labeledElement-label {
-       display: inline-block;
-       vertical-align: middle;
-       padding: 0.75em 0.5em 0.5em 0.5em;
+  display: inline-block;
+  padding: 0.75em 0.5em 0.5em 0.5em;
+  vertical-align: middle;
 }
 
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
-       display: inline-block;
-       vertical-align: middle;
-       padding: 0.5em 0;
+  display: inline-block;
+  padding: 0.5em 0;
+  vertical-align: middle;
 }
 
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labeledElement-label {
-       padding: 0.5em 0;
-}
-
-/* OO.ui.BookletLayout */
-
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-       padding: 1.5em;
-       width: 100%;
-       -webkit-box-sizing: border-box;
-       -moz-box-sizing: border-box;
-       box-sizing: border-box;
-}
-
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
-       overflow-y: auto;
+  padding: 0.5em 0;
 }
 
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
-       padding: 2em;
-}
-
-.oo-ui-bookletLayout-outlinePanel {
-       border-right: solid 1px #ddd;
-}
-
-.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
-       position: absolute;
-       top: 0;
-       left: 0;
-       right: 0;
-       bottom: 3em;
-       overflow-y: auto;
-}
-
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-       position: absolute;
-       bottom: 0;
-       left: 0;
-       right: 0;
-       box-shadow: 0 0 0.25em rgba(0,0,0,0.25);
-}
-
-.oo-ui-stackLayout > .oo-ui-panelLayout {
-       display: none;
-}
-
-.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
-       display: block;
-       position: relative;
-       margin-bottom: 1em;
-       box-shadow: 0 0 0.5em rgba(0,0,0,0.25);
-}
-
-.oo-ui-stackLayout-continuous > .oo-ui-panelLayout:last-child {
-       margin-bottom: 0;
-}
-/* OO.ui.PopupTool */
-
-.oo-ui-popupTool .oo-ui-popupWidget {
-       margin-left: 1.25em;
-       font-size: 0.8em;
-}
-
-.oo-ui-popupTool .oo-ui-popupWidget-popup,
-.oo-ui-popupTool .oo-ui-popupWidget-tail {
-       z-index: 4;
-}
-.oo-ui-toolbar {
-       clear: both;
+.oo-ui-fieldsetLayout {
+  position: relative;
+  padding: 0;
+  margin: 0;
 }
 
-.oo-ui-toolbar-bar {
-       border-bottom: solid 1px #ccc;
-       background-color: white;
-       /* @embed */
-       background-image: url(images/fade-up.png);
-       background-position: left bottom;
-       background-repeat: repeat-x;
-       padding-bottom: 1px;
-       line-height: 1em;
+.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
+  margin-top: 2em;
 }
 
-.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
-       border: none;
-       background: none;
+.oo-ui-fieldsetLayout-labeled {
+  margin-top: -0.75em;
 }
 
-.oo-ui-toolbar-bottom .oo-ui-toolbar-bar {
-       position: absolute;
+.oo-ui-fieldsetLayout > legend.oo-ui-labeledElement-label {
+  padding: 0.25em 0;
+  margin-bottom: 0.5em;
 }
 
-.oo-ui-toolbar-actions {
-       float: right;
+.oo-ui-fieldsetLayout.oo-ui-iconedElement > legend.oo-ui-labeledElement-label {
+  padding-left: 1.75em;
 }
 
-.oo-ui-toolbar-tools {
-       float: left;
+.oo-ui-fieldsetLayout.oo-ui-iconedElement > .oo-ui-iconedElement-icon {
+  position: absolute;
+  top: 0;
+  left: 0;
+  display: block;
+  width: 2em;
+  height: 2em;
+  background-position: center center;
+  background-repeat: no-repeat;
 }
 
-.oo-ui-toolbar-tools,
-.oo-ui-toolbar-actions,
-.oo-ui-toolbar-shadow {
-       -webkit-user-select: none;
-       -moz-user-select: none;
-       -ms-user-select: none;
-       -o-user-select: none;
-       user-select: none;
+.oo-ui-gridLayout {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
 }
 
-.oo-ui-toolbar-actions .oo-ui-popupWidget {
-       -webkit-touch-callout: default;
-       -webkit-user-select: all;
-       -moz-user-select: all;
-       -ms-user-select: all;
-       user-select: all;
+.oo-ui-labelWidget {
+  padding: 0.5em 0;
 }
 
-.oo-ui-toolbar-shadow {
-       /* @embed */
-       background-image: url(images/toolbar-shadow.png);
-       background-position: left top;
-       background-repeat: repeat-x;
-       position: absolute;
-       bottom: -9px;
-       height: 9px;
-       width: 100%;
-       pointer-events: none;
-       -webkit-transition: opacity 500ms ease-in-out;
-       -moz-transition: opacity 500ms ease-in-out;
-       -o-transition: opacity 500ms ease-in-out;
-       transition: opacity 500ms ease-in-out;
-       opacity: 0.125;
-}
-/* OO.ui.ToolGroup */
-
-.oo-ui-toolGroup {
-       display: inline-block;
-       margin: 0.3em;
-       vertical-align: middle;
-       border-radius: 0.25em;
-       border: solid 1px transparent;
-       -webkit-transition: border-color 300ms;
-       -moz-transition: border-color 300ms;
-       -o-transition: border-color 300ms;
-       transition: border-color 300ms;
+.oo-ui-panelLayout {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
 }
 
-.oo-ui-toolGroup:hover {
-       border-color: rgba(0,0,0,0.1);
+.oo-ui-panelLayout-scrollable {
+  overflow-y: auto;
 }
 
-.oo-ui-toolGroup-empty {
-       display: none;
+.oo-ui-panelLayout-padded {
+  padding: 2em;
 }
 
-.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-tool-title {
-       color: #000;
+.oo-ui-stackLayout > .oo-ui-panelLayout {
+  display: none;
 }
 
-.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
-       background-position: center center;
-       background-repeat: no-repeat;
+.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
+  position: relative;
+  display: block;
 }
 
-/* OO.ui.BarToolGroup */
-
 .oo-ui-barToolGroup > .oo-ui-iconedElement-icon,
-.oo-ui-barToolGroup > .oo-ui-iconedElement-label {
-       display: none;
+.oo-ui-barToolGroup > .oo-ui-labeledElement-label {
+  display: none;
 }
 
 .oo-ui-barToolGroup .oo-ui-tool {
-       display: inline-block;
-       position: relative;
-       vertical-align: top;
-       margin: -1px 0 -1px -1px;
-       border: solid 1px transparent;
+  position: relative;
+  display: inline-block;
+  vertical-align: top;
 }
 
 .oo-ui-barToolGroup .oo-ui-tool-link {
-       display: block;
-       height: 1.5em;
-       padding: 0.25em;
-       cursor: pointer;
+  display: block;
+  height: 1.5em;
+  padding: 0.25em;
+  cursor: pointer;
 }
 
-.oo-ui-barToolGroup
-       .oo-ui-tool-active:not(.oo-ui-widget-disabled) +
-       .oo-ui-tool-active:not(.oo-ui-widget-disabled)
-{
-       border-left-color: rgba(0,0,0,0.1);
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  display: block;
+  width: 1.5em;
+  height: 1.5em;
 }
 
-.oo-ui-barToolGroup .oo-ui-tool:first-child {
-       border-top-left-radius: 0.25em;
-       border-bottom-left-radius: 0.25em;
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  display: none;
 }
 
-.oo-ui-barToolGroup .oo-ui-tool:last-child {
-       margin-right: -1px;
-       border-top-right-radius: 0.25em;
-       border-bottom-right-radius: 0.25em;
+.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
 }
 
-.oo-ui-barToolGroup .oo-ui-tool:hover:not(.oo-ui-widget-disabled) {
-       border-color: rgba(0,0,0,0.2);
+.oo-ui-barToolGroup .oo-ui-tool-title,
+.oo-ui-barToolGroup .oo-ui-tool-accel {
+  display: none;
 }
 
-.oo-ui-barToolGroup .oo-ui-tool-active:not(.oo-ui-widget-disabled) {
-       border-color: rgba(0,0,0,0.2);
+.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
+  padding: 0.25em;
 }
 
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
-       display: block;
-       height: 1.5em;
-       width: 1.5em;
-       opacity: 0.8;
+.oo-ui-listToolGroup .oo-ui-tool {
+  display: inline-block;
+  width: 100%;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
 }
 
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-       display: none;
+.oo-ui-listToolGroup .oo-ui-tool-link {
+  display: block;
+  padding-right: 0.5em;
+  white-space: nowrap;
+  cursor: pointer;
 }
 
-.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-       cursor: default;
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
 }
 
-.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
-       opacity: 0.2;
+.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
+  min-width: 8em;
 }
 
-.oo-ui-barToolGroup .oo-ui-tool:not(.oo-ui-widget-disabled) .oo-ui-tool-link .oo-ui-iconedElement-icon {
-       opacity: 0.8;
+.oo-ui-menuToolGroup .oo-ui-tool {
+  display: block;
 }
 
-.oo-ui-barToolGroup .oo-ui-tool:hover:not(.oo-ui-widget-disabled) .oo-ui-tool-link .oo-ui-iconedElement-icon {
-       opacity: 1;
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+  display: block;
+  padding: 0.25em 1em 0.25em 0.25em;
+  white-space: nowrap;
+  cursor: pointer;
 }
 
-.oo-ui-barToolGroup .oo-ui-tool-title {
-       display: none;
+.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  background-image: none;
 }
 
-/* OO.ui.PopupToolGroup */
+.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  background-image: /* @embed */ url(images/icons/check.png);
+}
 
 .oo-ui-popupToolGroup {
-       position: relative;
-       height: 2em;
-       min-width: 2.5em;
+  position: relative;
+  height: 2em;
+  min-width: 2.5em;
 }
 
 .oo-ui-popupToolGroup.oo-ui-indicatedElement.oo-ui-iconedElement {
-       min-width: 3.5em;
+  min-width: 3.5em;
 }
 
 .oo-ui-popupToolGroup-handle {
-       display: block;
-       cursor: pointer;
+  display: block;
+  cursor: pointer;
 }
 
 .oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator,
 .oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon {
-       position: absolute;
-       top: 0;
-       width: 2em;
-       height: 2em;
-       background-position: center center;
-       background-repeat: no-repeat;
-       opacity: 0.8;
+  position: absolute;
+  top: 0;
+  width: 2em;
+  height: 2em;
+  background-position: center center;
+  background-repeat: no-repeat;
 }
 
 .oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator {
-       right: 0;
+  right: 0;
 }
 
 .oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon {
-       left: 0.25em;
+  left: 0.25em;
 }
 
 .oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
-       line-height: 2.6em;
-       font-size: 0.8em;
-       margin: 0 1em;
+  margin: 0 1em;
+  font-size: 0.8em;
+  line-height: 2.6em;
 }
 
 .oo-ui-popupToolGroup.oo-ui-iconedElement .oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
-       margin-left: 3.25em;
+  margin-left: 3.25em;
 }
 
 .oo-ui-popupToolGroup.oo-ui-indicatedElement .oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
-       margin-right: 2.25em;
+  margin-right: 2.25em;
 }
 
 .oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-       display: none;
-       position: absolute;
-       top: 2em;
-       left: -1px;
-       z-index: 4;
-       border: solid 1px #ccc;
-       background-color: white;
-       box-shadow: 0 0.25em 1em rgba(0,0,0,0.25);
+  position: absolute;
+  top: 2em;
+  left: -1px;
+  z-index: 4;
+  display: none;
 }
 
 .oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconedElement-icon {
-       background-repeat: no-repeat;
-       background-position: center center;
+  background-position: center center;
+  background-repeat: no-repeat;
 }
 
-.oo-ui-popupToolGroup-active:not(.oo-ui-widget-disabled) > .oo-ui-toolGroup-tools {
-       display: block;
-}
-
-.oo-ui-popupToolGroup-active:not(.oo-ui-widget-disabled) {
-       border-bottom-left-radius: 0;
-       border-bottom-right-radius: 0;
+.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
+  display: block;
 }
 
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
-       display: inline-block;
-       vertical-align: middle;
-       height: 2em;
-       width: 2em;
-       margin-right: 0.5em;
+  display: inline-block;
+  width: 2em;
+  height: 2em;
+  margin-right: 0.5em;
+  vertical-align: middle;
 }
 
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-       display: inline-block;
-       vertical-align: middle;
-       line-height: 2em;
-       font-size: 0.8em;
+  display: inline-block;
+  font-size: 0.8em;
+  line-height: 2em;
+  vertical-align: middle;
 }
 
 .oo-ui-popupToolGroup .oo-ui-tool-accel {
-       display: none;
-}
-
-/* OO.ui.ListToolGroup */
-
-.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
-       padding: 0.25em;
-}
-
-.oo-ui-listToolGroup .oo-ui-tool {
-       display: inline-block;
-       width: 100%;
-       -webkit-box-sizing: border-box;
-       -moz-box-sizing: border-box;
-       box-sizing: border-box;
-       border: solid 1px transparent;
-       margin: -1px 0;
-}
-
-.oo-ui-listToolGroup .oo-ui-tool-link {
-       display: block;
-       cursor: pointer;
-       white-space: nowrap;
-       padding-right: 0.5em;
-}
-
-.oo-ui-listToolGroup.oo-ui-popupToolGroup-active {
-       border-color: rgba(0,0,0,0.2);
+  display: none;
 }
 
-.oo-ui-listToolGroup
-       .oo-ui-tool-active:not(.oo-ui-widget-disabled) +
-       .oo-ui-tool-active:not(.oo-ui-widget-disabled)
-{
-       border-top-color: rgba(0,0,0,0.1);
-}
-
-.oo-ui-listToolGroup .oo-ui-tool:hover:not(.oo-ui-widget-disabled) {
-       border-color: rgba(0,0,0,0.2);
-}
-
-.oo-ui-listToolGroup .oo-ui-tool-active:not(.oo-ui-widget-disabled) {
-       border-color: rgba(0,0,0,0.2);
-}
-
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-       cursor: default;
-}
-
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
-       color: #ccc;
-}
-
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
-       opacity: 0.2;
-}
-
-.oo-ui-listToolGroup .oo-ui-tool:not(.oo-ui-widget-disabled) .oo-ui-tool-link .oo-ui-iconedElement-icon {
-       opacity: 0.8;
-}
-
-.oo-ui-listToolGroup .oo-ui-tool:hover:not(.oo-ui-widget-disabled) .oo-ui-tool-link .oo-ui-iconedElement-icon {
-       opacity: 1;
-}
-
-/* OO.ui.MenuToolGroup */
-
-.oo-ui-menuToolGroup {
-       border-color: rgba(0,0,0,0.1);
-}
-
-.oo-ui-menuToolGroup:hover {
-       border-color: rgba(0,0,0,0.2);
-}
-
-.oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
-       border-color: rgba(0,0,0,0.25);
-}
-
-.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
-       min-width: 8em;
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool {
-       display: block;
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-       display: block;
-       cursor: pointer;
-       white-space: nowrap;
-       padding: 0.25em 1em 0.25em 0.25em;
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
-       background-image: none;
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconedElement-icon {
-       /* @embed */
-       background-image: url(images/icons/check.png);
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool:hover {
-       background-color: #e1f3ff;
-}
-
-/* Common */
-
-.oo-ui-barToolGroup .oo-ui-tool-active:not(.oo-ui-widget-disabled),
-.oo-ui-listToolGroup .oo-ui-tool-active:not(.oo-ui-widget-disabled),
-.oo-ui-popupToolGroup-active:not(.oo-ui-widget-disabled) {
-       /* @embed */
-       background-image: url(images/fade-down.png);
-       background-position: left top;
-       background-repeat: repeat-x;
-       box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
-}
-/* OO.ui.ButtonWidget */
-
-.oo-ui-buttonWidget {
-       display: inline-block;
-       vertical-align: middle;
-}
-
-/* OO.ui.PopupButtonWidget */
-
-.oo-ui-popupButtonWidget {
-       position: relative;
+.oo-ui-popupTool .oo-ui-popupWidget {
+  margin-left: 1.25em;
+  font-size: 0.8em;
 }
 
-.oo-ui-popupButtonWidget .oo-ui-popupWidget {
-       position: absolute;
-       left: 1em;
-       cursor: auto;
+.oo-ui-popupTool .oo-ui-popupWidget-popup,
+.oo-ui-popupTool .oo-ui-popupWidget-tail {
+  z-index: 4;
 }
 
-/* OO.ui.ButtonGroupWidget */
-
-.oo-ui-buttonGroupWidget {
-       display: inline-block;
-       white-space: nowrap;
-       border-radius: 0.3em;
+.oo-ui-iconWidget {
+  display: inline-block;
+  width: 1.9em;
+  height: 1.9em;
+  line-height: 2.5em;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+  opacity: 0.8;
 }
 
-.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
-       border-radius: 0;
-       margin-bottom: -1px;
-       margin-left: -1px;
+.oo-ui-iconWidget.oo-ui-widget-disabled {
+  opacity: 0.2;
 }
 
-.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed:first-child .oo-ui-buttonedElement-button {
-       border-bottom-left-radius: 0.3em;
-       border-top-left-radius: 0.3em;
-       margin-left: 0;
+.oo-ui-indicatorWidget {
+  display: inline-block;
+  width: 1.9em;
+  height: 1.9em;
+  line-height: 2.5em;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+  opacity: 0.8;
 }
 
-.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed:last-child .oo-ui-buttonedElement-button {
-       border-bottom-right-radius: 0.3em;
-       border-top-right-radius: 0.3em;
+.oo-ui-indicatorWidget.oo-ui-widget-disabled {
+  opacity: 0.2;
 }
 
-/* OO.ui.SelectWidget */
-
 .oo-ui-selectWidget {
-       list-style: none;
-       margin: 0;
-       padding: 0;
+  padding: 0;
+  margin: 0;
+  list-style: none;
 }
 
-/* OO.ui.OptionWidget */
-
 .oo-ui-optionWidget {
-       position: relative;
-       display: block;
-       border: none;
-       list-style: none;
-       margin: 0;
-       padding: 0.5em 2em 0.5em 3em;
-       cursor: pointer;
-}
-
-.oo-ui-optionWidget .oo-ui-labeledElement-label {
-       line-height: 1.5em;
-       white-space: nowrap;
-       text-overflow: ellipsis;
-       overflow: hidden;
-}
-
-.oo-ui-optionWidget-highlighted {
-       background-color: #e1f3ff;
+  position: relative;
+  display: block;
+  padding: 0.5em 2em 0.5em 3em;
+  margin: 0;
+  list-style: none;
+  cursor: pointer;
+  border: none;
 }
 
-.oo-ui-optionWidget-selected {
-       background-color: #a7dcff;
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+  cursor: default;
 }
 
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-       cursor: default;
+.oo-ui-optionWidget .oo-ui-labeledElement-label {
+  overflow: hidden;
+  line-height: 1.5em;
+  text-overflow: ellipsis;
+  white-space: nowrap;
 }
 
 .oo-ui-optionWidget .oo-ui-iconedElement-icon,
 .oo-ui-optionWidget .oo-ui-indicatedElement-indicator {
-       position: absolute;
-       top: 50%;
-       width: 2em;
-       height: 2em;
-       margin-top: -1em;
-       background-repeat: no-repeat;
-       background-position: center center;
+  position: absolute;
+  top: 50%;
+  width: 2em;
+  height: 2em;
+  margin-top: -1em;
+  background-position: center center;
+  background-repeat: no-repeat;
 }
 
 .oo-ui-optionWidget .oo-ui-iconedElement-icon {
-       left: 0.5em;
+  left: 0.5em;
 }
 
 .oo-ui-optionWidget .oo-ui-indicatedElement-indicator {
-       right: 0.5em;
+  right: 0.5em;
 }
 
-/* OO.ui.OutlineItemWidget */
-
-.oo-ui-outlineItemWidget {
-       position: relative;
-       padding: 0.75em 0.75em 0.75em 3.5em;
-       -webkit-user-select: none;
-       -moz-user-select: none;
-       -ms-user-select: none;
-       user-select: none;
-       cursor: pointer;
-       font-size: 1.1em;
-}
-
-.oo-ui-outlineItemWidget-level-1 {
-       padding-left: 5em;
-}
-
-.oo-ui-outlineItemWidget-level-2 {
-       padding-left: 6.5em;
-}
-
-.oo-ui-outlineItemWidget.oo-ui-optionWidget-selected {
-       background-color: #a7dcff;
-       text-shadow: 0 1px 1px rgba(255,255,255,0.5);
-}
-
-.oo-ui-outlineItemWidget-level-0 .oo-ui-iconedElement-icon {
-       left: 1em;
-}
-
-.oo-ui-outlineItemWidget-level-1 .oo-ui-iconedElement-icon {
-       left: 2.5em;
+.oo-ui-menuWidget {
+  position: absolute;
 }
 
-.oo-ui-outlineItemWidget-level-2 .oo-ui-iconedElement-icon {
-       left: 4em;
+.oo-ui-menuWidget input {
+  position: absolute;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+  opacity: 0;
 }
 
-.oo-ui-outlineItemWidget.oo-ui-flaggableElement-important {
-       font-weight: bold;
+.oo-ui-popupWidget-popup {
+  position: absolute;
+  overflow: hidden;
 }
 
-.oo-ui-outlineItemWidget.oo-ui-flaggableElement-placeholder {
-       font-style: italic;
+.oo-ui-popupWidget-tail {
+  display: none;
 }
 
-.oo-ui-outlineItemWidget.oo-ui-flaggableElement-empty .oo-ui-iconedElement-icon,
-.oo-ui-outlineItemWidget.oo-ui-flaggableElement-empty .oo-ui-indicatedElement-indicator {
-       opacity: 0.5;
-}
-.oo-ui-outlineItemWidget.oo-ui-flaggableElement-empty .oo-ui-labeledElement-label {
-       color: #698AA0;
+.oo-ui-popupWidget-tailed .oo-ui-popupWidget-popup {
+  margin-top: 7px;
 }
 
-/* OO.ui.OutlineControlsWidget */
-
-.oo-ui-outlineControlsWidget {
-       height: 3em;
-       background-color: #fff;
+.oo-ui-popupWidget-tailed .oo-ui-popupWidget-tail {
+  position: absolute;
+  display: block;
+  background-repeat: no-repeat;
 }
 
-.oo-ui-outlineControlsWidget-adders,
-.oo-ui-outlineControlsWidget-movers {
-       float: left;
-       -webkit-box-sizing: border-box;
-       -moz-box-sizing: border-box;
-       box-sizing: border-box;
-       height: 3em;
-       padding: 0.5em;
+.oo-ui-popupWidget-head {
+  height: 2.5em;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
 }
 
-.oo-ui-outlineControlsWidget-adders {
-       float: left;
-}
-.oo-ui-outlineControlsWidget-movers {
-       float: right;
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+  float: right;
+  margin: 0.25em;
 }
 
-.oo-ui-outlineControlsWidget-adders .oo-ui-buttonWidget {
-       float: left;
+.oo-ui-popupWidget-head .oo-ui-labeledElement-label {
+  float: left;
+  margin: 0.75em 1em;
+  cursor: default;
 }
 
-.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
-       float: right;
+.oo-ui-buttonGroupWidget {
+  border-radius: 0.3em;
 }
 
-.oo-ui-outlineControlsWidget-adders .oo-ui-buttonWidget:first-child,
-.oo-ui-outlineControlsWidget-adders .oo-ui-buttonWidget:first-child:hover {
-       opacity: 0.25;
-       cursor: default;
+.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
+  margin-bottom: -1px;
+  margin-left: -1px;
+  border-radius: 0;
 }
 
-/* OO.ui.LabelWidget */
-
-.oo-ui-labelWidget {
-       padding: 0.5em 0;
+.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed:first-child .oo-ui-buttonedElement-button {
+  margin-left: 0;
+  border-bottom-left-radius: 0.3em;
+  border-top-left-radius: 0.3em;
 }
 
-/* OO.ui.TextInputWidget */
-
-.oo-ui-textInputWidget {
-       -webkit-box-sizing: border-box;
-       -moz-box-sizing: border-box;
-       box-sizing: border-box;
-       width: 20em;
-       position: relative;
+.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed:last-child .oo-ui-buttonedElement-button {
+  border-top-right-radius: 0.3em;
+  border-bottom-right-radius: 0.3em;
 }
 
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget input:focus[readonly],
-.oo-ui-widget-disabled.oo-ui-textInputWidget input:focus,
-.oo-ui-textInputWidget textarea,
-.oo-ui-textInputWidget textarea:focus[readonly],
-.oo-ui-widget-disabled.oo-ui-textInputWidget textarea:focus {
-       display: inline-block;
-       font-size: 1em;
-       font-family: sans-serif;
-       background-color: #fff;
-       border: solid 1px #ccc;
-       box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #ddd;
-       padding: 0.5em;
-       border-radius: 0.25em;
-       -webkit-box-sizing: border-box;
-       -moz-box-sizing: border-box;
-       box-sizing: border-box;
-       width: 100%;
-       resize: none;
-
-       /* Animation */
-       -webkit-transition: border-color 200ms, box-shadow 200ms;
-       -moz-transition: border-color 200ms, box-shadow 200ms;
-       -o-transition: border-color 200ms, box-shadow 200ms;
-       transition: border-color 200ms, box-shadow 200ms;
-}
-
-.oo-ui-textInputWidget-pending input,
-.oo-ui-textInputWidget-pending textarea {
-       background-color: transparent;
-}
-
-.oo-ui-textInputWidget input:focus,
-.oo-ui-textInputWidget textarea:focus {
-       outline: none;
-       border-color: #a7dcff;
-       box-shadow: 0 0 0.3em #a7dcff, 0 0 0 white;
-}
-
-.oo-ui-textInputWidget input[readonly],
-.oo-ui-textInputWidget textarea[readonly] {
-       color: #777;
-       text-shadow: 0 1px 1px #fff;
-}
-
-.oo-ui-widget-disabled.oo-ui-textInputWidget input,
-.oo-ui-widget-disabled.oo-ui-textInputWidget input:focus,
-.oo-ui-widget-disabled.oo-ui-textInputWidget textarea,
-.oo-ui-widget-disabled.oo-ui-textInputWidget textarea:focus {
-       color: #ccc;
-       border-color: #ddd;
-       text-shadow: 0 1px 1px #fff;
+.oo-ui-buttonOptionWidget {
+  display: inline-block;
+  padding: 0;
+  background-color: transparent;
 }
 
-.oo-ui-textInputWidget-decorated input,
-.oo-ui-textInputWidget-decorated textarea {
-       padding-left: 2em;
+.oo-ui-buttonOptionWidget .oo-ui-buttonedElement-button {
+  position: relative;
+  height: 1.9em;
 }
 
-.oo-ui-textInputWidget-icon {
-       position: absolute;
-       top: 0;
-       left: 0;
-       width: 2em;
-       height: 100%;
-       background-position: right center;
-       background-repeat: no-repeat;
+.oo-ui-buttonOptionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatedElement .oo-ui-indicatedElement-indicator {
+  position: static;
+  display: inline-block;
+  height: 1.9em;
+  margin-top: 0;
+  vertical-align: middle;
 }
 
-/* OO.ui.MenuWidget */
-
-.oo-ui-menuWidget {
-       position: absolute;
-       background: #fff;
-       margin-top: -1px;
-       border: solid 1px #ccc;
-       border-radius: 0 0 0.25em 0.25em;
-       box-shadow: 0 0.15em 1em 0 rgba(0, 0, 0, 0.2);
+.oo-ui-buttonSelectWidget {
+  display: inline-block;
+  white-space: nowrap;
 }
 
-.oo-ui-menuWidget input {
-       position: absolute;
-       width: 0;
-       height: 0;
-       overflow: hidden;
-       opacity: 0;
+.oo-ui-buttonWidget {
+  display: inline-block;
+  vertical-align: middle;
 }
 
-/* OO.ui.InlineMenuWidget */
-
 .oo-ui-inlineMenuWidget {
-       position: relative;
-       display: inline-block;
-       margin: 0.25em 0;
-       min-width: 20em;
+  position: relative;
+  display: inline-block;
+  min-width: 20em;
+  margin: 0.25em 0;
 }
 
 .oo-ui-inlineMenuWidget-handle {
-       display: inline-block;
-       width: 100%;
-       height: 2.5em;
-       border: solid 1px rgba(0,0,0,0.1);
-       border-radius: 0.25em;
-       -webkit-box-sizing: border-box;
-       -moz-box-sizing: border-box;
-       box-sizing: border-box;
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-       -moz-user-select: none;
-       -ms-user-select: none;
-       user-select: none;
-       cursor: pointer;
-}
-
-.oo-ui-inlineMenuWidget-handle:hover {
-       border-color: rgba(0,0,0,0.2);
+  display: inline-block;
+  width: 100%;
+  height: 2.5em;
+  cursor: pointer;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
 }
 
 .oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator,
 .oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon {
-       position: absolute;
-       top: 0;
-       width: 2.5em;
-       height: 2.5em;
-       background-position: center center;
-       background-repeat: no-repeat;
-       opacity: 0.8;
+  position: absolute;
+  top: 0;
+  width: 2.5em;
+  height: 2.5em;
+  background-position: center center;
+  background-repeat: no-repeat;
 }
 
 .oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator {
-       right: 0;
+  right: 0;
 }
 
 .oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon {
-       left: 0.25em;
+  left: 0.25em;
 }
 
 .oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
-       line-height: 2.5em;
-       margin: 0 0.5em;
+  margin: 0 0.5em;
+  line-height: 2.5em;
 }
 
 .oo-ui-inlineMenuWidget.oo-ui-iconedElement .oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
-       margin-left: 3em;
+  margin-left: 3em;
 }
 
 .oo-ui-inlineMenuWidget.oo-ui-indicatedElement .oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
-       margin-right: 2em;
+  margin-right: 2em;
 }
 
 .oo-ui-inlineMenuWidget .oo-ui-menuWidget {
-       width: 100%;
+  width: 100%;
 }
 
-/* OO.ui.MenuItemWidget */
-
 .oo-ui-menuItemWidget {
-       position: relative;
+  position: relative;
 }
 
 .oo-ui-menuItemWidget .oo-ui-iconedElement-icon {
-       display: none;
-}
-
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconedElement-icon {
-       display: block;
+  display: none;
 }
 
 .oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
-       background-color: transparent;
+  background-color: transparent;
 }
 
-.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted {
-       background-color: #e1f3ff;
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconedElement-icon {
+  display: block;
 }
 
-/* OO.ui.MenuSectionItemWidget */
-
 .oo-ui-menuSectionItemWidget {
-       padding: 0.33em 0.75em;
-       color: #888;
-       cursor: default;
+  padding: 0.33em 0.75em;
+  cursor: default;
 }
 
-/* OO.ui.ButtonSelectWidget */
-
-.oo-ui-buttonSelectWidget {
-       display: inline-block;
-       white-space: nowrap;
-       border-radius: 0.3em;
+.oo-ui-outlineControlsWidget {
+  height: 3em;
 }
 
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonedElement-button {
-       border-radius: 0;
-       margin-left: -1px;
+.oo-ui-outlineControlsWidget-adders,
+.oo-ui-outlineControlsWidget-movers {
+  float: left;
+  height: 2em;
+  padding: 0;
+  margin: 0.5em;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
 }
 
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonedElement-button {
-       border-bottom-left-radius: 0.3em;
-       border-top-left-radius: 0.3em;
-       margin-left: 0;
+.oo-ui-outlineControlsWidget > .oo-ui-iconedElement-icon {
+  float: left;
+  width: 1.5em;
+  height: 2em;
+  margin: 0.5em 0 0.5em 0.5em;
+  background-position: right center;
+  background-repeat: no-repeat;
 }
 
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonedElement-button {
-       border-bottom-right-radius: 0.3em;
-       border-top-right-radius: 0.3em;
+.oo-ui-outlineControlsWidget-adders {
+  float: left;
+  margin-left: 0;
 }
 
-/* OO.ui.ButtonOptionWidget */
-
-.oo-ui-buttonOptionWidget {
-       display: inline-block;
-       padding: 0;
-       background-color: transparent;
+.oo-ui-outlineControlsWidget-adders .oo-ui-buttonWidget {
+  float: left;
 }
 
-.oo-ui-buttonOptionWidget .oo-ui-buttonedElement-button {
-       position: relative;
-       height: 1.9em;
+.oo-ui-outlineControlsWidget-movers {
+  float: right;
 }
 
-.oo-ui-buttonOptionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatedElement .oo-ui-indicatedElement-indicator {
-       position: static;
-       display: inline-block;
-       vertical-align: middle;
-       height: 1.9em;
-       margin-top: 0;
+.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
+  float: right;
 }
 
-/* OO.ui.PopupWidget */
+.oo-ui-outlineItemWidget {
+  position: relative;
+  padding: 0.75em;
+  cursor: pointer;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
 
-.oo-ui-popupWidget-popup {
-       position: absolute;
-       overflow: hidden;
-       border: solid 1px #ccc;
-       border-radius: 0.25em;
-       background-color: #fff;
-       box-shadow: 0 0.15em 0.5em 0 rgba(0, 0, 0, 0.2);
+.oo-ui-outlineItemWidget.oo-ui-indicatedElement .oo-ui-labeledElement-label {
+  padding-right: 1.5em;
 }
 
-.oo-ui-popupWidget-tail {
-       display: none;
+.oo-ui-outlineItemWidget-level-0 {
+  padding-left: 3.5em;
 }
 
-.oo-ui-popupWidget-tailed .oo-ui-popupWidget-popup {
-       margin-top: 7px;
+.oo-ui-outlineItemWidget-level-0 .oo-ui-iconedElement-icon {
+  left: 1em;
 }
 
-.oo-ui-popupWidget-tailed .oo-ui-popupWidget-tail {
-       display: block;
-       position: absolute;
-       /* @embed */
-       background-image: url(images/tail.svg);
-       background-repeat: no-repeat;
-       width: 15px;
-       height: 8px;
-       margin-left: -7px;
-}
-
-.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
-       -webkit-transition: width 100ms, height 100ms, left 100ms;
-       -moz-transition: width 100ms, height 100ms, left 100ms;
-       -o-transition: width 100ms, height 100ms, left 100ms;
-       transition: width 100ms, height 100ms, left 100ms;
-       -webkit-transition-timing-function: ease-in-out;
-       -moz-transition-timing-function: ease-in-out;
-       -o-transition-timing-function: ease-in-out;
-       transition-timing-function: ease-in-out;
+.oo-ui-outlineItemWidget-level-1 {
+  padding-left: 5em;
 }
 
-.oo-ui-popupWidget-head {
-       height: 2.5em;
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-       -moz-user-select: none;
-       -ms-user-select: none;
-       user-select: none;
+.oo-ui-outlineItemWidget-level-1 .oo-ui-iconedElement-icon {
+  left: 2.5em;
 }
 
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-       float: right;
-       margin: 0.25em;
+.oo-ui-outlineItemWidget-level-2 {
+  padding-left: 6.5em;
 }
 
-.oo-ui-popupWidget-head .oo-ui-labeledElement-label {
-       float: left;
-       margin: 0.75em 1em;
-       cursor: default;
+.oo-ui-outlineItemWidget-level-2 .oo-ui-iconedElement-icon {
+  left: 4em;
 }
 
-.oo-ui-popupWidget-body {
-       box-shadow: 0 0 0.66em rgba(0,0,0,0.25);
+.oo-ui-popupButtonWidget {
+  position: relative;
 }
 
-/* OO.ui.SearchWidget */
+.oo-ui-popupButtonWidget .oo-ui-popupWidget {
+  position: absolute;
+  left: 1em;
+  cursor: auto;
+}
 
 .oo-ui-searchWidget-query {
-       position: absolute;
-       top: 0;
-       left: 0;
-       right: 0;
-       height: 4em;
-       padding: 0 1em;
-       box-shadow: 0 0 0.5em rgba(0,0,0,0.2);
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  height: 4em;
+  padding: 0 1em;
 }
 
 .oo-ui-searchWidget-query .oo-ui-textInputWidget {
-       width: 100%;
-       margin: 0.75em 0;
+  width: 100%;
+  margin: 0.75em 0;
 }
 
 .oo-ui-searchWidget-results {
-       position: absolute;
-       top: 4em;
-       bottom: 0;
-       left: 0;
-       right: 0;
-       padding: 1em;
-       overflow-x: hidden;
-       overflow-y: auto;
-       line-height: 0;
+  position: absolute;
+  top: 4em;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  padding: 1em;
+  overflow-x: hidden;
+  overflow-y: auto;
+  line-height: 0;
 }
 
-/* OO.ui.ToggleSwitchWidget */
-
-.oo-ui-toggleSwitchWidget {
-       position: relative;
-       display: inline-block;
-       vertical-align: middle;
-       height: 2em;
-       width: 3em;
-       border-radius: 1em;
-       overflow: hidden;
-       box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #ddd;
-       border: solid 1px #ccc;
-       cursor: pointer;
-       -webkit-box-sizing: border-box;
-       -moz-box-sizing: border-box;
-       box-sizing: border-box;
-       -webkit-transform: translateZ(0px);
-       -moz-transform: translateZ(0px);
-       -ms-transform: translateZ(0px);
-       -o-transform: translateZ(0px);
-       transform: translateZ(0px);
-
-       /* Gray */
-       background-color: #dddddd;
-       filter: progid:DXImageTransform.Microsoft.gradient(
-               GradientType=0,startColorstr=#dddddd, endColorstr=#ffffff
-       );
-       background-image: -webkit-gradient(
-               linear, right top, right bottom, color-stop(0%,#dddddd), color-stop(100%,#ffffff)
-       );
-       background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image: -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image: -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image: -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image: linear-gradient(top, #dddddd 0%, #ffffff 100%);
+.oo-ui-textInputWidget {
+  position: relative;
+  width: 20em;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
 }
 
-.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
-       opacity: 0.5;
-       cursor: default;
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+  display: inline-block;
+  width: 100%;
+  padding: 0.5em;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  resize: none;
 }
 
-.oo-ui-toggleSwitchWidget-grip {
-       -webkit-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-       -moz-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-       -o-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-       transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+.oo-ui-textInputWidget-decorated input,
+.oo-ui-textInputWidget-decorated textarea {
+  padding-left: 2em;
 }
 
-.oo-ui-toggleSwitchWidget-grip {
-       position: absolute;
-       display: block;
-       top: 0.25em;
-       left: 0.25em;
-       width: 1.5em;
-       height: 1.5em;
-       border-radius: 1em;
-       box-shadow: 0 0.1em 0.25em rgba(0, 0, 0, 0.1);
-       -webkit-box-sizing: border-box;
-       -moz-box-sizing: border-box;
-       box-sizing: border-box;
-
-       /* Gray */
-       border: 1px #c9c9c9 solid;
-       background-color: #ffffff;
-       filter: progid:DXImageTransform.Microsoft.gradient(
-               GradientType=0,startColorstr=#ffffff, endColorstr=#dddddd
-       );
-       background-image: -webkit-gradient(
-               linear, right top, right bottom, color-stop(0%,#ffffff), color-stop(100%,#dddddd)
-       );
-       background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image: -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image: -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image: -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image: linear-gradient(top, #ffffff 0%, #dddddd 100%);
-}
-
-.oo-ui-toggleSwitchWidget:not(.oo-ui-widget-disabled):hover,
-.oo-ui-toggleSwitchWidget:not(.oo-ui-widget-disabled):hover .oo-ui-toggleSwitchWidget-grip {
-       border-color: #aaa;
+.oo-ui-textInputWidget-icon {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 2em;
+  height: 100%;
+  background-position: right center;
+  background-repeat: no-repeat;
 }
 
-.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
-       left: 1.25em;
-       margin-left: -2px;
+.oo-ui-toggleSwitchWidget {
+  position: relative;
+  display: inline-block;
+  width: 3em;
+  height: 2em;
+  overflow: hidden;
+  vertical-align: middle;
+  cursor: pointer;
+  -webkit-transform: translateZ(0);
+     -moz-transform: translateZ(0);
+      -ms-transform: translateZ(0);
+       -o-transform: translateZ(0);
+          transform: translateZ(0);
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
 }
 
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
-       left: 0.25em;
-       margin-left: 0;
-}
-
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-on {
-       position: absolute;
-       top: 0;
-       bottom: 0;
-       right: 0;
-       left: 0;
-       border-radius: 1em;
-       box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-       -moz-user-select: none;
-       -ms-user-select: none;
-       user-select: none;
-
-       -webkit-transition: opacity 200ms ease-in-out;
-       -moz-transition: opacity 200ms ease-in-out;
-       -o-transition: opacity 200ms ease-in-out;
-       transition: opacity 200ms ease-in-out;
-
-       /* Blue */
-       background-color: #eaf4fa;
-       filter: progid:DXImageTransform.Microsoft.gradient(
-               GradientType=0,startColorstr=#b0d9ee, endColorstr=#eaf4fa
-       );
-       background-image: -webkit-gradient(
-               linear, right top, right bottom, color-stop(0%,#b0d9ee), color-stop(100%,#eaf4fa)
-       );
-       background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image: -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image: -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image: -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image: linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-}
-
-.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-on {
-       opacity: 1;
-}
-
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-on {
-       opacity: 0;
-}
-.oo-ui-window-head {
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-       -moz-user-select: none;
-       -ms-user-select: none;
-       user-select: none;
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+  cursor: default;
 }
 
-.oo-ui-window-body {
-       padding: 0 0.75em;
+.oo-ui-toggleSwitchWidget-grip {
+  position: absolute;
+  top: 0.25em;
+  left: 0.25em;
+  display: block;
+  width: 1.5em;
+  height: 1.5em;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  -webkit-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+     -moz-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+      -ms-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+       -o-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+          transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+}
+
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  -webkit-transition: opacity 200ms ease-in-out;
+     -moz-transition: opacity 200ms ease-in-out;
+      -ms-transition: opacity 200ms ease-in-out;
+       -o-transition: opacity 200ms ease-in-out;
+          transition: opacity 200ms ease-in-out;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
 }
 
-.oo-ui-window-icon {
-       float: left;
-       width: 2em;
-       height: 2em;
-       line-height: 2em;
-       margin-right: 0.5em;
-       background-position: right center;
-       background-repeat: no-repeat;
+.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
+  left: 1.25em;
+  margin-left: -2px;
 }
 
-.oo-ui-window-title {
-       float: left;
-       line-height: 2em;
-       color: #333;
-       white-space: nowrap;
-       cursor: default;
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
+  left: 0.25em;
+  margin-left: 0;
 }
 
-.oo-ui-window-overlay {
-       font-family: sans-serif;
-       line-height: 1.5em;
-       font-size: 1em;
-       position: absolute;
-       top: 0;
-       left: 0;
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+  display: none;
 }
+
 /* Icons */
 
 .oo-ui-icon-add-item {
-       /* @embed */
-       background-image: url(images/icons/add-item.svg);
+  background-image: /* @embed */ url(images/icons/add-item.svg);
 }
 
 .oo-ui-icon-advanced {
-       /* @embed */
-       background-image: url(images/icons/advanced.svg);
+  background-image: /* @embed */ url(images/icons/advanced.svg);
 }
 
 .oo-ui-icon-alert {
-       /* @embed */
-       background-image: url(images/icons/alert.svg);
+  background-image: /* @embed */ url(images/icons/alert.svg);
 }
 
 .oo-ui-icon-check {
-       /* @embed */
-       background-image: url(images/icons/check.svg);
+  background-image: /* @embed */ url(images/icons/check.svg);
 }
 
 .oo-ui-icon-clear {
-       /* @embed */
-       background-image: url(images/icons/clear.svg);
+  background-image: /* @embed */ url(images/icons/clear.svg);
 }
 
 .oo-ui-icon-close {
-       /* @embed */
-       background-image: url(images/icons/close.svg);
+  background-image: /* @embed */ url(images/icons/close.svg);
 }
 
 .oo-ui-icon-code {
-       /* @embed */
-       background-image: url(images/icons/code.svg);
+  background-image: /* @embed */ url(images/icons/code.svg);
 }
 
 .oo-ui-icon-collapse {
-       /* @embed */
-       background-image: url(images/icons/collapse.svg);
+  background-image: /* @embed */ url(images/icons/collapse.svg);
 }
 
 .oo-ui-icon-comment {
-       /* @embed */
-       background-image: url(images/icons/comment.svg);
+  background-image: /* @embed */ url(images/icons/comment.svg);
 }
 
 .oo-ui-icon-expand {
-       /* @embed */
-       background-image: url(images/icons/expand.svg);
+  background-image: /* @embed */ url(images/icons/expand.svg);
 }
 
 .oo-ui-icon-help {
-       /* @embed */
-       background-image: url(images/icons/help.svg);
+  background-image: /* @embed */ url(images/icons/help.svg);
 }
 
 .oo-ui-icon-link {
-       /* @embed */
-       background-image: url(images/icons/link.svg);
+  background-image: /* @embed */ url(images/icons/link.svg);
 }
 
 .oo-ui-icon-menu {
-       /* @embed */
-       background-image: url(images/icons/menu.svg);
+  background-image: /* @embed */ url(images/icons/menu.svg);
 }
 
 .oo-ui-icon-next {
-       /* @embed */
-       background-image: url(images/icons/move-ltr.svg);
+  background-image: /* @embed */ url(images/icons/move-ltr.svg);
 }
 
 .oo-ui-icon-picture {
-       /* @embed */
-       background-image: url(images/icons/picture.svg);
+  background-image: /* @embed */ url(images/icons/picture.svg);
 }
 
 .oo-ui-icon-previous {
-       /* @embed */
-       background-image: url(images/icons/move-rtl.svg);
+  background-image: /* @embed */ url(images/icons/move-rtl.svg);
 }
 
 .oo-ui-icon-redo {
-       /* @embed */
-       background-image: url(images/icons/arched-arrow-ltr.svg);
+  background-image: /* @embed */ url(images/icons/arched-arrow-ltr.svg);
 }
 
 .oo-ui-icon-remove {
-       /* @embed */
-       background-image: url(images/icons/remove.svg);
+  background-image: /* @embed */ url(images/icons/remove.svg);
 }
 
 .oo-ui-icon-search {
-       /* @embed */
-       background-image: url(images/icons/search.svg);
+  background-image: /* @embed */ url(images/icons/search.svg);
 }
 
 .oo-ui-icon-settings {
-       /* @embed */
-       background-image: url(images/icons/settings.svg);
+  background-image: /* @embed */ url(images/icons/settings.svg);
 }
 
 .oo-ui-icon-tag {
-       /* @embed */
-       background-image: url(images/icons/tag.svg);
+  background-image: /* @embed */ url(images/icons/tag.svg);
 }
 
 .oo-ui-icon-undo {
-       /* @embed */
-       background-image: url(images/icons/arched-arrow-rtl.svg);
+  background-image: /* @embed */ url(images/icons/arched-arrow-rtl.svg);
 }
 
 .oo-ui-icon-window {
-       /* @embed */
-       background-image: url(images/icons/window.svg);
+  background-image: /* @embed */ url(images/icons/window.svg);
 }
 
 /* Indicators */
 
 .oo-ui-indicator-down {
-       /* @embed */
-       background-image: url(images/indicators/down.svg);
+  background-image: /* @embed */ url(images/indicators/down.svg);
 }
 
 .oo-ui-indicator-required {
-       /* @embed */
-       background-image: url(images/indicators/required.svg);
+  background-image: /* @embed */ url(images/indicators/required.svg);
 }
 
 .oo-ui-indicator-up {
-       /* @embed */
-       background-image: url(images/indicators/up.svg);
-}
+  background-image: /* @embed */ url(images/indicators/up.svg);
+}
\ No newline at end of file
index 66536bb..6cf631f 100755 (executable)
@@ -37,6 +37,11 @@ fi
 # Undo any changes in the oojs-ui directory
 git reset resources/oojs-ui/
 git checkout resources/oojs-ui/
+
+git fetch origin
+# Create a branch of MW if needed, and reset it to master
+git checkout -B update-oojsui origin/master
+
 # Get the old oojs-ui version
 OLDVERSION=$(oojsuihash)
 if [ "x$OLDVERSION" == "x" ]
@@ -64,7 +69,8 @@ then
        exit 0
 fi
 # Build the distribution
-grunt
+npm install || exit 1
+grunt || exit 1
 # Get the list of changes
 NEWCHANGES=$(git log $OLDVERSION.. --oneline --no-merges --reverse --color=never)
 NEWCHANGESDISPLAY=$(git log $OLDVERSION.. --oneline --no-merges --reverse --color=always)
@@ -72,7 +78,7 @@ NEWCHANGESDISPLAY=$(git log $OLDVERSION.. --oneline --no-merges --reverse --colo
 cd -
 
 # Copy files from dist/ to resources/oojs-ui
-cp -a $1/dist/{oojs-ui.js,oojs-ui.svg.css,images,i18n} resources/oojs-ui/
+cp -a $1/dist/{oojs-ui.js,oojs-ui.svg.css,oojs-ui-apex.css,images,i18n} resources/oojs-ui/
 # Figure out what the new version is
 NEWVERSION=$(oojsuiversion)
 # Generate commit summary
index 70cb221..cd966b9 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs v1.0.7-pre (9c04f3e917)
+ * OOjs v1.0.8
  * https://www.mediawiki.org/wiki/OOjs
  *
  * Copyright 2011-2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: Fri Feb 14 2014 17:51:43 GMT-0800 (PST)
+ * Date: Tue Mar 11 2014 19:27:31 GMT+0100 (CET)
  */
 ( function ( global ) {
 
@@ -26,7 +26,6 @@ var
 /**
  * Assert whether a value is a plain object or not.
  *
- * @method
  * @param {Mixed} obj
  * @return {boolean}
  */
@@ -61,20 +60,20 @@ oo.isPlainObject = function ( obj ) {
  *  This is how prototypal inheritance works, it can only be one straight chain
  *  (just like classical inheritance in PHP for example). If you need to work with
  *  multiple constructors consider storing an instance of the other constructor in a
- *  property instead, or perhaps use a mixin (see oo.mixinClass).
+ *  property instead, or perhaps use a mixin (see OO.mixinClass).
  *
  *     function Thing() {}
  *     Thing.prototype.exists = function () {};
  *
  *     function Person() {
- *         this.constructor.super.apply( this, arguments );
+ *         Person.super.apply( this, arguments );
  *     }
- *     oo.inheritClass( Person, Thing );
+ *     OO.inheritClass( Person, Thing );
  *     Person.static.defaultEyeCount = 2;
  *     Person.prototype.walk = function () {};
  *
  *     function Jumper() {
- *         this.constructor.super.apply( this, arguments );
+ *         Jumper.super.apply( this, arguments );
  *     }
  *     OO.inheritClass( Jumper, Person );
  *     Jumper.prototype.jump = function () {};
@@ -85,7 +84,6 @@ oo.isPlainObject = function ( obj ) {
  *     x.walk();
  *     x instanceof Thing && x instanceof Person && x instanceof Jumper;
  *
- * @method
  * @param {Function} targetFn
  * @param {Function} originFn
  * @throws {Error} If target already inherits from origin
@@ -139,7 +137,6 @@ oo.inheritClass = function ( targetFn, originFn ) {
  *     OO.inheritClass( FooBar, Foo );
  *     OO.mixinClass( FooBar, ContextLazyLoad );
  *
- * @method
  * @param {Function} targetFn
  * @param {Function} originFn
  */
@@ -187,7 +184,6 @@ oo.mixinClass = function ( targetFn, originFn ) {
  *     foo2.getAge(); // 21
  *     foo.getAge(); // 22
  *
- * @method
  * @param {Object} origin
  * @return {Object} Clone of origin
  */
@@ -206,11 +202,10 @@ oo.cloneObject = function ( origin ) {
 };
 
 /**
- * Gets an array of all property values in an object.
+ * Get an array of all property values in an object.
  *
- * @method
  * @param {Object} Object to get values from
- * @returns {Array} List of object values
+ * @return {Array} List of object values
  */
 oo.getObjectValues = function ( obj ) {
        var key, values;
@@ -236,11 +231,10 @@ oo.getObjectValues = function ( obj ) {
  * the other. An asymmetrical test may also be performed, which checks only that properties in the
  * first object are present in the second object, but not the inverse.
  *
- * @method
  * @param {Object} a First object to compare
  * @param {Object} b Second object to compare
  * @param {boolean} [asymmetrical] Whether to check only that b contains values from a
- * @returns {boolean} If the objects contain the same values as each other
+ * @return {boolean} If the objects contain the same values as each other
  */
 oo.compare = function ( a, b, asymmetrical ) {
        var aValue, bValue, aType, bType, k;
@@ -269,10 +263,9 @@ oo.compare = function ( a, b, asymmetrical ) {
  *
  * Copies are deep, and will either be an object or an array depending on `source`.
  *
- * @method
  * @param {Object} source Object to copy
  * @param {Function} [callback] Applied to leaf values before they added to the clone
- * @returns {Object} Copy of source object
+ * @return {Object} Copy of source object
  */
 oo.copy = function ( source, callback ) {
        var key, sourceValue, sourceType, destination;
@@ -310,8 +303,9 @@ oo.copy = function ( source, callback ) {
 };
 
 /**
- * Generates a hash of an object based on its name and data.
- * Performance optimization: http://jsperf.com/ve-gethash-201208#/toJson_fnReplacerIfAoForElse
+ * Generate a hash of an object based on its name and data.
+ *
+ * Performance optimization: <http://jsperf.com/ve-gethash-201208#/toJson_fnReplacerIfAoForElse>
  *
  * To avoid two objects with the same values generating different hashes, we utilize the replacer
  * argument of JSON.stringify and sort the object by key as it's being serialized. This may or may
@@ -322,20 +316,21 @@ oo.copy = function ( source, callback ) {
  * ourselves. This allows classes to define custom hashing.
  *
  * @param {Object} val Object to generate hash for
- * @returns {string} Hash of object
+ * @return {string} Hash of object
  */
 oo.getHash = function ( val ) {
        return JSON.stringify( val, oo.getHash.keySortReplacer );
 };
 
 /**
- * Helper function for oo.getHash which sorts objects by key.
+ * Helper function for OO.getHash which sorts objects by key.
  *
  * This is a callback passed into JSON.stringify.
  *
+ * @method getHash_keySortReplacer
  * @param {string} key Property name of value being replaced
  * @param {Mixed} val Property value to replace
- * @returns {Mixed} Replacement value
+ * @return {Mixed} Replacement value
  */
 oo.getHash.keySortReplacer = function ( key, val ) {
        var normalized, keys, i, len;
@@ -365,13 +360,13 @@ oo.getHash.keySortReplacer = function ( key, val ) {
 /**
  * Compute the union (duplicate-free merge) of a set of arrays.
  *
- * Arrays values must be convertable to object keys (strings)
+ * Arrays values must be convertable to object keys (strings).
  *
  * By building an object (with the values for keys) in parallel with
- * the array, a new item's existence in the union can be computed faster
+ * the array, a new item's existence in the union can be computed faster.
  *
  * @param {Array...} arrays Arrays to union
- * @returns {Array} Union of the arrays
+ * @return {Array} Union of the arrays
  */
 oo.simpleArrayUnion = function () {
        var i, ilen, arr, j, jlen,
@@ -396,16 +391,16 @@ oo.simpleArrayUnion = function () {
  *
  * An intersection checks the item exists in 'b' while difference checks it doesn't.
  *
- * Arrays values must be convertable to object keys (strings)
+ * Arrays values must be convertable to object keys (strings).
  *
  * By building an object (with the values for keys) of 'b' we can
- * compute the result faster
+ * compute the result faster.
  *
  * @private
  * @param {Array} a First array
  * @param {Array} b Second array
  * @param {boolean} includeB Whether to items in 'b'
- * @returns {Array} Combination (intersection or difference) of arrays
+ * @return {Array} Combination (intersection or difference) of arrays
  */
 function simpleArrayCombine( a, b, includeB ) {
        var i, ilen, isInB,
@@ -429,11 +424,11 @@ function simpleArrayCombine( a, b, includeB ) {
 /**
  * Compute the intersection of two arrays (items in both arrays).
  *
- * Arrays values must be convertable to object keys (strings)
+ * Arrays values must be convertable to object keys (strings).
  *
  * @param {Array} a First array
  * @param {Array} b Second array
- * @returns {Array} Intersection of arrays
+ * @return {Array} Intersection of arrays
  */
 oo.simpleArrayIntersection = function ( a, b ) {
        return simpleArrayCombine( a, b, true );
@@ -442,25 +437,28 @@ oo.simpleArrayIntersection = function ( a, b ) {
 /**
  * Compute the difference of two arrays (items in 'a' but not 'b').
  *
- * Arrays values must be convertable to object keys (strings)
+ * Arrays values must be convertable to object keys (strings).
  *
  * @param {Array} a First array
  * @param {Array} b Second array
- * @returns {Array} Intersection of arrays
+ * @return {Array} Intersection of arrays
  */
 oo.simpleArrayDifference = function ( a, b ) {
        return simpleArrayCombine( a, b, false );
 };
 /**
- * Event emitter.
- *
  * @class OO.EventEmitter
  *
  * @constructor
- * @property {Object} bindings
  */
 oo.EventEmitter = function OoEventEmitter() {
        // Properties
+
+       /**
+        * Storage of bound event handlers by event name.
+        *
+        * @property
+        */
        this.bindings = {};
 };
 
@@ -471,7 +469,6 @@ oo.EventEmitter = function OoEventEmitter() {
  *
  * If the callback/context are already bound to the event, they will not be bound again.
  *
- * @method
  * @param {string} event Type of event to listen to
  * @param {Function} callback Function to call when event occurs
  * @param {Array} [args] Arguments to pass to listener, will be prepended to emitted arguments
@@ -516,7 +513,6 @@ oo.EventEmitter.prototype.on = function ( event, callback, args, context ) {
 /**
  * Adds a one-time listener to a specific event.
  *
- * @method
  * @param {string} event Type of event to listen to
  * @param {Function} listener Listener to call when event occurs
  * @chainable
@@ -532,7 +528,6 @@ oo.EventEmitter.prototype.once = function ( event, listener ) {
 /**
  * Remove a specific listener from a specific event.
  *
- * @method
  * @param {string} event Type of event to remove listener from
  * @param {Function} [callback] Listener to remove, omit to remove all
  * @param {Object} [context=null] Object used context for callback function or method
@@ -577,13 +572,13 @@ oo.EventEmitter.prototype.off = function ( event, callback, context ) {
 
 /**
  * Emit an event.
+ *
  * TODO: Should this be chainable? What is the usefulness of the boolean
  * return value here?
  *
- * @method
  * @param {string} event Type of event
  * @param {Mixed} args First in a list of variadic arguments passed to event handler (optional)
- * @returns {boolean} If event was handled by at least one listener
+ * @return {boolean} If event was handled by at least one listener
  */
 oo.EventEmitter.prototype.emit = function ( event ) {
        var i, len, binding, bindings, args;
@@ -607,12 +602,11 @@ oo.EventEmitter.prototype.emit = function ( event ) {
 /**
  * Connect event handlers to an object.
  *
- * @method
  * @param {Object} context Object to call methods on when events occur
  * @param {Object.<string,string>|Object.<string,Function>|Object.<string,Array>} methods List of
- * event bindings keyed by event name containing either method names, functions or arrays containing
- * method name or function followed by a list of arguments to be passed to callback before emitted
- * arguments
+ *  event bindings keyed by event name containing either method names, functions or arrays containing
+ *  method name or function followed by a list of arguments to be passed to callback before emitted
+ *  arguments
  * @chainable
  */
 oo.EventEmitter.prototype.connect = function ( context, methods ) {
@@ -647,7 +641,6 @@ oo.EventEmitter.prototype.connect = function ( context, methods ) {
 /**
  * Disconnect event handlers from an object.
  *
- * @method
  * @param {Object} context Object to disconnect methods from
  * @param {Object.<string,string>|Object.<string,Function>|Object.<string,Array>} [methods] List of
  * event bindings keyed by event name containing either method names or functions
@@ -688,8 +681,6 @@ oo.EventEmitter.prototype.disconnect = function ( context, methods ) {
        return this;
 };
 /**
- * Data registry.
- *
  * @class OO.Registry
  * @mixins OO.EventEmitter
  *
@@ -722,52 +713,44 @@ oo.mixinClass( oo.Registry, oo.EventEmitter );
  *
  * Only the base name will be registered, overriding any existing entry with the same base name.
  *
- * @method
  * @param {string|string[]} name Symbolic name or list of symbolic names
  * @param {Mixed} data Data to associate with symbolic name
  * @fires register
  * @throws {Error} Name argument must be a string or array
  */
 oo.Registry.prototype.register = function ( name, data ) {
-       if ( typeof name !== 'string' && !Array.isArray( name ) ) {
-               throw new Error( 'Name argument must be a string or array, cannot be a ' + typeof name );
-       }
        var i, len;
-       if ( Array.isArray( name ) ) {
+       if ( typeof name === 'string' ) {
+               this.registry[name] = data;
+               this.emit( 'register', name, data );
+       } else if ( Array.isArray( name ) ) {
                for ( i = 0, len = name.length; i < len; i++ ) {
                        this.register( name[i], data );
                }
-       } else if ( typeof name === 'string' ) {
-               this.registry[name] = data;
-               this.emit( 'register', name, data );
        } else {
-               throw new Error( 'Name must be a string or array of strings, cannot be a ' + typeof name );
+               throw new Error( 'Name must be a string or array, cannot be a ' + typeof name );
        }
 };
 
 /**
- * Gets data for a given symbolic name.
+ * Get data for a given symbolic name.
  *
  * Lookups are done using the base name.
  *
- * @method
  * @param {string} name Symbolic name
- * @returns {Mixed|undefined} Data associated with symbolic name
+ * @return {Mixed|undefined} Data associated with symbolic name
  */
 oo.Registry.prototype.lookup = function ( name ) {
        return this.registry[name];
 };
 /**
- * Object factory.
- *
  * @class OO.Factory
  * @extends OO.Registry
  *
  * @constructor
  */
 oo.Factory = function OoFactory() {
-       // Parent constructor
-       oo.Registry.call( this );
+       oo.Factory.super.call( this );
 
        // Properties
        this.entries = [];
@@ -784,14 +767,12 @@ oo.inheritClass( oo.Factory, oo.Registry );
  *
  * Classes must have a static `name` property to be registered.
  *
- *     @example
  *     function MyClass() {};
  *     // Adds a static property to the class defining a symbolic name
  *     MyClass.static = { 'name': 'mine' };
  *     // Registers class with factory, available via symbolic name 'mine'
  *     factory.register( MyClass );
  *
- * @method
  * @param {Function} constructor Constructor to use when creating object
  * @throws {Error} Name must be a string and must not be empty
  * @throws {Error} Constructor must be a function
@@ -807,7 +788,8 @@ oo.Factory.prototype.register = function ( constructor ) {
                throw new Error( 'Name must be a string and must not be empty' );
        }
        this.entries.push( name );
-       oo.Registry.prototype.register.call( this, name, constructor );
+
+       oo.Factory.super.prototype.register.call( this, name, constructor );
 };
 
 /**
@@ -816,10 +798,9 @@ oo.Factory.prototype.register = function ( constructor ) {
  * Name is used to look up the constructor to use, while all additional arguments are passed to the
  * constructor directly, so leaving one out will pass an undefined to the constructor.
  *
- * @method
  * @param {string} name Object name
  * @param {Mixed...} [args] Arguments to pass to the constructor
- * @returns {Object} The new object
+ * @return {Object} The new object
  * @throws {Error} Unknown object name
  */
 oo.Factory.prototype.create = function ( name ) {
index 0bdea23..57c7625 100755 (executable)
@@ -37,6 +37,11 @@ fi
 # Undo any changes in the oojs directory
 git reset resources/oojs/
 git checkout resources/oojs/
+
+git fetch origin
+# Create a branch of MW if needed, and reset it to master
+git checkout -B update-oojs origin/master
+
 # Get the old oojs version
 OLDVERSION=$(oojshash)
 if [ "x$OLDVERSION" == "x" ]
@@ -64,7 +69,8 @@ then
        exit 0
 fi
 # Build the distribution
-grunt
+npm install || exit 1
+grunt || exit 1
 # Get the list of changes
 NEWCHANGES=$(git log $OLDVERSION.. --oneline --no-merges --reverse --color=never)
 NEWCHANGESDISPLAY=$(git log $OLDVERSION.. --oneline --no-merges --reverse --color=always)
diff --git a/resources/sinonjs/sinon-1.8.1.js b/resources/sinonjs/sinon-1.8.1.js
deleted file mode 100644 (file)
index 3e9865e..0000000
+++ /dev/null
@@ -1,4721 +0,0 @@
-/**
- * Sinon.JS 1.8.1, 2014/02/02
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @author Contributors: https://github.com/cjohansen/Sinon.JS/blob/master/AUTHORS
- *
- * (The BSD License)
- * 
- * Copyright (c) 2010-2013, Christian Johansen, christian@cjohansen.no
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- * 
- *     * Redistributions of source code must retain the above copyright notice,
- *       this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright notice,
- *       this list of conditions and the following disclaimer in the documentation
- *       and/or other materials provided with the distribution.
- *     * Neither the name of Christian Johansen nor the names of his contributors
- *       may be used to endorse or promote products derived from this software
- *       without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-this.sinon = (function () {
-var samsam, formatio;
-function define(mod, deps, fn) { if (mod == "samsam") { samsam = deps(); } else { formatio = fn(samsam); } }
-define.amd = true;
-((typeof define === "function" && define.amd && function (m) { define("samsam", m); }) ||
- (typeof module === "object" &&
-      function (m) { module.exports = m(); }) || // Node
- function (m) { this.samsam = m(); } // Browser globals
-)(function () {
-    var o = Object.prototype;
-    var div = typeof document !== "undefined" && document.createElement("div");
-
-    function isNaN(value) {
-        // Unlike global isNaN, this avoids type coercion
-        // typeof check avoids IE host object issues, hat tip to
-        // lodash
-        var val = value; // JsLint thinks value !== value is "weird"
-        return typeof value === "number" && value !== val;
-    }
-
-    function getClass(value) {
-        // Returns the internal [[Class]] by calling Object.prototype.toString
-        // with the provided value as this. Return value is a string, naming the
-        // internal class, e.g. "Array"
-        return o.toString.call(value).split(/[ \]]/)[1];
-    }
-
-    /**
-     * @name samsam.isArguments
-     * @param Object object
-     *
-     * Returns ``true`` if ``object`` is an ``arguments`` object,
-     * ``false`` otherwise.
-     */
-    function isArguments(object) {
-        if (typeof object !== "object" || typeof object.length !== "number" ||
-                getClass(object) === "Array") {
-            return false;
-        }
-        if (typeof object.callee == "function") { return true; }
-        try {
-            object[object.length] = 6;
-            delete object[object.length];
-        } catch (e) {
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * @name samsam.isElement
-     * @param Object object
-     *
-     * Returns ``true`` if ``object`` is a DOM element node. Unlike
-     * Underscore.js/lodash, this function will return ``false`` if ``object``
-     * is an *element-like* object, i.e. a regular object with a ``nodeType``
-     * property that holds the value ``1``.
-     */
-    function isElement(object) {
-        if (!object || object.nodeType !== 1 || !div) { return false; }
-        try {
-            object.appendChild(div);
-            object.removeChild(div);
-        } catch (e) {
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * @name samsam.keys
-     * @param Object object
-     *
-     * Return an array of own property names.
-     */
-    function keys(object) {
-        var ks = [], prop;
-        for (prop in object) {
-            if (o.hasOwnProperty.call(object, prop)) { ks.push(prop); }
-        }
-        return ks;
-    }
-
-    /**
-     * @name samsam.isDate
-     * @param Object value
-     *
-     * Returns true if the object is a ``Date``, or *date-like*. Duck typing
-     * of date objects work by checking that the object has a ``getTime``
-     * function whose return value equals the return value from the object's
-     * ``valueOf``.
-     */
-    function isDate(value) {
-        return typeof value.getTime == "function" &&
-            value.getTime() == value.valueOf();
-    }
-
-    /**
-     * @name samsam.isNegZero
-     * @param Object value
-     *
-     * Returns ``true`` if ``value`` is ``-0``.
-     */
-    function isNegZero(value) {
-        return value === 0 && 1 / value === -Infinity;
-    }
-
-    /**
-     * @name samsam.equal
-     * @param Object obj1
-     * @param Object obj2
-     *
-     * Returns ``true`` if two objects are strictly equal. Compared to
-     * ``===`` there are two exceptions:
-     *
-     *   - NaN is considered equal to NaN
-     *   - -0 and +0 are not considered equal
-     */
-    function identical(obj1, obj2) {
-        if (obj1 === obj2 || (isNaN(obj1) && isNaN(obj2))) {
-            return obj1 !== 0 || isNegZero(obj1) === isNegZero(obj2);
-        }
-    }
-
-
-    /**
-     * @name samsam.deepEqual
-     * @param Object obj1
-     * @param Object obj2
-     *
-     * Deep equal comparison. Two values are "deep equal" if:
-     *
-     *   - They are equal, according to samsam.identical
-     *   - They are both date objects representing the same time
-     *   - They are both arrays containing elements that are all deepEqual
-     *   - They are objects with the same set of properties, and each property
-     *     in ``obj1`` is deepEqual to the corresponding property in ``obj2``
-     *
-     * Supports cyclic objects.
-     */
-    function deepEqualCyclic(obj1, obj2) {
-
-        // used for cyclic comparison
-        // contain already visited objects
-        var objects1 = [],
-            objects2 = [],
-        // contain pathes (position in the object structure)
-        // of the already visited objects
-        // indexes same as in objects arrays
-            paths1 = [],
-            paths2 = [],
-        // contains combinations of already compared objects
-        // in the manner: { "$1['ref']$2['ref']": true }
-            compared = {};
-
-        /**
-         * used to check, if the value of a property is an object
-         * (cyclic logic is only needed for objects)
-         * only needed for cyclic logic
-         */
-        function isObject(value) {
-
-            if (typeof value === 'object' && value !== null &&
-                    !(value instanceof Boolean) &&
-                    !(value instanceof Date)    &&
-                    !(value instanceof Number)  &&
-                    !(value instanceof RegExp)  &&
-                    !(value instanceof String)) {
-
-                return true;
-            }
-
-            return false;
-        }
-
-        /**
-         * returns the index of the given object in the
-         * given objects array, -1 if not contained
-         * only needed for cyclic logic
-         */
-        function getIndex(objects, obj) {
-
-            var i;
-            for (i = 0; i < objects.length; i++) {
-                if (objects[i] === obj) {
-                    return i;
-                }
-            }
-
-            return -1;
-        }
-
-        // does the recursion for the deep equal check
-        return (function deepEqual(obj1, obj2, path1, path2) {
-            var type1 = typeof obj1;
-            var type2 = typeof obj2;
-
-            // == null also matches undefined
-            if (obj1 === obj2 ||
-                    isNaN(obj1) || isNaN(obj2) ||
-                    obj1 == null || obj2 == null ||
-                    type1 !== "object" || type2 !== "object") {
-
-                return identical(obj1, obj2);
-            }
-
-            // Elements are only equal if identical(expected, actual)
-            if (isElement(obj1) || isElement(obj2)) { return false; }
-
-            var isDate1 = isDate(obj1), isDate2 = isDate(obj2);
-            if (isDate1 || isDate2) {
-                if (!isDate1 || !isDate2 || obj1.getTime() !== obj2.getTime()) {
-                    return false;
-                }
-            }
-
-            if (obj1 instanceof RegExp && obj2 instanceof RegExp) {
-                if (obj1.toString() !== obj2.toString()) { return false; }
-            }
-
-            var class1 = getClass(obj1);
-            var class2 = getClass(obj2);
-            var keys1 = keys(obj1);
-            var keys2 = keys(obj2);
-
-            if (isArguments(obj1) || isArguments(obj2)) {
-                if (obj1.length !== obj2.length) { return false; }
-            } else {
-                if (type1 !== type2 || class1 !== class2 ||
-                        keys1.length !== keys2.length) {
-                    return false;
-                }
-            }
-
-            var key, i, l,
-                // following vars are used for the cyclic logic
-                value1, value2,
-                isObject1, isObject2,
-                index1, index2,
-                newPath1, newPath2;
-
-            for (i = 0, l = keys1.length; i < l; i++) {
-                key = keys1[i];
-                if (!o.hasOwnProperty.call(obj2, key)) {
-                    return false;
-                }
-
-                // Start of the cyclic logic
-
-                value1 = obj1[key];
-                value2 = obj2[key];
-
-                isObject1 = isObject(value1);
-                isObject2 = isObject(value2);
-
-                // determine, if the objects were already visited
-                // (it's faster to check for isObject first, than to
-                // get -1 from getIndex for non objects)
-                index1 = isObject1 ? getIndex(objects1, value1) : -1;
-                index2 = isObject2 ? getIndex(objects2, value2) : -1;
-
-                // determine the new pathes of the objects
-                // - for non cyclic objects the current path will be extended
-                //   by current property name
-                // - for cyclic objects the stored path is taken
-                newPath1 = index1 !== -1
-                    ? paths1[index1]
-                    : path1 + '[' + JSON.stringify(key) + ']';
-                newPath2 = index2 !== -1
-                    ? paths2[index2]
-                    : path2 + '[' + JSON.stringify(key) + ']';
-
-                // stop recursion if current objects are already compared
-                if (compared[newPath1 + newPath2]) {
-                    return true;
-                }
-
-                // remember the current objects and their pathes
-                if (index1 === -1 && isObject1) {
-                    objects1.push(value1);
-                    paths1.push(newPath1);
-                }
-                if (index2 === -1 && isObject2) {
-                    objects2.push(value2);
-                    paths2.push(newPath2);
-                }
-
-                // remember that the current objects are already compared
-                if (isObject1 && isObject2) {
-                    compared[newPath1 + newPath2] = true;
-                }
-
-                // End of cyclic logic
-
-                // neither value1 nor value2 is a cycle
-                // continue with next level
-                if (!deepEqual(value1, value2, newPath1, newPath2)) {
-                    return false;
-                }
-            }
-
-            return true;
-
-        }(obj1, obj2, '$1', '$2'));
-    }
-
-    var match;
-
-    function arrayContains(array, subset) {
-        if (subset.length === 0) { return true; }
-        var i, l, j, k;
-        for (i = 0, l = array.length; i < l; ++i) {
-            if (match(array[i], subset[0])) {
-                for (j = 0, k = subset.length; j < k; ++j) {
-                    if (!match(array[i + j], subset[j])) { return false; }
-                }
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * @name samsam.match
-     * @param Object object
-     * @param Object matcher
-     *
-     * Compare arbitrary value ``object`` with matcher.
-     */
-    match = function match(object, matcher) {
-        if (matcher && typeof matcher.test === "function") {
-            return matcher.test(object);
-        }
-
-        if (typeof matcher === "function") {
-            return matcher(object) === true;
-        }
-
-        if (typeof matcher === "string") {
-            matcher = matcher.toLowerCase();
-            var notNull = typeof object === "string" || !!object;
-            return notNull &&
-                (String(object)).toLowerCase().indexOf(matcher) >= 0;
-        }
-
-        if (typeof matcher === "number") {
-            return matcher === object;
-        }
-
-        if (typeof matcher === "boolean") {
-            return matcher === object;
-        }
-
-        if (getClass(object) === "Array" && getClass(matcher) === "Array") {
-            return arrayContains(object, matcher);
-        }
-
-        if (matcher && typeof matcher === "object") {
-            var prop;
-            for (prop in matcher) {
-                if (!match(object[prop], matcher[prop])) {
-                    return false;
-                }
-            }
-            return true;
-        }
-
-        throw new Error("Matcher was not a string, a number, a " +
-                        "function, a boolean or an object");
-    };
-
-    return {
-        isArguments: isArguments,
-        isElement: isElement,
-        isDate: isDate,
-        isNegZero: isNegZero,
-        identical: identical,
-        deepEqual: deepEqualCyclic,
-        match: match,
-        keys: keys
-    };
-});
-((typeof define === "function" && define.amd && function (m) {
-    define("formatio", ["samsam"], m);
-}) || (typeof module === "object" && function (m) {
-    module.exports = m(require("samsam"));
-}) || function (m) { this.formatio = m(this.samsam); }
-)(function (samsam) {
-    
-    var formatio = {
-        excludeConstructors: ["Object", /^.$/],
-        quoteStrings: true
-    };
-
-    var hasOwn = Object.prototype.hasOwnProperty;
-
-    var specialObjects = [];
-    if (typeof global !== "undefined") {
-        specialObjects.push({ object: global, value: "[object global]" });
-    }
-    if (typeof document !== "undefined") {
-        specialObjects.push({
-            object: document,
-            value: "[object HTMLDocument]"
-        });
-    }
-    if (typeof window !== "undefined") {
-        specialObjects.push({ object: window, value: "[object Window]" });
-    }
-
-    function functionName(func) {
-        if (!func) { return ""; }
-        if (func.displayName) { return func.displayName; }
-        if (func.name) { return func.name; }
-        var matches = func.toString().match(/function\s+([^\(]+)/m);
-        return (matches && matches[1]) || "";
-    }
-
-    function constructorName(f, object) {
-        var name = functionName(object && object.constructor);
-        var excludes = f.excludeConstructors ||
-                formatio.excludeConstructors || [];
-
-        var i, l;
-        for (i = 0, l = excludes.length; i < l; ++i) {
-            if (typeof excludes[i] === "string" && excludes[i] === name) {
-                return "";
-            } else if (excludes[i].test && excludes[i].test(name)) {
-                return "";
-            }
-        }
-
-        return name;
-    }
-
-    function isCircular(object, objects) {
-        if (typeof object !== "object") { return false; }
-        var i, l;
-        for (i = 0, l = objects.length; i < l; ++i) {
-            if (objects[i] === object) { return true; }
-        }
-        return false;
-    }
-
-    function ascii(f, object, processed, indent) {
-        if (typeof object === "string") {
-            var qs = f.quoteStrings;
-            var quote = typeof qs !== "boolean" || qs;
-            return processed || quote ? '"' + object + '"' : object;
-        }
-
-        if (typeof object === "function" && !(object instanceof RegExp)) {
-            return ascii.func(object);
-        }
-
-        processed = processed || [];
-
-        if (isCircular(object, processed)) { return "[Circular]"; }
-
-        if (Object.prototype.toString.call(object) === "[object Array]") {
-            return ascii.array.call(f, object, processed);
-        }
-
-        if (!object) { return String((1/object) === -Infinity ? "-0" : object); }
-        if (samsam.isElement(object)) { return ascii.element(object); }
-
-        if (typeof object.toString === "function" &&
-                object.toString !== Object.prototype.toString) {
-            return object.toString();
-        }
-
-        var i, l;
-        for (i = 0, l = specialObjects.length; i < l; i++) {
-            if (object === specialObjects[i].object) {
-                return specialObjects[i].value;
-            }
-        }
-
-        return ascii.object.call(f, object, processed, indent);
-    }
-
-    ascii.func = function (func) {
-        return "function " + functionName(func) + "() {}";
-    };
-
-    ascii.array = function (array, processed) {
-        processed = processed || [];
-        processed.push(array);
-        var i, l, pieces = [];
-        for (i = 0, l = array.length; i < l; ++i) {
-            pieces.push(ascii(this, array[i], processed));
-        }
-        return "[" + pieces.join(", ") + "]";
-    };
-
-    ascii.object = function (object, processed, indent) {
-        processed = processed || [];
-        processed.push(object);
-        indent = indent || 0;
-        var pieces = [], properties = samsam.keys(object).sort();
-        var length = 3;
-        var prop, str, obj, i, l;
-
-        for (i = 0, l = properties.length; i < l; ++i) {
-            prop = properties[i];
-            obj = object[prop];
-
-            if (isCircular(obj, processed)) {
-                str = "[Circular]";
-            } else {
-                str = ascii(this, obj, processed, indent + 2);
-            }
-
-            str = (/\s/.test(prop) ? '"' + prop + '"' : prop) + ": " + str;
-            length += str.length;
-            pieces.push(str);
-        }
-
-        var cons = constructorName(this, object);
-        var prefix = cons ? "[" + cons + "] " : "";
-        var is = "";
-        for (i = 0, l = indent; i < l; ++i) { is += " "; }
-
-        if (length + indent > 80) {
-            return prefix + "{\n  " + is + pieces.join(",\n  " + is) + "\n" +
-                is + "}";
-        }
-        return prefix + "{ " + pieces.join(", ") + " }";
-    };
-
-    ascii.element = function (element) {
-        var tagName = element.tagName.toLowerCase();
-        var attrs = element.attributes, attr, pairs = [], attrName, i, l, val;
-
-        for (i = 0, l = attrs.length; i < l; ++i) {
-            attr = attrs.item(i);
-            attrName = attr.nodeName.toLowerCase().replace("html:", "");
-            val = attr.nodeValue;
-            if (attrName !== "contenteditable" || val !== "inherit") {
-                if (!!val) { pairs.push(attrName + "=\"" + val + "\""); }
-            }
-        }
-
-        var formatted = "<" + tagName + (pairs.length > 0 ? " " : "");
-        var content = element.innerHTML;
-
-        if (content.length > 20) {
-            content = content.substr(0, 20) + "[...]";
-        }
-
-        var res = formatted + pairs.join(" ") + ">" + content +
-                "</" + tagName + ">";
-
-        return res.replace(/ contentEditable="inherit"/, "");
-    };
-
-    function Formatio(options) {
-        for (var opt in options) {
-            this[opt] = options[opt];
-        }
-    }
-
-    Formatio.prototype = {
-        functionName: functionName,
-
-        configure: function (options) {
-            return new Formatio(options);
-        },
-
-        constructorName: function (object) {
-            return constructorName(this, object);
-        },
-
-        ascii: function (object, processed, indent) {
-            return ascii(this, object, processed, indent);
-        }
-    };
-
-    return Formatio.prototype;
-});
-/*jslint eqeqeq: false, onevar: false, forin: true, nomen: false, regexp: false, plusplus: false*/
-/*global module, require, __dirname, document*/
-/**
- * Sinon core utilities. For internal use only.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-var sinon = (function (formatio) {
-    var div = typeof document != "undefined" && document.createElement("div");
-    var hasOwn = Object.prototype.hasOwnProperty;
-
-    function isDOMNode(obj) {
-        var success = false;
-
-        try {
-            obj.appendChild(div);
-            success = div.parentNode == obj;
-        } catch (e) {
-            return false;
-        } finally {
-            try {
-                obj.removeChild(div);
-            } catch (e) {
-                // Remove failed, not much we can do about that
-            }
-        }
-
-        return success;
-    }
-
-    function isElement(obj) {
-        return div && obj && obj.nodeType === 1 && isDOMNode(obj);
-    }
-
-    function isFunction(obj) {
-        return typeof obj === "function" || !!(obj && obj.constructor && obj.call && obj.apply);
-    }
-
-    function mirrorProperties(target, source) {
-        for (var prop in source) {
-            if (!hasOwn.call(target, prop)) {
-                target[prop] = source[prop];
-            }
-        }
-    }
-
-    function isRestorable (obj) {
-        return typeof obj === "function" && typeof obj.restore === "function" && obj.restore.sinon;
-    }
-
-    var sinon = {
-        wrapMethod: function wrapMethod(object, property, method) {
-            if (!object) {
-                throw new TypeError("Should wrap property of object");
-            }
-
-            if (typeof method != "function") {
-                throw new TypeError("Method wrapper should be function");
-            }
-
-            var wrappedMethod = object[property],
-                error;
-
-            if (!isFunction(wrappedMethod)) {
-                error = new TypeError("Attempted to wrap " + (typeof wrappedMethod) + " property " +
-                                    property + " as function");
-            }
-
-            if (wrappedMethod.restore && wrappedMethod.restore.sinon) {
-                error = new TypeError("Attempted to wrap " + property + " which is already wrapped");
-            }
-
-            if (wrappedMethod.calledBefore) {
-                var verb = !!wrappedMethod.returns ? "stubbed" : "spied on";
-                error = new TypeError("Attempted to wrap " + property + " which is already " + verb);
-            }
-
-            if (error) {
-                if (wrappedMethod._stack) {
-                    error.stack += '\n--------------\n' + wrappedMethod._stack;
-                }
-                throw error;
-            }
-
-            // IE 8 does not support hasOwnProperty on the window object and Firefox has a problem
-            // when using hasOwn.call on objects from other frames.
-            var owned = object.hasOwnProperty ? object.hasOwnProperty(property) : hasOwn.call(object, property);
-            object[property] = method;
-            method.displayName = property;
-            // Set up a stack trace which can be used later to find what line of
-            // code the original method was created on.
-            method._stack = (new Error('Stack Trace for original')).stack;
-
-            method.restore = function () {
-                // For prototype properties try to reset by delete first.
-                // If this fails (ex: localStorage on mobile safari) then force a reset
-                // via direct assignment.
-                if (!owned) {
-                    delete object[property];
-                }
-                if (object[property] === method) {
-                    object[property] = wrappedMethod;
-                }
-            };
-
-            method.restore.sinon = true;
-            mirrorProperties(method, wrappedMethod);
-
-            return method;
-        },
-
-        extend: function extend(target) {
-            for (var i = 1, l = arguments.length; i < l; i += 1) {
-                for (var prop in arguments[i]) {
-                    if (arguments[i].hasOwnProperty(prop)) {
-                        target[prop] = arguments[i][prop];
-                    }
-
-                    // DONT ENUM bug, only care about toString
-                    if (arguments[i].hasOwnProperty("toString") &&
-                        arguments[i].toString != target.toString) {
-                        target.toString = arguments[i].toString;
-                    }
-                }
-            }
-
-            return target;
-        },
-
-        create: function create(proto) {
-            var F = function () {};
-            F.prototype = proto;
-            return new F();
-        },
-
-        deepEqual: function deepEqual(a, b) {
-            if (sinon.match && sinon.match.isMatcher(a)) {
-                return a.test(b);
-            }
-            if (typeof a != "object" || typeof b != "object") {
-                return a === b;
-            }
-
-            if (isElement(a) || isElement(b)) {
-                return a === b;
-            }
-
-            if (a === b) {
-                return true;
-            }
-
-            if ((a === null && b !== null) || (a !== null && b === null)) {
-                return false;
-            }
-
-            var aString = Object.prototype.toString.call(a);
-            if (aString != Object.prototype.toString.call(b)) {
-                return false;
-            }
-
-            if (aString == "[object Date]") {
-                return a.valueOf() === b.valueOf();
-            }
-
-            var prop, aLength = 0, bLength = 0;
-
-            if (aString == "[object Array]" && a.length !== b.length) {
-                return false;
-            }
-
-            for (prop in a) {
-                aLength += 1;
-
-                if (!deepEqual(a[prop], b[prop])) {
-                    return false;
-                }
-            }
-
-            for (prop in b) {
-                bLength += 1;
-            }
-
-            return aLength == bLength;
-        },
-
-        functionName: function functionName(func) {
-            var name = func.displayName || func.name;
-
-            // Use function decomposition as a last resort to get function
-            // name. Does not rely on function decomposition to work - if it
-            // doesn't debugging will be slightly less informative
-            // (i.e. toString will say 'spy' rather than 'myFunc').
-            if (!name) {
-                var matches = func.toString().match(/function ([^\s\(]+)/);
-                name = matches && matches[1];
-            }
-
-            return name;
-        },
-
-        functionToString: function toString() {
-            if (this.getCall && this.callCount) {
-                var thisValue, prop, i = this.callCount;
-
-                while (i--) {
-                    thisValue = this.getCall(i).thisValue;
-
-                    for (prop in thisValue) {
-                        if (thisValue[prop] === this) {
-                            return prop;
-                        }
-                    }
-                }
-            }
-
-            return this.displayName || "sinon fake";
-        },
-
-        getConfig: function (custom) {
-            var config = {};
-            custom = custom || {};
-            var defaults = sinon.defaultConfig;
-
-            for (var prop in defaults) {
-                if (defaults.hasOwnProperty(prop)) {
-                    config[prop] = custom.hasOwnProperty(prop) ? custom[prop] : defaults[prop];
-                }
-            }
-
-            return config;
-        },
-
-        format: function (val) {
-            return "" + val;
-        },
-
-        defaultConfig: {
-            injectIntoThis: true,
-            injectInto: null,
-            properties: ["spy", "stub", "mock", "clock", "server", "requests"],
-            useFakeTimers: true,
-            useFakeServer: true
-        },
-
-        timesInWords: function timesInWords(count) {
-            return count == 1 && "once" ||
-                count == 2 && "twice" ||
-                count == 3 && "thrice" ||
-                (count || 0) + " times";
-        },
-
-        calledInOrder: function (spies) {
-            for (var i = 1, l = spies.length; i < l; i++) {
-                if (!spies[i - 1].calledBefore(spies[i]) || !spies[i].called) {
-                    return false;
-                }
-            }
-
-            return true;
-        },
-
-        orderByFirstCall: function (spies) {
-            return spies.sort(function (a, b) {
-                // uuid, won't ever be equal
-                var aCall = a.getCall(0);
-                var bCall = b.getCall(0);
-                var aId = aCall && aCall.callId || -1;
-                var bId = bCall && bCall.callId || -1;
-
-                return aId < bId ? -1 : 1;
-            });
-        },
-
-        log: function () {},
-
-        logError: function (label, err) {
-            var msg = label + " threw exception: ";
-            sinon.log(msg + "[" + err.name + "] " + err.message);
-            if (err.stack) { sinon.log(err.stack); }
-
-            setTimeout(function () {
-                err.message = msg + err.message;
-                throw err;
-            }, 0);
-        },
-
-        typeOf: function (value) {
-            if (value === null) {
-                return "null";
-            }
-            else if (value === undefined) {
-                return "undefined";
-            }
-            var string = Object.prototype.toString.call(value);
-            return string.substring(8, string.length - 1).toLowerCase();
-        },
-
-        createStubInstance: function (constructor) {
-            if (typeof constructor !== "function") {
-                throw new TypeError("The constructor should be a function.");
-            }
-            return sinon.stub(sinon.create(constructor.prototype));
-        },
-
-        restore: function (object) {
-            if (object !== null && typeof object === "object") {
-                for (var prop in object) {
-                    if (isRestorable(object[prop])) {
-                        object[prop].restore();
-                    }
-                }
-            }
-            else if (isRestorable(object)) {
-                object.restore();
-            }
-        }
-    };
-
-    var isNode = typeof module !== "undefined" && module.exports;
-    var isAMD = typeof define === 'function' && typeof define.amd === 'object' && define.amd;
-
-    if (isAMD) {
-        define(function(){
-            return sinon;
-        });
-    } else if (isNode) {
-        try {
-            formatio = require("formatio");
-        } catch (e) {}
-        module.exports = sinon;
-        module.exports.spy = require("./sinon/spy");
-        module.exports.spyCall = require("./sinon/call");
-        module.exports.behavior = require("./sinon/behavior");
-        module.exports.stub = require("./sinon/stub");
-        module.exports.mock = require("./sinon/mock");
-        module.exports.collection = require("./sinon/collection");
-        module.exports.assert = require("./sinon/assert");
-        module.exports.sandbox = require("./sinon/sandbox");
-        module.exports.test = require("./sinon/test");
-        module.exports.testCase = require("./sinon/test_case");
-        module.exports.assert = require("./sinon/assert");
-        module.exports.match = require("./sinon/match");
-    }
-
-    if (formatio) {
-        var formatter = formatio.configure({ quoteStrings: false });
-        sinon.format = function () {
-            return formatter.ascii.apply(formatter, arguments);
-        };
-    } else if (isNode) {
-        try {
-            var util = require("util");
-            sinon.format = function (value) {
-                return typeof value == "object" && value.toString === Object.prototype.toString ? util.inspect(value) : value;
-            };
-        } catch (e) {
-            /* Node, but no util module - would be very old, but better safe than
-             sorry */
-        }
-    }
-
-    return sinon;
-}(typeof formatio == "object" && formatio));
-
-/* @depend ../sinon.js */
-/*jslint eqeqeq: false, onevar: false, plusplus: false*/
-/*global module, require, sinon*/
-/**
- * Match functions
- *
- * @author Maximilian Antoni (mail@maxantoni.de)
- * @license BSD
- *
- * Copyright (c) 2012 Maximilian Antoni
- */
-
-(function (sinon) {
-    var commonJSModule = typeof module !== 'undefined' && module.exports;
-
-    if (!sinon && commonJSModule) {
-        sinon = require("../sinon");
-    }
-
-    if (!sinon) {
-        return;
-    }
-
-    function assertType(value, type, name) {
-        var actual = sinon.typeOf(value);
-        if (actual !== type) {
-            throw new TypeError("Expected type of " + name + " to be " +
-                type + ", but was " + actual);
-        }
-    }
-
-    var matcher = {
-        toString: function () {
-            return this.message;
-        }
-    };
-
-    function isMatcher(object) {
-        return matcher.isPrototypeOf(object);
-    }
-
-    function matchObject(expectation, actual) {
-        if (actual === null || actual === undefined) {
-            return false;
-        }
-        for (var key in expectation) {
-            if (expectation.hasOwnProperty(key)) {
-                var exp = expectation[key];
-                var act = actual[key];
-                if (match.isMatcher(exp)) {
-                    if (!exp.test(act)) {
-                        return false;
-                    }
-                } else if (sinon.typeOf(exp) === "object") {
-                    if (!matchObject(exp, act)) {
-                        return false;
-                    }
-                } else if (!sinon.deepEqual(exp, act)) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
-    matcher.or = function (m2) {
-        if (!isMatcher(m2)) {
-            throw new TypeError("Matcher expected");
-        }
-        var m1 = this;
-        var or = sinon.create(matcher);
-        or.test = function (actual) {
-            return m1.test(actual) || m2.test(actual);
-        };
-        or.message = m1.message + ".or(" + m2.message + ")";
-        return or;
-    };
-
-    matcher.and = function (m2) {
-        if (!isMatcher(m2)) {
-            throw new TypeError("Matcher expected");
-        }
-        var m1 = this;
-        var and = sinon.create(matcher);
-        and.test = function (actual) {
-            return m1.test(actual) && m2.test(actual);
-        };
-        and.message = m1.message + ".and(" + m2.message + ")";
-        return and;
-    };
-
-    var match = function (expectation, message) {
-        var m = sinon.create(matcher);
-        var type = sinon.typeOf(expectation);
-        switch (type) {
-        case "object":
-            if (typeof expectation.test === "function") {
-                m.test = function (actual) {
-                    return expectation.test(actual) === true;
-                };
-                m.message = "match(" + sinon.functionName(expectation.test) + ")";
-                return m;
-            }
-            var str = [];
-            for (var key in expectation) {
-                if (expectation.hasOwnProperty(key)) {
-                    str.push(key + ": " + expectation[key]);
-                }
-            }
-            m.test = function (actual) {
-                return matchObject(expectation, actual);
-            };
-            m.message = "match(" + str.join(", ") + ")";
-            break;
-        case "number":
-            m.test = function (actual) {
-                return expectation == actual;
-            };
-            break;
-        case "string":
-            m.test = function (actual) {
-                if (typeof actual !== "string") {
-                    return false;
-                }
-                return actual.indexOf(expectation) !== -1;
-            };
-            m.message = "match(\"" + expectation + "\")";
-            break;
-        case "regexp":
-            m.test = function (actual) {
-                if (typeof actual !== "string") {
-                    return false;
-                }
-                return expectation.test(actual);
-            };
-            break;
-        case "function":
-            m.test = expectation;
-            if (message) {
-                m.message = message;
-            } else {
-                m.message = "match(" + sinon.functionName(expectation) + ")";
-            }
-            break;
-        default:
-            m.test = function (actual) {
-              return sinon.deepEqual(expectation, actual);
-            };
-        }
-        if (!m.message) {
-            m.message = "match(" + expectation + ")";
-        }
-        return m;
-    };
-
-    match.isMatcher = isMatcher;
-
-    match.any = match(function () {
-        return true;
-    }, "any");
-
-    match.defined = match(function (actual) {
-        return actual !== null && actual !== undefined;
-    }, "defined");
-
-    match.truthy = match(function (actual) {
-        return !!actual;
-    }, "truthy");
-
-    match.falsy = match(function (actual) {
-        return !actual;
-    }, "falsy");
-
-    match.same = function (expectation) {
-        return match(function (actual) {
-            return expectation === actual;
-        }, "same(" + expectation + ")");
-    };
-
-    match.typeOf = function (type) {
-        assertType(type, "string", "type");
-        return match(function (actual) {
-            return sinon.typeOf(actual) === type;
-        }, "typeOf(\"" + type + "\")");
-    };
-
-    match.instanceOf = function (type) {
-        assertType(type, "function", "type");
-        return match(function (actual) {
-            return actual instanceof type;
-        }, "instanceOf(" + sinon.functionName(type) + ")");
-    };
-
-    function createPropertyMatcher(propertyTest, messagePrefix) {
-        return function (property, value) {
-            assertType(property, "string", "property");
-            var onlyProperty = arguments.length === 1;
-            var message = messagePrefix + "(\"" + property + "\"";
-            if (!onlyProperty) {
-                message += ", " + value;
-            }
-            message += ")";
-            return match(function (actual) {
-                if (actual === undefined || actual === null ||
-                        !propertyTest(actual, property)) {
-                    return false;
-                }
-                return onlyProperty || sinon.deepEqual(value, actual[property]);
-            }, message);
-        };
-    }
-
-    match.has = createPropertyMatcher(function (actual, property) {
-        if (typeof actual === "object") {
-            return property in actual;
-        }
-        return actual[property] !== undefined;
-    }, "has");
-
-    match.hasOwn = createPropertyMatcher(function (actual, property) {
-        return actual.hasOwnProperty(property);
-    }, "hasOwn");
-
-    match.bool = match.typeOf("boolean");
-    match.number = match.typeOf("number");
-    match.string = match.typeOf("string");
-    match.object = match.typeOf("object");
-    match.func = match.typeOf("function");
-    match.array = match.typeOf("array");
-    match.regexp = match.typeOf("regexp");
-    match.date = match.typeOf("date");
-
-    if (commonJSModule) {
-        module.exports = match;
-    } else {
-        sinon.match = match;
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
-  * @depend ../sinon.js
-  * @depend match.js
-  */
-/*jslint eqeqeq: false, onevar: false, plusplus: false*/
-/*global module, require, sinon*/
-/**
-  * Spy calls
-  *
-  * @author Christian Johansen (christian@cjohansen.no)
-  * @author Maximilian Antoni (mail@maxantoni.de)
-  * @license BSD
-  *
-  * Copyright (c) 2010-2013 Christian Johansen
-  * Copyright (c) 2013 Maximilian Antoni
-  */
-
-(function (sinon) {
-    var commonJSModule = typeof module !== 'undefined' && module.exports;
-    if (!sinon && commonJSModule) {
-        sinon = require("../sinon");
-    }
-
-    if (!sinon) {
-        return;
-    }
-
-    function throwYieldError(proxy, text, args) {
-        var msg = sinon.functionName(proxy) + text;
-        if (args.length) {
-            msg += " Received [" + slice.call(args).join(", ") + "]";
-        }
-        throw new Error(msg);
-    }
-
-    var slice = Array.prototype.slice;
-
-    var callProto = {
-        calledOn: function calledOn(thisValue) {
-            if (sinon.match && sinon.match.isMatcher(thisValue)) {
-                return thisValue.test(this.thisValue);
-            }
-            return this.thisValue === thisValue;
-        },
-
-        calledWith: function calledWith() {
-            for (var i = 0, l = arguments.length; i < l; i += 1) {
-                if (!sinon.deepEqual(arguments[i], this.args[i])) {
-                    return false;
-                }
-            }
-
-            return true;
-        },
-
-        calledWithMatch: function calledWithMatch() {
-            for (var i = 0, l = arguments.length; i < l; i += 1) {
-                var actual = this.args[i];
-                var expectation = arguments[i];
-                if (!sinon.match || !sinon.match(expectation).test(actual)) {
-                    return false;
-                }
-            }
-            return true;
-        },
-
-        calledWithExactly: function calledWithExactly() {
-            return arguments.length == this.args.length &&
-                this.calledWith.apply(this, arguments);
-        },
-
-        notCalledWith: function notCalledWith() {
-            return !this.calledWith.apply(this, arguments);
-        },
-
-        notCalledWithMatch: function notCalledWithMatch() {
-            return !this.calledWithMatch.apply(this, arguments);
-        },
-
-        returned: function returned(value) {
-            return sinon.deepEqual(value, this.returnValue);
-        },
-
-        threw: function threw(error) {
-            if (typeof error === "undefined" || !this.exception) {
-                return !!this.exception;
-            }
-
-            return this.exception === error || this.exception.name === error;
-        },
-
-        calledWithNew: function calledWithNew() {
-            return this.thisValue instanceof this.proxy;
-        },
-
-        calledBefore: function (other) {
-            return this.callId < other.callId;
-        },
-
-        calledAfter: function (other) {
-            return this.callId > other.callId;
-        },
-
-        callArg: function (pos) {
-            this.args[pos]();
-        },
-
-        callArgOn: function (pos, thisValue) {
-            this.args[pos].apply(thisValue);
-        },
-
-        callArgWith: function (pos) {
-            this.callArgOnWith.apply(this, [pos, null].concat(slice.call(arguments, 1)));
-        },
-
-        callArgOnWith: function (pos, thisValue) {
-            var args = slice.call(arguments, 2);
-            this.args[pos].apply(thisValue, args);
-        },
-
-        "yield": function () {
-            this.yieldOn.apply(this, [null].concat(slice.call(arguments, 0)));
-        },
-
-        yieldOn: function (thisValue) {
-            var args = this.args;
-            for (var i = 0, l = args.length; i < l; ++i) {
-                if (typeof args[i] === "function") {
-                    args[i].apply(thisValue, slice.call(arguments, 1));
-                    return;
-                }
-            }
-            throwYieldError(this.proxy, " cannot yield since no callback was passed.", args);
-        },
-
-        yieldTo: function (prop) {
-            this.yieldToOn.apply(this, [prop, null].concat(slice.call(arguments, 1)));
-        },
-
-        yieldToOn: function (prop, thisValue) {
-            var args = this.args;
-            for (var i = 0, l = args.length; i < l; ++i) {
-                if (args[i] && typeof args[i][prop] === "function") {
-                    args[i][prop].apply(thisValue, slice.call(arguments, 2));
-                    return;
-                }
-            }
-            throwYieldError(this.proxy, " cannot yield to '" + prop +
-                "' since no callback was passed.", args);
-        },
-
-        toString: function () {
-            var callStr = this.proxy.toString() + "(";
-            var args = [];
-
-            for (var i = 0, l = this.args.length; i < l; ++i) {
-                args.push(sinon.format(this.args[i]));
-            }
-
-            callStr = callStr + args.join(", ") + ")";
-
-            if (typeof this.returnValue != "undefined") {
-                callStr += " => " + sinon.format(this.returnValue);
-            }
-
-            if (this.exception) {
-                callStr += " !" + this.exception.name;
-
-                if (this.exception.message) {
-                    callStr += "(" + this.exception.message + ")";
-                }
-            }
-
-            return callStr;
-        }
-    };
-
-    callProto.invokeCallback = callProto.yield;
-
-    function createSpyCall(spy, thisValue, args, returnValue, exception, id) {
-        if (typeof id !== "number") {
-            throw new TypeError("Call id is not a number");
-        }
-        var proxyCall = sinon.create(callProto);
-        proxyCall.proxy = spy;
-        proxyCall.thisValue = thisValue;
-        proxyCall.args = args;
-        proxyCall.returnValue = returnValue;
-        proxyCall.exception = exception;
-        proxyCall.callId = id;
-
-        return proxyCall;
-    }
-    createSpyCall.toString = callProto.toString; // used by mocks
-
-    if (commonJSModule) {
-        module.exports = createSpyCall;
-    } else {
-        sinon.spyCall = createSpyCall;
-    }
-}(typeof sinon == "object" && sinon || null));
-
-
-/**
-  * @depend ../sinon.js
-  * @depend call.js
-  */
-/*jslint eqeqeq: false, onevar: false, plusplus: false*/
-/*global module, require, sinon*/
-/**
-  * Spy functions
-  *
-  * @author Christian Johansen (christian@cjohansen.no)
-  * @license BSD
-  *
-  * Copyright (c) 2010-2013 Christian Johansen
-  */
-
-(function (sinon) {
-    var commonJSModule = typeof module !== 'undefined' && module.exports;
-    var push = Array.prototype.push;
-    var slice = Array.prototype.slice;
-    var callId = 0;
-
-    if (!sinon && commonJSModule) {
-        sinon = require("../sinon");
-    }
-
-    if (!sinon) {
-        return;
-    }
-
-    function spy(object, property) {
-        if (!property && typeof object == "function") {
-            return spy.create(object);
-        }
-
-        if (!object && !property) {
-            return spy.create(function () { });
-        }
-
-        var method = object[property];
-        return sinon.wrapMethod(object, property, spy.create(method));
-    }
-
-    function matchingFake(fakes, args, strict) {
-        if (!fakes) {
-            return;
-        }
-
-        for (var i = 0, l = fakes.length; i < l; i++) {
-            if (fakes[i].matches(args, strict)) {
-                return fakes[i];
-            }
-        }
-    }
-
-    function incrementCallCount() {
-        this.called = true;
-        this.callCount += 1;
-        this.notCalled = false;
-        this.calledOnce = this.callCount == 1;
-        this.calledTwice = this.callCount == 2;
-        this.calledThrice = this.callCount == 3;
-    }
-
-    function createCallProperties() {
-        this.firstCall = this.getCall(0);
-        this.secondCall = this.getCall(1);
-        this.thirdCall = this.getCall(2);
-        this.lastCall = this.getCall(this.callCount - 1);
-    }
-
-    var vars = "a,b,c,d,e,f,g,h,i,j,k,l";
-    function createProxy(func) {
-        // Retain the function length:
-        var p;
-        if (func.length) {
-            eval("p = (function proxy(" + vars.substring(0, func.length * 2 - 1) +
-                ") { return p.invoke(func, this, slice.call(arguments)); });");
-        }
-        else {
-            p = function proxy() {
-                return p.invoke(func, this, slice.call(arguments));
-            };
-        }
-        return p;
-    }
-
-    var uuid = 0;
-
-    // Public API
-    var spyApi = {
-        reset: function () {
-            this.called = false;
-            this.notCalled = true;
-            this.calledOnce = false;
-            this.calledTwice = false;
-            this.calledThrice = false;
-            this.callCount = 0;
-            this.firstCall = null;
-            this.secondCall = null;
-            this.thirdCall = null;
-            this.lastCall = null;
-            this.args = [];
-            this.returnValues = [];
-            this.thisValues = [];
-            this.exceptions = [];
-            this.callIds = [];
-            if (this.fakes) {
-                for (var i = 0; i < this.fakes.length; i++) {
-                    this.fakes[i].reset();
-                }
-            }
-        },
-
-        create: function create(func) {
-            var name;
-
-            if (typeof func != "function") {
-                func = function () { };
-            } else {
-                name = sinon.functionName(func);
-            }
-
-            var proxy = createProxy(func);
-
-            sinon.extend(proxy, spy);
-            delete proxy.create;
-            sinon.extend(proxy, func);
-
-            proxy.reset();
-            proxy.prototype = func.prototype;
-            proxy.displayName = name || "spy";
-            proxy.toString = sinon.functionToString;
-            proxy._create = sinon.spy.create;
-            proxy.id = "spy#" + uuid++;
-
-            return proxy;
-        },
-
-        invoke: function invoke(func, thisValue, args) {
-            var matching = matchingFake(this.fakes, args);
-            var exception, returnValue;
-
-            incrementCallCount.call(this);
-            push.call(this.thisValues, thisValue);
-            push.call(this.args, args);
-            push.call(this.callIds, callId++);
-
-            try {
-                if (matching) {
-                    returnValue = matching.invoke(func, thisValue, args);
-                } else {
-                    returnValue = (this.func || func).apply(thisValue, args);
-                }
-
-                var thisCall = this.getCall(this.callCount - 1);
-                if (thisCall.calledWithNew() && typeof returnValue !== 'object') {
-                    returnValue = thisValue;
-                }
-            } catch (e) {
-                exception = e;
-            }
-
-            push.call(this.exceptions, exception);
-            push.call(this.returnValues, returnValue);
-
-            createCallProperties.call(this);
-
-            if (exception !== undefined) {
-                throw exception;
-            }
-
-            return returnValue;
-        },
-
-        getCall: function getCall(i) {
-            if (i < 0 || i >= this.callCount) {
-                return null;
-            }
-
-            return sinon.spyCall(this, this.thisValues[i], this.args[i],
-                                    this.returnValues[i], this.exceptions[i],
-                                    this.callIds[i]);
-        },
-
-        getCalls: function () {
-            var calls = [];
-            var i;
-
-            for (i = 0; i < this.callCount; i++) {
-                calls.push(this.getCall(i));
-            }
-
-            return calls;
-        },
-
-        calledBefore: function calledBefore(spyFn) {
-            if (!this.called) {
-                return false;
-            }
-
-            if (!spyFn.called) {
-                return true;
-            }
-
-            return this.callIds[0] < spyFn.callIds[spyFn.callIds.length - 1];
-        },
-
-        calledAfter: function calledAfter(spyFn) {
-            if (!this.called || !spyFn.called) {
-                return false;
-            }
-
-            return this.callIds[this.callCount - 1] > spyFn.callIds[spyFn.callCount - 1];
-        },
-
-        withArgs: function () {
-            var args = slice.call(arguments);
-
-            if (this.fakes) {
-                var match = matchingFake(this.fakes, args, true);
-
-                if (match) {
-                    return match;
-                }
-            } else {
-                this.fakes = [];
-            }
-
-            var original = this;
-            var fake = this._create();
-            fake.matchingAguments = args;
-            fake.parent = this;
-            push.call(this.fakes, fake);
-
-            fake.withArgs = function () {
-                return original.withArgs.apply(original, arguments);
-            };
-
-            for (var i = 0; i < this.args.length; i++) {
-                if (fake.matches(this.args[i])) {
-                    incrementCallCount.call(fake);
-                    push.call(fake.thisValues, this.thisValues[i]);
-                    push.call(fake.args, this.args[i]);
-                    push.call(fake.returnValues, this.returnValues[i]);
-                    push.call(fake.exceptions, this.exceptions[i]);
-                    push.call(fake.callIds, this.callIds[i]);
-                }
-            }
-            createCallProperties.call(fake);
-
-            return fake;
-        },
-
-        matches: function (args, strict) {
-            var margs = this.matchingAguments;
-
-            if (margs.length <= args.length &&
-                sinon.deepEqual(margs, args.slice(0, margs.length))) {
-                return !strict || margs.length == args.length;
-            }
-        },
-
-        printf: function (format) {
-            var spy = this;
-            var args = slice.call(arguments, 1);
-            var formatter;
-
-            return (format || "").replace(/%(.)/g, function (match, specifyer) {
-                formatter = spyApi.formatters[specifyer];
-
-                if (typeof formatter == "function") {
-                    return formatter.call(null, spy, args);
-                } else if (!isNaN(parseInt(specifyer, 10))) {
-                    return sinon.format(args[specifyer - 1]);
-                }
-
-                return "%" + specifyer;
-            });
-        }
-    };
-
-    function delegateToCalls(method, matchAny, actual, notCalled) {
-        spyApi[method] = function () {
-            if (!this.called) {
-                if (notCalled) {
-                    return notCalled.apply(this, arguments);
-                }
-                return false;
-            }
-
-            var currentCall;
-            var matches = 0;
-
-            for (var i = 0, l = this.callCount; i < l; i += 1) {
-                currentCall = this.getCall(i);
-
-                if (currentCall[actual || method].apply(currentCall, arguments)) {
-                    matches += 1;
-
-                    if (matchAny) {
-                        return true;
-                    }
-                }
-            }
-
-            return matches === this.callCount;
-        };
-    }
-
-    delegateToCalls("calledOn", true);
-    delegateToCalls("alwaysCalledOn", false, "calledOn");
-    delegateToCalls("calledWith", true);
-    delegateToCalls("calledWithMatch", true);
-    delegateToCalls("alwaysCalledWith", false, "calledWith");
-    delegateToCalls("alwaysCalledWithMatch", false, "calledWithMatch");
-    delegateToCalls("calledWithExactly", true);
-    delegateToCalls("alwaysCalledWithExactly", false, "calledWithExactly");
-    delegateToCalls("neverCalledWith", false, "notCalledWith",
-        function () { return true; });
-    delegateToCalls("neverCalledWithMatch", false, "notCalledWithMatch",
-        function () { return true; });
-    delegateToCalls("threw", true);
-    delegateToCalls("alwaysThrew", false, "threw");
-    delegateToCalls("returned", true);
-    delegateToCalls("alwaysReturned", false, "returned");
-    delegateToCalls("calledWithNew", true);
-    delegateToCalls("alwaysCalledWithNew", false, "calledWithNew");
-    delegateToCalls("callArg", false, "callArgWith", function () {
-        throw new Error(this.toString() + " cannot call arg since it was not yet invoked.");
-    });
-    spyApi.callArgWith = spyApi.callArg;
-    delegateToCalls("callArgOn", false, "callArgOnWith", function () {
-        throw new Error(this.toString() + " cannot call arg since it was not yet invoked.");
-    });
-    spyApi.callArgOnWith = spyApi.callArgOn;
-    delegateToCalls("yield", false, "yield", function () {
-        throw new Error(this.toString() + " cannot yield since it was not yet invoked.");
-    });
-    // "invokeCallback" is an alias for "yield" since "yield" is invalid in strict mode.
-    spyApi.invokeCallback = spyApi.yield;
-    delegateToCalls("yieldOn", false, "yieldOn", function () {
-        throw new Error(this.toString() + " cannot yield since it was not yet invoked.");
-    });
-    delegateToCalls("yieldTo", false, "yieldTo", function (property) {
-        throw new Error(this.toString() + " cannot yield to '" + property +
-            "' since it was not yet invoked.");
-    });
-    delegateToCalls("yieldToOn", false, "yieldToOn", function (property) {
-        throw new Error(this.toString() + " cannot yield to '" + property +
-            "' since it was not yet invoked.");
-    });
-
-    spyApi.formatters = {
-        "c": function (spy) {
-            return sinon.timesInWords(spy.callCount);
-        },
-
-        "n": function (spy) {
-            return spy.toString();
-        },
-
-        "C": function (spy) {
-            var calls = [];
-
-            for (var i = 0, l = spy.callCount; i < l; ++i) {
-                var stringifiedCall = "    " + spy.getCall(i).toString();
-                if (/\n/.test(calls[i - 1])) {
-                    stringifiedCall = "\n" + stringifiedCall;
-                }
-                push.call(calls, stringifiedCall);
-            }
-
-            return calls.length > 0 ? "\n" + calls.join("\n") : "";
-        },
-
-        "t": function (spy) {
-            var objects = [];
-
-            for (var i = 0, l = spy.callCount; i < l; ++i) {
-                push.call(objects, sinon.format(spy.thisValues[i]));
-            }
-
-            return objects.join(", ");
-        },
-
-        "*": function (spy, args) {
-            var formatted = [];
-
-            for (var i = 0, l = args.length; i < l; ++i) {
-                push.call(formatted, sinon.format(args[i]));
-            }
-
-            return formatted.join(", ");
-        }
-    };
-
-    sinon.extend(spy, spyApi);
-
-    spy.spyCall = sinon.spyCall;
-
-    if (commonJSModule) {
-        module.exports = spy;
-    } else {
-        sinon.spy = spy;
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend ../sinon.js
- */
-/*jslint eqeqeq: false, onevar: false*/
-/*global module, require, sinon, process, setImmediate, setTimeout*/
-/**
- * Stub behavior
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @author Tim Fischbach (mail@timfischbach.de)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (sinon) {
-    var commonJSModule = typeof module !== 'undefined' && module.exports;
-
-    if (!sinon && commonJSModule) {
-        sinon = require("../sinon");
-    }
-
-    if (!sinon) {
-        return;
-    }
-
-    var slice = Array.prototype.slice;
-    var join = Array.prototype.join;
-    var proto;
-
-    var nextTick = (function () {
-        if (typeof process === "object" && typeof process.nextTick === "function") {
-            return process.nextTick;
-        } else if (typeof setImmediate === "function") {
-            return setImmediate;
-        } else {
-            return function (callback) {
-                setTimeout(callback, 0);
-            };
-        }
-    })();
-
-    function throwsException(error, message) {
-        if (typeof error == "string") {
-            this.exception = new Error(message || "");
-            this.exception.name = error;
-        } else if (!error) {
-            this.exception = new Error("Error");
-        } else {
-            this.exception = error;
-        }
-
-        return this;
-    }
-
-    function getCallback(behavior, args) {
-        var callArgAt = behavior.callArgAt;
-
-        if (callArgAt < 0) {
-            var callArgProp = behavior.callArgProp;
-
-            for (var i = 0, l = args.length; i < l; ++i) {
-                if (!callArgProp && typeof args[i] == "function") {
-                    return args[i];
-                }
-
-                if (callArgProp && args[i] &&
-                    typeof args[i][callArgProp] == "function") {
-                    return args[i][callArgProp];
-                }
-            }
-
-            return null;
-        }
-
-        return args[callArgAt];
-    }
-
-    function getCallbackError(behavior, func, args) {
-        if (behavior.callArgAt < 0) {
-            var msg;
-
-            if (behavior.callArgProp) {
-                msg = sinon.functionName(behavior.stub) +
-                    " expected to yield to '" + behavior.callArgProp +
-                    "', but no object with such a property was passed.";
-            } else {
-                msg = sinon.functionName(behavior.stub) +
-                    " expected to yield, but no callback was passed.";
-            }
-
-            if (args.length > 0) {
-                msg += " Received [" + join.call(args, ", ") + "]";
-            }
-
-            return msg;
-        }
-
-        return "argument at index " + behavior.callArgAt + " is not a function: " + func;
-    }
-
-    function callCallback(behavior, args) {
-        if (typeof behavior.callArgAt == "number") {
-            var func = getCallback(behavior, args);
-
-            if (typeof func != "function") {
-                throw new TypeError(getCallbackError(behavior, func, args));
-            }
-
-            if (behavior.callbackAsync) {
-                nextTick(function() {
-                    func.apply(behavior.callbackContext, behavior.callbackArguments);
-                });
-            } else {
-                func.apply(behavior.callbackContext, behavior.callbackArguments);
-            }
-        }
-    }
-
-    proto = {
-        create: function(stub) {
-            var behavior = sinon.extend({}, sinon.behavior);
-            delete behavior.create;
-            behavior.stub = stub;
-
-            return behavior;
-        },
-
-        isPresent: function() {
-            return (typeof this.callArgAt == 'number' ||
-                    this.exception ||
-                    typeof this.returnArgAt == 'number' ||
-                    this.returnThis ||
-                    this.returnValueDefined);
-        },
-
-        invoke: function(context, args) {
-            callCallback(this, args);
-
-            if (this.exception) {
-                throw this.exception;
-            } else if (typeof this.returnArgAt == 'number') {
-                return args[this.returnArgAt];
-            } else if (this.returnThis) {
-                return context;
-            }
-
-            return this.returnValue;
-        },
-
-        onCall: function(index) {
-            return this.stub.onCall(index);
-        },
-
-        onFirstCall: function() {
-            return this.stub.onFirstCall();
-        },
-
-        onSecondCall: function() {
-            return this.stub.onSecondCall();
-        },
-
-        onThirdCall: function() {
-            return this.stub.onThirdCall();
-        },
-
-        withArgs: function(/* arguments */) {
-            throw new Error('Defining a stub by invoking "stub.onCall(...).withArgs(...)" is not supported. ' +
-                            'Use "stub.withArgs(...).onCall(...)" to define sequential behavior for calls with certain arguments.');
-        },
-
-        callsArg: function callsArg(pos) {
-            if (typeof pos != "number") {
-                throw new TypeError("argument index is not number");
-            }
-
-            this.callArgAt = pos;
-            this.callbackArguments = [];
-            this.callbackContext = undefined;
-            this.callArgProp = undefined;
-            this.callbackAsync = false;
-
-            return this;
-        },
-
-        callsArgOn: function callsArgOn(pos, context) {
-            if (typeof pos != "number") {
-                throw new TypeError("argument index is not number");
-            }
-            if (typeof context != "object") {
-                throw new TypeError("argument context is not an object");
-            }
-
-            this.callArgAt = pos;
-            this.callbackArguments = [];
-            this.callbackContext = context;
-            this.callArgProp = undefined;
-            this.callbackAsync = false;
-
-            return this;
-        },
-
-        callsArgWith: function callsArgWith(pos) {
-            if (typeof pos != "number") {
-                throw new TypeError("argument index is not number");
-            }
-
-            this.callArgAt = pos;
-            this.callbackArguments = slice.call(arguments, 1);
-            this.callbackContext = undefined;
-            this.callArgProp = undefined;
-            this.callbackAsync = false;
-
-            return this;
-        },
-
-        callsArgOnWith: function callsArgWith(pos, context) {
-            if (typeof pos != "number") {
-                throw new TypeError("argument index is not number");
-            }
-            if (typeof context != "object") {
-                throw new TypeError("argument context is not an object");
-            }
-
-            this.callArgAt = pos;
-            this.callbackArguments = slice.call(arguments, 2);
-            this.callbackContext = context;
-            this.callArgProp = undefined;
-            this.callbackAsync = false;
-
-            return this;
-        },
-
-        yields: function () {
-            this.callArgAt = -1;
-            this.callbackArguments = slice.call(arguments, 0);
-            this.callbackContext = undefined;
-            this.callArgProp = undefined;
-            this.callbackAsync = false;
-
-            return this;
-        },
-
-        yieldsOn: function (context) {
-            if (typeof context != "object") {
-                throw new TypeError("argument context is not an object");
-            }
-
-            this.callArgAt = -1;
-            this.callbackArguments = slice.call(arguments, 1);
-            this.callbackContext = context;
-            this.callArgProp = undefined;
-            this.callbackAsync = false;
-
-            return this;
-        },
-
-        yieldsTo: function (prop) {
-            this.callArgAt = -1;
-            this.callbackArguments = slice.call(arguments, 1);
-            this.callbackContext = undefined;
-            this.callArgProp = prop;
-            this.callbackAsync = false;
-
-            return this;
-        },
-
-        yieldsToOn: function (prop, context) {
-            if (typeof context != "object") {
-                throw new TypeError("argument context is not an object");
-            }
-
-            this.callArgAt = -1;
-            this.callbackArguments = slice.call(arguments, 2);
-            this.callbackContext = context;
-            this.callArgProp = prop;
-            this.callbackAsync = false;
-
-            return this;
-        },
-
-
-        "throws": throwsException,
-        throwsException: throwsException,
-
-        returns: function returns(value) {
-            this.returnValue = value;
-            this.returnValueDefined = true;
-
-            return this;
-        },
-
-        returnsArg: function returnsArg(pos) {
-            if (typeof pos != "number") {
-                throw new TypeError("argument index is not number");
-            }
-
-            this.returnArgAt = pos;
-
-            return this;
-        },
-
-        returnsThis: function returnsThis() {
-            this.returnThis = true;
-
-            return this;
-        }
-    };
-
-    // create asynchronous versions of callsArg* and yields* methods
-    for (var method in proto) {
-        // need to avoid creating anotherasync versions of the newly added async methods
-        if (proto.hasOwnProperty(method) &&
-            method.match(/^(callsArg|yields)/) &&
-            !method.match(/Async/)) {
-            proto[method + 'Async'] = (function (syncFnName) {
-                return function () {
-                    var result = this[syncFnName].apply(this, arguments);
-                    this.callbackAsync = true;
-                    return result;
-                };
-            })(method);
-        }
-    }
-
-    if (commonJSModule) {
-        module.exports = proto;
-    } else {
-        sinon.behavior = proto;
-    }
-}(typeof sinon == "object" && sinon || null));
-/**
- * @depend ../sinon.js
- * @depend spy.js
- * @depend behavior.js
- */
-/*jslint eqeqeq: false, onevar: false*/
-/*global module, require, sinon*/
-/**
- * Stub functions
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (sinon) {
-    var commonJSModule = typeof module !== 'undefined' && module.exports;
-
-    if (!sinon && commonJSModule) {
-        sinon = require("../sinon");
-    }
-
-    if (!sinon) {
-        return;
-    }
-
-    function stub(object, property, func) {
-        if (!!func && typeof func != "function") {
-            throw new TypeError("Custom stub should be function");
-        }
-
-        var wrapper;
-
-        if (func) {
-            wrapper = sinon.spy && sinon.spy.create ? sinon.spy.create(func) : func;
-        } else {
-            wrapper = stub.create();
-        }
-
-        if (!object && typeof property === "undefined") {
-            return sinon.stub.create();
-        }
-
-        if (typeof property === "undefined" && typeof object == "object") {
-            for (var prop in object) {
-                if (typeof object[prop] === "function") {
-                    stub(object, prop);
-                }
-            }
-
-            return object;
-        }
-
-        return sinon.wrapMethod(object, property, wrapper);
-    }
-
-    function getDefaultBehavior(stub) {
-        return stub.defaultBehavior || getParentBehaviour(stub) || sinon.behavior.create(stub);
-    }
-
-    function getParentBehaviour(stub) {
-        return (stub.parent && getCurrentBehavior(stub.parent));
-    }
-
-    function getCurrentBehavior(stub) {
-        var behavior = stub.behaviors[stub.callCount - 1];
-        return behavior && behavior.isPresent() ? behavior : getDefaultBehavior(stub);
-    }
-
-    var uuid = 0;
-
-    sinon.extend(stub, (function () {
-        var proto = {
-            create: function create() {
-                var functionStub = function () {
-                    return getCurrentBehavior(functionStub).invoke(this, arguments);
-                };
-
-                functionStub.id = "stub#" + uuid++;
-                var orig = functionStub;
-                functionStub = sinon.spy.create(functionStub);
-                functionStub.func = orig;
-
-                sinon.extend(functionStub, stub);
-                functionStub._create = sinon.stub.create;
-                functionStub.displayName = "stub";
-                functionStub.toString = sinon.functionToString;
-
-                functionStub.defaultBehavior = null;
-                functionStub.behaviors = [];
-
-                return functionStub;
-            },
-
-            resetBehavior: function () {
-                var i;
-
-                this.defaultBehavior = null;
-                this.behaviors = [];
-
-                delete this.returnValue;
-                delete this.returnArgAt;
-                this.returnThis = false;
-
-                if (this.fakes) {
-                    for (i = 0; i < this.fakes.length; i++) {
-                        this.fakes[i].resetBehavior();
-                    }
-                }
-            },
-
-            onCall: function(index) {
-                if (!this.behaviors[index]) {
-                    this.behaviors[index] = sinon.behavior.create(this);
-                }
-
-                return this.behaviors[index];
-            },
-
-            onFirstCall: function() {
-                return this.onCall(0);
-            },
-
-            onSecondCall: function() {
-                return this.onCall(1);
-            },
-
-            onThirdCall: function() {
-                return this.onCall(2);
-            }
-        };
-
-        for (var method in sinon.behavior) {
-            if (sinon.behavior.hasOwnProperty(method) &&
-                !proto.hasOwnProperty(method) &&
-                method != 'create' &&
-                method != 'withArgs' &&
-                method != 'invoke') {
-                proto[method] = (function(behaviorMethod) {
-                    return function() {
-                        this.defaultBehavior = this.defaultBehavior || sinon.behavior.create(this);
-                        this.defaultBehavior[behaviorMethod].apply(this.defaultBehavior, arguments);
-                        return this;
-                    };
-                }(method));
-            }
-        }
-
-        return proto;
-    }()));
-
-    if (commonJSModule) {
-        module.exports = stub;
-    } else {
-        sinon.stub = stub;
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend ../sinon.js
- * @depend stub.js
- */
-/*jslint eqeqeq: false, onevar: false, nomen: false*/
-/*global module, require, sinon*/
-/**
- * Mock functions.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (sinon) {
-    var commonJSModule = typeof module !== 'undefined' && module.exports;
-    var push = [].push;
-    var match;
-
-    if (!sinon && commonJSModule) {
-        sinon = require("../sinon");
-    }
-
-    if (!sinon) {
-        return;
-    }
-
-    match = sinon.match;
-
-    if (!match && commonJSModule) {
-        match = require("./match");
-    }
-
-    function mock(object) {
-        if (!object) {
-            return sinon.expectation.create("Anonymous mock");
-        }
-
-        return mock.create(object);
-    }
-
-    sinon.mock = mock;
-
-    sinon.extend(mock, (function () {
-        function each(collection, callback) {
-            if (!collection) {
-                return;
-            }
-
-            for (var i = 0, l = collection.length; i < l; i += 1) {
-                callback(collection[i]);
-            }
-        }
-
-        return {
-            create: function create(object) {
-                if (!object) {
-                    throw new TypeError("object is null");
-                }
-
-                var mockObject = sinon.extend({}, mock);
-                mockObject.object = object;
-                delete mockObject.create;
-
-                return mockObject;
-            },
-
-            expects: function expects(method) {
-                if (!method) {
-                    throw new TypeError("method is falsy");
-                }
-
-                if (!this.expectations) {
-                    this.expectations = {};
-                    this.proxies = [];
-                }
-
-                if (!this.expectations[method]) {
-                    this.expectations[method] = [];
-                    var mockObject = this;
-
-                    sinon.wrapMethod(this.object, method, function () {
-                        return mockObject.invokeMethod(method, this, arguments);
-                    });
-
-                    push.call(this.proxies, method);
-                }
-
-                var expectation = sinon.expectation.create(method);
-                push.call(this.expectations[method], expectation);
-
-                return expectation;
-            },
-
-            restore: function restore() {
-                var object = this.object;
-
-                each(this.proxies, function (proxy) {
-                    if (typeof object[proxy].restore == "function") {
-                        object[proxy].restore();
-                    }
-                });
-            },
-
-            verify: function verify() {
-                var expectations = this.expectations || {};
-                var messages = [], met = [];
-
-                each(this.proxies, function (proxy) {
-                    each(expectations[proxy], function (expectation) {
-                        if (!expectation.met()) {
-                            push.call(messages, expectation.toString());
-                        } else {
-                            push.call(met, expectation.toString());
-                        }
-                    });
-                });
-
-                this.restore();
-
-                if (messages.length > 0) {
-                    sinon.expectation.fail(messages.concat(met).join("\n"));
-                } else {
-                    sinon.expectation.pass(messages.concat(met).join("\n"));
-                }
-
-                return true;
-            },
-
-            invokeMethod: function invokeMethod(method, thisValue, args) {
-                var expectations = this.expectations && this.expectations[method];
-                var length = expectations && expectations.length || 0, i;
-
-                for (i = 0; i < length; i += 1) {
-                    if (!expectations[i].met() &&
-                        expectations[i].allowsCall(thisValue, args)) {
-                        return expectations[i].apply(thisValue, args);
-                    }
-                }
-
-                var messages = [], available, exhausted = 0;
-
-                for (i = 0; i < length; i += 1) {
-                    if (expectations[i].allowsCall(thisValue, args)) {
-                        available = available || expectations[i];
-                    } else {
-                        exhausted += 1;
-                    }
-                    push.call(messages, "    " + expectations[i].toString());
-                }
-
-                if (exhausted === 0) {
-                    return available.apply(thisValue, args);
-                }
-
-                messages.unshift("Unexpected call: " + sinon.spyCall.toString.call({
-                    proxy: method,
-                    args: args
-                }));
-
-                sinon.expectation.fail(messages.join("\n"));
-            }
-        };
-    }()));
-
-    var times = sinon.timesInWords;
-
-    sinon.expectation = (function () {
-        var slice = Array.prototype.slice;
-        var _invoke = sinon.spy.invoke;
-
-        function callCountInWords(callCount) {
-            if (callCount == 0) {
-                return "never called";
-            } else {
-                return "called " + times(callCount);
-            }
-        }
-
-        function expectedCallCountInWords(expectation) {
-            var min = expectation.minCalls;
-            var max = expectation.maxCalls;
-
-            if (typeof min == "number" && typeof max == "number") {
-                var str = times(min);
-
-                if (min != max) {
-                    str = "at least " + str + " and at most " + times(max);
-                }
-
-                return str;
-            }
-
-            if (typeof min == "number") {
-                return "at least " + times(min);
-            }
-
-            return "at most " + times(max);
-        }
-
-        function receivedMinCalls(expectation) {
-            var hasMinLimit = typeof expectation.minCalls == "number";
-            return !hasMinLimit || expectation.callCount >= expectation.minCalls;
-        }
-
-        function receivedMaxCalls(expectation) {
-            if (typeof expectation.maxCalls != "number") {
-                return false;
-            }
-
-            return expectation.callCount == expectation.maxCalls;
-        }
-
-        function verifyMatcher(possibleMatcher, arg){
-            if (match && match.isMatcher(possibleMatcher)) {
-                return possibleMatcher.test(arg);
-            } else {
-                return true;
-            }
-        }
-
-        return {
-            minCalls: 1,
-            maxCalls: 1,
-
-            create: function create(methodName) {
-                var expectation = sinon.extend(sinon.stub.create(), sinon.expectation);
-                delete expectation.create;
-                expectation.method = methodName;
-
-                return expectation;
-            },
-
-            invoke: function invoke(func, thisValue, args) {
-                this.verifyCallAllowed(thisValue, args);
-
-                return _invoke.apply(this, arguments);
-            },
-
-            atLeast: function atLeast(num) {
-                if (typeof num != "number") {
-                    throw new TypeError("'" + num + "' is not number");
-                }
-
-                if (!this.limitsSet) {
-                    this.maxCalls = null;
-                    this.limitsSet = true;
-                }
-
-                this.minCalls = num;
-
-                return this;
-            },
-
-            atMost: function atMost(num) {
-                if (typeof num != "number") {
-                    throw new TypeError("'" + num + "' is not number");
-                }
-
-                if (!this.limitsSet) {
-                    this.minCalls = null;
-                    this.limitsSet = true;
-                }
-
-                this.maxCalls = num;
-
-                return this;
-            },
-
-            never: function never() {
-                return this.exactly(0);
-            },
-
-            once: function once() {
-                return this.exactly(1);
-            },
-
-            twice: function twice() {
-                return this.exactly(2);
-            },
-
-            thrice: function thrice() {
-                return this.exactly(3);
-            },
-
-            exactly: function exactly(num) {
-                if (typeof num != "number") {
-                    throw new TypeError("'" + num + "' is not a number");
-                }
-
-                this.atLeast(num);
-                return this.atMost(num);
-            },
-
-            met: function met() {
-                return !this.failed && receivedMinCalls(this);
-            },
-
-            verifyCallAllowed: function verifyCallAllowed(thisValue, args) {
-                if (receivedMaxCalls(this)) {
-                    this.failed = true;
-                    sinon.expectation.fail(this.method + " already called " + times(this.maxCalls));
-                }
-
-                if ("expectedThis" in this && this.expectedThis !== thisValue) {
-                    sinon.expectation.fail(this.method + " called with " + thisValue + " as thisValue, expected " +
-                        this.expectedThis);
-                }
-
-                if (!("expectedArguments" in this)) {
-                    return;
-                }
-
-                if (!args) {
-                    sinon.expectation.fail(this.method + " received no arguments, expected " +
-                        sinon.format(this.expectedArguments));
-                }
-
-                if (args.length < this.expectedArguments.length) {
-                    sinon.expectation.fail(this.method + " received too few arguments (" + sinon.format(args) +
-                        "), expected " + sinon.format(this.expectedArguments));
-                }
-
-                if (this.expectsExactArgCount &&
-                    args.length != this.expectedArguments.length) {
-                    sinon.expectation.fail(this.method + " received too many arguments (" + sinon.format(args) +
-                        "), expected " + sinon.format(this.expectedArguments));
-                }
-
-                for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {
-
-                    if (!verifyMatcher(this.expectedArguments[i],args[i])) {
-                        sinon.expectation.fail(this.method + " received wrong arguments " + sinon.format(args) +
-                            ", didn't match " + this.expectedArguments.toString());
-                    }
-
-                    if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {
-                        sinon.expectation.fail(this.method + " received wrong arguments " + sinon.format(args) +
-                            ", expected " + sinon.format(this.expectedArguments));
-                    }
-                }
-            },
-
-            allowsCall: function allowsCall(thisValue, args) {
-                if (this.met() && receivedMaxCalls(this)) {
-                    return false;
-                }
-
-                if ("expectedThis" in this && this.expectedThis !== thisValue) {
-                    return false;
-                }
-
-                if (!("expectedArguments" in this)) {
-                    return true;
-                }
-
-                args = args || [];
-
-                if (args.length < this.expectedArguments.length) {
-                    return false;
-                }
-
-                if (this.expectsExactArgCount &&
-                    args.length != this.expectedArguments.length) {
-                    return false;
-                }
-
-                for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {
-                    if (!verifyMatcher(this.expectedArguments[i],args[i])) {
-                        return false;
-                    }
-
-                    if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {
-                        return false;
-                    }
-                }
-
-                return true;
-            },
-
-            withArgs: function withArgs() {
-                this.expectedArguments = slice.call(arguments);
-                return this;
-            },
-
-            withExactArgs: function withExactArgs() {
-                this.withArgs.apply(this, arguments);
-                this.expectsExactArgCount = true;
-                return this;
-            },
-
-            on: function on(thisValue) {
-                this.expectedThis = thisValue;
-                return this;
-            },
-
-            toString: function () {
-                var args = (this.expectedArguments || []).slice();
-
-                if (!this.expectsExactArgCount) {
-                    push.call(args, "[...]");
-                }
-
-                var callStr = sinon.spyCall.toString.call({
-                    proxy: this.method || "anonymous mock expectation",
-                    args: args
-                });
-
-                var message = callStr.replace(", [...", "[, ...") + " " +
-                    expectedCallCountInWords(this);
-
-                if (this.met()) {
-                    return "Expectation met: " + message;
-                }
-
-                return "Expected " + message + " (" +
-                    callCountInWords(this.callCount) + ")";
-            },
-
-            verify: function verify() {
-                if (!this.met()) {
-                    sinon.expectation.fail(this.toString());
-                } else {
-                    sinon.expectation.pass(this.toString());
-                }
-
-                return true;
-            },
-
-            pass: function(message) {
-              sinon.assert.pass(message);
-            },
-            fail: function (message) {
-                var exception = new Error(message);
-                exception.name = "ExpectationError";
-
-                throw exception;
-            }
-        };
-    }());
-
-    if (commonJSModule) {
-        module.exports = mock;
-    } else {
-        sinon.mock = mock;
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend ../sinon.js
- * @depend stub.js
- * @depend mock.js
- */
-/*jslint eqeqeq: false, onevar: false, forin: true*/
-/*global module, require, sinon*/
-/**
- * Collections of stubs, spies and mocks.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (sinon) {
-    var commonJSModule = typeof module !== 'undefined' && module.exports;
-    var push = [].push;
-    var hasOwnProperty = Object.prototype.hasOwnProperty;
-
-    if (!sinon && commonJSModule) {
-        sinon = require("../sinon");
-    }
-
-    if (!sinon) {
-        return;
-    }
-
-    function getFakes(fakeCollection) {
-        if (!fakeCollection.fakes) {
-            fakeCollection.fakes = [];
-        }
-
-        return fakeCollection.fakes;
-    }
-
-    function each(fakeCollection, method) {
-        var fakes = getFakes(fakeCollection);
-
-        for (var i = 0, l = fakes.length; i < l; i += 1) {
-            if (typeof fakes[i][method] == "function") {
-                fakes[i][method]();
-            }
-        }
-    }
-
-    function compact(fakeCollection) {
-        var fakes = getFakes(fakeCollection);
-        var i = 0;
-        while (i < fakes.length) {
-          fakes.splice(i, 1);
-        }
-    }
-
-    var collection = {
-        verify: function resolve() {
-            each(this, "verify");
-        },
-
-        restore: function restore() {
-            each(this, "restore");
-            compact(this);
-        },
-
-        verifyAndRestore: function verifyAndRestore() {
-            var exception;
-
-            try {
-                this.verify();
-            } catch (e) {
-                exception = e;
-            }
-
-            this.restore();
-
-            if (exception) {
-                throw exception;
-            }
-        },
-
-        add: function add(fake) {
-            push.call(getFakes(this), fake);
-            return fake;
-        },
-
-        spy: function spy() {
-            return this.add(sinon.spy.apply(sinon, arguments));
-        },
-
-        stub: function stub(object, property, value) {
-            if (property) {
-                var original = object[property];
-
-                if (typeof original != "function") {
-                    if (!hasOwnProperty.call(object, property)) {
-                        throw new TypeError("Cannot stub non-existent own property " + property);
-                    }
-
-                    object[property] = value;
-
-                    return this.add({
-                        restore: function () {
-                            object[property] = original;
-                        }
-                    });
-                }
-            }
-            if (!property && !!object && typeof object == "object") {
-                var stubbedObj = sinon.stub.apply(sinon, arguments);
-
-                for (var prop in stubbedObj) {
-                    if (typeof stubbedObj[prop] === "function") {
-                        this.add(stubbedObj[prop]);
-                    }
-                }
-
-                return stubbedObj;
-            }
-
-            return this.add(sinon.stub.apply(sinon, arguments));
-        },
-
-        mock: function mock() {
-            return this.add(sinon.mock.apply(sinon, arguments));
-        },
-
-        inject: function inject(obj) {
-            var col = this;
-
-            obj.spy = function () {
-                return col.spy.apply(col, arguments);
-            };
-
-            obj.stub = function () {
-                return col.stub.apply(col, arguments);
-            };
-
-            obj.mock = function () {
-                return col.mock.apply(col, arguments);
-            };
-
-            return obj;
-        }
-    };
-
-    if (commonJSModule) {
-        module.exports = collection;
-    } else {
-        sinon.collection = collection;
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/*jslint eqeqeq: false, plusplus: false, evil: true, onevar: false, browser: true, forin: false*/
-/*global module, require, window*/
-/**
- * Fake timer API
- * setTimeout
- * setInterval
- * clearTimeout
- * clearInterval
- * tick
- * reset
- * Date
- *
- * Inspired by jsUnitMockTimeOut from JsUnit
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-if (typeof sinon == "undefined") {
-    var sinon = {};
-}
-
-(function (global) {
-    var id = 1;
-
-    function addTimer(args, recurring) {
-        if (args.length === 0) {
-            throw new Error("Function requires at least 1 parameter");
-        }
-
-        if (typeof args[0] === "undefined") {
-            throw new Error("Callback must be provided to timer calls");
-        }
-
-        var toId = id++;
-        var delay = args[1] || 0;
-
-        if (!this.timeouts) {
-            this.timeouts = {};
-        }
-
-        this.timeouts[toId] = {
-            id: toId,
-            func: args[0],
-            callAt: this.now + delay,
-            invokeArgs: Array.prototype.slice.call(args, 2)
-        };
-
-        if (recurring === true) {
-            this.timeouts[toId].interval = delay;
-        }
-
-        return toId;
-    }
-
-    function parseTime(str) {
-        if (!str) {
-            return 0;
-        }
-
-        var strings = str.split(":");
-        var l = strings.length, i = l;
-        var ms = 0, parsed;
-
-        if (l > 3 || !/^(\d\d:){0,2}\d\d?$/.test(str)) {
-            throw new Error("tick only understands numbers and 'h:m:s'");
-        }
-
-        while (i--) {
-            parsed = parseInt(strings[i], 10);
-
-            if (parsed >= 60) {
-                throw new Error("Invalid time " + str);
-            }
-
-            ms += parsed * Math.pow(60, (l - i - 1));
-        }
-
-        return ms * 1000;
-    }
-
-    function createObject(object) {
-        var newObject;
-
-        if (Object.create) {
-            newObject = Object.create(object);
-        } else {
-            var F = function () {};
-            F.prototype = object;
-            newObject = new F();
-        }
-
-        newObject.Date.clock = newObject;
-        return newObject;
-    }
-
-    sinon.clock = {
-        now: 0,
-
-        create: function create(now) {
-            var clock = createObject(this);
-
-            if (typeof now == "number") {
-                clock.now = now;
-            }
-
-            if (!!now && typeof now == "object") {
-                throw new TypeError("now should be milliseconds since UNIX epoch");
-            }
-
-            return clock;
-        },
-
-        setTimeout: function setTimeout(callback, timeout) {
-            return addTimer.call(this, arguments, false);
-        },
-
-        clearTimeout: function clearTimeout(timerId) {
-            if (!this.timeouts) {
-                this.timeouts = [];
-            }
-
-            if (timerId in this.timeouts) {
-                delete this.timeouts[timerId];
-            }
-        },
-
-        setInterval: function setInterval(callback, timeout) {
-            return addTimer.call(this, arguments, true);
-        },
-
-        clearInterval: function clearInterval(timerId) {
-            this.clearTimeout(timerId);
-        },
-
-        setImmediate: function setImmediate(callback) {
-            var passThruArgs = Array.prototype.slice.call(arguments, 1);
-
-            return addTimer.call(this, [callback, 0].concat(passThruArgs), false);
-        },
-
-        clearImmediate: function clearImmediate(timerId) {
-            this.clearTimeout(timerId);
-        },
-
-        tick: function tick(ms) {
-            ms = typeof ms == "number" ? ms : parseTime(ms);
-            var tickFrom = this.now, tickTo = this.now + ms, previous = this.now;
-            var timer = this.firstTimerInRange(tickFrom, tickTo);
-
-            var firstException;
-            while (timer && tickFrom <= tickTo) {
-                if (this.timeouts[timer.id]) {
-                    tickFrom = this.now = timer.callAt;
-                    try {
-                      this.callTimer(timer);
-                    } catch (e) {
-                      firstException = firstException || e;
-                    }
-                }
-
-                timer = this.firstTimerInRange(previous, tickTo);
-                previous = tickFrom;
-            }
-
-            this.now = tickTo;
-
-            if (firstException) {
-              throw firstException;
-            }
-
-            return this.now;
-        },
-
-        firstTimerInRange: function (from, to) {
-            var timer, smallest = null, originalTimer;
-
-            for (var id in this.timeouts) {
-                if (this.timeouts.hasOwnProperty(id)) {
-                    if (this.timeouts[id].callAt < from || this.timeouts[id].callAt > to) {
-                        continue;
-                    }
-
-                    if (smallest === null || this.timeouts[id].callAt < smallest) {
-                        originalTimer = this.timeouts[id];
-                        smallest = this.timeouts[id].callAt;
-
-                        timer = {
-                            func: this.timeouts[id].func,
-                            callAt: this.timeouts[id].callAt,
-                            interval: this.timeouts[id].interval,
-                            id: this.timeouts[id].id,
-                            invokeArgs: this.timeouts[id].invokeArgs
-                        };
-                    }
-                }
-            }
-
-            return timer || null;
-        },
-
-        callTimer: function (timer) {
-            if (typeof timer.interval == "number") {
-                this.timeouts[timer.id].callAt += timer.interval;
-            } else {
-                delete this.timeouts[timer.id];
-            }
-
-            try {
-                if (typeof timer.func == "function") {
-                    timer.func.apply(null, timer.invokeArgs);
-                } else {
-                    eval(timer.func);
-                }
-            } catch (e) {
-              var exception = e;
-            }
-
-            if (!this.timeouts[timer.id]) {
-                if (exception) {
-                  throw exception;
-                }
-                return;
-            }
-
-            if (exception) {
-              throw exception;
-            }
-        },
-
-        reset: function reset() {
-            this.timeouts = {};
-        },
-
-        Date: (function () {
-            var NativeDate = Date;
-
-            function ClockDate(year, month, date, hour, minute, second, ms) {
-                // Defensive and verbose to avoid potential harm in passing
-                // explicit undefined when user does not pass argument
-                switch (arguments.length) {
-                case 0:
-                    return new NativeDate(ClockDate.clock.now);
-                case 1:
-                    return new NativeDate(year);
-                case 2:
-                    return new NativeDate(year, month);
-                case 3:
-                    return new NativeDate(year, month, date);
-                case 4:
-                    return new NativeDate(year, month, date, hour);
-                case 5:
-                    return new NativeDate(year, month, date, hour, minute);
-                case 6:
-                    return new NativeDate(year, month, date, hour, minute, second);
-                default:
-                    return new NativeDate(year, month, date, hour, minute, second, ms);
-                }
-            }
-
-            return mirrorDateProperties(ClockDate, NativeDate);
-        }())
-    };
-
-    function mirrorDateProperties(target, source) {
-        if (source.now) {
-            target.now = function now() {
-                return target.clock.now;
-            };
-        } else {
-            delete target.now;
-        }
-
-        if (source.toSource) {
-            target.toSource = function toSource() {
-                return source.toSource();
-            };
-        } else {
-            delete target.toSource;
-        }
-
-        target.toString = function toString() {
-            return source.toString();
-        };
-
-        target.prototype = source.prototype;
-        target.parse = source.parse;
-        target.UTC = source.UTC;
-        target.prototype.toUTCString = source.prototype.toUTCString;
-
-        for (var prop in source) {
-            if (source.hasOwnProperty(prop)) {
-                target[prop] = source[prop];
-            }
-        }
-
-        return target;
-    }
-
-    var methods = ["Date", "setTimeout", "setInterval",
-                   "clearTimeout", "clearInterval"];
-
-    if (typeof global.setImmediate !== "undefined") {
-        methods.push("setImmediate");
-    }
-
-    if (typeof global.clearImmediate !== "undefined") {
-        methods.push("clearImmediate");
-    }
-
-    function restore() {
-        var method;
-
-        for (var i = 0, l = this.methods.length; i < l; i++) {
-            method = this.methods[i];
-
-            if (global[method].hadOwnProperty) {
-                global[method] = this["_" + method];
-            } else {
-                try {
-                    delete global[method];
-                } catch (e) {}
-            }
-        }
-
-        // Prevent multiple executions which will completely remove these props
-        this.methods = [];
-    }
-
-    function stubGlobal(method, clock) {
-        clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(global, method);
-        clock["_" + method] = global[method];
-
-        if (method == "Date") {
-            var date = mirrorDateProperties(clock[method], global[method]);
-            global[method] = date;
-        } else {
-            global[method] = function () {
-                return clock[method].apply(clock, arguments);
-            };
-
-            for (var prop in clock[method]) {
-                if (clock[method].hasOwnProperty(prop)) {
-                    global[method][prop] = clock[method][prop];
-                }
-            }
-        }
-
-        global[method].clock = clock;
-    }
-
-    sinon.useFakeTimers = function useFakeTimers(now) {
-        var clock = sinon.clock.create(now);
-        clock.restore = restore;
-        clock.methods = Array.prototype.slice.call(arguments,
-                                                   typeof now == "number" ? 1 : 0);
-
-        if (clock.methods.length === 0) {
-            clock.methods = methods;
-        }
-
-        for (var i = 0, l = clock.methods.length; i < l; i++) {
-            stubGlobal(clock.methods[i], clock);
-        }
-
-        return clock;
-    };
-}(typeof global != "undefined" && typeof global !== "function" ? global : this));
-
-sinon.timers = {
-    setTimeout: setTimeout,
-    clearTimeout: clearTimeout,
-    setImmediate: (typeof setImmediate !== "undefined" ? setImmediate : undefined),
-    clearImmediate: (typeof clearImmediate !== "undefined" ? clearImmediate: undefined),
-    setInterval: setInterval,
-    clearInterval: clearInterval,
-    Date: Date
-};
-
-if (typeof module !== 'undefined' && module.exports) {
-    module.exports = sinon;
-}
-
-/*jslint eqeqeq: false, onevar: false*/
-/*global sinon, module, require, ActiveXObject, XMLHttpRequest, DOMParser*/
-/**
- * Minimal Event interface implementation
- *
- * Original implementation by Sven Fuchs: https://gist.github.com/995028
- * Modifications and tests by Christian Johansen.
- *
- * @author Sven Fuchs (svenfuchs@artweb-design.de)
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2011 Sven Fuchs, Christian Johansen
- */
-
-if (typeof sinon == "undefined") {
-    this.sinon = {};
-}
-
-(function () {
-    var push = [].push;
-
-    sinon.Event = function Event(type, bubbles, cancelable, target) {
-        this.initEvent(type, bubbles, cancelable, target);
-    };
-
-    sinon.Event.prototype = {
-        initEvent: function(type, bubbles, cancelable, target) {
-            this.type = type;
-            this.bubbles = bubbles;
-            this.cancelable = cancelable;
-            this.target = target;
-        },
-
-        stopPropagation: function () {},
-
-        preventDefault: function () {
-            this.defaultPrevented = true;
-        }
-    };
-
-    sinon.EventTarget = {
-        addEventListener: function addEventListener(event, listener) {
-            this.eventListeners = this.eventListeners || {};
-            this.eventListeners[event] = this.eventListeners[event] || [];
-            push.call(this.eventListeners[event], listener);
-        },
-
-        removeEventListener: function removeEventListener(event, listener) {
-            var listeners = this.eventListeners && this.eventListeners[event] || [];
-
-            for (var i = 0, l = listeners.length; i < l; ++i) {
-                if (listeners[i] == listener) {
-                    return listeners.splice(i, 1);
-                }
-            }
-        },
-
-        dispatchEvent: function dispatchEvent(event) {
-            var type = event.type;
-            var listeners = this.eventListeners && this.eventListeners[type] || [];
-
-            for (var i = 0; i < listeners.length; i++) {
-                if (typeof listeners[i] == "function") {
-                    listeners[i].call(this, event);
-                } else {
-                    listeners[i].handleEvent(event);
-                }
-            }
-
-            return !!event.defaultPrevented;
-        }
-    };
-}());
-
-/**
- * @depend ../../sinon.js
- * @depend event.js
- */
-/*jslint eqeqeq: false, onevar: false*/
-/*global sinon, module, require, ActiveXObject, XMLHttpRequest, DOMParser*/
-/**
- * Fake XMLHttpRequest object
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-// wrapper for global
-(function(global) {
-
-    if (typeof sinon === "undefined") {
-        global.sinon = {};
-    }
-    sinon.xhr = { XMLHttpRequest: global.XMLHttpRequest };
-
-    var xhr = sinon.xhr;
-    xhr.GlobalXMLHttpRequest = global.XMLHttpRequest;
-    xhr.GlobalActiveXObject = global.ActiveXObject;
-    xhr.supportsActiveX = typeof xhr.GlobalActiveXObject != "undefined";
-    xhr.supportsXHR = typeof xhr.GlobalXMLHttpRequest != "undefined";
-    xhr.workingXHR = xhr.supportsXHR ? xhr.GlobalXMLHttpRequest : xhr.supportsActiveX
-                                     ? function() { return new xhr.GlobalActiveXObject("MSXML2.XMLHTTP.3.0") } : false;
-    xhr.supportsCORS = 'withCredentials' in (new sinon.xhr.GlobalXMLHttpRequest());
-
-    /*jsl:ignore*/
-    var unsafeHeaders = {
-        "Accept-Charset": true,
-        "Accept-Encoding": true,
-        "Connection": true,
-        "Content-Length": true,
-        "Cookie": true,
-        "Cookie2": true,
-        "Content-Transfer-Encoding": true,
-        "Date": true,
-        "Expect": true,
-        "Host": true,
-        "Keep-Alive": true,
-        "Referer": true,
-        "TE": true,
-        "Trailer": true,
-        "Transfer-Encoding": true,
-        "Upgrade": true,
-        "User-Agent": true,
-        "Via": true
-    };
-    /*jsl:end*/
-
-    function FakeXMLHttpRequest() {
-        this.readyState = FakeXMLHttpRequest.UNSENT;
-        this.requestHeaders = {};
-        this.requestBody = null;
-        this.status = 0;
-        this.statusText = "";
-        this.upload = new UploadProgress();
-        if (sinon.xhr.supportsCORS) {
-            this.withCredentials = false;
-        }
-
-
-        var xhr = this;
-        var events = ["loadstart", "load", "abort", "loadend"];
-
-        function addEventListener(eventName) {
-            xhr.addEventListener(eventName, function (event) {
-                var listener = xhr["on" + eventName];
-
-                if (listener && typeof listener == "function") {
-                    listener(event);
-                }
-            });
-        }
-
-        for (var i = events.length - 1; i >= 0; i--) {
-            addEventListener(events[i]);
-        }
-
-        if (typeof FakeXMLHttpRequest.onCreate == "function") {
-            FakeXMLHttpRequest.onCreate(this);
-        }
-    }
-
-    // An upload object is created for each
-    // FakeXMLHttpRequest and allows upload
-    // events to be simulated using uploadProgress
-    // and uploadError.
-    function UploadProgress() {
-        this.eventListeners = {
-            "progress": [],
-            "load": [],
-            "abort": [],
-            "error": []
-        }
-    }
-
-    UploadProgress.prototype.addEventListener = function(event, listener) {
-        this.eventListeners[event].push(listener);
-    };
-
-    UploadProgress.prototype.removeEventListener = function(event, listener) {
-        var listeners = this.eventListeners[event] || [];
-
-        for (var i = 0, l = listeners.length; i < l; ++i) {
-            if (listeners[i] == listener) {
-                return listeners.splice(i, 1);
-            }
-        }
-    };
-
-    UploadProgress.prototype.dispatchEvent = function(event) {
-        var listeners = this.eventListeners[event.type] || [];
-
-        for (var i = 0, listener; (listener = listeners[i]) != null; i++) {
-            listener(event);
-        }
-    };
-
-    function verifyState(xhr) {
-        if (xhr.readyState !== FakeXMLHttpRequest.OPENED) {
-            throw new Error("INVALID_STATE_ERR");
-        }
-
-        if (xhr.sendFlag) {
-            throw new Error("INVALID_STATE_ERR");
-        }
-    }
-
-    // filtering to enable a white-list version of Sinon FakeXhr,
-    // where whitelisted requests are passed through to real XHR
-    function each(collection, callback) {
-        if (!collection) return;
-        for (var i = 0, l = collection.length; i < l; i += 1) {
-            callback(collection[i]);
-        }
-    }
-    function some(collection, callback) {
-        for (var index = 0; index < collection.length; index++) {
-            if(callback(collection[index]) === true) return true;
-        }
-        return false;
-    }
-    // largest arity in XHR is 5 - XHR#open
-    var apply = function(obj,method,args) {
-        switch(args.length) {
-        case 0: return obj[method]();
-        case 1: return obj[method](args[0]);
-        case 2: return obj[method](args[0],args[1]);
-        case 3: return obj[method](args[0],args[1],args[2]);
-        case 4: return obj[method](args[0],args[1],args[2],args[3]);
-        case 5: return obj[method](args[0],args[1],args[2],args[3],args[4]);
-        }
-    };
-
-    FakeXMLHttpRequest.filters = [];
-    FakeXMLHttpRequest.addFilter = function(fn) {
-        this.filters.push(fn)
-    };
-    var IE6Re = /MSIE 6/;
-    FakeXMLHttpRequest.defake = function(fakeXhr,xhrArgs) {
-        var xhr = new sinon.xhr.workingXHR();
-        each(["open","setRequestHeader","send","abort","getResponseHeader",
-              "getAllResponseHeaders","addEventListener","overrideMimeType","removeEventListener"],
-             function(method) {
-                 fakeXhr[method] = function() {
-                   return apply(xhr,method,arguments);
-                 };
-             });
-
-        var copyAttrs = function(args) {
-            each(args, function(attr) {
-              try {
-                fakeXhr[attr] = xhr[attr]
-              } catch(e) {
-                if(!IE6Re.test(navigator.userAgent)) throw e;
-              }
-            });
-        };
-
-        var stateChange = function() {
-            fakeXhr.readyState = xhr.readyState;
-            if(xhr.readyState >= FakeXMLHttpRequest.HEADERS_RECEIVED) {
-                copyAttrs(["status","statusText"]);
-            }
-            if(xhr.readyState >= FakeXMLHttpRequest.LOADING) {
-                copyAttrs(["responseText"]);
-            }
-            if(xhr.readyState === FakeXMLHttpRequest.DONE) {
-                copyAttrs(["responseXML"]);
-            }
-            if(fakeXhr.onreadystatechange) fakeXhr.onreadystatechange.call(fakeXhr, { target: fakeXhr });
-        };
-        if(xhr.addEventListener) {
-          for(var event in fakeXhr.eventListeners) {
-              if(fakeXhr.eventListeners.hasOwnProperty(event)) {
-                  each(fakeXhr.eventListeners[event],function(handler) {
-                      xhr.addEventListener(event, handler);
-                  });
-              }
-          }
-          xhr.addEventListener("readystatechange",stateChange);
-        } else {
-          xhr.onreadystatechange = stateChange;
-        }
-        apply(xhr,"open",xhrArgs);
-    };
-    FakeXMLHttpRequest.useFilters = false;
-
-    function verifyRequestSent(xhr) {
-        if (xhr.readyState == FakeXMLHttpRequest.DONE) {
-            throw new Error("Request done");
-        }
-    }
-
-    function verifyHeadersReceived(xhr) {
-        if (xhr.async && xhr.readyState != FakeXMLHttpRequest.HEADERS_RECEIVED) {
-            throw new Error("No headers received");
-        }
-    }
-
-    function verifyResponseBodyType(body) {
-        if (typeof body != "string") {
-            var error = new Error("Attempted to respond to fake XMLHttpRequest with " +
-                                 body + ", which is not a string.");
-            error.name = "InvalidBodyException";
-            throw error;
-        }
-    }
-
-    sinon.extend(FakeXMLHttpRequest.prototype, sinon.EventTarget, {
-        async: true,
-
-        open: function open(method, url, async, username, password) {
-            this.method = method;
-            this.url = url;
-            this.async = typeof async == "boolean" ? async : true;
-            this.username = username;
-            this.password = password;
-            this.responseText = null;
-            this.responseXML = null;
-            this.requestHeaders = {};
-            this.sendFlag = false;
-            if(sinon.FakeXMLHttpRequest.useFilters === true) {
-                var xhrArgs = arguments;
-                var defake = some(FakeXMLHttpRequest.filters,function(filter) {
-                    return filter.apply(this,xhrArgs)
-                });
-                if (defake) {
-                  return sinon.FakeXMLHttpRequest.defake(this,arguments);
-                }
-            }
-            this.readyStateChange(FakeXMLHttpRequest.OPENED);
-        },
-
-        readyStateChange: function readyStateChange(state) {
-            this.readyState = state;
-
-            if (typeof this.onreadystatechange == "function") {
-                try {
-                    this.onreadystatechange();
-                } catch (e) {
-                    sinon.logError("Fake XHR onreadystatechange handler", e);
-                }
-            }
-
-            this.dispatchEvent(new sinon.Event("readystatechange"));
-
-            switch (this.readyState) {
-                case FakeXMLHttpRequest.DONE:
-                    this.dispatchEvent(new sinon.Event("load", false, false, this));
-                    this.dispatchEvent(new sinon.Event("loadend", false, false, this));
-                    this.upload.dispatchEvent(new sinon.Event("load", false, false, this));
-                    this.upload.dispatchEvent(new ProgressEvent("progress", {loaded: 100, total: 100}));
-                    break;
-            }
-        },
-
-        setRequestHeader: function setRequestHeader(header, value) {
-            verifyState(this);
-
-            if (unsafeHeaders[header] || /^(Sec-|Proxy-)/.test(header)) {
-                throw new Error("Refused to set unsafe header \"" + header + "\"");
-            }
-
-            if (this.requestHeaders[header]) {
-                this.requestHeaders[header] += "," + value;
-            } else {
-                this.requestHeaders[header] = value;
-            }
-        },
-
-        // Helps testing
-        setResponseHeaders: function setResponseHeaders(headers) {
-            this.responseHeaders = {};
-
-            for (var header in headers) {
-                if (headers.hasOwnProperty(header)) {
-                    this.responseHeaders[header] = headers[header];
-                }
-            }
-
-            if (this.async) {
-                this.readyStateChange(FakeXMLHttpRequest.HEADERS_RECEIVED);
-            } else {
-                this.readyState = FakeXMLHttpRequest.HEADERS_RECEIVED;
-            }
-        },
-
-        // Currently treats ALL data as a DOMString (i.e. no Document)
-        send: function send(data) {
-            verifyState(this);
-
-            if (!/^(get|head)$/i.test(this.method)) {
-                if (this.requestHeaders["Content-Type"]) {
-                    var value = this.requestHeaders["Content-Type"].split(";");
-                    this.requestHeaders["Content-Type"] = value[0] + ";charset=utf-8";
-                } else {
-                    this.requestHeaders["Content-Type"] = "text/plain;charset=utf-8";
-                }
-
-                this.requestBody = data;
-            }
-
-            this.errorFlag = false;
-            this.sendFlag = this.async;
-            this.readyStateChange(FakeXMLHttpRequest.OPENED);
-
-            if (typeof this.onSend == "function") {
-                this.onSend(this);
-            }
-
-            this.dispatchEvent(new sinon.Event("loadstart", false, false, this));
-        },
-
-        abort: function abort() {
-            this.aborted = true;
-            this.responseText = null;
-            this.errorFlag = true;
-            this.requestHeaders = {};
-
-            if (this.readyState > sinon.FakeXMLHttpRequest.UNSENT && this.sendFlag) {
-                this.readyStateChange(sinon.FakeXMLHttpRequest.DONE);
-                this.sendFlag = false;
-            }
-
-            this.readyState = sinon.FakeXMLHttpRequest.UNSENT;
-
-            this.dispatchEvent(new sinon.Event("abort", false, false, this));
-
-            this.upload.dispatchEvent(new sinon.Event("abort", false, false, this));
-
-            if (typeof this.onerror === "function") {
-                this.onerror();
-            }
-        },
-
-        getResponseHeader: function getResponseHeader(header) {
-            if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {
-                return null;
-            }
-
-            if (/^Set-Cookie2?$/i.test(header)) {
-                return null;
-            }
-
-            header = header.toLowerCase();
-
-            for (var h in this.responseHeaders) {
-                if (h.toLowerCase() == header) {
-                    return this.responseHeaders[h];
-                }
-            }
-
-            return null;
-        },
-
-        getAllResponseHeaders: function getAllResponseHeaders() {
-            if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {
-                return "";
-            }
-
-            var headers = "";
-
-            for (var header in this.responseHeaders) {
-                if (this.responseHeaders.hasOwnProperty(header) &&
-                    !/^Set-Cookie2?$/i.test(header)) {
-                    headers += header + ": " + this.responseHeaders[header] + "\r\n";
-                }
-            }
-
-            return headers;
-        },
-
-        setResponseBody: function setResponseBody(body) {
-            verifyRequestSent(this);
-            verifyHeadersReceived(this);
-            verifyResponseBodyType(body);
-
-            var chunkSize = this.chunkSize || 10;
-            var index = 0;
-            this.responseText = "";
-
-            do {
-                if (this.async) {
-                    this.readyStateChange(FakeXMLHttpRequest.LOADING);
-                }
-
-                this.responseText += body.substring(index, index + chunkSize);
-                index += chunkSize;
-            } while (index < body.length);
-
-            var type = this.getResponseHeader("Content-Type");
-
-            if (this.responseText &&
-                (!type || /(text\/xml)|(application\/xml)|(\+xml)/.test(type))) {
-                try {
-                    this.responseXML = FakeXMLHttpRequest.parseXML(this.responseText);
-                } catch (e) {
-                    // Unable to parse XML - no biggie
-                }
-            }
-
-            if (this.async) {
-                this.readyStateChange(FakeXMLHttpRequest.DONE);
-            } else {
-                this.readyState = FakeXMLHttpRequest.DONE;
-            }
-        },
-
-        respond: function respond(status, headers, body) {
-            this.setResponseHeaders(headers || {});
-            this.status = typeof status == "number" ? status : 200;
-            this.statusText = FakeXMLHttpRequest.statusCodes[this.status];
-            this.setResponseBody(body || "");
-        },
-
-        uploadProgress: function uploadProgress(progressEventRaw) {
-            this.upload.dispatchEvent(new ProgressEvent("progress", progressEventRaw));
-        },
-
-        uploadError: function uploadError(error) {
-            this.upload.dispatchEvent(new CustomEvent("error", {"detail": error}));
-        }
-    });
-
-    sinon.extend(FakeXMLHttpRequest, {
-        UNSENT: 0,
-        OPENED: 1,
-        HEADERS_RECEIVED: 2,
-        LOADING: 3,
-        DONE: 4
-    });
-
-    // Borrowed from JSpec
-    FakeXMLHttpRequest.parseXML = function parseXML(text) {
-        var xmlDoc;
-
-        if (typeof DOMParser != "undefined") {
-            var parser = new DOMParser();
-            xmlDoc = parser.parseFromString(text, "text/xml");
-        } else {
-            xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
-            xmlDoc.async = "false";
-            xmlDoc.loadXML(text);
-        }
-
-        return xmlDoc;
-    };
-
-    FakeXMLHttpRequest.statusCodes = {
-        100: "Continue",
-        101: "Switching Protocols",
-        200: "OK",
-        201: "Created",
-        202: "Accepted",
-        203: "Non-Authoritative Information",
-        204: "No Content",
-        205: "Reset Content",
-        206: "Partial Content",
-        300: "Multiple Choice",
-        301: "Moved Permanently",
-        302: "Found",
-        303: "See Other",
-        304: "Not Modified",
-        305: "Use Proxy",
-        307: "Temporary Redirect",
-        400: "Bad Request",
-        401: "Unauthorized",
-        402: "Payment Required",
-        403: "Forbidden",
-        404: "Not Found",
-        405: "Method Not Allowed",
-        406: "Not Acceptable",
-        407: "Proxy Authentication Required",
-        408: "Request Timeout",
-        409: "Conflict",
-        410: "Gone",
-        411: "Length Required",
-        412: "Precondition Failed",
-        413: "Request Entity Too Large",
-        414: "Request-URI Too Long",
-        415: "Unsupported Media Type",
-        416: "Requested Range Not Satisfiable",
-        417: "Expectation Failed",
-        422: "Unprocessable Entity",
-        500: "Internal Server Error",
-        501: "Not Implemented",
-        502: "Bad Gateway",
-        503: "Service Unavailable",
-        504: "Gateway Timeout",
-        505: "HTTP Version Not Supported"
-    };
-
-    sinon.useFakeXMLHttpRequest = function () {
-        sinon.FakeXMLHttpRequest.restore = function restore(keepOnCreate) {
-            if (xhr.supportsXHR) {
-                global.XMLHttpRequest = xhr.GlobalXMLHttpRequest;
-            }
-
-            if (xhr.supportsActiveX) {
-                global.ActiveXObject = xhr.GlobalActiveXObject;
-            }
-
-            delete sinon.FakeXMLHttpRequest.restore;
-
-            if (keepOnCreate !== true) {
-                delete sinon.FakeXMLHttpRequest.onCreate;
-            }
-        };
-        if (xhr.supportsXHR) {
-            global.XMLHttpRequest = sinon.FakeXMLHttpRequest;
-        }
-
-        if (xhr.supportsActiveX) {
-            global.ActiveXObject = function ActiveXObject(objId) {
-                if (objId == "Microsoft.XMLHTTP" || /^Msxml2\.XMLHTTP/i.test(objId)) {
-
-                    return new sinon.FakeXMLHttpRequest();
-                }
-
-                return new xhr.GlobalActiveXObject(objId);
-            };
-        }
-
-        return sinon.FakeXMLHttpRequest;
-    };
-
-    sinon.FakeXMLHttpRequest = FakeXMLHttpRequest;
-
-})(typeof global === "object" ? global : this);
-
-if (typeof module !== 'undefined' && module.exports) {
-    module.exports = sinon;
-}
-
-/**
- * @depend fake_xml_http_request.js
- */
-/*jslint eqeqeq: false, onevar: false, regexp: false, plusplus: false*/
-/*global module, require, window*/
-/**
- * The Sinon "server" mimics a web server that receives requests from
- * sinon.FakeXMLHttpRequest and provides an API to respond to those requests,
- * both synchronously and asynchronously. To respond synchronuously, canned
- * answers have to be provided upfront.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-if (typeof sinon == "undefined") {
-    var sinon = {};
-}
-
-sinon.fakeServer = (function () {
-    var push = [].push;
-    function F() {}
-
-    function create(proto) {
-        F.prototype = proto;
-        return new F();
-    }
-
-    function responseArray(handler) {
-        var response = handler;
-
-        if (Object.prototype.toString.call(handler) != "[object Array]") {
-            response = [200, {}, handler];
-        }
-
-        if (typeof response[2] != "string") {
-            throw new TypeError("Fake server response body should be string, but was " +
-                                typeof response[2]);
-        }
-
-        return response;
-    }
-
-    var wloc = typeof window !== "undefined" ? window.location : {};
-    var rCurrLoc = new RegExp("^" + wloc.protocol + "//" + wloc.host);
-
-    function matchOne(response, reqMethod, reqUrl) {
-        var rmeth = response.method;
-        var matchMethod = !rmeth || rmeth.toLowerCase() == reqMethod.toLowerCase();
-        var url = response.url;
-        var matchUrl = !url || url == reqUrl || (typeof url.test == "function" && url.test(reqUrl));
-
-        return matchMethod && matchUrl;
-    }
-
-    function match(response, request) {
-        var requestUrl = request.url;
-
-        if (!/^https?:\/\//.test(requestUrl) || rCurrLoc.test(requestUrl)) {
-            requestUrl = requestUrl.replace(rCurrLoc, "");
-        }
-
-        if (matchOne(response, this.getHTTPMethod(request), requestUrl)) {
-            if (typeof response.response == "function") {
-                var ru = response.url;
-                var args = [request].concat(ru && typeof ru.exec == "function" ? ru.exec(requestUrl).slice(1) : []);
-                return response.response.apply(response, args);
-            }
-
-            return true;
-        }
-
-        return false;
-    }
-
-    function log(response, request) {
-        var str;
-
-        str =  "Request:\n"  + sinon.format(request)  + "\n\n";
-        str += "Response:\n" + sinon.format(response) + "\n\n";
-
-        sinon.log(str);
-    }
-
-    return {
-        create: function () {
-            var server = create(this);
-            this.xhr = sinon.useFakeXMLHttpRequest();
-            server.requests = [];
-
-            this.xhr.onCreate = function (xhrObj) {
-                server.addRequest(xhrObj);
-            };
-
-            return server;
-        },
-
-        addRequest: function addRequest(xhrObj) {
-            var server = this;
-            push.call(this.requests, xhrObj);
-
-            xhrObj.onSend = function () {
-                server.handleRequest(this);
-
-                if (server.autoRespond && !server.responding) {
-                    setTimeout(function () {
-                        server.responding = false;
-                        server.respond();
-                    }, server.autoRespondAfter || 10);
-
-                    server.responding = true;
-                }
-            };
-        },
-
-        getHTTPMethod: function getHTTPMethod(request) {
-            if (this.fakeHTTPMethods && /post/i.test(request.method)) {
-                var matches = (request.requestBody || "").match(/_method=([^\b;]+)/);
-                return !!matches ? matches[1] : request.method;
-            }
-
-            return request.method;
-        },
-
-        handleRequest: function handleRequest(xhr) {
-            if (xhr.async) {
-                if (!this.queue) {
-                    this.queue = [];
-                }
-
-                push.call(this.queue, xhr);
-            } else {
-                this.processRequest(xhr);
-            }
-        },
-
-        respondWith: function respondWith(method, url, body) {
-            if (arguments.length == 1 && typeof method != "function") {
-                this.response = responseArray(method);
-                return;
-            }
-
-            if (!this.responses) { this.responses = []; }
-
-            if (arguments.length == 1) {
-                body = method;
-                url = method = null;
-            }
-
-            if (arguments.length == 2) {
-                body = url;
-                url = method;
-                method = null;
-            }
-
-            push.call(this.responses, {
-                method: method,
-                url: url,
-                response: typeof body == "function" ? body : responseArray(body)
-            });
-        },
-
-        respond: function respond() {
-            if (arguments.length > 0) this.respondWith.apply(this, arguments);
-            var queue = this.queue || [];
-            var requests = queue.splice(0);
-            var request;
-
-            while(request = requests.shift()) {
-                this.processRequest(request);
-            }
-        },
-
-        processRequest: function processRequest(request) {
-            try {
-                if (request.aborted) {
-                    return;
-                }
-
-                var response = this.response || [404, {}, ""];
-
-                if (this.responses) {
-                    for (var l = this.responses.length, i = l - 1; i >= 0; i--) {
-                        if (match.call(this, this.responses[i], request)) {
-                            response = this.responses[i].response;
-                            break;
-                        }
-                    }
-                }
-
-                if (request.readyState != 4) {
-                    log(response, request);
-
-                    request.respond(response[0], response[1], response[2]);
-                }
-            } catch (e) {
-                sinon.logError("Fake server request processing", e);
-            }
-        },
-
-        restore: function restore() {
-            return this.xhr.restore && this.xhr.restore.apply(this.xhr, arguments);
-        }
-    };
-}());
-
-if (typeof module !== 'undefined' && module.exports) {
-    module.exports = sinon;
-}
-
-/**
- * @depend fake_server.js
- * @depend fake_timers.js
- */
-/*jslint browser: true, eqeqeq: false, onevar: false*/
-/*global sinon*/
-/**
- * Add-on for sinon.fakeServer that automatically handles a fake timer along with
- * the FakeXMLHttpRequest. The direct inspiration for this add-on is jQuery
- * 1.3.x, which does not use xhr object's onreadystatehandler at all - instead,
- * it polls the object for completion with setInterval. Dispite the direct
- * motivation, there is nothing jQuery-specific in this file, so it can be used
- * in any environment where the ajax implementation depends on setInterval or
- * setTimeout.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function () {
-    function Server() {}
-    Server.prototype = sinon.fakeServer;
-
-    sinon.fakeServerWithClock = new Server();
-
-    sinon.fakeServerWithClock.addRequest = function addRequest(xhr) {
-        if (xhr.async) {
-            if (typeof setTimeout.clock == "object") {
-                this.clock = setTimeout.clock;
-            } else {
-                this.clock = sinon.useFakeTimers();
-                this.resetClock = true;
-            }
-
-            if (!this.longestTimeout) {
-                var clockSetTimeout = this.clock.setTimeout;
-                var clockSetInterval = this.clock.setInterval;
-                var server = this;
-
-                this.clock.setTimeout = function (fn, timeout) {
-                    server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);
-
-                    return clockSetTimeout.apply(this, arguments);
-                };
-
-                this.clock.setInterval = function (fn, timeout) {
-                    server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);
-
-                    return clockSetInterval.apply(this, arguments);
-                };
-            }
-        }
-
-        return sinon.fakeServer.addRequest.call(this, xhr);
-    };
-
-    sinon.fakeServerWithClock.respond = function respond() {
-        var returnVal = sinon.fakeServer.respond.apply(this, arguments);
-
-        if (this.clock) {
-            this.clock.tick(this.longestTimeout || 0);
-            this.longestTimeout = 0;
-
-            if (this.resetClock) {
-                this.clock.restore();
-                this.resetClock = false;
-            }
-        }
-
-        return returnVal;
-    };
-
-    sinon.fakeServerWithClock.restore = function restore() {
-        if (this.clock) {
-            this.clock.restore();
-        }
-
-        return sinon.fakeServer.restore.apply(this, arguments);
-    };
-}());
-
-/**
- * @depend ../sinon.js
- * @depend collection.js
- * @depend util/fake_timers.js
- * @depend util/fake_server_with_clock.js
- */
-/*jslint eqeqeq: false, onevar: false, plusplus: false*/
-/*global require, module*/
-/**
- * Manages fake collections as well as fake utilities such as Sinon's
- * timers and fake XHR implementation in one convenient object.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-if (typeof module !== 'undefined' && module.exports) {
-    var sinon = require("../sinon");
-    sinon.extend(sinon, require("./util/fake_timers"));
-}
-
-(function () {
-    var push = [].push;
-
-    function exposeValue(sandbox, config, key, value) {
-        if (!value) {
-            return;
-        }
-
-        if (config.injectInto && !(key in config.injectInto) ) {
-            config.injectInto[key] = value;
-        } else {
-            push.call(sandbox.args, value);
-        }
-    }
-
-    function prepareSandboxFromConfig(config) {
-        var sandbox = sinon.create(sinon.sandbox);
-
-        if (config.useFakeServer) {
-            if (typeof config.useFakeServer == "object") {
-                sandbox.serverPrototype = config.useFakeServer;
-            }
-
-            sandbox.useFakeServer();
-        }
-
-        if (config.useFakeTimers) {
-            if (typeof config.useFakeTimers == "object") {
-                sandbox.useFakeTimers.apply(sandbox, config.useFakeTimers);
-            } else {
-                sandbox.useFakeTimers();
-            }
-        }
-
-        return sandbox;
-    }
-
-    sinon.sandbox = sinon.extend(sinon.create(sinon.collection), {
-        useFakeTimers: function useFakeTimers() {
-            this.clock = sinon.useFakeTimers.apply(sinon, arguments);
-
-            return this.add(this.clock);
-        },
-
-        serverPrototype: sinon.fakeServer,
-
-        useFakeServer: function useFakeServer() {
-            var proto = this.serverPrototype || sinon.fakeServer;
-
-            if (!proto || !proto.create) {
-                return null;
-            }
-
-            this.server = proto.create();
-            return this.add(this.server);
-        },
-
-        inject: function (obj) {
-            sinon.collection.inject.call(this, obj);
-
-            if (this.clock) {
-                obj.clock = this.clock;
-            }
-
-            if (this.server) {
-                obj.server = this.server;
-                obj.requests = this.server.requests;
-            }
-
-            return obj;
-        },
-
-        create: function (config) {
-            if (!config) {
-                return sinon.create(sinon.sandbox);
-            }
-
-            var sandbox = prepareSandboxFromConfig(config);
-            sandbox.args = sandbox.args || [];
-            var prop, value, exposed = sandbox.inject({});
-
-            if (config.properties) {
-                for (var i = 0, l = config.properties.length; i < l; i++) {
-                    prop = config.properties[i];
-                    value = exposed[prop] || prop == "sandbox" && sandbox;
-                    exposeValue(sandbox, config, prop, value);
-                }
-            } else {
-                exposeValue(sandbox, config, "sandbox", value);
-            }
-
-            return sandbox;
-        }
-    });
-
-    sinon.sandbox.useFakeXMLHttpRequest = sinon.sandbox.useFakeServer;
-
-    if (typeof module !== 'undefined' && module.exports) {
-        module.exports = sinon.sandbox;
-    }
-}());
-
-/**
- * @depend ../sinon.js
- * @depend stub.js
- * @depend mock.js
- * @depend sandbox.js
- */
-/*jslint eqeqeq: false, onevar: false, forin: true, plusplus: false*/
-/*global module, require, sinon*/
-/**
- * Test function, sandboxes fakes
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (sinon) {
-    var commonJSModule = typeof module !== 'undefined' && module.exports;
-
-    if (!sinon && commonJSModule) {
-        sinon = require("../sinon");
-    }
-
-    if (!sinon) {
-        return;
-    }
-
-    function test(callback) {
-        var type = typeof callback;
-
-        if (type != "function") {
-            throw new TypeError("sinon.test needs to wrap a test function, got " + type);
-        }
-
-        return function () {
-            var config = sinon.getConfig(sinon.config);
-            config.injectInto = config.injectIntoThis && this || config.injectInto;
-            var sandbox = sinon.sandbox.create(config);
-            var exception, result;
-            var args = Array.prototype.slice.call(arguments).concat(sandbox.args);
-
-            try {
-                result = callback.apply(this, args);
-            } catch (e) {
-                exception = e;
-            }
-
-            if (typeof exception !== "undefined") {
-                sandbox.restore();
-                throw exception;
-            }
-            else {
-                sandbox.verifyAndRestore();
-            }
-
-            return result;
-        };
-    }
-
-    test.config = {
-        injectIntoThis: true,
-        injectInto: null,
-        properties: ["spy", "stub", "mock", "clock", "server", "requests"],
-        useFakeTimers: true,
-        useFakeServer: true
-    };
-
-    if (commonJSModule) {
-        module.exports = test;
-    } else {
-        sinon.test = test;
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend ../sinon.js
- * @depend test.js
- */
-/*jslint eqeqeq: false, onevar: false, eqeqeq: false*/
-/*global module, require, sinon*/
-/**
- * Test case, sandboxes all test functions
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (sinon) {
-    var commonJSModule = typeof module !== 'undefined' && module.exports;
-
-    if (!sinon && commonJSModule) {
-        sinon = require("../sinon");
-    }
-
-    if (!sinon || !Object.prototype.hasOwnProperty) {
-        return;
-    }
-
-    function createTest(property, setUp, tearDown) {
-        return function () {
-            if (setUp) {
-                setUp.apply(this, arguments);
-            }
-
-            var exception, result;
-
-            try {
-                result = property.apply(this, arguments);
-            } catch (e) {
-                exception = e;
-            }
-
-            if (tearDown) {
-                tearDown.apply(this, arguments);
-            }
-
-            if (exception) {
-                throw exception;
-            }
-
-            return result;
-        };
-    }
-
-    function testCase(tests, prefix) {
-        /*jsl:ignore*/
-        if (!tests || typeof tests != "object") {
-            throw new TypeError("sinon.testCase needs an object with test functions");
-        }
-        /*jsl:end*/
-
-        prefix = prefix || "test";
-        var rPrefix = new RegExp("^" + prefix);
-        var methods = {}, testName, property, method;
-        var setUp = tests.setUp;
-        var tearDown = tests.tearDown;
-
-        for (testName in tests) {
-            if (tests.hasOwnProperty(testName)) {
-                property = tests[testName];
-
-                if (/^(setUp|tearDown)$/.test(testName)) {
-                    continue;
-                }
-
-                if (typeof property == "function" && rPrefix.test(testName)) {
-                    method = property;
-
-                    if (setUp || tearDown) {
-                        method = createTest(property, setUp, tearDown);
-                    }
-
-                    methods[testName] = sinon.test(method);
-                } else {
-                    methods[testName] = tests[testName];
-                }
-            }
-        }
-
-        return methods;
-    }
-
-    if (commonJSModule) {
-        module.exports = testCase;
-    } else {
-        sinon.testCase = testCase;
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend ../sinon.js
- * @depend stub.js
- */
-/*jslint eqeqeq: false, onevar: false, nomen: false, plusplus: false*/
-/*global module, require, sinon*/
-/**
- * Assertions matching the test spy retrieval interface.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (sinon, global) {
-    var commonJSModule = typeof module !== "undefined" && module.exports;
-    var slice = Array.prototype.slice;
-    var assert;
-
-    if (!sinon && commonJSModule) {
-        sinon = require("../sinon");
-    }
-
-    if (!sinon) {
-        return;
-    }
-
-    function verifyIsStub() {
-        var method;
-
-        for (var i = 0, l = arguments.length; i < l; ++i) {
-            method = arguments[i];
-
-            if (!method) {
-                assert.fail("fake is not a spy");
-            }
-
-            if (typeof method != "function") {
-                assert.fail(method + " is not a function");
-            }
-
-            if (typeof method.getCall != "function") {
-                assert.fail(method + " is not stubbed");
-            }
-        }
-    }
-
-    function failAssertion(object, msg) {
-        object = object || global;
-        var failMethod = object.fail || assert.fail;
-        failMethod.call(object, msg);
-    }
-
-    function mirrorPropAsAssertion(name, method, message) {
-        if (arguments.length == 2) {
-            message = method;
-            method = name;
-        }
-
-        assert[name] = function (fake) {
-            verifyIsStub(fake);
-
-            var args = slice.call(arguments, 1);
-            var failed = false;
-
-            if (typeof method == "function") {
-                failed = !method(fake);
-            } else {
-                failed = typeof fake[method] == "function" ?
-                    !fake[method].apply(fake, args) : !fake[method];
-            }
-
-            if (failed) {
-                failAssertion(this, fake.printf.apply(fake, [message].concat(args)));
-            } else {
-                assert.pass(name);
-            }
-        };
-    }
-
-    function exposedName(prefix, prop) {
-        return !prefix || /^fail/.test(prop) ? prop :
-            prefix + prop.slice(0, 1).toUpperCase() + prop.slice(1);
-    }
-
-    assert = {
-        failException: "AssertError",
-
-        fail: function fail(message) {
-            var error = new Error(message);
-            error.name = this.failException || assert.failException;
-
-            throw error;
-        },
-
-        pass: function pass(assertion) {},
-
-        callOrder: function assertCallOrder() {
-            verifyIsStub.apply(null, arguments);
-            var expected = "", actual = "";
-
-            if (!sinon.calledInOrder(arguments)) {
-                try {
-                    expected = [].join.call(arguments, ", ");
-                    var calls = slice.call(arguments);
-                    var i = calls.length;
-                    while (i) {
-                        if (!calls[--i].called) {
-                            calls.splice(i, 1);
-                        }
-                    }
-                    actual = sinon.orderByFirstCall(calls).join(", ");
-                } catch (e) {
-                    // If this fails, we'll just fall back to the blank string
-                }
-
-                failAssertion(this, "expected " + expected + " to be " +
-                              "called in order but were called as " + actual);
-            } else {
-                assert.pass("callOrder");
-            }
-        },
-
-        callCount: function assertCallCount(method, count) {
-            verifyIsStub(method);
-
-            if (method.callCount != count) {
-                var msg = "expected %n to be called " + sinon.timesInWords(count) +
-                    " but was called %c%C";
-                failAssertion(this, method.printf(msg));
-            } else {
-                assert.pass("callCount");
-            }
-        },
-
-        expose: function expose(target, options) {
-            if (!target) {
-                throw new TypeError("target is null or undefined");
-            }
-
-            var o = options || {};
-            var prefix = typeof o.prefix == "undefined" && "assert" || o.prefix;
-            var includeFail = typeof o.includeFail == "undefined" || !!o.includeFail;
-
-            for (var method in this) {
-                if (method != "export" && (includeFail || !/^(fail)/.test(method))) {
-                    target[exposedName(prefix, method)] = this[method];
-                }
-            }
-
-            return target;
-        }
-    };
-
-    mirrorPropAsAssertion("called", "expected %n to have been called at least once but was never called");
-    mirrorPropAsAssertion("notCalled", function (spy) { return !spy.called; },
-                          "expected %n to not have been called but was called %c%C");
-    mirrorPropAsAssertion("calledOnce", "expected %n to be called once but was called %c%C");
-    mirrorPropAsAssertion("calledTwice", "expected %n to be called twice but was called %c%C");
-    mirrorPropAsAssertion("calledThrice", "expected %n to be called thrice but was called %c%C");
-    mirrorPropAsAssertion("calledOn", "expected %n to be called with %1 as this but was called with %t");
-    mirrorPropAsAssertion("alwaysCalledOn", "expected %n to always be called with %1 as this but was called with %t");
-    mirrorPropAsAssertion("calledWithNew", "expected %n to be called with new");
-    mirrorPropAsAssertion("alwaysCalledWithNew", "expected %n to always be called with new");
-    mirrorPropAsAssertion("calledWith", "expected %n to be called with arguments %*%C");
-    mirrorPropAsAssertion("calledWithMatch", "expected %n to be called with match %*%C");
-    mirrorPropAsAssertion("alwaysCalledWith", "expected %n to always be called with arguments %*%C");
-    mirrorPropAsAssertion("alwaysCalledWithMatch", "expected %n to always be called with match %*%C");
-    mirrorPropAsAssertion("calledWithExactly", "expected %n to be called with exact arguments %*%C");
-    mirrorPropAsAssertion("alwaysCalledWithExactly", "expected %n to always be called with exact arguments %*%C");
-    mirrorPropAsAssertion("neverCalledWith", "expected %n to never be called with arguments %*%C");
-    mirrorPropAsAssertion("neverCalledWithMatch", "expected %n to never be called with match %*%C");
-    mirrorPropAsAssertion("threw", "%n did not throw exception%C");
-    mirrorPropAsAssertion("alwaysThrew", "%n did not always throw exception%C");
-
-    if (commonJSModule) {
-        module.exports = assert;
-    } else {
-        sinon.assert = assert;
-    }
-}(typeof sinon == "object" && sinon || null, typeof window != "undefined" ? window : (typeof self != "undefined") ? self : global));
-
-return sinon;}.call(typeof window != 'undefined' && window || {}));
diff --git a/resources/sinonjs/sinon-1.9.0.js b/resources/sinonjs/sinon-1.9.0.js
new file mode 100644 (file)
index 0000000..428b729
--- /dev/null
@@ -0,0 +1,4794 @@
+/**
+ * Sinon.JS 1.9.0, 2014/03/05
+ *
+ * @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.
+ */
+
+this.sinon = (function () {
+var samsam, formatio;
+function define(mod, deps, fn) { if (mod == "samsam") { samsam = deps(); } else { formatio = fn(samsam); } }
+define.amd = true;
+((typeof define === "function" && define.amd && function (m) { define("samsam", m); }) ||
+ (typeof module === "object" &&
+      function (m) { module.exports = m(); }) || // Node
+ function (m) { this.samsam = m(); } // Browser globals
+)(function () {
+    var o = Object.prototype;
+    var div = typeof document !== "undefined" && document.createElement("div");
+
+    function isNaN(value) {
+        // Unlike global isNaN, this avoids type coercion
+        // typeof check avoids IE host object issues, hat tip to
+        // lodash
+        var val = value; // JsLint thinks value !== value is "weird"
+        return typeof value === "number" && value !== val;
+    }
+
+    function getClass(value) {
+        // Returns the internal [[Class]] by calling Object.prototype.toString
+        // with the provided value as this. Return value is a string, naming the
+        // internal class, e.g. "Array"
+        return o.toString.call(value).split(/[ \]]/)[1];
+    }
+
+    /**
+     * @name samsam.isArguments
+     * @param Object object
+     *
+     * Returns ``true`` if ``object`` is an ``arguments`` object,
+     * ``false`` otherwise.
+     */
+    function isArguments(object) {
+        if (typeof object !== "object" || typeof object.length !== "number" ||
+                getClass(object) === "Array") {
+            return false;
+        }
+        if (typeof object.callee == "function") { return true; }
+        try {
+            object[object.length] = 6;
+            delete object[object.length];
+        } catch (e) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * @name samsam.isElement
+     * @param Object object
+     *
+     * Returns ``true`` if ``object`` is a DOM element node. Unlike
+     * Underscore.js/lodash, this function will return ``false`` if ``object``
+     * is an *element-like* object, i.e. a regular object with a ``nodeType``
+     * property that holds the value ``1``.
+     */
+    function isElement(object) {
+        if (!object || object.nodeType !== 1 || !div) { return false; }
+        try {
+            object.appendChild(div);
+            object.removeChild(div);
+        } catch (e) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * @name samsam.keys
+     * @param Object object
+     *
+     * Return an array of own property names.
+     */
+    function keys(object) {
+        var ks = [], prop;
+        for (prop in object) {
+            if (o.hasOwnProperty.call(object, prop)) { ks.push(prop); }
+        }
+        return ks;
+    }
+
+    /**
+     * @name samsam.isDate
+     * @param Object value
+     *
+     * Returns true if the object is a ``Date``, or *date-like*. Duck typing
+     * of date objects work by checking that the object has a ``getTime``
+     * function whose return value equals the return value from the object's
+     * ``valueOf``.
+     */
+    function isDate(value) {
+        return typeof value.getTime == "function" &&
+            value.getTime() == value.valueOf();
+    }
+
+    /**
+     * @name samsam.isNegZero
+     * @param Object value
+     *
+     * Returns ``true`` if ``value`` is ``-0``.
+     */
+    function isNegZero(value) {
+        return value === 0 && 1 / value === -Infinity;
+    }
+
+    /**
+     * @name samsam.equal
+     * @param Object obj1
+     * @param Object obj2
+     *
+     * Returns ``true`` if two objects are strictly equal. Compared to
+     * ``===`` there are two exceptions:
+     *
+     *   - NaN is considered equal to NaN
+     *   - -0 and +0 are not considered equal
+     */
+    function identical(obj1, obj2) {
+        if (obj1 === obj2 || (isNaN(obj1) && isNaN(obj2))) {
+            return obj1 !== 0 || isNegZero(obj1) === isNegZero(obj2);
+        }
+    }
+
+
+    /**
+     * @name samsam.deepEqual
+     * @param Object obj1
+     * @param Object obj2
+     *
+     * Deep equal comparison. Two values are "deep equal" if:
+     *
+     *   - They are equal, according to samsam.identical
+     *   - They are both date objects representing the same time
+     *   - They are both arrays containing elements that are all deepEqual
+     *   - They are objects with the same set of properties, and each property
+     *     in ``obj1`` is deepEqual to the corresponding property in ``obj2``
+     *
+     * Supports cyclic objects.
+     */
+    function deepEqualCyclic(obj1, obj2) {
+
+        // used for cyclic comparison
+        // contain already visited objects
+        var objects1 = [],
+            objects2 = [],
+        // contain pathes (position in the object structure)
+        // of the already visited objects
+        // indexes same as in objects arrays
+            paths1 = [],
+            paths2 = [],
+        // contains combinations of already compared objects
+        // in the manner: { "$1['ref']$2['ref']": true }
+            compared = {};
+
+        /**
+         * used to check, if the value of a property is an object
+         * (cyclic logic is only needed for objects)
+         * only needed for cyclic logic
+         */
+        function isObject(value) {
+
+            if (typeof value === 'object' && value !== null &&
+                    !(value instanceof Boolean) &&
+                    !(value instanceof Date)    &&
+                    !(value instanceof Number)  &&
+                    !(value instanceof RegExp)  &&
+                    !(value instanceof String)) {
+
+                return true;
+            }
+
+            return false;
+        }
+
+        /**
+         * returns the index of the given object in the
+         * given objects array, -1 if not contained
+         * only needed for cyclic logic
+         */
+        function getIndex(objects, obj) {
+
+            var i;
+            for (i = 0; i < objects.length; i++) {
+                if (objects[i] === obj) {
+                    return i;
+                }
+            }
+
+            return -1;
+        }
+
+        // does the recursion for the deep equal check
+        return (function deepEqual(obj1, obj2, path1, path2) {
+            var type1 = typeof obj1;
+            var type2 = typeof obj2;
+
+            // == null also matches undefined
+            if (obj1 === obj2 ||
+                    isNaN(obj1) || isNaN(obj2) ||
+                    obj1 == null || obj2 == null ||
+                    type1 !== "object" || type2 !== "object") {
+
+                return identical(obj1, obj2);
+            }
+
+            // Elements are only equal if identical(expected, actual)
+            if (isElement(obj1) || isElement(obj2)) { return false; }
+
+            var isDate1 = isDate(obj1), isDate2 = isDate(obj2);
+            if (isDate1 || isDate2) {
+                if (!isDate1 || !isDate2 || obj1.getTime() !== obj2.getTime()) {
+                    return false;
+                }
+            }
+
+            if (obj1 instanceof RegExp && obj2 instanceof RegExp) {
+                if (obj1.toString() !== obj2.toString()) { return false; }
+            }
+
+            var class1 = getClass(obj1);
+            var class2 = getClass(obj2);
+            var keys1 = keys(obj1);
+            var keys2 = keys(obj2);
+
+            if (isArguments(obj1) || isArguments(obj2)) {
+                if (obj1.length !== obj2.length) { return false; }
+            } else {
+                if (type1 !== type2 || class1 !== class2 ||
+                        keys1.length !== keys2.length) {
+                    return false;
+                }
+            }
+
+            var key, i, l,
+                // following vars are used for the cyclic logic
+                value1, value2,
+                isObject1, isObject2,
+                index1, index2,
+                newPath1, newPath2;
+
+            for (i = 0, l = keys1.length; i < l; i++) {
+                key = keys1[i];
+                if (!o.hasOwnProperty.call(obj2, key)) {
+                    return false;
+                }
+
+                // Start of the cyclic logic
+
+                value1 = obj1[key];
+                value2 = obj2[key];
+
+                isObject1 = isObject(value1);
+                isObject2 = isObject(value2);
+
+                // determine, if the objects were already visited
+                // (it's faster to check for isObject first, than to
+                // get -1 from getIndex for non objects)
+                index1 = isObject1 ? getIndex(objects1, value1) : -1;
+                index2 = isObject2 ? getIndex(objects2, value2) : -1;
+
+                // determine the new pathes of the objects
+                // - for non cyclic objects the current path will be extended
+                //   by current property name
+                // - for cyclic objects the stored path is taken
+                newPath1 = index1 !== -1
+                    ? paths1[index1]
+                    : path1 + '[' + JSON.stringify(key) + ']';
+                newPath2 = index2 !== -1
+                    ? paths2[index2]
+                    : path2 + '[' + JSON.stringify(key) + ']';
+
+                // stop recursion if current objects are already compared
+                if (compared[newPath1 + newPath2]) {
+                    return true;
+                }
+
+                // remember the current objects and their pathes
+                if (index1 === -1 && isObject1) {
+                    objects1.push(value1);
+                    paths1.push(newPath1);
+                }
+                if (index2 === -1 && isObject2) {
+                    objects2.push(value2);
+                    paths2.push(newPath2);
+                }
+
+                // remember that the current objects are already compared
+                if (isObject1 && isObject2) {
+                    compared[newPath1 + newPath2] = true;
+                }
+
+                // End of cyclic logic
+
+                // neither value1 nor value2 is a cycle
+                // continue with next level
+                if (!deepEqual(value1, value2, newPath1, newPath2)) {
+                    return false;
+                }
+            }
+
+            return true;
+
+        }(obj1, obj2, '$1', '$2'));
+    }
+
+    var match;
+
+    function arrayContains(array, subset) {
+        if (subset.length === 0) { return true; }
+        var i, l, j, k;
+        for (i = 0, l = array.length; i < l; ++i) {
+            if (match(array[i], subset[0])) {
+                for (j = 0, k = subset.length; j < k; ++j) {
+                    if (!match(array[i + j], subset[j])) { return false; }
+                }
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * @name samsam.match
+     * @param Object object
+     * @param Object matcher
+     *
+     * Compare arbitrary value ``object`` with matcher.
+     */
+    match = function match(object, matcher) {
+        if (matcher && typeof matcher.test === "function") {
+            return matcher.test(object);
+        }
+
+        if (typeof matcher === "function") {
+            return matcher(object) === true;
+        }
+
+        if (typeof matcher === "string") {
+            matcher = matcher.toLowerCase();
+            var notNull = typeof object === "string" || !!object;
+            return notNull &&
+                (String(object)).toLowerCase().indexOf(matcher) >= 0;
+        }
+
+        if (typeof matcher === "number") {
+            return matcher === object;
+        }
+
+        if (typeof matcher === "boolean") {
+            return matcher === object;
+        }
+
+        if (getClass(object) === "Array" && getClass(matcher) === "Array") {
+            return arrayContains(object, matcher);
+        }
+
+        if (matcher && typeof matcher === "object") {
+            var prop;
+            for (prop in matcher) {
+                if (!match(object[prop], matcher[prop])) {
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        throw new Error("Matcher was not a string, a number, a " +
+                        "function, a boolean or an object");
+    };
+
+    return {
+        isArguments: isArguments,
+        isElement: isElement,
+        isDate: isDate,
+        isNegZero: isNegZero,
+        identical: identical,
+        deepEqual: deepEqualCyclic,
+        match: match,
+        keys: keys
+    };
+});
+((typeof define === "function" && define.amd && function (m) {
+    define("formatio", ["samsam"], m);
+}) || (typeof module === "object" && function (m) {
+    module.exports = m(require("samsam"));
+}) || function (m) { this.formatio = m(this.samsam); }
+)(function (samsam) {
+    
+    var formatio = {
+        excludeConstructors: ["Object", /^.$/],
+        quoteStrings: true
+    };
+
+    var hasOwn = Object.prototype.hasOwnProperty;
+
+    var specialObjects = [];
+    if (typeof global !== "undefined") {
+        specialObjects.push({ object: global, value: "[object global]" });
+    }
+    if (typeof document !== "undefined") {
+        specialObjects.push({
+            object: document,
+            value: "[object HTMLDocument]"
+        });
+    }
+    if (typeof window !== "undefined") {
+        specialObjects.push({ object: window, value: "[object Window]" });
+    }
+
+    function functionName(func) {
+        if (!func) { return ""; }
+        if (func.displayName) { return func.displayName; }
+        if (func.name) { return func.name; }
+        var matches = func.toString().match(/function\s+([^\(]+)/m);
+        return (matches && matches[1]) || "";
+    }
+
+    function constructorName(f, object) {
+        var name = functionName(object && object.constructor);
+        var excludes = f.excludeConstructors ||
+                formatio.excludeConstructors || [];
+
+        var i, l;
+        for (i = 0, l = excludes.length; i < l; ++i) {
+            if (typeof excludes[i] === "string" && excludes[i] === name) {
+                return "";
+            } else if (excludes[i].test && excludes[i].test(name)) {
+                return "";
+            }
+        }
+
+        return name;
+    }
+
+    function isCircular(object, objects) {
+        if (typeof object !== "object") { return false; }
+        var i, l;
+        for (i = 0, l = objects.length; i < l; ++i) {
+            if (objects[i] === object) { return true; }
+        }
+        return false;
+    }
+
+    function ascii(f, object, processed, indent) {
+        if (typeof object === "string") {
+            var qs = f.quoteStrings;
+            var quote = typeof qs !== "boolean" || qs;
+            return processed || quote ? '"' + object + '"' : object;
+        }
+
+        if (typeof object === "function" && !(object instanceof RegExp)) {
+            return ascii.func(object);
+        }
+
+        processed = processed || [];
+
+        if (isCircular(object, processed)) { return "[Circular]"; }
+
+        if (Object.prototype.toString.call(object) === "[object Array]") {
+            return ascii.array.call(f, object, processed);
+        }
+
+        if (!object) { return String((1/object) === -Infinity ? "-0" : object); }
+        if (samsam.isElement(object)) { return ascii.element(object); }
+
+        if (typeof object.toString === "function" &&
+                object.toString !== Object.prototype.toString) {
+            return object.toString();
+        }
+
+        var i, l;
+        for (i = 0, l = specialObjects.length; i < l; i++) {
+            if (object === specialObjects[i].object) {
+                return specialObjects[i].value;
+            }
+        }
+
+        return ascii.object.call(f, object, processed, indent);
+    }
+
+    ascii.func = function (func) {
+        return "function " + functionName(func) + "() {}";
+    };
+
+    ascii.array = function (array, processed) {
+        processed = processed || [];
+        processed.push(array);
+        var i, l, pieces = [];
+        for (i = 0, l = array.length; i < l; ++i) {
+            pieces.push(ascii(this, array[i], processed));
+        }
+        return "[" + pieces.join(", ") + "]";
+    };
+
+    ascii.object = function (object, processed, indent) {
+        processed = processed || [];
+        processed.push(object);
+        indent = indent || 0;
+        var pieces = [], properties = samsam.keys(object).sort();
+        var length = 3;
+        var prop, str, obj, i, l;
+
+        for (i = 0, l = properties.length; i < l; ++i) {
+            prop = properties[i];
+            obj = object[prop];
+
+            if (isCircular(obj, processed)) {
+                str = "[Circular]";
+            } else {
+                str = ascii(this, obj, processed, indent + 2);
+            }
+
+            str = (/\s/.test(prop) ? '"' + prop + '"' : prop) + ": " + str;
+            length += str.length;
+            pieces.push(str);
+        }
+
+        var cons = constructorName(this, object);
+        var prefix = cons ? "[" + cons + "] " : "";
+        var is = "";
+        for (i = 0, l = indent; i < l; ++i) { is += " "; }
+
+        if (length + indent > 80) {
+            return prefix + "{\n  " + is + pieces.join(",\n  " + is) + "\n" +
+                is + "}";
+        }
+        return prefix + "{ " + pieces.join(", ") + " }";
+    };
+
+    ascii.element = function (element) {
+        var tagName = element.tagName.toLowerCase();
+        var attrs = element.attributes, attr, pairs = [], attrName, i, l, val;
+
+        for (i = 0, l = attrs.length; i < l; ++i) {
+            attr = attrs.item(i);
+            attrName = attr.nodeName.toLowerCase().replace("html:", "");
+            val = attr.nodeValue;
+            if (attrName !== "contenteditable" || val !== "inherit") {
+                if (!!val) { pairs.push(attrName + "=\"" + val + "\""); }
+            }
+        }
+
+        var formatted = "<" + tagName + (pairs.length > 0 ? " " : "");
+        var content = element.innerHTML;
+
+        if (content.length > 20) {
+            content = content.substr(0, 20) + "[...]";
+        }
+
+        var res = formatted + pairs.join(" ") + ">" + content +
+                "</" + tagName + ">";
+
+        return res.replace(/ contentEditable="inherit"/, "");
+    };
+
+    function Formatio(options) {
+        for (var opt in options) {
+            this[opt] = options[opt];
+        }
+    }
+
+    Formatio.prototype = {
+        functionName: functionName,
+
+        configure: function (options) {
+            return new Formatio(options);
+        },
+
+        constructorName: function (object) {
+            return constructorName(this, object);
+        },
+
+        ascii: function (object, processed, indent) {
+            return ascii(this, object, processed, indent);
+        }
+    };
+
+    return Formatio.prototype;
+});
+/*jslint eqeqeq: false, onevar: false, forin: true, nomen: false, regexp: false, plusplus: false*/
+/*global module, require, __dirname, document*/
+/**
+ * Sinon core utilities. For internal use only.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+var sinon = (function (formatio) {
+    var div = typeof document != "undefined" && document.createElement("div");
+    var hasOwn = Object.prototype.hasOwnProperty;
+
+    function isDOMNode(obj) {
+        var success = false;
+
+        try {
+            obj.appendChild(div);
+            success = div.parentNode == obj;
+        } catch (e) {
+            return false;
+        } finally {
+            try {
+                obj.removeChild(div);
+            } catch (e) {
+                // Remove failed, not much we can do about that
+            }
+        }
+
+        return success;
+    }
+
+    function isElement(obj) {
+        return div && obj && obj.nodeType === 1 && isDOMNode(obj);
+    }
+
+    function isFunction(obj) {
+        return typeof obj === "function" || !!(obj && obj.constructor && obj.call && obj.apply);
+    }
+
+    function mirrorProperties(target, source) {
+        for (var prop in source) {
+            if (!hasOwn.call(target, prop)) {
+                target[prop] = source[prop];
+            }
+        }
+    }
+
+    function isRestorable (obj) {
+        return typeof obj === "function" && typeof obj.restore === "function" && obj.restore.sinon;
+    }
+
+    var sinon = {
+        wrapMethod: function wrapMethod(object, property, method) {
+            if (!object) {
+                throw new TypeError("Should wrap property of object");
+            }
+
+            if (typeof method != "function") {
+                throw new TypeError("Method wrapper should be function");
+            }
+
+            var wrappedMethod = object[property],
+                error;
+
+            if (!isFunction(wrappedMethod)) {
+                error = new TypeError("Attempted to wrap " + (typeof wrappedMethod) + " property " +
+                                    property + " as function");
+            }
+
+            if (wrappedMethod.restore && wrappedMethod.restore.sinon) {
+                error = new TypeError("Attempted to wrap " + property + " which is already wrapped");
+            }
+
+            if (wrappedMethod.calledBefore) {
+                var verb = !!wrappedMethod.returns ? "stubbed" : "spied on";
+                error = new TypeError("Attempted to wrap " + property + " which is already " + verb);
+            }
+
+            if (error) {
+                if (wrappedMethod._stack) {
+                    error.stack += '\n--------------\n' + wrappedMethod._stack;
+                }
+                throw error;
+            }
+
+            // IE 8 does not support hasOwnProperty on the window object and Firefox has a problem
+            // when using hasOwn.call on objects from other frames.
+            var owned = object.hasOwnProperty ? object.hasOwnProperty(property) : hasOwn.call(object, property);
+            object[property] = method;
+            method.displayName = property;
+            // Set up a stack trace which can be used later to find what line of
+            // code the original method was created on.
+            method._stack = (new Error('Stack Trace for original')).stack;
+
+            method.restore = function () {
+                // For prototype properties try to reset by delete first.
+                // If this fails (ex: localStorage on mobile safari) then force a reset
+                // via direct assignment.
+                if (!owned) {
+                    delete object[property];
+                }
+                if (object[property] === method) {
+                    object[property] = wrappedMethod;
+                }
+            };
+
+            method.restore.sinon = true;
+            mirrorProperties(method, wrappedMethod);
+
+            return method;
+        },
+
+        extend: function extend(target) {
+            for (var i = 1, l = arguments.length; i < l; i += 1) {
+                for (var prop in arguments[i]) {
+                    if (arguments[i].hasOwnProperty(prop)) {
+                        target[prop] = arguments[i][prop];
+                    }
+
+                    // DONT ENUM bug, only care about toString
+                    if (arguments[i].hasOwnProperty("toString") &&
+                        arguments[i].toString != target.toString) {
+                        target.toString = arguments[i].toString;
+                    }
+                }
+            }
+
+            return target;
+        },
+
+        create: function create(proto) {
+            var F = function () {};
+            F.prototype = proto;
+            return new F();
+        },
+
+        deepEqual: function deepEqual(a, b) {
+            if (sinon.match && sinon.match.isMatcher(a)) {
+                return a.test(b);
+            }
+            if (typeof a != "object" || typeof b != "object") {
+                return a === b;
+            }
+
+            if (isElement(a) || isElement(b)) {
+                return a === b;
+            }
+
+            if (a === b) {
+                return true;
+            }
+
+            if ((a === null && b !== null) || (a !== null && b === null)) {
+                return false;
+            }
+
+            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 (!deepEqual(a[prop], b[prop])) {
+                    return false;
+                }
+            }
+
+            for (prop in b) {
+                bLength += 1;
+            }
+
+            return aLength == bLength;
+        },
+
+        functionName: function functionName(func) {
+            var name = func.displayName || func.name;
+
+            // Use function decomposition as a last resort to get function
+            // name. Does not rely on function decomposition to work - if it
+            // doesn't debugging will be slightly less informative
+            // (i.e. toString will say 'spy' rather than 'myFunc').
+            if (!name) {
+                var matches = func.toString().match(/function ([^\s\(]+)/);
+                name = matches && matches[1];
+            }
+
+            return name;
+        },
+
+        functionToString: function toString() {
+            if (this.getCall && this.callCount) {
+                var thisValue, prop, i = this.callCount;
+
+                while (i--) {
+                    thisValue = this.getCall(i).thisValue;
+
+                    for (prop in thisValue) {
+                        if (thisValue[prop] === this) {
+                            return prop;
+                        }
+                    }
+                }
+            }
+
+            return this.displayName || "sinon fake";
+        },
+
+        getConfig: function (custom) {
+            var config = {};
+            custom = custom || {};
+            var defaults = sinon.defaultConfig;
+
+            for (var prop in defaults) {
+                if (defaults.hasOwnProperty(prop)) {
+                    config[prop] = custom.hasOwnProperty(prop) ? custom[prop] : defaults[prop];
+                }
+            }
+
+            return config;
+        },
+
+        format: function (val) {
+            return "" + val;
+        },
+
+        defaultConfig: {
+            injectIntoThis: true,
+            injectInto: null,
+            properties: ["spy", "stub", "mock", "clock", "server", "requests"],
+            useFakeTimers: true,
+            useFakeServer: true
+        },
+
+        timesInWords: function timesInWords(count) {
+            return count == 1 && "once" ||
+                count == 2 && "twice" ||
+                count == 3 && "thrice" ||
+                (count || 0) + " times";
+        },
+
+        calledInOrder: function (spies) {
+            for (var i = 1, l = spies.length; i < l; i++) {
+                if (!spies[i - 1].calledBefore(spies[i]) || !spies[i].called) {
+                    return false;
+                }
+            }
+
+            return true;
+        },
+
+        orderByFirstCall: function (spies) {
+            return spies.sort(function (a, b) {
+                // uuid, won't ever be equal
+                var aCall = a.getCall(0);
+                var bCall = b.getCall(0);
+                var aId = aCall && aCall.callId || -1;
+                var bId = bCall && bCall.callId || -1;
+
+                return aId < bId ? -1 : 1;
+            });
+        },
+
+        log: function () {},
+
+        logError: function (label, err) {
+            var msg = label + " threw exception: ";
+            sinon.log(msg + "[" + err.name + "] " + err.message);
+            if (err.stack) { sinon.log(err.stack); }
+
+            setTimeout(function () {
+                err.message = msg + err.message;
+                throw err;
+            }, 0);
+        },
+
+        typeOf: function (value) {
+            if (value === null) {
+                return "null";
+            }
+            else if (value === undefined) {
+                return "undefined";
+            }
+            var string = Object.prototype.toString.call(value);
+            return string.substring(8, string.length - 1).toLowerCase();
+        },
+
+        createStubInstance: function (constructor) {
+            if (typeof constructor !== "function") {
+                throw new TypeError("The constructor should be a function.");
+            }
+            return sinon.stub(sinon.create(constructor.prototype));
+        },
+
+        restore: function (object) {
+            if (object !== null && typeof object === "object") {
+                for (var prop in object) {
+                    if (isRestorable(object[prop])) {
+                        object[prop].restore();
+                    }
+                }
+            }
+            else if (isRestorable(object)) {
+                object.restore();
+            }
+        }
+    };
+
+    var isNode = typeof module !== "undefined" && module.exports;
+    var isAMD = typeof define === 'function' && typeof define.amd === 'object' && define.amd;
+
+    if (isAMD) {
+        define(function(){
+            return sinon;
+        });
+    } else if (isNode) {
+        try {
+            formatio = require("formatio");
+        } catch (e) {}
+        module.exports = sinon;
+        module.exports.spy = require("./sinon/spy");
+        module.exports.spyCall = require("./sinon/call");
+        module.exports.behavior = require("./sinon/behavior");
+        module.exports.stub = require("./sinon/stub");
+        module.exports.mock = require("./sinon/mock");
+        module.exports.collection = require("./sinon/collection");
+        module.exports.assert = require("./sinon/assert");
+        module.exports.sandbox = require("./sinon/sandbox");
+        module.exports.test = require("./sinon/test");
+        module.exports.testCase = require("./sinon/test_case");
+        module.exports.assert = require("./sinon/assert");
+        module.exports.match = require("./sinon/match");
+    }
+
+    if (formatio) {
+        var formatter = formatio.configure({ quoteStrings: false });
+        sinon.format = function () {
+            return formatter.ascii.apply(formatter, arguments);
+        };
+    } else if (isNode) {
+        try {
+            var util = require("util");
+            sinon.format = function (value) {
+                return typeof value == "object" && value.toString === Object.prototype.toString ? util.inspect(value) : value;
+            };
+        } catch (e) {
+            /* Node, but no util module - would be very old, but better safe than
+             sorry */
+        }
+    }
+
+    return sinon;
+}(typeof formatio == "object" && formatio));
+
+/* @depend ../sinon.js */
+/*jslint eqeqeq: false, onevar: false, plusplus: false*/
+/*global module, require, sinon*/
+/**
+ * Match functions
+ *
+ * @author Maximilian Antoni (mail@maxantoni.de)
+ * @license BSD
+ *
+ * Copyright (c) 2012 Maximilian Antoni
+ */
+
+(function (sinon) {
+    var commonJSModule = typeof module !== 'undefined' && module.exports;
+
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon) {
+        return;
+    }
+
+    function assertType(value, type, name) {
+        var actual = sinon.typeOf(value);
+        if (actual !== type) {
+            throw new TypeError("Expected type of " + name + " to be " +
+                type + ", but was " + actual);
+        }
+    }
+
+    var matcher = {
+        toString: function () {
+            return this.message;
+        }
+    };
+
+    function isMatcher(object) {
+        return matcher.isPrototypeOf(object);
+    }
+
+    function matchObject(expectation, actual) {
+        if (actual === null || actual === undefined) {
+            return false;
+        }
+        for (var key in expectation) {
+            if (expectation.hasOwnProperty(key)) {
+                var exp = expectation[key];
+                var act = actual[key];
+                if (match.isMatcher(exp)) {
+                    if (!exp.test(act)) {
+                        return false;
+                    }
+                } else if (sinon.typeOf(exp) === "object") {
+                    if (!matchObject(exp, act)) {
+                        return false;
+                    }
+                } else if (!sinon.deepEqual(exp, act)) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    matcher.or = function (m2) {
+        if (!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");
+
+    if (commonJSModule) {
+        module.exports = match;
+    } else {
+        sinon.match = match;
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+  * @depend ../sinon.js
+  * @depend match.js
+  */
+/*jslint eqeqeq: false, onevar: false, plusplus: false*/
+/*global module, require, sinon*/
+/**
+  * Spy calls
+  *
+  * @author Christian Johansen (christian@cjohansen.no)
+  * @author Maximilian Antoni (mail@maxantoni.de)
+  * @license BSD
+  *
+  * Copyright (c) 2010-2013 Christian Johansen
+  * Copyright (c) 2013 Maximilian Antoni
+  */
+
+(function (sinon) {
+    var commonJSModule = typeof module !== 'undefined' && module.exports;
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon) {
+        return;
+    }
+
+    function throwYieldError(proxy, text, args) {
+        var msg = sinon.functionName(proxy) + text;
+        if (args.length) {
+            msg += " Received [" + slice.call(args).join(", ") + "]";
+        }
+        throw new Error(msg);
+    }
+
+    var slice = Array.prototype.slice;
+
+    var callProto = {
+        calledOn: function calledOn(thisValue) {
+            if (sinon.match && sinon.match.isMatcher(thisValue)) {
+                return thisValue.test(this.thisValue);
+            }
+            return this.thisValue === thisValue;
+        },
+
+        calledWith: function calledWith() {
+            for (var i = 0, l = arguments.length; i < l; i += 1) {
+                if (!sinon.deepEqual(arguments[i], this.args[i])) {
+                    return false;
+                }
+            }
+
+            return true;
+        },
+
+        calledWithMatch: function calledWithMatch() {
+            for (var i = 0, l = arguments.length; i < l; i += 1) {
+                var actual = this.args[i];
+                var expectation = arguments[i];
+                if (!sinon.match || !sinon.match(expectation).test(actual)) {
+                    return false;
+                }
+            }
+            return true;
+        },
+
+        calledWithExactly: function calledWithExactly() {
+            return arguments.length == this.args.length &&
+                this.calledWith.apply(this, arguments);
+        },
+
+        notCalledWith: function notCalledWith() {
+            return !this.calledWith.apply(this, arguments);
+        },
+
+        notCalledWithMatch: function notCalledWithMatch() {
+            return !this.calledWithMatch.apply(this, arguments);
+        },
+
+        returned: function returned(value) {
+            return sinon.deepEqual(value, this.returnValue);
+        },
+
+        threw: function threw(error) {
+            if (typeof error === "undefined" || !this.exception) {
+                return !!this.exception;
+            }
+
+            return this.exception === error || this.exception.name === error;
+        },
+
+        calledWithNew: function calledWithNew() {
+            return this.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
+
+    if (commonJSModule) {
+        module.exports = createSpyCall;
+    } else {
+        sinon.spyCall = createSpyCall;
+    }
+}(typeof sinon == "object" && sinon || null));
+
+
+/**
+  * @depend ../sinon.js
+  * @depend call.js
+  */
+/*jslint eqeqeq: false, onevar: false, plusplus: false*/
+/*global module, require, sinon*/
+/**
+  * Spy functions
+  *
+  * @author Christian Johansen (christian@cjohansen.no)
+  * @license BSD
+  *
+  * Copyright (c) 2010-2013 Christian Johansen
+  */
+
+(function (sinon) {
+    var commonJSModule = typeof module !== 'undefined' && module.exports;
+    var push = Array.prototype.push;
+    var slice = Array.prototype.slice;
+    var callId = 0;
+
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon) {
+        return;
+    }
+
+    function spy(object, property) {
+        if (!property && typeof object == "function") {
+            return spy.create(object);
+        }
+
+        if (!object && !property) {
+            return spy.create(function () { });
+        }
+
+        var method = object[property];
+        return sinon.wrapMethod(object, property, spy.create(method));
+    }
+
+    function matchingFake(fakes, args, strict) {
+        if (!fakes) {
+            return;
+        }
+
+        for (var i = 0, l = fakes.length; i < l; i++) {
+            if (fakes[i].matches(args, strict)) {
+                return fakes[i];
+            }
+        }
+    }
+
+    function incrementCallCount() {
+        this.called = true;
+        this.callCount += 1;
+        this.notCalled = false;
+        this.calledOnce = this.callCount == 1;
+        this.calledTwice = this.callCount == 2;
+        this.calledThrice = this.callCount == 3;
+    }
+
+    function createCallProperties() {
+        this.firstCall = this.getCall(0);
+        this.secondCall = this.getCall(1);
+        this.thirdCall = this.getCall(2);
+        this.lastCall = this.getCall(this.callCount - 1);
+    }
+
+    var vars = "a,b,c,d,e,f,g,h,i,j,k,l";
+    function createProxy(func) {
+        // Retain the function length:
+        var p;
+        if (func.length) {
+            eval("p = (function proxy(" + vars.substring(0, func.length * 2 - 1) +
+                ") { return p.invoke(func, this, slice.call(arguments)); });");
+        }
+        else {
+            p = function proxy() {
+                return p.invoke(func, this, slice.call(arguments));
+            };
+        }
+        return p;
+    }
+
+    var uuid = 0;
+
+    // Public API
+    var spyApi = {
+        reset: function () {
+            this.called = false;
+            this.notCalled = true;
+            this.calledOnce = false;
+            this.calledTwice = false;
+            this.calledThrice = false;
+            this.callCount = 0;
+            this.firstCall = null;
+            this.secondCall = null;
+            this.thirdCall = null;
+            this.lastCall = null;
+            this.args = [];
+            this.returnValues = [];
+            this.thisValues = [];
+            this.exceptions = [];
+            this.callIds = [];
+            if (this.fakes) {
+                for (var i = 0; i < this.fakes.length; i++) {
+                    this.fakes[i].reset();
+                }
+            }
+        },
+
+        create: function create(func) {
+            var name;
+
+            if (typeof func != "function") {
+                func = function () { };
+            } else {
+                name = sinon.functionName(func);
+            }
+
+            var proxy = createProxy(func);
+
+            sinon.extend(proxy, spy);
+            delete proxy.create;
+            sinon.extend(proxy, func);
+
+            proxy.reset();
+            proxy.prototype = func.prototype;
+            proxy.displayName = name || "spy";
+            proxy.toString = sinon.functionToString;
+            proxy._create = sinon.spy.create;
+            proxy.id = "spy#" + uuid++;
+
+            return proxy;
+        },
+
+        invoke: function invoke(func, thisValue, args) {
+            var matching = matchingFake(this.fakes, args);
+            var exception, returnValue;
+
+            incrementCallCount.call(this);
+            push.call(this.thisValues, thisValue);
+            push.call(this.args, args);
+            push.call(this.callIds, callId++);
+
+            try {
+                if (matching) {
+                    returnValue = matching.invoke(func, thisValue, args);
+                } else {
+                    returnValue = (this.func || func).apply(thisValue, args);
+                }
+
+                var thisCall = this.getCall(this.callCount - 1);
+                if (thisCall.calledWithNew() && typeof returnValue !== 'object') {
+                    returnValue = thisValue;
+                }
+            } catch (e) {
+                exception = e;
+            }
+
+            push.call(this.exceptions, exception);
+            push.call(this.returnValues, returnValue);
+
+            createCallProperties.call(this);
+
+            if (exception !== undefined) {
+                throw exception;
+            }
+
+            return returnValue;
+        },
+
+        getCall: function getCall(i) {
+            if (i < 0 || i >= this.callCount) {
+                return null;
+            }
+
+            return sinon.spyCall(this, this.thisValues[i], this.args[i],
+                                    this.returnValues[i], this.exceptions[i],
+                                    this.callIds[i]);
+        },
+
+        getCalls: function () {
+            var calls = [];
+            var i;
+
+            for (i = 0; i < this.callCount; i++) {
+                calls.push(this.getCall(i));
+            }
+
+            return calls;
+        },
+
+        calledBefore: function calledBefore(spyFn) {
+            if (!this.called) {
+                return false;
+            }
+
+            if (!spyFn.called) {
+                return true;
+            }
+
+            return this.callIds[0] < spyFn.callIds[spyFn.callIds.length - 1];
+        },
+
+        calledAfter: function calledAfter(spyFn) {
+            if (!this.called || !spyFn.called) {
+                return false;
+            }
+
+            return this.callIds[this.callCount - 1] > spyFn.callIds[spyFn.callCount - 1];
+        },
+
+        withArgs: function () {
+            var args = slice.call(arguments);
+
+            if (this.fakes) {
+                var match = matchingFake(this.fakes, args, true);
+
+                if (match) {
+                    return match;
+                }
+            } else {
+                this.fakes = [];
+            }
+
+            var original = this;
+            var fake = this._create();
+            fake.matchingAguments = args;
+            fake.parent = this;
+            push.call(this.fakes, fake);
+
+            fake.withArgs = function () {
+                return original.withArgs.apply(original, arguments);
+            };
+
+            for (var i = 0; i < this.args.length; i++) {
+                if (fake.matches(this.args[i])) {
+                    incrementCallCount.call(fake);
+                    push.call(fake.thisValues, this.thisValues[i]);
+                    push.call(fake.args, this.args[i]);
+                    push.call(fake.returnValues, this.returnValues[i]);
+                    push.call(fake.exceptions, this.exceptions[i]);
+                    push.call(fake.callIds, this.callIds[i]);
+                }
+            }
+            createCallProperties.call(fake);
+
+            return fake;
+        },
+
+        matches: function (args, strict) {
+            var margs = this.matchingAguments;
+
+            if (margs.length <= args.length &&
+                sinon.deepEqual(margs, args.slice(0, margs.length))) {
+                return !strict || margs.length == args.length;
+            }
+        },
+
+        printf: function (format) {
+            var spy = this;
+            var args = slice.call(arguments, 1);
+            var formatter;
+
+            return (format || "").replace(/%(.)/g, function (match, specifyer) {
+                formatter = spyApi.formatters[specifyer];
+
+                if (typeof formatter == "function") {
+                    return formatter.call(null, spy, args);
+                } else if (!isNaN(parseInt(specifyer, 10))) {
+                    return sinon.format(args[specifyer - 1]);
+                }
+
+                return "%" + specifyer;
+            });
+        }
+    };
+
+    function delegateToCalls(method, matchAny, actual, notCalled) {
+        spyApi[method] = function () {
+            if (!this.called) {
+                if (notCalled) {
+                    return notCalled.apply(this, arguments);
+                }
+                return false;
+            }
+
+            var currentCall;
+            var matches = 0;
+
+            for (var i = 0, l = this.callCount; i < l; i += 1) {
+                currentCall = this.getCall(i);
+
+                if (currentCall[actual || method].apply(currentCall, arguments)) {
+                    matches += 1;
+
+                    if (matchAny) {
+                        return true;
+                    }
+                }
+            }
+
+            return matches === this.callCount;
+        };
+    }
+
+    delegateToCalls("calledOn", true);
+    delegateToCalls("alwaysCalledOn", false, "calledOn");
+    delegateToCalls("calledWith", true);
+    delegateToCalls("calledWithMatch", true);
+    delegateToCalls("alwaysCalledWith", false, "calledWith");
+    delegateToCalls("alwaysCalledWithMatch", false, "calledWithMatch");
+    delegateToCalls("calledWithExactly", true);
+    delegateToCalls("alwaysCalledWithExactly", false, "calledWithExactly");
+    delegateToCalls("neverCalledWith", false, "notCalledWith",
+        function () { return true; });
+    delegateToCalls("neverCalledWithMatch", false, "notCalledWithMatch",
+        function () { return true; });
+    delegateToCalls("threw", true);
+    delegateToCalls("alwaysThrew", false, "threw");
+    delegateToCalls("returned", true);
+    delegateToCalls("alwaysReturned", false, "returned");
+    delegateToCalls("calledWithNew", true);
+    delegateToCalls("alwaysCalledWithNew", false, "calledWithNew");
+    delegateToCalls("callArg", false, "callArgWith", function () {
+        throw new Error(this.toString() + " cannot call arg since it was not yet invoked.");
+    });
+    spyApi.callArgWith = spyApi.callArg;
+    delegateToCalls("callArgOn", false, "callArgOnWith", function () {
+        throw new Error(this.toString() + " cannot call arg since it was not yet invoked.");
+    });
+    spyApi.callArgOnWith = spyApi.callArgOn;
+    delegateToCalls("yield", false, "yield", function () {
+        throw new Error(this.toString() + " cannot yield since it was not yet invoked.");
+    });
+    // "invokeCallback" is an alias for "yield" since "yield" is invalid in strict mode.
+    spyApi.invokeCallback = spyApi.yield;
+    delegateToCalls("yieldOn", false, "yieldOn", function () {
+        throw new Error(this.toString() + " cannot yield since it was not yet invoked.");
+    });
+    delegateToCalls("yieldTo", false, "yieldTo", function (property) {
+        throw new Error(this.toString() + " cannot yield to '" + property +
+            "' since it was not yet invoked.");
+    });
+    delegateToCalls("yieldToOn", false, "yieldToOn", function (property) {
+        throw new Error(this.toString() + " cannot yield to '" + property +
+            "' since it was not yet invoked.");
+    });
+
+    spyApi.formatters = {
+        "c": function (spy) {
+            return sinon.timesInWords(spy.callCount);
+        },
+
+        "n": function (spy) {
+            return spy.toString();
+        },
+
+        "C": function (spy) {
+            var calls = [];
+
+            for (var i = 0, l = spy.callCount; i < l; ++i) {
+                var stringifiedCall = "    " + spy.getCall(i).toString();
+                if (/\n/.test(calls[i - 1])) {
+                    stringifiedCall = "\n" + stringifiedCall;
+                }
+                push.call(calls, stringifiedCall);
+            }
+
+            return calls.length > 0 ? "\n" + calls.join("\n") : "";
+        },
+
+        "t": function (spy) {
+            var objects = [];
+
+            for (var i = 0, l = spy.callCount; i < l; ++i) {
+                push.call(objects, sinon.format(spy.thisValues[i]));
+            }
+
+            return objects.join(", ");
+        },
+
+        "*": function (spy, args) {
+            var formatted = [];
+
+            for (var i = 0, l = args.length; i < l; ++i) {
+                push.call(formatted, sinon.format(args[i]));
+            }
+
+            return formatted.join(", ");
+        }
+    };
+
+    sinon.extend(spy, spyApi);
+
+    spy.spyCall = sinon.spyCall;
+
+    if (commonJSModule) {
+        module.exports = spy;
+    } else {
+        sinon.spy = spy;
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+ * @depend ../sinon.js
+ */
+/*jslint eqeqeq: false, onevar: false*/
+/*global module, require, sinon, process, setImmediate, setTimeout*/
+/**
+ * Stub behavior
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @author Tim Fischbach (mail@timfischbach.de)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function (sinon) {
+    var commonJSModule = typeof module !== 'undefined' && module.exports;
+
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon) {
+        return;
+    }
+
+    var slice = Array.prototype.slice;
+    var join = Array.prototype.join;
+    var proto;
+
+    var nextTick = (function () {
+        if (typeof process === "object" && typeof process.nextTick === "function") {
+            return process.nextTick;
+        } else if (typeof setImmediate === "function") {
+            return setImmediate;
+        } else {
+            return function (callback) {
+                setTimeout(callback, 0);
+            };
+        }
+    })();
+
+    function throwsException(error, message) {
+        if (typeof error == "string") {
+            this.exception = new Error(message || "");
+            this.exception.name = error;
+        } else if (!error) {
+            this.exception = new Error("Error");
+        } else {
+            this.exception = error;
+        }
+
+        return this;
+    }
+
+    function getCallback(behavior, args) {
+        var callArgAt = behavior.callArgAt;
+
+        if (callArgAt < 0) {
+            var callArgProp = behavior.callArgProp;
+
+            for (var i = 0, l = args.length; i < l; ++i) {
+                if (!callArgProp && typeof args[i] == "function") {
+                    return args[i];
+                }
+
+                if (callArgProp && args[i] &&
+                    typeof args[i][callArgProp] == "function") {
+                    return args[i][callArgProp];
+                }
+            }
+
+            return null;
+        }
+
+        return args[callArgAt];
+    }
+
+    function getCallbackError(behavior, func, args) {
+        if (behavior.callArgAt < 0) {
+            var msg;
+
+            if (behavior.callArgProp) {
+                msg = sinon.functionName(behavior.stub) +
+                    " expected to yield to '" + behavior.callArgProp +
+                    "', but no object with such a property was passed.";
+            } else {
+                msg = sinon.functionName(behavior.stub) +
+                    " expected to yield, but no callback was passed.";
+            }
+
+            if (args.length > 0) {
+                msg += " Received [" + join.call(args, ", ") + "]";
+            }
+
+            return msg;
+        }
+
+        return "argument at index " + behavior.callArgAt + " is not a function: " + func;
+    }
+
+    function callCallback(behavior, args) {
+        if (typeof behavior.callArgAt == "number") {
+            var func = getCallback(behavior, args);
+
+            if (typeof func != "function") {
+                throw new TypeError(getCallbackError(behavior, func, args));
+            }
+
+            if (behavior.callbackAsync) {
+                nextTick(function() {
+                    func.apply(behavior.callbackContext, behavior.callbackArguments);
+                });
+            } else {
+                func.apply(behavior.callbackContext, behavior.callbackArguments);
+            }
+        }
+    }
+
+    proto = {
+        create: function(stub) {
+            var behavior = sinon.extend({}, sinon.behavior);
+            delete behavior.create;
+            behavior.stub = stub;
+
+            return behavior;
+        },
+
+        isPresent: function() {
+            return (typeof this.callArgAt == 'number' ||
+                    this.exception ||
+                    typeof this.returnArgAt == 'number' ||
+                    this.returnThis ||
+                    this.returnValueDefined);
+        },
+
+        invoke: function(context, args) {
+            callCallback(this, args);
+
+            if (this.exception) {
+                throw this.exception;
+            } else if (typeof this.returnArgAt == 'number') {
+                return args[this.returnArgAt];
+            } else if (this.returnThis) {
+                return context;
+            }
+
+            return this.returnValue;
+        },
+
+        onCall: function(index) {
+            return this.stub.onCall(index);
+        },
+
+        onFirstCall: function() {
+            return this.stub.onFirstCall();
+        },
+
+        onSecondCall: function() {
+            return this.stub.onSecondCall();
+        },
+
+        onThirdCall: function() {
+            return this.stub.onThirdCall();
+        },
+
+        withArgs: function(/* arguments */) {
+            throw new Error('Defining a stub by invoking "stub.onCall(...).withArgs(...)" is not supported. ' +
+                            'Use "stub.withArgs(...).onCall(...)" to define sequential behavior for calls with certain arguments.');
+        },
+
+        callsArg: function callsArg(pos) {
+            if (typeof pos != "number") {
+                throw new TypeError("argument index is not number");
+            }
+
+            this.callArgAt = pos;
+            this.callbackArguments = [];
+            this.callbackContext = undefined;
+            this.callArgProp = undefined;
+            this.callbackAsync = false;
+
+            return this;
+        },
+
+        callsArgOn: function callsArgOn(pos, context) {
+            if (typeof pos != "number") {
+                throw new TypeError("argument index is not number");
+            }
+            if (typeof context != "object") {
+                throw new TypeError("argument context is not an object");
+            }
+
+            this.callArgAt = pos;
+            this.callbackArguments = [];
+            this.callbackContext = context;
+            this.callArgProp = undefined;
+            this.callbackAsync = false;
+
+            return this;
+        },
+
+        callsArgWith: function callsArgWith(pos) {
+            if (typeof pos != "number") {
+                throw new TypeError("argument index is not number");
+            }
+
+            this.callArgAt = pos;
+            this.callbackArguments = slice.call(arguments, 1);
+            this.callbackContext = undefined;
+            this.callArgProp = undefined;
+            this.callbackAsync = false;
+
+            return this;
+        },
+
+        callsArgOnWith: function callsArgWith(pos, context) {
+            if (typeof pos != "number") {
+                throw new TypeError("argument index is not number");
+            }
+            if (typeof context != "object") {
+                throw new TypeError("argument context is not an object");
+            }
+
+            this.callArgAt = pos;
+            this.callbackArguments = slice.call(arguments, 2);
+            this.callbackContext = context;
+            this.callArgProp = undefined;
+            this.callbackAsync = false;
+
+            return this;
+        },
+
+        yields: function () {
+            this.callArgAt = -1;
+            this.callbackArguments = slice.call(arguments, 0);
+            this.callbackContext = undefined;
+            this.callArgProp = undefined;
+            this.callbackAsync = false;
+
+            return this;
+        },
+
+        yieldsOn: function (context) {
+            if (typeof context != "object") {
+                throw new TypeError("argument context is not an object");
+            }
+
+            this.callArgAt = -1;
+            this.callbackArguments = slice.call(arguments, 1);
+            this.callbackContext = context;
+            this.callArgProp = undefined;
+            this.callbackAsync = false;
+
+            return this;
+        },
+
+        yieldsTo: function (prop) {
+            this.callArgAt = -1;
+            this.callbackArguments = slice.call(arguments, 1);
+            this.callbackContext = undefined;
+            this.callArgProp = prop;
+            this.callbackAsync = false;
+
+            return this;
+        },
+
+        yieldsToOn: function (prop, context) {
+            if (typeof context != "object") {
+                throw new TypeError("argument context is not an object");
+            }
+
+            this.callArgAt = -1;
+            this.callbackArguments = slice.call(arguments, 2);
+            this.callbackContext = context;
+            this.callArgProp = prop;
+            this.callbackAsync = false;
+
+            return this;
+        },
+
+
+        "throws": throwsException,
+        throwsException: throwsException,
+
+        returns: function returns(value) {
+            this.returnValue = value;
+            this.returnValueDefined = true;
+
+            return this;
+        },
+
+        returnsArg: function returnsArg(pos) {
+            if (typeof pos != "number") {
+                throw new TypeError("argument index is not number");
+            }
+
+            this.returnArgAt = pos;
+
+            return this;
+        },
+
+        returnsThis: function returnsThis() {
+            this.returnThis = true;
+
+            return this;
+        }
+    };
+
+    // create asynchronous versions of callsArg* and yields* methods
+    for (var method in proto) {
+        // need to avoid creating anotherasync versions of the newly added async methods
+        if (proto.hasOwnProperty(method) &&
+            method.match(/^(callsArg|yields)/) &&
+            !method.match(/Async/)) {
+            proto[method + 'Async'] = (function (syncFnName) {
+                return function () {
+                    var result = this[syncFnName].apply(this, arguments);
+                    this.callbackAsync = true;
+                    return result;
+                };
+            })(method);
+        }
+    }
+
+    if (commonJSModule) {
+        module.exports = proto;
+    } else {
+        sinon.behavior = proto;
+    }
+}(typeof sinon == "object" && sinon || null));
+/**
+ * @depend ../sinon.js
+ * @depend spy.js
+ * @depend behavior.js
+ */
+/*jslint eqeqeq: false, onevar: false*/
+/*global module, require, sinon*/
+/**
+ * Stub functions
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function (sinon) {
+    var commonJSModule = typeof module !== 'undefined' && module.exports;
+
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon) {
+        return;
+    }
+
+    function stub(object, property, func) {
+        if (!!func && typeof func != "function") {
+            throw new TypeError("Custom stub should be function");
+        }
+
+        var wrapper;
+
+        if (func) {
+            wrapper = sinon.spy && sinon.spy.create ? sinon.spy.create(func) : func;
+        } else {
+            wrapper = stub.create();
+        }
+
+        if (!object && typeof property === "undefined") {
+            return sinon.stub.create();
+        }
+
+        if (typeof property === "undefined" && typeof object == "object") {
+            for (var prop in object) {
+                if (typeof object[prop] === "function") {
+                    stub(object, prop);
+                }
+            }
+
+            return object;
+        }
+
+        return sinon.wrapMethod(object, property, wrapper);
+    }
+
+    function getDefaultBehavior(stub) {
+        return stub.defaultBehavior || getParentBehaviour(stub) || sinon.behavior.create(stub);
+    }
+
+    function getParentBehaviour(stub) {
+        return (stub.parent && getCurrentBehavior(stub.parent));
+    }
+
+    function getCurrentBehavior(stub) {
+        var behavior = stub.behaviors[stub.callCount - 1];
+        return behavior && behavior.isPresent() ? behavior : getDefaultBehavior(stub);
+    }
+
+    var uuid = 0;
+
+    sinon.extend(stub, (function () {
+        var proto = {
+            create: function create() {
+                var functionStub = function () {
+                    return getCurrentBehavior(functionStub).invoke(this, arguments);
+                };
+
+                functionStub.id = "stub#" + uuid++;
+                var orig = functionStub;
+                functionStub = sinon.spy.create(functionStub);
+                functionStub.func = orig;
+
+                sinon.extend(functionStub, stub);
+                functionStub._create = sinon.stub.create;
+                functionStub.displayName = "stub";
+                functionStub.toString = sinon.functionToString;
+
+                functionStub.defaultBehavior = null;
+                functionStub.behaviors = [];
+
+                return functionStub;
+            },
+
+            resetBehavior: function () {
+                var i;
+
+                this.defaultBehavior = null;
+                this.behaviors = [];
+
+                delete this.returnValue;
+                delete this.returnArgAt;
+                this.returnThis = false;
+
+                if (this.fakes) {
+                    for (i = 0; i < this.fakes.length; i++) {
+                        this.fakes[i].resetBehavior();
+                    }
+                }
+            },
+
+            onCall: function(index) {
+                if (!this.behaviors[index]) {
+                    this.behaviors[index] = sinon.behavior.create(this);
+                }
+
+                return this.behaviors[index];
+            },
+
+            onFirstCall: function() {
+                return this.onCall(0);
+            },
+
+            onSecondCall: function() {
+                return this.onCall(1);
+            },
+
+            onThirdCall: function() {
+                return this.onCall(2);
+            }
+        };
+
+        for (var method in sinon.behavior) {
+            if (sinon.behavior.hasOwnProperty(method) &&
+                !proto.hasOwnProperty(method) &&
+                method != 'create' &&
+                method != 'withArgs' &&
+                method != 'invoke') {
+                proto[method] = (function(behaviorMethod) {
+                    return function() {
+                        this.defaultBehavior = this.defaultBehavior || sinon.behavior.create(this);
+                        this.defaultBehavior[behaviorMethod].apply(this.defaultBehavior, arguments);
+                        return this;
+                    };
+                }(method));
+            }
+        }
+
+        return proto;
+    }()));
+
+    if (commonJSModule) {
+        module.exports = stub;
+    } else {
+        sinon.stub = stub;
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+ * @depend ../sinon.js
+ * @depend stub.js
+ */
+/*jslint eqeqeq: false, onevar: false, nomen: false*/
+/*global module, require, sinon*/
+/**
+ * Mock functions.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function (sinon) {
+    var commonJSModule = typeof module !== 'undefined' && module.exports;
+    var push = [].push;
+    var match;
+
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon) {
+        return;
+    }
+
+    match = sinon.match;
+
+    if (!match && commonJSModule) {
+        match = require("./match");
+    }
+
+    function mock(object) {
+        if (!object) {
+            return sinon.expectation.create("Anonymous mock");
+        }
+
+        return mock.create(object);
+    }
+
+    sinon.mock = mock;
+
+    sinon.extend(mock, (function () {
+        function each(collection, callback) {
+            if (!collection) {
+                return;
+            }
+
+            for (var i = 0, l = collection.length; i < l; i += 1) {
+                callback(collection[i]);
+            }
+        }
+
+        return {
+            create: function create(object) {
+                if (!object) {
+                    throw new TypeError("object is null");
+                }
+
+                var mockObject = sinon.extend({}, mock);
+                mockObject.object = object;
+                delete mockObject.create;
+
+                return mockObject;
+            },
+
+            expects: function expects(method) {
+                if (!method) {
+                    throw new TypeError("method is falsy");
+                }
+
+                if (!this.expectations) {
+                    this.expectations = {};
+                    this.proxies = [];
+                }
+
+                if (!this.expectations[method]) {
+                    this.expectations[method] = [];
+                    var mockObject = this;
+
+                    sinon.wrapMethod(this.object, method, function () {
+                        return mockObject.invokeMethod(method, this, arguments);
+                    });
+
+                    push.call(this.proxies, method);
+                }
+
+                var expectation = sinon.expectation.create(method);
+                push.call(this.expectations[method], expectation);
+
+                return expectation;
+            },
+
+            restore: function restore() {
+                var object = this.object;
+
+                each(this.proxies, function (proxy) {
+                    if (typeof object[proxy].restore == "function") {
+                        object[proxy].restore();
+                    }
+                });
+            },
+
+            verify: function verify() {
+                var expectations = this.expectations || {};
+                var messages = [], met = [];
+
+                each(this.proxies, function (proxy) {
+                    each(expectations[proxy], function (expectation) {
+                        if (!expectation.met()) {
+                            push.call(messages, expectation.toString());
+                        } else {
+                            push.call(met, expectation.toString());
+                        }
+                    });
+                });
+
+                this.restore();
+
+                if (messages.length > 0) {
+                    sinon.expectation.fail(messages.concat(met).join("\n"));
+                } else {
+                    sinon.expectation.pass(messages.concat(met).join("\n"));
+                }
+
+                return true;
+            },
+
+            invokeMethod: function invokeMethod(method, thisValue, args) {
+                var expectations = this.expectations && this.expectations[method];
+                var length = expectations && expectations.length || 0, i;
+
+                for (i = 0; i < length; i += 1) {
+                    if (!expectations[i].met() &&
+                        expectations[i].allowsCall(thisValue, args)) {
+                        return expectations[i].apply(thisValue, args);
+                    }
+                }
+
+                var messages = [], available, exhausted = 0;
+
+                for (i = 0; i < length; i += 1) {
+                    if (expectations[i].allowsCall(thisValue, args)) {
+                        available = available || expectations[i];
+                    } else {
+                        exhausted += 1;
+                    }
+                    push.call(messages, "    " + expectations[i].toString());
+                }
+
+                if (exhausted === 0) {
+                    return available.apply(thisValue, args);
+                }
+
+                messages.unshift("Unexpected call: " + sinon.spyCall.toString.call({
+                    proxy: method,
+                    args: args
+                }));
+
+                sinon.expectation.fail(messages.join("\n"));
+            }
+        };
+    }()));
+
+    var times = sinon.timesInWords;
+
+    sinon.expectation = (function () {
+        var slice = Array.prototype.slice;
+        var _invoke = sinon.spy.invoke;
+
+        function callCountInWords(callCount) {
+            if (callCount == 0) {
+                return "never called";
+            } else {
+                return "called " + times(callCount);
+            }
+        }
+
+        function expectedCallCountInWords(expectation) {
+            var min = expectation.minCalls;
+            var max = expectation.maxCalls;
+
+            if (typeof min == "number" && typeof max == "number") {
+                var str = times(min);
+
+                if (min != max) {
+                    str = "at least " + str + " and at most " + times(max);
+                }
+
+                return str;
+            }
+
+            if (typeof min == "number") {
+                return "at least " + times(min);
+            }
+
+            return "at most " + times(max);
+        }
+
+        function receivedMinCalls(expectation) {
+            var hasMinLimit = typeof expectation.minCalls == "number";
+            return !hasMinLimit || expectation.callCount >= expectation.minCalls;
+        }
+
+        function receivedMaxCalls(expectation) {
+            if (typeof expectation.maxCalls != "number") {
+                return false;
+            }
+
+            return expectation.callCount == expectation.maxCalls;
+        }
+
+        function verifyMatcher(possibleMatcher, arg){
+            if (match && match.isMatcher(possibleMatcher)) {
+                return possibleMatcher.test(arg);
+            } else {
+                return true;
+            }
+        }
+
+        return {
+            minCalls: 1,
+            maxCalls: 1,
+
+            create: function create(methodName) {
+                var expectation = sinon.extend(sinon.stub.create(), sinon.expectation);
+                delete expectation.create;
+                expectation.method = methodName;
+
+                return expectation;
+            },
+
+            invoke: function invoke(func, thisValue, args) {
+                this.verifyCallAllowed(thisValue, args);
+
+                return _invoke.apply(this, arguments);
+            },
+
+            atLeast: function atLeast(num) {
+                if (typeof num != "number") {
+                    throw new TypeError("'" + num + "' is not number");
+                }
+
+                if (!this.limitsSet) {
+                    this.maxCalls = null;
+                    this.limitsSet = true;
+                }
+
+                this.minCalls = num;
+
+                return this;
+            },
+
+            atMost: function atMost(num) {
+                if (typeof num != "number") {
+                    throw new TypeError("'" + num + "' is not number");
+                }
+
+                if (!this.limitsSet) {
+                    this.minCalls = null;
+                    this.limitsSet = true;
+                }
+
+                this.maxCalls = num;
+
+                return this;
+            },
+
+            never: function never() {
+                return this.exactly(0);
+            },
+
+            once: function once() {
+                return this.exactly(1);
+            },
+
+            twice: function twice() {
+                return this.exactly(2);
+            },
+
+            thrice: function thrice() {
+                return this.exactly(3);
+            },
+
+            exactly: function exactly(num) {
+                if (typeof num != "number") {
+                    throw new TypeError("'" + num + "' is not a number");
+                }
+
+                this.atLeast(num);
+                return this.atMost(num);
+            },
+
+            met: function met() {
+                return !this.failed && receivedMinCalls(this);
+            },
+
+            verifyCallAllowed: function verifyCallAllowed(thisValue, args) {
+                if (receivedMaxCalls(this)) {
+                    this.failed = true;
+                    sinon.expectation.fail(this.method + " already called " + times(this.maxCalls));
+                }
+
+                if ("expectedThis" in this && this.expectedThis !== thisValue) {
+                    sinon.expectation.fail(this.method + " called with " + thisValue + " as thisValue, expected " +
+                        this.expectedThis);
+                }
+
+                if (!("expectedArguments" in this)) {
+                    return;
+                }
+
+                if (!args) {
+                    sinon.expectation.fail(this.method + " received no arguments, expected " +
+                        sinon.format(this.expectedArguments));
+                }
+
+                if (args.length < this.expectedArguments.length) {
+                    sinon.expectation.fail(this.method + " received too few arguments (" + sinon.format(args) +
+                        "), expected " + sinon.format(this.expectedArguments));
+                }
+
+                if (this.expectsExactArgCount &&
+                    args.length != this.expectedArguments.length) {
+                    sinon.expectation.fail(this.method + " received too many arguments (" + sinon.format(args) +
+                        "), expected " + sinon.format(this.expectedArguments));
+                }
+
+                for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {
+
+                    if (!verifyMatcher(this.expectedArguments[i],args[i])) {
+                        sinon.expectation.fail(this.method + " received wrong arguments " + sinon.format(args) +
+                            ", didn't match " + this.expectedArguments.toString());
+                    }
+
+                    if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {
+                        sinon.expectation.fail(this.method + " received wrong arguments " + sinon.format(args) +
+                            ", expected " + sinon.format(this.expectedArguments));
+                    }
+                }
+            },
+
+            allowsCall: function allowsCall(thisValue, args) {
+                if (this.met() && receivedMaxCalls(this)) {
+                    return false;
+                }
+
+                if ("expectedThis" in this && this.expectedThis !== thisValue) {
+                    return false;
+                }
+
+                if (!("expectedArguments" in this)) {
+                    return true;
+                }
+
+                args = args || [];
+
+                if (args.length < this.expectedArguments.length) {
+                    return false;
+                }
+
+                if (this.expectsExactArgCount &&
+                    args.length != this.expectedArguments.length) {
+                    return false;
+                }
+
+                for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {
+                    if (!verifyMatcher(this.expectedArguments[i],args[i])) {
+                        return false;
+                    }
+
+                    if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {
+                        return false;
+                    }
+                }
+
+                return true;
+            },
+
+            withArgs: function withArgs() {
+                this.expectedArguments = slice.call(arguments);
+                return this;
+            },
+
+            withExactArgs: function withExactArgs() {
+                this.withArgs.apply(this, arguments);
+                this.expectsExactArgCount = true;
+                return this;
+            },
+
+            on: function on(thisValue) {
+                this.expectedThis = thisValue;
+                return this;
+            },
+
+            toString: function () {
+                var args = (this.expectedArguments || []).slice();
+
+                if (!this.expectsExactArgCount) {
+                    push.call(args, "[...]");
+                }
+
+                var callStr = sinon.spyCall.toString.call({
+                    proxy: this.method || "anonymous mock expectation",
+                    args: args
+                });
+
+                var message = callStr.replace(", [...", "[, ...") + " " +
+                    expectedCallCountInWords(this);
+
+                if (this.met()) {
+                    return "Expectation met: " + message;
+                }
+
+                return "Expected " + message + " (" +
+                    callCountInWords(this.callCount) + ")";
+            },
+
+            verify: function verify() {
+                if (!this.met()) {
+                    sinon.expectation.fail(this.toString());
+                } else {
+                    sinon.expectation.pass(this.toString());
+                }
+
+                return true;
+            },
+
+            pass: function(message) {
+              sinon.assert.pass(message);
+            },
+            fail: function (message) {
+                var exception = new Error(message);
+                exception.name = "ExpectationError";
+
+                throw exception;
+            }
+        };
+    }());
+
+    if (commonJSModule) {
+        module.exports = mock;
+    } else {
+        sinon.mock = mock;
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+ * @depend ../sinon.js
+ * @depend stub.js
+ * @depend mock.js
+ */
+/*jslint eqeqeq: false, onevar: false, forin: true*/
+/*global module, require, sinon*/
+/**
+ * Collections of stubs, spies and mocks.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function (sinon) {
+    var commonJSModule = typeof module !== 'undefined' && module.exports;
+    var push = [].push;
+    var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon) {
+        return;
+    }
+
+    function getFakes(fakeCollection) {
+        if (!fakeCollection.fakes) {
+            fakeCollection.fakes = [];
+        }
+
+        return fakeCollection.fakes;
+    }
+
+    function each(fakeCollection, method) {
+        var fakes = getFakes(fakeCollection);
+
+        for (var i = 0, l = fakes.length; i < l; i += 1) {
+            if (typeof fakes[i][method] == "function") {
+                fakes[i][method]();
+            }
+        }
+    }
+
+    function compact(fakeCollection) {
+        var fakes = getFakes(fakeCollection);
+        var i = 0;
+        while (i < fakes.length) {
+          fakes.splice(i, 1);
+        }
+    }
+
+    var collection = {
+        verify: function resolve() {
+            each(this, "verify");
+        },
+
+        restore: function restore() {
+            each(this, "restore");
+            compact(this);
+        },
+
+        verifyAndRestore: function verifyAndRestore() {
+            var exception;
+
+            try {
+                this.verify();
+            } catch (e) {
+                exception = e;
+            }
+
+            this.restore();
+
+            if (exception) {
+                throw exception;
+            }
+        },
+
+        add: function add(fake) {
+            push.call(getFakes(this), fake);
+            return fake;
+        },
+
+        spy: function spy() {
+            return this.add(sinon.spy.apply(sinon, arguments));
+        },
+
+        stub: function stub(object, property, value) {
+            if (property) {
+                var original = object[property];
+
+                if (typeof original != "function") {
+                    if (!hasOwnProperty.call(object, property)) {
+                        throw new TypeError("Cannot stub non-existent own property " + property);
+                    }
+
+                    object[property] = value;
+
+                    return this.add({
+                        restore: function () {
+                            object[property] = original;
+                        }
+                    });
+                }
+            }
+            if (!property && !!object && typeof object == "object") {
+                var stubbedObj = sinon.stub.apply(sinon, arguments);
+
+                for (var prop in stubbedObj) {
+                    if (typeof stubbedObj[prop] === "function") {
+                        this.add(stubbedObj[prop]);
+                    }
+                }
+
+                return stubbedObj;
+            }
+
+            return this.add(sinon.stub.apply(sinon, arguments));
+        },
+
+        mock: function mock() {
+            return this.add(sinon.mock.apply(sinon, arguments));
+        },
+
+        inject: function inject(obj) {
+            var col = this;
+
+            obj.spy = function () {
+                return col.spy.apply(col, arguments);
+            };
+
+            obj.stub = function () {
+                return col.stub.apply(col, arguments);
+            };
+
+            obj.mock = function () {
+                return col.mock.apply(col, arguments);
+            };
+
+            return obj;
+        }
+    };
+
+    if (commonJSModule) {
+        module.exports = collection;
+    } else {
+        sinon.collection = collection;
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/*jslint eqeqeq: false, plusplus: false, evil: true, onevar: false, browser: true, forin: false*/
+/*global module, require, window*/
+/**
+ * Fake timer API
+ * setTimeout
+ * setInterval
+ * clearTimeout
+ * clearInterval
+ * tick
+ * reset
+ * Date
+ *
+ * Inspired by jsUnitMockTimeOut from JsUnit
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+if (typeof sinon == "undefined") {
+    var sinon = {};
+}
+
+(function (global) {
+    var id = 1;
+
+    function addTimer(args, recurring) {
+        if (args.length === 0) {
+            throw new Error("Function requires at least 1 parameter");
+        }
+
+        if (typeof args[0] === "undefined") {
+            throw new Error("Callback must be provided to timer calls");
+        }
+
+        var toId = id++;
+        var delay = args[1] || 0;
+
+        if (!this.timeouts) {
+            this.timeouts = {};
+        }
+
+        this.timeouts[toId] = {
+            id: toId,
+            func: args[0],
+            callAt: this.now + delay,
+            invokeArgs: Array.prototype.slice.call(args, 2)
+        };
+
+        if (recurring === true) {
+            this.timeouts[toId].interval = delay;
+        }
+
+        return toId;
+    }
+
+    function parseTime(str) {
+        if (!str) {
+            return 0;
+        }
+
+        var strings = str.split(":");
+        var l = strings.length, i = l;
+        var ms = 0, parsed;
+
+        if (l > 3 || !/^(\d\d:){0,2}\d\d?$/.test(str)) {
+            throw new Error("tick only understands numbers and 'h:m:s'");
+        }
+
+        while (i--) {
+            parsed = parseInt(strings[i], 10);
+
+            if (parsed >= 60) {
+                throw new Error("Invalid time " + str);
+            }
+
+            ms += parsed * Math.pow(60, (l - i - 1));
+        }
+
+        return ms * 1000;
+    }
+
+    function createObject(object) {
+        var newObject;
+
+        if (Object.create) {
+            newObject = Object.create(object);
+        } else {
+            var F = function () {};
+            F.prototype = object;
+            newObject = new F();
+        }
+
+        newObject.Date.clock = newObject;
+        return newObject;
+    }
+
+    sinon.clock = {
+        now: 0,
+
+        create: function create(now) {
+            var clock = createObject(this);
+
+            if (typeof now == "number") {
+                clock.now = now;
+            }
+
+            if (!!now && typeof now == "object") {
+                throw new TypeError("now should be milliseconds since UNIX epoch");
+            }
+
+            return clock;
+        },
+
+        setTimeout: function setTimeout(callback, timeout) {
+            return addTimer.call(this, arguments, false);
+        },
+
+        clearTimeout: function clearTimeout(timerId) {
+            if (!this.timeouts) {
+                this.timeouts = [];
+            }
+
+            if (timerId in this.timeouts) {
+                delete this.timeouts[timerId];
+            }
+        },
+
+        setInterval: function setInterval(callback, timeout) {
+            return addTimer.call(this, arguments, true);
+        },
+
+        clearInterval: function clearInterval(timerId) {
+            this.clearTimeout(timerId);
+        },
+
+        setImmediate: function setImmediate(callback) {
+            var passThruArgs = Array.prototype.slice.call(arguments, 1);
+
+            return addTimer.call(this, [callback, 0].concat(passThruArgs), false);
+        },
+
+        clearImmediate: function clearImmediate(timerId) {
+            this.clearTimeout(timerId);
+        },
+
+        tick: function tick(ms) {
+            ms = typeof ms == "number" ? ms : parseTime(ms);
+            var tickFrom = this.now, tickTo = this.now + ms, previous = this.now;
+            var timer = this.firstTimerInRange(tickFrom, tickTo);
+
+            var firstException;
+            while (timer && tickFrom <= tickTo) {
+                if (this.timeouts[timer.id]) {
+                    tickFrom = this.now = timer.callAt;
+                    try {
+                      this.callTimer(timer);
+                    } catch (e) {
+                      firstException = firstException || e;
+                    }
+                }
+
+                timer = this.firstTimerInRange(previous, tickTo);
+                previous = tickFrom;
+            }
+
+            this.now = tickTo;
+
+            if (firstException) {
+              throw firstException;
+            }
+
+            return this.now;
+        },
+
+        firstTimerInRange: function (from, to) {
+            var timer, smallest = null, originalTimer;
+
+            for (var id in this.timeouts) {
+                if (this.timeouts.hasOwnProperty(id)) {
+                    if (this.timeouts[id].callAt < from || this.timeouts[id].callAt > to) {
+                        continue;
+                    }
+
+                    if (smallest === null || this.timeouts[id].callAt < smallest) {
+                        originalTimer = this.timeouts[id];
+                        smallest = this.timeouts[id].callAt;
+
+                        timer = {
+                            func: this.timeouts[id].func,
+                            callAt: this.timeouts[id].callAt,
+                            interval: this.timeouts[id].interval,
+                            id: this.timeouts[id].id,
+                            invokeArgs: this.timeouts[id].invokeArgs
+                        };
+                    }
+                }
+            }
+
+            return timer || null;
+        },
+
+        callTimer: function (timer) {
+            if (typeof timer.interval == "number") {
+                this.timeouts[timer.id].callAt += timer.interval;
+            } else {
+                delete this.timeouts[timer.id];
+            }
+
+            try {
+                if (typeof timer.func == "function") {
+                    timer.func.apply(null, timer.invokeArgs);
+                } else {
+                    eval(timer.func);
+                }
+            } catch (e) {
+              var exception = e;
+            }
+
+            if (!this.timeouts[timer.id]) {
+                if (exception) {
+                  throw exception;
+                }
+                return;
+            }
+
+            if (exception) {
+              throw exception;
+            }
+        },
+
+        reset: function reset() {
+            this.timeouts = {};
+        },
+
+        Date: (function () {
+            var NativeDate = Date;
+
+            function ClockDate(year, month, date, hour, minute, second, ms) {
+                // Defensive and verbose to avoid potential harm in passing
+                // explicit undefined when user does not pass argument
+                switch (arguments.length) {
+                case 0:
+                    return new NativeDate(ClockDate.clock.now);
+                case 1:
+                    return new NativeDate(year);
+                case 2:
+                    return new NativeDate(year, month);
+                case 3:
+                    return new NativeDate(year, month, date);
+                case 4:
+                    return new NativeDate(year, month, date, hour);
+                case 5:
+                    return new NativeDate(year, month, date, hour, minute);
+                case 6:
+                    return new NativeDate(year, month, date, hour, minute, second);
+                default:
+                    return new NativeDate(year, month, date, hour, minute, second, ms);
+                }
+            }
+
+            return mirrorDateProperties(ClockDate, NativeDate);
+        }())
+    };
+
+    function mirrorDateProperties(target, source) {
+        if (source.now) {
+            target.now = function now() {
+                return target.clock.now;
+            };
+        } else {
+            delete target.now;
+        }
+
+        if (source.toSource) {
+            target.toSource = function toSource() {
+                return source.toSource();
+            };
+        } else {
+            delete target.toSource;
+        }
+
+        target.toString = function toString() {
+            return source.toString();
+        };
+
+        target.prototype = source.prototype;
+        target.parse = source.parse;
+        target.UTC = source.UTC;
+        target.prototype.toUTCString = source.prototype.toUTCString;
+
+        for (var prop in source) {
+            if (source.hasOwnProperty(prop)) {
+                target[prop] = source[prop];
+            }
+        }
+
+        return target;
+    }
+
+    var methods = ["Date", "setTimeout", "setInterval",
+                   "clearTimeout", "clearInterval"];
+
+    if (typeof global.setImmediate !== "undefined") {
+        methods.push("setImmediate");
+    }
+
+    if (typeof global.clearImmediate !== "undefined") {
+        methods.push("clearImmediate");
+    }
+
+    function restore() {
+        var method;
+
+        for (var i = 0, l = this.methods.length; i < l; i++) {
+            method = this.methods[i];
+
+            if (global[method].hadOwnProperty) {
+                global[method] = this["_" + method];
+            } else {
+                try {
+                    delete global[method];
+                } catch (e) {}
+            }
+        }
+
+        // Prevent multiple executions which will completely remove these props
+        this.methods = [];
+    }
+
+    function stubGlobal(method, clock) {
+        clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(global, method);
+        clock["_" + method] = global[method];
+
+        if (method == "Date") {
+            var date = mirrorDateProperties(clock[method], global[method]);
+            global[method] = date;
+        } else {
+            global[method] = function () {
+                return clock[method].apply(clock, arguments);
+            };
+
+            for (var prop in clock[method]) {
+                if (clock[method].hasOwnProperty(prop)) {
+                    global[method][prop] = clock[method][prop];
+                }
+            }
+        }
+
+        global[method].clock = clock;
+    }
+
+    sinon.useFakeTimers = function useFakeTimers(now) {
+        var clock = sinon.clock.create(now);
+        clock.restore = restore;
+        clock.methods = Array.prototype.slice.call(arguments,
+                                                   typeof now == "number" ? 1 : 0);
+
+        if (clock.methods.length === 0) {
+            clock.methods = methods;
+        }
+
+        for (var i = 0, l = clock.methods.length; i < l; i++) {
+            stubGlobal(clock.methods[i], clock);
+        }
+
+        return clock;
+    };
+}(typeof global != "undefined" && typeof global !== "function" ? global : this));
+
+sinon.timers = {
+    setTimeout: setTimeout,
+    clearTimeout: clearTimeout,
+    setImmediate: (typeof setImmediate !== "undefined" ? setImmediate : undefined),
+    clearImmediate: (typeof clearImmediate !== "undefined" ? clearImmediate: undefined),
+    setInterval: setInterval,
+    clearInterval: clearInterval,
+    Date: Date
+};
+
+if (typeof module !== 'undefined' && module.exports) {
+    module.exports = sinon;
+}
+
+/*jslint eqeqeq: false, onevar: false*/
+/*global sinon, module, require, ActiveXObject, XMLHttpRequest, DOMParser*/
+/**
+ * Minimal Event interface implementation
+ *
+ * Original implementation by Sven Fuchs: https://gist.github.com/995028
+ * Modifications and tests by Christian Johansen.
+ *
+ * @author Sven Fuchs (svenfuchs@artweb-design.de)
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2011 Sven Fuchs, Christian Johansen
+ */
+
+if (typeof sinon == "undefined") {
+    this.sinon = {};
+}
+
+(function () {
+    var push = [].push;
+
+    sinon.Event = function Event(type, bubbles, cancelable, target) {
+        this.initEvent(type, bubbles, cancelable, target);
+    };
+
+    sinon.Event.prototype = {
+        initEvent: function(type, bubbles, cancelable, target) {
+            this.type = type;
+            this.bubbles = bubbles;
+            this.cancelable = cancelable;
+            this.target = target;
+        },
+
+        stopPropagation: function () {},
+
+        preventDefault: function () {
+            this.defaultPrevented = true;
+        }
+    };
+
+    sinon.ProgressEvent = function ProgressEvent(type, progressEventRaw, target) {
+        this.initEvent(type, false, false, target);
+        this.loaded = progressEventRaw.loaded || null;
+        this.total = progressEventRaw.total || null;
+    };
+
+    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;
+        }
+    };
+}());
+
+/**
+ * @depend ../../sinon.js
+ * @depend event.js
+ */
+/*jslint eqeqeq: false, onevar: false*/
+/*global sinon, module, require, ActiveXObject, XMLHttpRequest, DOMParser*/
+/**
+ * Fake XMLHttpRequest object
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+// wrapper for global
+(function(global) {
+    if (typeof sinon === "undefined") {
+        global.sinon = {};
+    }
+
+    var supportsProgress = typeof ProgressEvent !== "undefined";
+    var supportsCustomEvent = typeof CustomEvent !== "undefined";
+    sinon.xhr = { XMLHttpRequest: global.XMLHttpRequest };
+    var xhr = sinon.xhr;
+    xhr.GlobalXMLHttpRequest = global.XMLHttpRequest;
+    xhr.GlobalActiveXObject = global.ActiveXObject;
+    xhr.supportsActiveX = typeof xhr.GlobalActiveXObject != "undefined";
+    xhr.supportsXHR = typeof xhr.GlobalXMLHttpRequest != "undefined";
+    xhr.workingXHR = xhr.supportsXHR ? xhr.GlobalXMLHttpRequest : xhr.supportsActiveX
+                                     ? function() { return new xhr.GlobalActiveXObject("MSXML2.XMLHTTP.3.0") } : false;
+    xhr.supportsCORS = 'withCredentials' in (new sinon.xhr.GlobalXMLHttpRequest());
+
+    /*jsl:ignore*/
+    var unsafeHeaders = {
+        "Accept-Charset": true,
+        "Accept-Encoding": true,
+        "Connection": true,
+        "Content-Length": true,
+        "Cookie": true,
+        "Cookie2": true,
+        "Content-Transfer-Encoding": true,
+        "Date": true,
+        "Expect": true,
+        "Host": true,
+        "Keep-Alive": true,
+        "Referer": true,
+        "TE": true,
+        "Trailer": true,
+        "Transfer-Encoding": true,
+        "Upgrade": true,
+        "User-Agent": true,
+        "Via": true
+    };
+    /*jsl:end*/
+
+    function FakeXMLHttpRequest() {
+        this.readyState = FakeXMLHttpRequest.UNSENT;
+        this.requestHeaders = {};
+        this.requestBody = null;
+        this.status = 0;
+        this.statusText = "";
+        this.upload = new UploadProgress();
+        if (sinon.xhr.supportsCORS) {
+            this.withCredentials = false;
+        }
+
+
+        var xhr = this;
+        var events = ["loadstart", "load", "abort", "loadend"];
+
+        function addEventListener(eventName) {
+            xhr.addEventListener(eventName, function (event) {
+                var listener = xhr["on" + eventName];
+
+                if (listener && typeof listener == "function") {
+                    listener.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(event, listener) {
+        this.eventListeners[event].push(listener);
+    };
+
+    UploadProgress.prototype.removeEventListener = function(event, listener) {
+        var listeners = this.eventListeners[event] || [];
+
+        for (var i = 0, l = listeners.length; i < l; ++i) {
+            if (listeners[i] == listener) {
+                return listeners.splice(i, 1);
+            }
+        }
+    };
+
+    UploadProgress.prototype.dispatchEvent = function(event) {
+        var listeners = this.eventListeners[event.type] || [];
+
+        for (var i = 0, listener; (listener = listeners[i]) != null; i++) {
+            listener(event);
+        }
+    };
+
+    function verifyState(xhr) {
+        if (xhr.readyState !== FakeXMLHttpRequest.OPENED) {
+            throw new Error("INVALID_STATE_ERR");
+        }
+
+        if (xhr.sendFlag) {
+            throw new Error("INVALID_STATE_ERR");
+        }
+    }
+
+    // filtering to enable a white-list version of Sinon FakeXhr,
+    // where whitelisted requests are passed through to real XHR
+    function each(collection, callback) {
+        if (!collection) return;
+        for (var i = 0, l = collection.length; i < l; i += 1) {
+            callback(collection[i]);
+        }
+    }
+    function some(collection, callback) {
+        for (var index = 0; index < collection.length; index++) {
+            if(callback(collection[index]) === true) return true;
+        }
+        return false;
+    }
+    // largest arity in XHR is 5 - XHR#open
+    var apply = function(obj,method,args) {
+        switch(args.length) {
+        case 0: return obj[method]();
+        case 1: return obj[method](args[0]);
+        case 2: return obj[method](args[0],args[1]);
+        case 3: return obj[method](args[0],args[1],args[2]);
+        case 4: return obj[method](args[0],args[1],args[2],args[3]);
+        case 5: return obj[method](args[0],args[1],args[2],args[3],args[4]);
+        }
+    };
+
+    FakeXMLHttpRequest.filters = [];
+    FakeXMLHttpRequest.addFilter = function(fn) {
+        this.filters.push(fn)
+    };
+    var IE6Re = /MSIE 6/;
+    FakeXMLHttpRequest.defake = function(fakeXhr,xhrArgs) {
+        var xhr = new sinon.xhr.workingXHR();
+        each(["open","setRequestHeader","send","abort","getResponseHeader",
+              "getAllResponseHeaders","addEventListener","overrideMimeType","removeEventListener"],
+             function(method) {
+                 fakeXhr[method] = function() {
+                   return apply(xhr,method,arguments);
+                 };
+             });
+
+        var copyAttrs = function(args) {
+            each(args, function(attr) {
+              try {
+                fakeXhr[attr] = xhr[attr]
+              } catch(e) {
+                if(!IE6Re.test(navigator.userAgent)) throw e;
+              }
+            });
+        };
+
+        var stateChange = function() {
+            fakeXhr.readyState = xhr.readyState;
+            if(xhr.readyState >= FakeXMLHttpRequest.HEADERS_RECEIVED) {
+                copyAttrs(["status","statusText"]);
+            }
+            if(xhr.readyState >= FakeXMLHttpRequest.LOADING) {
+                copyAttrs(["responseText"]);
+            }
+            if(xhr.readyState === FakeXMLHttpRequest.DONE) {
+                copyAttrs(["responseXML"]);
+            }
+            if(fakeXhr.onreadystatechange) fakeXhr.onreadystatechange.call(fakeXhr, { target: fakeXhr });
+        };
+        if(xhr.addEventListener) {
+          for(var event in fakeXhr.eventListeners) {
+              if(fakeXhr.eventListeners.hasOwnProperty(event)) {
+                  each(fakeXhr.eventListeners[event],function(handler) {
+                      xhr.addEventListener(event, handler);
+                  });
+              }
+          }
+          xhr.addEventListener("readystatechange",stateChange);
+        } else {
+          xhr.onreadystatechange = stateChange;
+        }
+        apply(xhr,"open",xhrArgs);
+    };
+    FakeXMLHttpRequest.useFilters = false;
+
+    function 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;
+        }
+    }
+
+    sinon.extend(FakeXMLHttpRequest.prototype, sinon.EventTarget, {
+        async: true,
+
+        open: function open(method, url, async, username, password) {
+            this.method = method;
+            this.url = url;
+            this.async = typeof async == "boolean" ? async : true;
+            this.username = username;
+            this.password = password;
+            this.responseText = null;
+            this.responseXML = null;
+            this.requestHeaders = {};
+            this.sendFlag = false;
+            if(sinon.FakeXMLHttpRequest.useFilters === true) {
+                var xhrArgs = arguments;
+                var defake = some(FakeXMLHttpRequest.filters,function(filter) {
+                    return filter.apply(this,xhrArgs)
+                });
+                if (defake) {
+                  return sinon.FakeXMLHttpRequest.defake(this,arguments);
+                }
+            }
+            this.readyStateChange(FakeXMLHttpRequest.OPENED);
+        },
+
+        readyStateChange: function readyStateChange(state) {
+            this.readyState = state;
+
+            if (typeof this.onreadystatechange == "function") {
+                try {
+                    this.onreadystatechange();
+                } catch (e) {
+                    sinon.logError("Fake XHR onreadystatechange handler", e);
+                }
+            }
+
+            this.dispatchEvent(new sinon.Event("readystatechange"));
+
+            switch (this.readyState) {
+                case FakeXMLHttpRequest.DONE:
+                    this.dispatchEvent(new sinon.Event("load", false, false, this));
+                    this.dispatchEvent(new sinon.Event("loadend", false, false, this));
+                    this.upload.dispatchEvent(new sinon.Event("load", false, false, this));
+                    if (supportsProgress) {
+                        this.upload.dispatchEvent(new sinon.ProgressEvent('progress', {loaded: 100, total: 100}));
+                    }
+                    break;
+            }
+        },
+
+        setRequestHeader: function setRequestHeader(header, value) {
+            verifyState(this);
+
+            if (unsafeHeaders[header] || /^(Sec-|Proxy-)/.test(header)) {
+                throw new Error("Refused to set unsafe header \"" + header + "\"");
+            }
+
+            if (this.requestHeaders[header]) {
+                this.requestHeaders[header] += "," + value;
+            } else {
+                this.requestHeaders[header] = value;
+            }
+        },
+
+        // Helps testing
+        setResponseHeaders: function setResponseHeaders(headers) {
+            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)) {
+                if (this.requestHeaders["Content-Type"]) {
+                    var value = this.requestHeaders["Content-Type"].split(";");
+                    this.requestHeaders["Content-Type"] = value[0] + ";charset=utf-8";
+                } else {
+                    this.requestHeaders["Content-Type"] = "text/plain;charset=utf-8";
+                }
+
+                this.requestBody = data;
+            }
+
+            this.errorFlag = false;
+            this.sendFlag = this.async;
+            this.readyStateChange(FakeXMLHttpRequest.OPENED);
+
+            if (typeof this.onSend == "function") {
+                this.onSend(this);
+            }
+
+            this.dispatchEvent(new sinon.Event("loadstart", false, false, this));
+        },
+
+        abort: function abort() {
+            this.aborted = true;
+            this.responseText = null;
+            this.errorFlag = true;
+            this.requestHeaders = {};
+
+            if (this.readyState > sinon.FakeXMLHttpRequest.UNSENT && this.sendFlag) {
+                this.readyStateChange(sinon.FakeXMLHttpRequest.DONE);
+                this.sendFlag = false;
+            }
+
+            this.readyState = sinon.FakeXMLHttpRequest.UNSENT;
+
+            this.dispatchEvent(new sinon.Event("abort", false, false, this));
+
+            this.upload.dispatchEvent(new sinon.Event("abort", false, false, this));
+
+            if (typeof this.onerror === "function") {
+                this.onerror();
+            }
+        },
+
+        getResponseHeader: function getResponseHeader(header) {
+            if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {
+                return null;
+            }
+
+            if (/^Set-Cookie2?$/i.test(header)) {
+                return null;
+            }
+
+            header = header.toLowerCase();
+
+            for (var h in this.responseHeaders) {
+                if (h.toLowerCase() == header) {
+                    return this.responseHeaders[h];
+                }
+            }
+
+            return null;
+        },
+
+        getAllResponseHeaders: function getAllResponseHeaders() {
+            if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {
+                return "";
+            }
+
+            var headers = "";
+
+            for (var header in this.responseHeaders) {
+                if (this.responseHeaders.hasOwnProperty(header) &&
+                    !/^Set-Cookie2?$/i.test(header)) {
+                    headers += header + ": " + this.responseHeaders[header] + "\r\n";
+                }
+            }
+
+            return headers;
+        },
+
+        setResponseBody: function setResponseBody(body) {
+            verifyRequestSent(this);
+            verifyHeadersReceived(this);
+            verifyResponseBodyType(body);
+
+            var chunkSize = this.chunkSize || 10;
+            var index = 0;
+            this.responseText = "";
+
+            do {
+                if (this.async) {
+                    this.readyStateChange(FakeXMLHttpRequest.LOADING);
+                }
+
+                this.responseText += body.substring(index, index + chunkSize);
+                index += chunkSize;
+            } while (index < body.length);
+
+            var type = this.getResponseHeader("Content-Type");
+
+            if (this.responseText &&
+                (!type || /(text\/xml)|(application\/xml)|(\+xml)/.test(type))) {
+                try {
+                    this.responseXML = FakeXMLHttpRequest.parseXML(this.responseText);
+                } catch (e) {
+                    // Unable to parse XML - no biggie
+                }
+            }
+
+            if (this.async) {
+                this.readyStateChange(FakeXMLHttpRequest.DONE);
+            } else {
+                this.readyState = FakeXMLHttpRequest.DONE;
+            }
+        },
+
+        respond: function respond(status, headers, body) {
+            this.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));
+            }
+        },
+
+        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
+    });
+
+    // Borrowed from JSpec
+    FakeXMLHttpRequest.parseXML = function parseXML(text) {
+        var xmlDoc;
+
+        if (typeof DOMParser != "undefined") {
+            var parser = new DOMParser();
+            xmlDoc = parser.parseFromString(text, "text/xml");
+        } else {
+            xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
+            xmlDoc.async = "false";
+            xmlDoc.loadXML(text);
+        }
+
+        return xmlDoc;
+    };
+
+    FakeXMLHttpRequest.statusCodes = {
+        100: "Continue",
+        101: "Switching Protocols",
+        200: "OK",
+        201: "Created",
+        202: "Accepted",
+        203: "Non-Authoritative Information",
+        204: "No Content",
+        205: "Reset Content",
+        206: "Partial Content",
+        300: "Multiple Choice",
+        301: "Moved Permanently",
+        302: "Found",
+        303: "See Other",
+        304: "Not Modified",
+        305: "Use Proxy",
+        307: "Temporary Redirect",
+        400: "Bad Request",
+        401: "Unauthorized",
+        402: "Payment Required",
+        403: "Forbidden",
+        404: "Not Found",
+        405: "Method Not Allowed",
+        406: "Not Acceptable",
+        407: "Proxy Authentication Required",
+        408: "Request Timeout",
+        409: "Conflict",
+        410: "Gone",
+        411: "Length Required",
+        412: "Precondition Failed",
+        413: "Request Entity Too Large",
+        414: "Request-URI Too Long",
+        415: "Unsupported Media Type",
+        416: "Requested Range Not Satisfiable",
+        417: "Expectation Failed",
+        422: "Unprocessable Entity",
+        500: "Internal Server Error",
+        501: "Not Implemented",
+        502: "Bad Gateway",
+        503: "Service Unavailable",
+        504: "Gateway Timeout",
+        505: "HTTP Version Not Supported"
+    };
+
+    sinon.useFakeXMLHttpRequest = function () {
+        sinon.FakeXMLHttpRequest.restore = function restore(keepOnCreate) {
+            if (xhr.supportsXHR) {
+                global.XMLHttpRequest = xhr.GlobalXMLHttpRequest;
+            }
+
+            if (xhr.supportsActiveX) {
+                global.ActiveXObject = xhr.GlobalActiveXObject;
+            }
+
+            delete sinon.FakeXMLHttpRequest.restore;
+
+            if (keepOnCreate !== true) {
+                delete sinon.FakeXMLHttpRequest.onCreate;
+            }
+        };
+        if (xhr.supportsXHR) {
+            global.XMLHttpRequest = sinon.FakeXMLHttpRequest;
+        }
+
+        if (xhr.supportsActiveX) {
+            global.ActiveXObject = function ActiveXObject(objId) {
+                if (objId == "Microsoft.XMLHTTP" || /^Msxml2\.XMLHTTP/i.test(objId)) {
+
+                    return new sinon.FakeXMLHttpRequest();
+                }
+
+                return new xhr.GlobalActiveXObject(objId);
+            };
+        }
+
+        return sinon.FakeXMLHttpRequest;
+    };
+
+    sinon.FakeXMLHttpRequest = FakeXMLHttpRequest;
+
+})(typeof global === "object" ? global : this);
+
+if (typeof module !== 'undefined' && module.exports) {
+    module.exports = sinon;
+}
+
+/**
+ * @depend fake_xml_http_request.js
+ */
+/*jslint eqeqeq: false, onevar: false, regexp: false, plusplus: false*/
+/*global module, require, window*/
+/**
+ * The Sinon "server" mimics a web server that receives requests from
+ * sinon.FakeXMLHttpRequest and provides an API to respond to those requests,
+ * both synchronously and asynchronously. To respond synchronuously, canned
+ * answers have to be provided upfront.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+if (typeof sinon == "undefined") {
+    var sinon = {};
+}
+
+sinon.fakeServer = (function () {
+    var push = [].push;
+    function F() {}
+
+    function create(proto) {
+        F.prototype = proto;
+        return new F();
+    }
+
+    function responseArray(handler) {
+        var response = handler;
+
+        if (Object.prototype.toString.call(handler) != "[object Array]") {
+            response = [200, {}, handler];
+        }
+
+        if (typeof response[2] != "string") {
+            throw new TypeError("Fake server response body should be string, but was " +
+                                typeof response[2]);
+        }
+
+        return response;
+    }
+
+    var wloc = typeof window !== "undefined" ? window.location : {};
+    var rCurrLoc = new RegExp("^" + wloc.protocol + "//" + wloc.host);
+
+    function matchOne(response, reqMethod, reqUrl) {
+        var rmeth = response.method;
+        var matchMethod = !rmeth || rmeth.toLowerCase() == reqMethod.toLowerCase();
+        var url = response.url;
+        var matchUrl = !url || url == reqUrl || (typeof url.test == "function" && url.test(reqUrl));
+
+        return matchMethod && matchUrl;
+    }
+
+    function match(response, request) {
+        var requestUrl = request.url;
+
+        if (!/^https?:\/\//.test(requestUrl) || rCurrLoc.test(requestUrl)) {
+            requestUrl = requestUrl.replace(rCurrLoc, "");
+        }
+
+        if (matchOne(response, this.getHTTPMethod(request), requestUrl)) {
+            if (typeof response.response == "function") {
+                var ru = response.url;
+                var args = [request].concat(ru && typeof ru.exec == "function" ? ru.exec(requestUrl).slice(1) : []);
+                return response.response.apply(response, args);
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+    function log(response, request) {
+        var str;
+
+        str =  "Request:\n"  + sinon.format(request)  + "\n\n";
+        str += "Response:\n" + sinon.format(response) + "\n\n";
+
+        sinon.log(str);
+    }
+
+    return {
+        create: function () {
+            var server = create(this);
+            this.xhr = sinon.useFakeXMLHttpRequest();
+            server.requests = [];
+
+            this.xhr.onCreate = function (xhrObj) {
+                server.addRequest(xhrObj);
+            };
+
+            return server;
+        },
+
+        addRequest: function addRequest(xhrObj) {
+            var server = this;
+            push.call(this.requests, xhrObj);
+
+            xhrObj.onSend = function () {
+                server.handleRequest(this);
+
+                if (server.autoRespond && !server.responding) {
+                    setTimeout(function () {
+                        server.responding = false;
+                        server.respond();
+                    }, server.autoRespondAfter || 10);
+
+                    server.responding = true;
+                }
+            };
+        },
+
+        getHTTPMethod: function getHTTPMethod(request) {
+            if (this.fakeHTTPMethods && /post/i.test(request.method)) {
+                var matches = (request.requestBody || "").match(/_method=([^\b;]+)/);
+                return !!matches ? matches[1] : request.method;
+            }
+
+            return request.method;
+        },
+
+        handleRequest: function handleRequest(xhr) {
+            if (xhr.async) {
+                if (!this.queue) {
+                    this.queue = [];
+                }
+
+                push.call(this.queue, xhr);
+            } else {
+                this.processRequest(xhr);
+            }
+        },
+
+        respondWith: function respondWith(method, url, body) {
+            if (arguments.length == 1 && typeof method != "function") {
+                this.response = responseArray(method);
+                return;
+            }
+
+            if (!this.responses) { this.responses = []; }
+
+            if (arguments.length == 1) {
+                body = method;
+                url = method = null;
+            }
+
+            if (arguments.length == 2) {
+                body = url;
+                url = method;
+                method = null;
+            }
+
+            push.call(this.responses, {
+                method: method,
+                url: url,
+                response: typeof body == "function" ? body : responseArray(body)
+            });
+        },
+
+        respond: function respond() {
+            if (arguments.length > 0) this.respondWith.apply(this, arguments);
+            var queue = this.queue || [];
+            var requests = queue.splice(0);
+            var request;
+
+            while(request = requests.shift()) {
+                this.processRequest(request);
+            }
+        },
+
+        processRequest: function processRequest(request) {
+            try {
+                if (request.aborted) {
+                    return;
+                }
+
+                var response = this.response || [404, {}, ""];
+
+                if (this.responses) {
+                    for (var l = this.responses.length, i = l - 1; i >= 0; i--) {
+                        if (match.call(this, this.responses[i], request)) {
+                            response = this.responses[i].response;
+                            break;
+                        }
+                    }
+                }
+
+                if (request.readyState != 4) {
+                    log(response, request);
+
+                    request.respond(response[0], response[1], response[2]);
+                }
+            } catch (e) {
+                sinon.logError("Fake server request processing", e);
+            }
+        },
+
+        restore: function restore() {
+            return this.xhr.restore && this.xhr.restore.apply(this.xhr, arguments);
+        }
+    };
+}());
+
+if (typeof module !== 'undefined' && module.exports) {
+    module.exports = sinon;
+}
+
+/**
+ * @depend fake_server.js
+ * @depend fake_timers.js
+ */
+/*jslint browser: true, eqeqeq: false, onevar: false*/
+/*global sinon*/
+/**
+ * Add-on for sinon.fakeServer that automatically handles a fake timer along with
+ * the FakeXMLHttpRequest. The direct inspiration for this add-on is jQuery
+ * 1.3.x, which does not use xhr object's onreadystatehandler at all - instead,
+ * it polls the object for completion with setInterval. Dispite the direct
+ * motivation, there is nothing jQuery-specific in this file, so it can be used
+ * in any environment where the ajax implementation depends on setInterval or
+ * setTimeout.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function () {
+    function Server() {}
+    Server.prototype = sinon.fakeServer;
+
+    sinon.fakeServerWithClock = new Server();
+
+    sinon.fakeServerWithClock.addRequest = function addRequest(xhr) {
+        if (xhr.async) {
+            if (typeof setTimeout.clock == "object") {
+                this.clock = setTimeout.clock;
+            } else {
+                this.clock = sinon.useFakeTimers();
+                this.resetClock = true;
+            }
+
+            if (!this.longestTimeout) {
+                var clockSetTimeout = this.clock.setTimeout;
+                var clockSetInterval = this.clock.setInterval;
+                var server = this;
+
+                this.clock.setTimeout = function (fn, timeout) {
+                    server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);
+
+                    return clockSetTimeout.apply(this, arguments);
+                };
+
+                this.clock.setInterval = function (fn, timeout) {
+                    server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);
+
+                    return clockSetInterval.apply(this, arguments);
+                };
+            }
+        }
+
+        return sinon.fakeServer.addRequest.call(this, xhr);
+    };
+
+    sinon.fakeServerWithClock.respond = function respond() {
+        var returnVal = sinon.fakeServer.respond.apply(this, arguments);
+
+        if (this.clock) {
+            this.clock.tick(this.longestTimeout || 0);
+            this.longestTimeout = 0;
+
+            if (this.resetClock) {
+                this.clock.restore();
+                this.resetClock = false;
+            }
+        }
+
+        return returnVal;
+    };
+
+    sinon.fakeServerWithClock.restore = function restore() {
+        if (this.clock) {
+            this.clock.restore();
+        }
+
+        return sinon.fakeServer.restore.apply(this, arguments);
+    };
+}());
+
+/**
+ * @depend ../sinon.js
+ * @depend collection.js
+ * @depend util/fake_timers.js
+ * @depend util/fake_server_with_clock.js
+ */
+/*jslint eqeqeq: false, onevar: false, plusplus: false*/
+/*global require, module*/
+/**
+ * Manages fake collections as well as fake utilities such as Sinon's
+ * timers and fake XHR implementation in one convenient object.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+if (typeof module !== 'undefined' && module.exports) {
+    var sinon = require("../sinon");
+    sinon.extend(sinon, require("./util/fake_timers"));
+}
+
+(function () {
+    var push = [].push;
+
+    function exposeValue(sandbox, config, key, value) {
+        if (!value) {
+            return;
+        }
+
+        if (config.injectInto && !(key in config.injectInto)) {
+            config.injectInto[key] = value;
+            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;
+            }
+
+            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;
+        }
+    });
+
+    sinon.sandbox.useFakeXMLHttpRequest = sinon.sandbox.useFakeServer;
+
+    if (typeof module !== 'undefined' && module.exports) {
+        module.exports = sinon.sandbox;
+    }
+}());
+
+/**
+ * @depend ../sinon.js
+ * @depend stub.js
+ * @depend mock.js
+ * @depend sandbox.js
+ */
+/*jslint eqeqeq: false, onevar: false, forin: true, plusplus: false*/
+/*global module, require, sinon*/
+/**
+ * Test function, sandboxes fakes
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function (sinon) {
+    var commonJSModule = typeof module !== 'undefined' && module.exports;
+
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon) {
+        return;
+    }
+
+    function test(callback) {
+        var type = typeof callback;
+
+        if (type != "function") {
+            throw new TypeError("sinon.test needs to wrap a test function, got " + type);
+        }
+
+        return function () {
+            var config = sinon.getConfig(sinon.config);
+            config.injectInto = config.injectIntoThis && this || config.injectInto;
+            var sandbox = sinon.sandbox.create(config);
+            var exception, result;
+            var args = Array.prototype.slice.call(arguments).concat(sandbox.args);
+
+            try {
+                result = callback.apply(this, args);
+            } catch (e) {
+                exception = e;
+            }
+
+            if (typeof exception !== "undefined") {
+                sandbox.restore();
+                throw exception;
+            }
+            else {
+                sandbox.verifyAndRestore();
+            }
+
+            return result;
+        };
+    }
+
+    test.config = {
+        injectIntoThis: true,
+        injectInto: null,
+        properties: ["spy", "stub", "mock", "clock", "server", "requests"],
+        useFakeTimers: true,
+        useFakeServer: true
+    };
+
+    if (commonJSModule) {
+        module.exports = test;
+    } else {
+        sinon.test = test;
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+ * @depend ../sinon.js
+ * @depend test.js
+ */
+/*jslint eqeqeq: false, onevar: false, eqeqeq: false*/
+/*global module, require, sinon*/
+/**
+ * Test case, sandboxes all test functions
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function (sinon) {
+    var commonJSModule = typeof module !== 'undefined' && module.exports;
+
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon || !Object.prototype.hasOwnProperty) {
+        return;
+    }
+
+    function createTest(property, setUp, tearDown) {
+        return function () {
+            if (setUp) {
+                setUp.apply(this, arguments);
+            }
+
+            var exception, result;
+
+            try {
+                result = property.apply(this, arguments);
+            } catch (e) {
+                exception = e;
+            }
+
+            if (tearDown) {
+                tearDown.apply(this, arguments);
+            }
+
+            if (exception) {
+                throw exception;
+            }
+
+            return result;
+        };
+    }
+
+    function testCase(tests, prefix) {
+        /*jsl:ignore*/
+        if (!tests || typeof tests != "object") {
+            throw new TypeError("sinon.testCase needs an object with test functions");
+        }
+        /*jsl:end*/
+
+        prefix = prefix || "test";
+        var rPrefix = new RegExp("^" + prefix);
+        var methods = {}, testName, property, method;
+        var setUp = tests.setUp;
+        var tearDown = tests.tearDown;
+
+        for (testName in tests) {
+            if (tests.hasOwnProperty(testName)) {
+                property = tests[testName];
+
+                if (/^(setUp|tearDown)$/.test(testName)) {
+                    continue;
+                }
+
+                if (typeof property == "function" && rPrefix.test(testName)) {
+                    method = property;
+
+                    if (setUp || tearDown) {
+                        method = createTest(property, setUp, tearDown);
+                    }
+
+                    methods[testName] = sinon.test(method);
+                } else {
+                    methods[testName] = tests[testName];
+                }
+            }
+        }
+
+        return methods;
+    }
+
+    if (commonJSModule) {
+        module.exports = testCase;
+    } else {
+        sinon.testCase = testCase;
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+ * @depend ../sinon.js
+ * @depend stub.js
+ */
+/*jslint eqeqeq: false, onevar: false, nomen: false, plusplus: false*/
+/*global module, require, sinon*/
+/**
+ * Assertions matching the test spy retrieval interface.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function (sinon, global) {
+    var commonJSModule = typeof module !== "undefined" && module.exports;
+    var slice = Array.prototype.slice;
+    var assert;
+
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon) {
+        return;
+    }
+
+    function verifyIsStub() {
+        var method;
+
+        for (var i = 0, l = arguments.length; i < l; ++i) {
+            method = arguments[i];
+
+            if (!method) {
+                assert.fail("fake is not a spy");
+            }
+
+            if (typeof method != "function") {
+                assert.fail(method + " is not a function");
+            }
+
+            if (typeof method.getCall != "function") {
+                assert.fail(method + " is not stubbed");
+            }
+        }
+    }
+
+    function failAssertion(object, msg) {
+        object = object || global;
+        var failMethod = object.fail || assert.fail;
+        failMethod.call(object, msg);
+    }
+
+    function mirrorPropAsAssertion(name, method, message) {
+        if (arguments.length == 2) {
+            message = method;
+            method = name;
+        }
+
+        assert[name] = function (fake) {
+            verifyIsStub(fake);
+
+            var args = slice.call(arguments, 1);
+            var failed = false;
+
+            if (typeof method == "function") {
+                failed = !method(fake);
+            } else {
+                failed = typeof fake[method] == "function" ?
+                    !fake[method].apply(fake, args) : !fake[method];
+            }
+
+            if (failed) {
+                failAssertion(this, fake.printf.apply(fake, [message].concat(args)));
+            } else {
+                assert.pass(name);
+            }
+        };
+    }
+
+    function exposedName(prefix, prop) {
+        return !prefix || /^fail/.test(prop) ? prop :
+            prefix + prop.slice(0, 1).toUpperCase() + prop.slice(1);
+    }
+
+    assert = {
+        failException: "AssertError",
+
+        fail: function fail(message) {
+            var error = new Error(message);
+            error.name = this.failException || assert.failException;
+
+            throw error;
+        },
+
+        pass: function pass(assertion) {},
+
+        callOrder: function assertCallOrder() {
+            verifyIsStub.apply(null, arguments);
+            var expected = "", actual = "";
+
+            if (!sinon.calledInOrder(arguments)) {
+                try {
+                    expected = [].join.call(arguments, ", ");
+                    var calls = slice.call(arguments);
+                    var i = calls.length;
+                    while (i) {
+                        if (!calls[--i].called) {
+                            calls.splice(i, 1);
+                        }
+                    }
+                    actual = sinon.orderByFirstCall(calls).join(", ");
+                } catch (e) {
+                    // If this fails, we'll just fall back to the blank string
+                }
+
+                failAssertion(this, "expected " + expected + " to be " +
+                              "called in order but were called as " + actual);
+            } else {
+                assert.pass("callOrder");
+            }
+        },
+
+        callCount: function assertCallCount(method, count) {
+            verifyIsStub(method);
+
+            if (method.callCount != count) {
+                var msg = "expected %n to be called " + sinon.timesInWords(count) +
+                    " but was called %c%C";
+                failAssertion(this, method.printf(msg));
+            } else {
+                assert.pass("callCount");
+            }
+        },
+
+        expose: function expose(target, options) {
+            if (!target) {
+                throw new TypeError("target is null or undefined");
+            }
+
+            var o = options || {};
+            var prefix = typeof o.prefix == "undefined" && "assert" || o.prefix;
+            var includeFail = typeof o.includeFail == "undefined" || !!o.includeFail;
+
+            for (var method in this) {
+                if (method != "export" && (includeFail || !/^(fail)/.test(method))) {
+                    target[exposedName(prefix, method)] = this[method];
+                }
+            }
+
+            return target;
+        },
+
+        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");
+
+    if (commonJSModule) {
+        module.exports = assert;
+    } else {
+        sinon.assert = assert;
+    }
+}(typeof sinon == "object" && sinon || null, typeof window != "undefined" ? window : (typeof self != "undefined") ? self : global));
+
+return sinon;}.call(typeof window != 'undefined' && window || {}));
diff --git a/resources/sinonjs/sinon-ie-1.8.1.js b/resources/sinonjs/sinon-ie-1.8.1.js
deleted file mode 100644 (file)
index f92e9db..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-/**
- * Sinon.JS 1.8.1, 2014/02/02
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @author Contributors: https://github.com/cjohansen/Sinon.JS/blob/master/AUTHORS
- *
- * (The BSD License)
- * 
- * Copyright (c) 2010-2013, Christian Johansen, christian@cjohansen.no
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- * 
- *     * Redistributions of source code must retain the above copyright notice,
- *       this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright notice,
- *       this list of conditions and the following disclaimer in the documentation
- *       and/or other materials provided with the distribution.
- *     * Neither the name of Christian Johansen nor the names of his contributors
- *       may be used to endorse or promote products derived from this software
- *       without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*global sinon, setTimeout, setInterval, clearTimeout, clearInterval, Date*/
-/**
- * Helps IE run the fake timers. By defining global functions, IE allows
- * them to be overwritten at a later point. If these are not defined like
- * this, overwriting them will result in anything from an exception to browser
- * crash.
- *
- * If you don't require fake timers to work in IE, don't include this file.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-function setTimeout() {}
-function clearTimeout() {}
-function setImmediate() {}
-function clearImmediate() {}
-function setInterval() {}
-function clearInterval() {}
-function Date() {}
-
-// Reassign the original functions. Now their writable attribute
-// should be true. Hackish, I know, but it works.
-setTimeout = sinon.timers.setTimeout;
-clearTimeout = sinon.timers.clearTimeout;
-setImmediate = sinon.timers.setImmediate;
-clearImmediate = sinon.timers.clearImmediate;
-setInterval = sinon.timers.setInterval;
-clearInterval = sinon.timers.clearInterval;
-Date = sinon.timers.Date;
-
-/*global sinon*/
-/**
- * Helps IE run the fake XMLHttpRequest. By defining global functions, IE allows
- * them to be overwritten at a later point. If these are not defined like
- * this, overwriting them will result in anything from an exception to browser
- * crash.
- *
- * If you don't require fake XHR to work in IE, don't include this file.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-function XMLHttpRequest() {}
-
-// Reassign the original function. Now its writable attribute
-// should be true. Hackish, I know, but it works.
-XMLHttpRequest = sinon.xhr.XMLHttpRequest || undefined;
diff --git a/resources/sinonjs/sinon-ie-1.9.0.js b/resources/sinonjs/sinon-ie-1.9.0.js
new file mode 100644 (file)
index 0000000..c9fbd9d
--- /dev/null
@@ -0,0 +1,86 @@
+/**
+ * Sinon.JS 1.9.0, 2014/03/05
+ *
+ * @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.
+ */
+
+/*global sinon, setTimeout, setInterval, clearTimeout, clearInterval, Date*/
+/**
+ * Helps IE run the fake timers. By defining global functions, IE allows
+ * them to be overwritten at a later point. If these are not defined like
+ * this, overwriting them will result in anything from an exception to browser
+ * crash.
+ *
+ * If you don't require fake timers to work in IE, don't include this file.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+function setTimeout() {}
+function clearTimeout() {}
+function setImmediate() {}
+function clearImmediate() {}
+function setInterval() {}
+function clearInterval() {}
+function Date() {}
+
+// Reassign the original functions. Now their writable attribute
+// should be true. Hackish, I know, but it works.
+setTimeout = sinon.timers.setTimeout;
+clearTimeout = sinon.timers.clearTimeout;
+setImmediate = sinon.timers.setImmediate;
+clearImmediate = sinon.timers.clearImmediate;
+setInterval = sinon.timers.setInterval;
+clearInterval = sinon.timers.clearInterval;
+Date = sinon.timers.Date;
+
+/*global sinon*/
+/**
+ * Helps IE run the fake XMLHttpRequest. By defining global functions, IE allows
+ * them to be overwritten at a later point. If these are not defined like
+ * this, overwriting them will result in anything from an exception to browser
+ * crash.
+ *
+ * If you don't require fake XHR to work in IE, don't include this file.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+function XMLHttpRequest() {}
+
+// Reassign the original function. Now its writable attribute
+// should be true. Hackish, I know, but it works.
+XMLHttpRequest = sinon.xhr.XMLHttpRequest || undefined;
index a7c62b3..9344feb 100644 (file)
@@ -90,21 +90,37 @@ class CologneBlueTemplate extends BaseTemplate {
                        return "";
                }
 
+               $html = '';
+
                // We override SkinTemplate->formatLanguageName() in SkinCologneBlue
                // not to capitalize the language names.
                $language_urls = $this->data['language_urls'];
-               if ( empty( $language_urls ) ) {
-                       return "";
-               }
+               if ( !empty( $language_urls ) ) {
+                       $s = array();
+                       foreach ( $language_urls as $key => $data ) {
+                               $s[] = $this->makeListItem( $key, $data, array( 'tag' => 'span' ) );
+                       }
 
-               $s = array();
-               foreach ( $language_urls as $key => $data ) {
-                       $s[] = $this->makeListItem( $key, $data, array( 'tag' => 'span' ) );
+                       $html = wfMessage( 'otherlanguages' )->text()
+                               . wfMessage( 'colon-separator' )->text()
+                               . $this->getSkin()->getLanguage()->pipeList( $s );
                }
 
-               return wfMessage( 'otherlanguages' )->text()
-                       . wfMessage( 'colon-separator' )->text()
-                       . $this->getSkin()->getLanguage()->pipeList( $s );
+               $html .= $this->renderAfterPortlet( 'lang' );
+
+               return $html;
+       }
+
+       /**
+        * @param string $name
+        */
+       protected function renderAfterPortlet( $name ) {
+               $content = '';
+               wfRunHooks( 'BaseTemplateAfterPortlet', array( $this, $name, &$content ) );
+
+               $html = $content !== '' ? "<div class='after-portlet after-portlet-$name'>$content</div>" : '';
+
+               return $html;
        }
 
        function pageTitleLinks() {
@@ -517,6 +533,8 @@ class CologneBlueTemplate extends BaseTemplate {
                                $role = ( $heading == 'search' ) ? 'search' : 'navigation';
                                $s .= "<div class=\"portlet\" id=\"$portletId\" role=\"$role\">\n$headingHTML\n$listHTML\n</div>\n";
                        }
+
+                       $s .= $this->renderAfterPortlet( $heading );
                }
 
                $s .= "</div>\n";
index bd914ce..34f5965 100644 (file)
@@ -221,6 +221,8 @@ echo $footerEnd;
                                } ?>
 
                        </form>
+
+                       <?php $this->renderAfterPortlet( 'search' ); ?>
                </div>
        </div>
 <?php
@@ -242,6 +244,7 @@ echo $footerEnd;
                                } ?>
 
                        </ul>
+<?php          $this->renderAfterPortlet( 'cactions' ); ?>
                </div>
        </div>
 <?php
@@ -263,6 +266,7 @@ echo $footerEnd;
                wfRunHooks( 'SkinTemplateToolboxEnd', array( &$this, true ) );
 ?>
                        </ul>
+<?php          $this->renderAfterPortlet( 'tb' ); ?>
                </div>
        </div>
 <?php
@@ -270,7 +274,7 @@ echo $footerEnd;
 
        /*************************************************************************************************/
        function languageBox() {
-               if ( $this->data['language_urls'] ) {
+               if ( $this->data['language_urls'] !== false ) {
 ?>
        <div id="p-lang" class="portlet" role="navigation">
                <h3<?php $this->html( 'userlangattributes' ) ?>><?php $this->msg( 'otherlanguages' ) ?></h3>
@@ -281,6 +285,8 @@ echo $footerEnd;
 
 <?php          } ?>
                        </ul>
+
+<?php          $this->renderAfterPortlet( 'lang' ); ?>
                </div>
        </div>
 <?php
@@ -315,9 +321,12 @@ echo $footerEnd;
                        # allow raw HTML block to be defined by extensions
                        print $cont;
                }
+
+               $this->renderAfterPortlet( $bar );
 ?>
                </div>
        </div>
 <?php
        }
+
 } // end of class
index 899a272..2bab6ad 100644 (file)
@@ -167,6 +167,7 @@ class VectorTemplate extends BaseTemplate {
                                $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
                                $this->text( 'pageLanguage' );
                        ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
+                       <?php $this->html( 'prebodyhtml' ) ?>
                        <div id="bodyContent">
                                <?php if ( $this->data['isarticle'] ) { ?>
                                <div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
@@ -274,7 +275,7 @@ class VectorTemplate extends BaseTemplate {
                                        $this->renderPortal( 'tb', $this->getToolbox(), 'toolbox', 'SkinTemplateToolboxEnd' );
                                        break;
                                case 'LANGUAGES':
-                                       if ( $this->data['language_urls'] ) {
+                                       if ( $this->data['language_urls']  !== false ) {
                                                $this->renderPortal( 'lang', $this->data['language_urls'], 'otherlanguages' );
                                        }
                                        break;
@@ -316,9 +317,12 @@ class VectorTemplate extends BaseTemplate {
                </ul>
 <?php
                } else { ?>
-               <?php echo $content; /* Allow raw HTML block to be defined by extensions */ ?>
-<?php
-               } ?>
+               <?php
+                       echo $content; /* Allow raw HTML block to be defined by extensions */
+               }
+
+               $this->renderAfterPortlet( $name );
+               ?>
        </div>
 </div>
 <?php
index 40a9432..ef9cf8f 100644 (file)
@@ -133,6 +133,11 @@ textarea {
        line-height: inherit;
 }
 
+div.after-portlet {
+       display: inline;
+       padding-left: .5em;
+}
+
 h1 {
        color: #666666;
        font-family: Verdana, Arial, sans-serif;
index 145b375..6d37657 100644 (file)
@@ -250,6 +250,12 @@ table.rimage {
        border: 1px solid #aaa;
        padding: 0 .8em .3em .5em;
 }
+/* allows .pBody styles to wrap around content added via BaseTemplateAfterPortlet hook */
+.pBody:after {
+       content: '';
+       clear: both;
+       display: block;
+}
 .portlet ul {
        line-height: 1.5em;
        font-size: 95%;
diff --git a/skins/vector/components/animations.less b/skins/vector/components/animations.less
new file mode 100644 (file)
index 0000000..9163779
--- /dev/null
@@ -0,0 +1,28 @@
+/* Animate between standard and high definition layouts */
+body.vector-animateLayout {
+       div#content,
+       div#footer,
+       #left-navigation {
+               .transition(margin-left 250ms, padding 250ms;);
+       }
+
+       #p-logo {
+               .transition(left 250ms);
+       }
+
+       #mw-panel {
+               .transition(padding-right 250ms);
+       }
+
+       #p-search {
+               .transition(margin-right 250ms);
+       }
+
+       #p-personal {
+               .transition(right 250ms);
+       }
+
+       #mw-head-base {
+               .transition(margin-left 250ms);
+       }
+}
index cb89a7b..8e7fc4d 100644 (file)
@@ -87,32 +87,3 @@ pre, .mw-code {
 .tipsy {
        font-size: 0.8em;
 }
-
-/* Animate between standard and high definition layouts */
-body.vector-animateLayout {
-       div#content,
-       div#footer,
-       #left-navigation {
-               .transition(margin-left 250ms, padding 250ms;);
-       }
-
-       #p-logo {
-               .transition(left 250ms);
-       }
-
-       #mw-panel {
-               .transition(padding-right 250ms);
-       }
-
-       #p-search {
-               .transition(margin-right 250ms);
-       }
-
-       #p-personal {
-               .transition(right 250ms);
-       }
-
-       #mw-head-base {
-               .transition(margin-left 250ms);
-       }
-}
index ec0b2fa..46c3030 100644 (file)
@@ -55,18 +55,21 @@ div#simpleSearch {
 
                // These rules MAY NOT be merged because of how CSS requires browsers
                // to parse unrecognized selectors!
+               // Note these rules ensure that placeholder text can be distinguished from
+               // standard text. In browsers which make this distinction clear these rules
+               // are not necessary.
+               // For inputs that use jquery.placeholder.js e.g. IE9-
                &.placeholder {
                        color: #999;
                }
+               // Distinguish placeholder text in IE10+
                &:-ms-input-placeholder {
                        color: #999;
                }
+               // Distinguish placeholder text in Firefox 18-
                &:-moz-placeholder {
                        color: #999;
                }
-               &::-webkit-input-placeholder {
-                       color: #999;
-               }
 
                // Undo the styles Webkit browsers apply to type=search fields,
                // we provide our own
@@ -108,41 +111,3 @@ div#simpleSearch {
                z-index: 1;
        }
 }
-
-// The following styles exist only for backwards-compatibility with
-// cached HTML and are to be removed before 1.23 release.
-
-/* Fix direction changed for awful hacks */
-.sitedir-ltr div#simpleSearch button#searchButton {
-       /* @noflip */
-       direction: ltr;
-}
-.sitedir-rtl div#simpleSearch button#searchButton {
-       /* @noflip */
-       direction: rtl;
-}
-
-div#simpleSearch button#searchButton {
-       position: absolute;
-       padding: 0;
-       padding-top: 0.3em;
-       padding-bottom: 0.2em;
-       padding-right: 0.4em;
-       margin: 0;
-       border: none;
-       background-color: transparent;
-       background-image: none;
-       text-indent: 0;
-
-       /* OVERRIDDEN BY COMPLIANT BROWSERS */
-       img {
-               border: none;
-               margin: 0;
-               margin-top: -3px;
-               padding: 0;
-       }
-       /* IGNORED BY IE6 */
-       > img {
-               margin: 0;
-       }
-}
index 8d5423a..819286e 100644 (file)
@@ -2,6 +2,7 @@
 
 @media screen {
        @import "components/common.less";
+       @import "components/animations.less";
        @import "components/navigation.less";
        @import "components/footer.less";
        @import 'components/notifications.less';
index ea4b0f6..7a048bf 100644 (file)
@@ -40,6 +40,9 @@ $wgAutoloadClasses += array(
        'MediaWikiPHPUnitCommand' => "$testDir/phpunit/MediaWikiPHPUnitCommand.php",
        'MediaWikiPHPUnitTestListener' => "$testDir/phpunit/MediaWikiPHPUnitTestListener.php",
        'MediaWikiLangTestCase' => "$testDir/phpunit/MediaWikiLangTestCase.php",
+       'ResourceLoaderTestCase' => "$testDir/phpunit/ResourceLoaderTestCase.php",
+       'ResourceLoaderTestModule' => "$testDir/phpunit/ResourceLoaderTestCase.php",
+       'ResourceLoaderFileModuleTestModule' => "$testDir/phpunit/ResourceLoaderTestCase.php",
        'TestUser' => "$testDir/phpunit/includes/TestUser.php",
 
        # tests/phpunit/includes
index 55e93e2..95b9d05 100644 (file)
@@ -387,7 +387,7 @@ class ParserTest {
 
                foreach ( $filenames as $filename ) {
                        $contents = file_get_contents( $filename );
-                       preg_match_all( '/!!\s*input\n(.*?)\n!!\s*result/s', $contents, $matches );
+                       preg_match_all( '/!!\s*(input|wikitext)\n(.*?)\n!!\s*(result|html|html\/\*|html\/php)/s', $contents, $matches );
 
                        foreach ( $matches[1] as $match ) {
                                $dict .= $match . "\n";
index a868214..9cea156 100644 (file)
@@ -157,23 +157,23 @@ Template:OpenTable
 ###
 !! test
 Blank input
-!! input
-!! result
+!! wikitext
+!! html
 !! end
 
 
 !! test
 Simple paragraph
-!! input
+!! wikitext
 This is a simple paragraph.
-!! result
+!! html
 <p>This is a simple paragraph.
 </p>
 !! end
 
 !! test
 Paragraphs with extra newline spacing
-!! input
+!! wikitext
 foo
 
 bar
@@ -184,7 +184,7 @@ baz
 
 
 booz
-!! result
+!! html
 <p>foo
 </p><p>bar
 </p><p><br />
@@ -196,7 +196,7 @@ baz
 
 !! test
 Paragraphs with newline spacing with comment lines in between
-!! input
+!! wikitext
 ----
 a
 <!--foo-->
@@ -232,7 +232,7 @@ a
 <!--foo-->
 b
 ----
-!! result
+!! html
 <hr />
 <p>a
 b
@@ -269,7 +269,7 @@ b
 
 !! test
 Paragraphs with newline spacing with non-empty white-space lines in between
-!! input
+!! wikitext
 ----
 a
  
@@ -280,7 +280,7 @@ a
  
 b
 ----
-!! result
+!! html
 <hr />
 <p>a
 </p><p>b
@@ -296,7 +296,7 @@ b
 
 !! test
 Paragraphs with newline spacing with non-empty mixed comment and white-space lines in between
-!! input
+!! wikitext
 ----
 a
  <!--foo-->
@@ -319,7 +319,7 @@ a
  
 b
 ----
-!! result
+!! html
 <hr />
 <p>a
 b
@@ -343,13 +343,13 @@ b
 
 !! test
 Extra newlines: More paragraphs with indented comment
-!! input
+!! wikitext
 a
 
    <!--boo-->
 
 b
-!!result
+!! html
 <p>a
 </p><p><br />
 b
@@ -358,7 +358,7 @@ b
 
 !! test
 Extra newlines followed by heading
-!! input
+!! wikitext
 a
 
 
@@ -368,7 +368,7 @@ a
 
 
 =b=
-!! result
+!! html
 <p>a
 </p><p><br />
 </p>
@@ -382,13 +382,13 @@ a
 
 !! test
 Extra newlines between heading and content are swallowed
-!! input
+!! wikitext
 =b=
 
 
 
 [[a]]
-!! result
+!! html
 <h1><span class="mw-headline" id="b">b</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: b">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
 <p><a href="/index.php?title=A&amp;action=edit&amp;redlink=1" class="new" title="A (page does not exist)">a</a>
 </p>
@@ -396,20 +396,20 @@ Extra newlines between heading and content are swallowed
 
 !! test
 Parsing an URL
-!! input
+!! wikitext
 http://fr.wikipedia.org/wiki/🍺
 <!-- EasterEgg we love beer, better be able be able to link to it -->
-!! result
+!! html
 <p><a rel="nofollow" class="external free" href="http://fr.wikipedia.org/wiki/🍺">http://fr.wikipedia.org/wiki/🍺</a>
 </p>
 !! end
 
 !! test
 Simple list
-!! input
+!! wikitext
 * Item 1
 * Item 2
-!! result
+!! html
 <ul>
 <li> Item 1
 </li>
@@ -421,7 +421,7 @@ Simple list
 
 !! test
 Italics and bold
-!! input
+!! wikitext
 * plain
 * plain''italic''plain
 * plain''italic''plain''italic''plain
@@ -437,7 +437,7 @@ Italics and bold
 * plain'''bold''bold-italic'''''plain
 * plain l'''italic''plain
 * plain l''''bold''' plain
-!! result
+!! html
 <ul>
 <li> plain
 </li>
@@ -476,9 +476,9 @@ Italics and bold
 # this example taken from the [[simple:Moon]] article (bug 47326)
 !! test
 Italics and possessives (1)
-!! input
+!! wikitext
 obtained by ''[[Lunar Prospector]]'''s gamma-ray spectrometer
-!! result
+!! html
 <p>obtained by <i><a href="/index.php?title=Lunar_Prospector&amp;action=edit&amp;redlink=1" class="new" title="Lunar Prospector (page does not exist)">Lunar Prospector</a>'</i>s gamma-ray spectrometer
 </p>
 !! end
@@ -486,9 +486,9 @@ obtained by ''[[Lunar Prospector]]'''s gamma-ray spectrometer
 # this example taken from [[en:Flaming Pie]] (bug 49926)
 !! test
 Italics and possessives (2)
-!! input
+!! wikitext
 '''''Flaming Pie''''' is ... released in 1997. In ''Flaming Pie'''s liner notes
-!! result
+!! html
 <p><i><b>Flaming Pie</b></i> is ... released in 1997. In <i>Flaming Pie'</i>s liner notes
 </p>
 !! end
@@ -496,9 +496,9 @@ Italics and possessives (2)
 # this example taken from [[en:Dictionary]] (bug 49926)
 !! test
 Italics and possessives (3)
-!! input
+!! wikitext
 The first monolingual dictionary written in a Romance language was ''Sebastián Covarrubias''' ''Tesoro de la lengua castellana o española'', published in 1611 in Madrid. In 1612 the first edition of the ''Vocabolario dell'[[Accademia della Crusca]]'', for Italian, was published. In 1690 in Rotterdam was published, posthumously, the ''Dictionnaire Universel''.
-!! result
+!! html
 <p>The first monolingual dictionary written in a Romance language was <i>Sebastián Covarrubias'</i> <i>Tesoro de la lengua castellana o española</i>, published in 1611 in Madrid. In 1612 the first edition of the <i>Vocabolario dell'<a href="/index.php?title=Accademia_della_Crusca&amp;action=edit&amp;redlink=1" class="new" title="Accademia della Crusca (page does not exist)">Accademia della Crusca</a></i>, for Italian, was published. In 1690 in Rotterdam was published, posthumously, the <i>Dictionnaire Universel</i>.
 </p>
 !! end
@@ -509,9 +509,9 @@ The first monolingual dictionary written in a Romance language was ''Sebastián
 ###
 !! test
 Italics and bold: 2-quote opening sequence: (2,2)
-!! input
+!! wikitext
 ''foo''
-!! result
+!! html
 <p><i>foo</i>
 </p>
 !!end
@@ -519,9 +519,9 @@ Italics and bold: 2-quote opening sequence: (2,2)
 
 !! test
 Italics and bold: 2-quote opening sequence: (2,3)
-!! input
+!! wikitext
 ''foo'''
-!! result
+!! html
 <p><i>foo'</i>
 </p>
 !!end
@@ -529,32 +529,23 @@ Italics and bold: 2-quote opening sequence: (2,3)
 
 !! test
 Italics and bold: 2-quote opening sequence: (2,4)
-!! input
+!! wikitext
 ''foo''''
-!! result
+!! html
 <p><i>foo''</i>
 </p>
 !!end
 
 
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
 !! test
-Italics and bold: 2-quote opening sequence: (2,5) (php)
-!! options
-php
-!! input
+Italics and bold: 2-quote opening sequence: (2,5)
+!! wikitext
 ''foo'''''
-!! result
+!! html/php
 <p><i>foo</i>
 </p>
-!!end
-# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
-!! test
-Italics and bold: 2-quote opening sequence: (2,5) (parsoid)
-!! options
-parsoid
-!! input
-''foo'''''
-!! result
+!! html/parsoid
 <p><i>foo</i><b></b>
 </p>
 !!end
@@ -566,9 +557,9 @@ parsoid
 
 !! test
 Italics and bold: 3-quote opening sequence: (3,2)
-!! input
+!! wikitext
 '''foo''
-!! result
+!! html
 <p>'<i>foo</i>
 </p>
 !!end
@@ -576,9 +567,9 @@ Italics and bold: 3-quote opening sequence: (3,2)
 
 !! test
 Italics and bold: 3-quote opening sequence: (3,3)
-!! input
+!! wikitext
 '''foo'''
-!! result
+!! html
 <p><b>foo</b>
 </p>
 !!end
@@ -586,32 +577,23 @@ Italics and bold: 3-quote opening sequence: (3,3)
 
 !! test
 Italics and bold: 3-quote opening sequence: (3,4)
-!! input
+!! wikitext
 '''foo''''
-!! result
+!! html
 <p><b>foo'</b>
 </p>
 !!end
 
 
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
 !! test
-Italics and bold: 3-quote opening sequence: (3,5) (php)
-!! options
-php
-!! input
+Italics and bold: 3-quote opening sequence: (3,5)
+!! wikitext
 '''foo'''''
-!! result
+!! html/php
 <p><b>foo</b>
 </p>
-!!end
-# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
-!! test
-Italics and bold: 3-quote opening sequence: (3,5) (parsoid)
-!! options
-parsoid
-!! input
-'''foo'''''
-!! result
+!! html/parsoid
 <p><b>foo</b><i></i>
 </p>
 !!end
@@ -623,9 +605,9 @@ parsoid
 
 !! test
 Italics and bold: 4-quote opening sequence: (4,2)
-!! input
+!! wikitext
 ''''foo''
-!! result
+!! html
 <p>''<i>foo</i>
 </p>
 !!end
@@ -633,9 +615,9 @@ Italics and bold: 4-quote opening sequence: (4,2)
 
 !! test
 Italics and bold: 4-quote opening sequence: (4,3)
-!! input
+!! wikitext
 ''''foo'''
-!! result
+!! html
 <p>'<b>foo</b>
 </p>
 !!end
@@ -643,32 +625,23 @@ Italics and bold: 4-quote opening sequence: (4,3)
 
 !! test
 Italics and bold: 4-quote opening sequence: (4,4)
-!! input
+!! wikitext
 ''''foo''''
-!! result
+!! html
 <p>'<b>foo'</b>
 </p>
 !!end
 
 
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
 !! test
-Italics and bold: 4-quote opening sequence: (4,5) (php)
-!! options
-php
-!! input
+Italics and bold: 4-quote opening sequence: (4,5)
+!! wikitext
 ''''foo'''''
-!! result
+!! html/php
 <p>'<b>foo</b>
 </p>
-!!end
-# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
-!! test
-Italics and bold: 4-quote opening sequence: (4,5) (parsoid)
-!! options
-parsoid
-!! input
-''''foo'''''
-!! result
+!! html/parsoid
 <p>'<b>foo</b><i></i>
 </p>
 !!end
@@ -681,9 +654,9 @@ parsoid
 !! test
 Italics and bold: 5-quote opening sequence: (5,2)
 !! options
-!! input
+!! wikitext
 '''''foo''
-!! result
+!! html
 <p><b><i>foo</i></b>
 </p>
 !!end
@@ -691,9 +664,9 @@ Italics and bold: 5-quote opening sequence: (5,2)
 
 !! test
 Italics and bold: 5-quote opening sequence: (5,3)
-!! input
+!! wikitext
 '''''foo'''
-!! result
+!! html
 <p><i><b>foo</b></i>
 </p>
 !!end
@@ -701,9 +674,9 @@ Italics and bold: 5-quote opening sequence: (5,3)
 
 !! test
 Italics and bold: 5-quote opening sequence: (5,4)
-!! input
+!! wikitext
 '''''foo''''
-!! result
+!! html
 <p><i><b>foo'</b></i>
 </p>
 !!end
@@ -711,9 +684,9 @@ Italics and bold: 5-quote opening sequence: (5,4)
 
 !! test
 Italics and bold: 5-quote opening sequence: (5,5)
-!! input
+!! wikitext
 '''''foo'''''
-!! result
+!! html
 <p><i><b>foo</b></i>
 </p>
 !!end
@@ -723,9 +696,9 @@ Italics and bold: 5-quote opening sequence: (5,5)
 ###
 !! test
 Italics and bold: multiple quote sequences: (2,4,2)
-!! input
+!! wikitext
 ''foo''''bar''
-!! result
+!! html
 <p><i>foo'<b>bar</b></i>
 </p>
 !!end
@@ -733,9 +706,9 @@ Italics and bold: multiple quote sequences: (2,4,2)
 
 !! test
 Italics and bold: multiple quote sequences: (2,4,3)
-!! input
+!! wikitext
 ''foo''''bar'''
-!! result
+!! html
 <p><i>foo'<b>bar</b></i>
 </p>
 !!end
@@ -743,55 +716,37 @@ Italics and bold: multiple quote sequences: (2,4,3)
 
 !! test
 Italics and bold: multiple quote sequences: (2,4,4)
-!! input
+!! wikitext
 ''foo''''bar''''
-!! result
+!! html
 <p><i>foo'<b>bar'</b></i>
 </p>
 !!end
 
 
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
 !! test
-Italics and bold: multiple quote sequences: (3,4,2) (php)
-!! options
-php
-!! input
+Italics and bold: multiple quote sequences: (3,4,2)
+!! wikitext
 '''foo''''bar''
-!! result
+!! html/php
 <p><b>foo'</b>bar
 </p>
-!!end
-# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
-!! test
-Italics and bold: multiple quote sequences: (3,4,2) (parsoid)
-!! options
-parsoid
-!! input
-'''foo''''bar''
-!! result
+!! html/parsoid
 <p><b>foo'</b>bar<i></i>
 </p>
 !!end
 
 
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
 !! test
-Italics and bold: multiple quote sequences: (3,4,3) (php)
-!! options
-php
-!! input
+Italics and bold: multiple quote sequences: (3,4,3)
+!! wikitext
 '''foo''''bar'''
-!! result
+!! html/php
 <p><b>foo'</b>bar
 </p>
-!!end
-# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
-!! test
-Italics and bold: multiple quote sequences: (3,4,3) (parsoid)
-!! options
-parsoid
-!! input
-'''foo''''bar'''
-!! result
+!! html/parsoid
 <p><b>foo'</b>bar<b></b>
 </p>
 !!end
@@ -801,9 +756,9 @@ parsoid
 ###
 !! test
 Italics and bold: other quote tests: (2,3,5)
-!! input
+!! wikitext
 ''this is about '''foo's family'''''
-!! result
+!! html
 <p><i>this is about <b>foo's family</b></i>
 </p>
 !!end
@@ -811,9 +766,9 @@ Italics and bold: other quote tests: (2,3,5)
 
 !! test
 Italics and bold: other quote tests: (2,(3,3),2)
-!! input
+!! wikitext
 ''this is about '''foo's''' family''
-!! result
+!! html
 <p><i>this is about <b>foo's</b> family</i>
 </p>
 !!end
@@ -821,9 +776,9 @@ Italics and bold: other quote tests: (2,(3,3),2)
 
 !! test
 Italics and bold: other quote tests: (3,2,3,2)
-!! input
+!! wikitext
 '''this is about ''foo'''s family''
-!! result
+!! html
 <p><b>this is about <i>foo</i></b><i>s family</i>
 </p>
 !!end
@@ -832,9 +787,9 @@ Italics and bold: other quote tests: (3,2,3,2)
 !! test
 Italics and bold: other quote tests: (3,2,3,3)
 !! options
-!! input
+!! wikitext
 '''this is about ''foo'''s family'''
-!! result
+!! html
 <p>'<i>this is about </i>foo<b>s family</b>
 </p>
 !!end
@@ -842,9 +797,9 @@ Italics and bold: other quote tests: (3,2,3,3)
 
 !! test
 Italics and bold: other quote tests: (3,(2,2),3)
-!! input
+!! wikitext
 '''this is about ''foo's'' family'''
-!! result
+!! html
 <p><b>this is about <i>foo's</i> family</b>
 </p>
 !!end
@@ -852,9 +807,9 @@ Italics and bold: other quote tests: (3,(2,2),3)
 
 !! test
 Italicized possessive
-!! input
+!! wikitext
 The ''[[Main Page]]'''s talk page.
-!! result
+!! html
 <p>The <i><a href="/wiki/Main_Page" title="Main Page">Main Page</a>'</i>s talk page.
 </p>
 !! end
@@ -864,12 +819,12 @@ Parsoid only: Quote balancing context should be restricted to td/th cells on the
 (Requires tidy for PHP parser output to be fixed up)
 !! options
 parsoid=wt2html,wt2wt
-!! input
+!! wikitext
 {|
 !''a!!''b
 |''a||''b
 |}
-!! result
+!! html
 <table>
 <tbody><tr><th><i>a</i></th><th><i>b</i></th>
 <td><i>a</i></td><td><i>b</i></td></tr>
@@ -882,13 +837,13 @@ parsoid=wt2html,wt2wt
 
 !! test
 Non-html5 tags should be accepted
-!! input
+!! wikitext
 <center>''foo''</center>
 <big>''foo''</big>
 <font>''foo''</font>
 <strike>''foo''</strike>
 <tt>''foo''</tt>
-!! result
+!! html
 <center><i>foo</i></center>
 <p><big><i>foo</i></big>
 <font><i>foo</i></font>
@@ -899,9 +854,9 @@ Non-html5 tags should be accepted
 
 !! test
 <wbr> is valid wikitext (bug 52468)
-!! input
+!! wikitext
 <wbr>
-!! result
+!! html
 <p><wbr />
 </p>
 !! end
@@ -909,11 +864,11 @@ Non-html5 tags should be accepted
 # <strike> is HTML4, <s> is HTML4/5.
 !! test
 <s> or <strike> for strikethrough
-!! input
+!! wikitext
 <strike>strike</strike>
 
 <s>s</s>
-!! result
+!! html
 <p><strike>strike</strike>
 </p><p><s>s</s>
 </p>
@@ -921,7 +876,7 @@ Non-html5 tags should be accepted
 
 !! test
 Non-word characters don't terminate tag names (bug 17663, 40670, 52022)
-!! input
+!! wikitext
 <b→> doesn't work! </b→>
 
 <bä> doesn't work! </bä>
@@ -931,7 +886,7 @@ Non-word characters don't terminate tag names (bug 17663, 40670, 52022)
 <s.foo>s.foo</s.foo>
 
 <sub-ID#1>
-!! result
+!! html
 <p>&lt;b→&gt; doesn't work! &lt;/b→&gt;
 </p><p>&lt;bä&gt; doesn't work! &lt;/bä&gt;
 </p><p>&lt;boo&gt; works fine &lt;/boo&gt;
@@ -942,11 +897,11 @@ Non-word characters don't terminate tag names (bug 17663, 40670, 52022)
 
 !! test
 Isolated close tags should be treated as literal text (bug 52760)
-!! input
+!! wikitext
 </b>
 
 <s.foo>s</s>
-!! result
+!! html
 <p>&lt;/b&gt;
 </p><p>&lt;s.foo&gt;s&lt;/s&gt;
 </p>
@@ -958,18 +913,18 @@ Isolated close tags should be treated as literal text (bug 52760)
 
 !! test
 Bare pipe character (bug 52363)
-!! input
+!! wikitext
 |
-!! result
+!! html
 <p>|
 </p>
 !! end
 
 !! test
 Bare pipe character from a template (bug 52363)
-!! input
+!! wikitext
 {{pipe}}
-!! result
+!! html
 <p>|
 </p>
 !! end
@@ -980,16 +935,16 @@ Bare pipe character from a template (bug 52363)
 
 !! test
 <nowiki> unordered list
-!! input
+!! wikitext
 <nowiki>* This is not an unordered list item.</nowiki>
-!! result
+!! html
 <p>* This is not an unordered list item.
 </p>
 !! end
 
 !! test
 <nowiki> spacing
-!! input
+!! wikitext
 <nowiki>Lorem ipsum dolor
 
 sed abit.
@@ -997,7 +952,7 @@ sed abit.
 
 :and a colon
 </nowiki>
-!! result
+!! html
 <p>Lorem ipsum dolor
 
 sed abit.
@@ -1010,7 +965,7 @@ sed abit.
 
 !! test
 nowiki 3
-!! input
+!! wikitext
 :There is not nowiki.
 :There is <nowiki>nowiki</nowiki>.
 
@@ -1019,7 +974,7 @@ nowiki 3
 
 *There is not nowiki.
 *There is <nowiki>nowiki</nowiki>.
-!! result
+!! html
 <dl>
 <dd>There is not nowiki.
 </dd>
@@ -1043,9 +998,9 @@ nowiki 3
 
 !! test
 Entities inside <nowiki>
-!! input
+!! wikitext
 <nowiki>&lt;</nowiki>
-!! result
+!! html
 <p>&lt;
 </p>
 !! end
@@ -1054,9 +1009,9 @@ Entities inside <nowiki>
 Entities inside template parameters
 !! options
 parsoid
-!! input
+!! wikitext
 {{echo|&ndash;}}
-!! result
+!! html
 <p><span typeof="mw:Transclusion mw:Entity" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&amp;ndash;"}},"i":0}}]}'>&ndash;</span>
 </p>
 !! end
@@ -1066,7 +1021,7 @@ parsoid
 ###
 !! test
 Comments and Indent-Pre
-!! input
+!! wikitext
 <!-- comment 1 --> asdf
 
 <!-- comment 1 --> asdf
@@ -1077,7 +1032,7 @@ Comments and Indent-Pre
 
 <!-- comment 1 --> asdf
 <!-- comment 2 --> xyz
-!! result
+!! html
 <pre>asdf
 </pre>
 <pre>asdf
@@ -1093,11 +1048,11 @@ xyz
 
 !! test
 Comment test 2a
-!! input
+!! wikitext
 asdf
 <!-- comment 1 -->
 jkl
-!! result
+!! html
 <p>asdf
 jkl
 </p>
@@ -1105,12 +1060,12 @@ jkl
 
 !! test
 Comment test 2b
-!! input
+!! wikitext
 asdf
 <!-- comment 1 -->
 
 jkl
-!! result
+!! html
 <p>asdf
 </p><p>jkl
 </p>
@@ -1118,12 +1073,12 @@ jkl
 
 !! test
 Comment test 3
-!! input
+!! wikitext
 asdf
 <!-- comment 1 -->
 <!-- comment 2 -->
 jkl
-!! result
+!! html
 <p>asdf
 jkl
 </p>
@@ -1131,20 +1086,20 @@ jkl
 
 !! test
 Comment test 4
-!! input
+!! wikitext
 asdf<!-- comment 1 -->jkl
-!! result
+!! html
 <p>asdfjkl
 </p>
 !! end
 
 !! test
 Comment spacing
-!! input
+!! wikitext
 a
  <!-- foo --> b <!-- bar -->
 c
-!! result
+!! html
 <p>a
 </p>
 <pre> b 
 
 !! test
 Comment whitespace
-!! input
+!! wikitext
 <!-- returns a single newline, not nothing, since the newline after > is not stripped -->
-!! result
+!! html
 
 !! end
 
 !! test
 Comment semantics and delimiters
-!! input
+!! wikitext
 <!-- --><!----><!-----><!------>
-!! result
+!! html
 
 !! end
 
 !! test
 Comment semantics and delimiters, redux
-!! input
+!! wikitext
 <!-- In SGML every "foo" here would actually show up in the text -- foo -- bar
 -- foo -- funky huh? ... -->
-!! result
+!! html
 
 !! end
 
 !! test
 Comment semantics and delimiters: directors cut
-!! input
+!! wikitext
 <!-- ... However we like to keep things simple and somewhat XML-ish so we eat
 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
 -->-->
-!! result
+!! html
 <p>--&gt;
 </p>
 !! end
 
 !! test
 Comment semantics: nesting
-!! input
+!! wikitext
 <!--<!-- no, we're not going to do anything fancy here -->-->
-!! result
+!! html
 <p>--&gt;
 </p>
 !! end
 
 !! test
 Comment semantics: unclosed comment at end
-!! input
+!! wikitext
 <!--This comment will run out to the end of the document
-!! result
+!! html
 
 !! end
 
 !! test
 Comment in template title
-!! input
+!! wikitext
 {{f<!---->oo}}
-!! result
+!! html
 <p>FOO
 </p>
 !! end
 
 !! test
 Comment on its own line post-expand
-!! input
+!! wikitext
 a
 {{blank}}<!---->
 b
-!! result
+!! html
 <p>a
 </p><p>b
 </p>
 
 !! test
 Comment on its own line post-expand with non-significant whitespace
-!! input
+!! wikitext
 a
  {{blank}} <!----> 
 b
-!! result
+!! html
 <p>a
 </p><p>b
 </p>
 ###
 !! test
 No block tags
-!! input
+!! wikitext
 a
 
 b
-!! result
+!! html
 <p>a
 </p><p>b
 </p>
 
 !! test
 Block tag on one line (<div>)
-!! input
+!! wikitext
 a <div>foo</div>
 
 b
-!! result
+!! html
 a <div>foo</div>
 <p>b
 </p>
@@ -1269,11 +1224,11 @@ a <div>foo</div>
 
 !! test
 Block tag on one line (<blockquote>)
-!! input
+!! wikitext
 a <blockquote>foo</blockquote>
 
 b
-!! result
+!! html
 a <blockquote>foo</blockquote>
 <p>b
 </p>
@@ -1281,11 +1236,11 @@ a <blockquote>foo</blockquote>
 
 !! test
 Block tag on both lines (<div>)
-!! input
+!! wikitext
 a <div>foo</div>
 
 b <div>foo</div>
-!! result
+!! html
 a <div>foo</div>
 b <div>foo</div>
 
@@ -1293,11 +1248,11 @@ b <div>foo</div>
 
 !! test
 Block tag on both lines (<blockquote>)
-!! input
+!! wikitext
 a <blockquote>foo</blockquote>
 
 b <blockquote>foo</blockquote>
-!! result
+!! html
 a <blockquote>foo</blockquote>
 b <blockquote>foo</blockquote>
 
@@ -1305,13 +1260,13 @@ b <blockquote>foo</blockquote>
 
 !! test
 Multiple lines without block tags
-!! input
+!! wikitext
 <div>foo</div> a
 b
 c
 d<!--foo--> e
 x <div>foo</div> z
-!! result
+!! html
 <div>foo</div> a
 <p>b
 c
@@ -1323,7 +1278,7 @@ x <div>foo</div> z
 
 !! test
 Empty lines between lines with block tags
-!! input
+!! wikitext
 <div></div>
 
 
@@ -1336,7 +1291,7 @@ b
 
 
 <div>e</div>
-!! result
+!! html
 <div></div>
 <p><br />
 </p>
 ## PHP parser emits output which is broken
 !! test
 Unclosed HTML p-tags should be handled properly
-!! options
-parsoid
-!! input
+!! wikitext
 <div><p>foo</div>
 a
 
 b
-!! result
+!! html/parsoid
 <div data-parsoid='{"stx":"html"}'><p data-parsoid='{"stx":"html", "autoInsertedEnd":true}'>foo</p></div>
 <p>a</p>
 <p>b</p>
 ###
 !! test
 Preformatted text
-!! input
+!! wikitext
  This is some
  Preformatted text
  With ''italic''
  And '''bold'''
  And a [[Main Page|link]]
-!! result
+!! html
 <pre>This is some
 Preformatted text
 With <i>italic</i>
@@ -1389,12 +1342,12 @@ And a <a href="/wiki/Main_Page" title="Main Page">link</a>
 
 !! test
 Tabs don't trigger preformatted text
-!! input
+!! wikitext
        This is not
         preformatted text.
  This is preformatted text.
        So is this.
-!! result
+!! html
 <p>    This is not
         preformatted text.
 </p>
@@ -1405,10 +1358,10 @@ Tabs don't trigger preformatted text
 
 !! test
 Ident preformatting with inline content
-!! input
+!! wikitext
  a
  ''b''
-!! result
+!! html
 <pre>a
 <i>b</i>
 </pre>
@@ -1416,13 +1369,13 @@ Ident preformatting with inline content
 
 !! test
 <pre> with <nowiki> inside (compatibility with 1.6 and earlier)
-!! input
+!! wikitext
 <pre><nowiki>
 <b>
 <cite>
 <em>
 </nowiki></pre>
-!! result
+!! html
 <pre>
 &lt;b&gt;
 &lt;cite&gt;
@@ -1433,11 +1386,11 @@ Ident preformatting with inline content
 
 !! test
 Regression with preformatted in <center>
-!! input
+!! wikitext
 <center>
  Blah
 </center>
-!! result
+!! html
 <center>
 <pre>Blah
 </pre>
@@ -1447,7 +1400,7 @@ Regression with preformatted in <center>
 
 !! test
 Bug 52763: Preformatted in <blockquote>
-!! input
+!! wikitext
 <blockquote>
  Blah
 {|
@@ -1455,7 +1408,7 @@ Bug 52763: Preformatted in <blockquote>
  indented cell (no pre-wrapping!)
 |}
 </blockquote>
-!! result
+!! html
 <blockquote>
 <p> Blah
 </p>
@@ -1471,13 +1424,13 @@ Bug 52763: Preformatted in <blockquote>
 
 !! test
 Bug 51086: Double newlines in blockquotes should be turned into paragraphs
-!! input
+!! wikitext
 <blockquote>
 Foo
 
 Bar
 </blockquote>
-!! result
+!! html
 <blockquote>
 <p>Foo
 </p><p>Bar
@@ -1488,11 +1441,11 @@ Bar
 
 !! test
 Bug 15491: <ins>/<del> in blockquote
-!! input
+!! wikitext
 <blockquote>
 Foo <del>bar</del> <ins>baz</ins> quux
 </blockquote>
-!! result
+!! html
 <blockquote>
 <p>Foo <del>bar</del> <ins>baz</ins> quux
 </p>
@@ -1505,10 +1458,10 @@ Foo <del>bar</del> <ins>baz</ins> quux
 # below in a <p> tag. (see comment 23-25 of bug #6200)
 !! test
 Bug 15491: <ins>/<del> in blockquote (2)
-!! input
+!! wikitext
 <blockquote>Foo <del>bar</del> <ins>baz</ins> quux
 </blockquote>
-!! result
+!! html
 <blockquote>Foo <del>bar</del> <ins>baz</ins> quux
 </blockquote>
 
@@ -1516,52 +1469,52 @@ Bug 15491: <ins>/<del> in blockquote (2)
 
 !! test
 <pre> with attributes (bug 3202)
-!! input
+!! wikitext
 <pre style="background: blue; color:white">Bluescreen of WikiDeath</pre>
-!! result
+!! html
 <pre style="background: blue; color:white">Bluescreen of WikiDeath</pre>
 
 !! end
 
 !! test
 <pre> with width attribute (bug 3202)
-!! input
+!! wikitext
 <pre width="8">Narrow screen goodies</pre>
-!! result
+!! html
 <pre width="8">Narrow screen goodies</pre>
 
 !! end
 
 !! test
 <pre> with forbidden attribute (bug 3202)
-!! input
+!! wikitext
 <pre width="8" onmouseover="alert(document.cookie)">Narrow screen goodies</pre>
-!! result
+!! html
 <pre width="8">Narrow screen goodies</pre>
 
 !! end
 
 !! test
 Entities inside <pre>
-!! input
+!! wikitext
 <pre>&lt;</pre>
-!! result
+!! html
 <pre>&lt;</pre>
 
 !! end
 
 !! test
 <pre> with forbidden attribute values (bug 3202)
-!! input
+!! wikitext
 <pre width="8" style="border-width: expression(alert(document.cookie))">Narrow screen goodies</pre>
-!! result
+!! html
 <pre width="8" style="/* insecure input */">Narrow screen goodies</pre>
 
 !! end
 
 !! test
 <nowiki> inside <pre> (bug 13238)
-!! input
+!! wikitext
 <pre>
 <nowiki>
 </pre>
@@ -1569,7 +1522,7 @@ Entities inside <pre>
 <nowiki></nowiki>
 </pre>
 <pre><nowiki><nowiki></nowiki>Foo<nowiki></nowiki></nowiki></pre>
-!! result
+!! html
 <pre>
 &lt;nowiki&gt;
 </pre>
@@ -1582,7 +1535,7 @@ Entities inside <pre>
 
 !! test
 <nowiki> and <pre> preference (first one wins)
-!! input
+!! wikitext
 <pre>
 <nowiki>
 </pre>
@@ -1596,7 +1549,7 @@ Entities inside <pre>
 </nowiki>
 </pre>
 
-!! result
+!! html
 <pre>
 &lt;nowiki&gt;
 </pre>
@@ -1613,23 +1566,23 @@ Entities inside <pre>
 
 !! test
 </pre> inside nowiki
-!! input
+!! wikitext
 <nowiki></pre></nowiki>
-!! result
+!! html
 <p>&lt;/pre&gt;
 </p>
 !! end
 
 !! test
 Empty pre; pre inside other HTML tags (bug 54946)
-!! input
+!! wikitext
 a
 
 <div><pre>
 foo
 </pre></div>
 <pre></pre>
-!! result
+!! html
 <p>a
 </p>
 <div><pre>
@@ -1641,10 +1594,10 @@ foo
 
 !! test
 HTML pre followed by indent-pre
-!! input
+!! wikitext
 <pre>foo</pre>
  bar
-!! result
+!! html
 <pre>foo</pre>
 <pre>bar
 </pre>
@@ -1654,36 +1607,36 @@ HTML pre followed by indent-pre
 Block tag pre
 !!options
 parsoid
-!!input
+!! wikitext
 <p><pre>foo</pre></p>
-!!result
-<p data-parsoid='{"stx":"html","autoInsertedEnd":true,"dsr":[0,3,3,0]}'></p><pre data-parsoid='{"stx":"html","dsr":[3,17,5,6]}'>foo</pre><p data-parsoid='{"autoInsertedStart":true,"stx":"html","dsr":[17,21,0,null]}'></p>
+!! html
+<p data-parsoid='{"stx":"html","autoInsertedEnd":true}'></p><pre data-parsoid='{"stx":"html"}'>foo</pre><p data-parsoid='{"autoInsertedStart":true,"stx":"html"}'></p>
 !!end
 
 !!test
 Templates: Indent-Pre: 1a. Templates that break a line should suppress <pre>
-!!input
+!! wikitext
  {{echo|}}
-!!result
+!! html
 
 !!end
 
 !!test
 Templates: Indent-Pre: 1b. Templates that break a line should suppress <pre>
-!!input
+!! wikitext
  {{echo|
 foo}}
-!!result
+!! html
 <p>foo
 </p>
 !!end
 
 !! test
 Templates: Indent-Pre: 1c: Wrapping should be based on expanded content
-!! input
+!! wikitext
  {{echo|a
 b}}
-!!result
+!! html
 <pre>a
 </pre>
 <p>b
@@ -1692,14 +1645,14 @@ b}}
 
 !! test
 Templates: Indent-Pre: 1d: Wrapping should be based on expanded content
-!! input
+!! wikitext
  {{echo|a
 b
 c
  d
 e
 }}
-!!result
+!! html
 <pre>a
 </pre>
 <p>b
@@ -1713,7 +1666,7 @@ c
 
 !!test
 Templates: Indent-Pre: 1e. Wrapping should be based on expanded content
-!!input
+!! wikitext
 {{echo| foo}}
 
 {{echo| foo}}{{echo| bar}}
@@ -1726,7 +1679,7 @@ Templates: Indent-Pre: 1e. Wrapping should be based on expanded content
 <!--cmt-->{{echo| foo}}
 
 {{echo|{{echo| }}bar}}
-!!result
+!! html
 <pre>foo
 </pre>
 <pre>foo bar
@@ -1744,7 +1697,7 @@ bar
 
 !! test
 Templates: Indent-Pre: 1f: Wrapping should be based on expanded content
-!! input
+!! wikitext
 {{echo| }}a
 
 {{echo|
@@ -1758,7 +1711,7 @@ Templates: Indent-Pre: 1f: Wrapping should be based on expanded content
 
 {{echo|a
 }} b
-!!result
+!! html
 <pre>a
 </pre>
 <p><br />
@@ -1781,9 +1734,9 @@ Templates: Indent-Pre: 1f: Wrapping should be based on expanded content
 
 !! test
 Things that look like <pre> tags aren't treated as such
-!! input
+!! wikitext
 Barack Obama <President> of the United States
-!! result
+!! html
 <p>Barack Obama &lt;President&gt; of the United States
 </p>
 !! end
@@ -1792,9 +1745,9 @@ Barack Obama <President> of the United States
 Parsoid: handle pre with space after attribute
 !! options
 parsoid=wt2html
-!! input
+!! wikitext
 <pre style="width:50%;" >{{echo|foo}}</pre>
-!! result
+!! html
 <pre style="width:50%;">{{echo|foo}}</pre>
 !! end
 
@@ -1803,7 +1756,7 @@ parsoid=wt2html
 Parsoid: Don't paragraph-wrap fosterable content
 !! options
 parsoid=wt2html
-!! input
+!! wikitext
 {|
 <td></td>
 <td></td>
@@ -1811,7 +1764,7 @@ parsoid=wt2html
 
 
 |}
-!! result
+!! html
 <table>
 
 <tbody>
@@ -1829,7 +1782,7 @@ parsoid=wt2html
 Parsoid: Don't paragraph-wrap fosterable content even if table syntax is unbalanced
 !! options
 parsoid=wt2html
-!! input
+!! wikitext
 {|
 <td>
 <td>
@@ -1838,7 +1791,7 @@ parsoid=wt2html
 
 
 |}
-!! result
+!! html
 <table>
 
 <tbody>
@@ -1860,7 +1813,7 @@ parsoid=wt2html
 #--------------------------------------------------------------------
 !! test
 Templates: Strip leading and trailing whitespace from named-param values
-!! input
+!! wikitext
 {{echo|1= a }}
 
 {{echo|1= {{echo|b}} }}
@@ -1871,7 +1824,7 @@ Templates: Strip leading and trailing whitespace from named-param values
 {{echo| 1 =
 * d
 }}
-!! result
+!! html
 <p>a
 </p><p>b
 </p><p>c
@@ -1885,7 +1838,7 @@ Templates: Strip leading and trailing whitespace from named-param values
 
 !! test
 Templates: Don't strip whitespace from positional-param values
-!! input
+!! wikitext
 {{echo|a }}
 
 {{echo|{{echo|b}} }}
@@ -1904,7 +1857,7 @@ Templates: Don't strip whitespace from positional-param values
 
 {{echo|
  }}g
-!! result
+!! html
 <p>a 
 </p><p>b 
 </p>
@@ -1932,12 +1885,12 @@ Templates: Don't strip whitespace from positional-param values
 
 !! test
 Templates: Handle empty comment-and-ws-only lines correctly
-!! input
+!! wikitext
 {{echo|foo
 <!--should be ignored-->
  <!--should be ignored as well-->
 bar}}
-!! result
+!! html
 <p>foo
 bar
 </p>
@@ -1950,9 +1903,9 @@ bar
 Templates: Parsoid parameter escaping test 1
 !! options
 parsoid
-!! input
+!! wikitext
 {{echo|[foo]|{{echo|[bar]}}}}
-!! result
+!! html
 <p about="#mwt1" typeof="mw:Transclusion"
 data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[foo]"},"2":{"wt":"{{echo|[bar]}}"}},"i":0}}]}'>[foo]</p>
 !! end
@@ -1961,9 +1914,9 @@ data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},
 Parsoid: Pipes in external links in template parameter
 !! options
 parsoid
-!! input
+!! wikitext
 {{echo|[{{echo|http://example.com}} link]}}
-!! result
+!! html
 <p><a rel="mw:ExtLink" href="http://example.com" about="#mwt31" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[{{echo|http://example.com}} link]"}},"i":0}}]}'>link</a></p>
 !! end
 
@@ -1971,9 +1924,9 @@ parsoid
 Parsoid: pipe in transclusion parameter
 !! options
 parsoid
-!! input
+!! wikitext
 {{echo|http://foo.com/a&#124;b}}
-!! result
+!! html
 <p><a rel="mw:ExtLink" href="http://foo.com/a|b" about="#mwt1"
 typeof="mw:Transclusion"
 data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"http://foo.com/a&amp;#124;b"}},"i":0}}]}'>http://foo.com/a|b</a></p>
@@ -1983,9 +1936,9 @@ data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},
 Parsoid: Pipe in external link target and content in template parameter
 !! options
 parsoid=html2wt,wt2wt
-!! input
+!! wikitext
 {{echo|[http://foo.com/a&#124;b a&#124;b]}}
-!! result
+!! html
 <p><a rel="mw:ExtLink" href="http://foo.com/a|b" about="#mwt1"
 typeof="mw:Transclusion"
 data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},
@@ -1996,11 +1949,11 @@ data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},
 Templates: Don't escape already nowiki-escaped text in template parameters
 !! options
 parsoid=html2wt,wt2wt
-!! input
+!! wikitext
 {{echo|foo<nowiki>|</nowiki>bar}}
 {{echo|<nowiki>&lt;div&gt;</nowiki>}}
 {{echo|<nowiki></nowiki>}}
-!! result
+!! html
 <p><span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo<nowiki>|</nowiki>bar"}},"i":0}}]}'}'>foo</span><span typeof="mw:Nowiki" about="#mwt1">|</span><span about="#mwt1">bar</span>
 <span typeof="mw:Transclusion mw:Nowiki" about="#mwt2" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<nowiki>&amp;lt;div&amp;gt;</nowiki>"}},"i":0}}]}'><span typeof="mw:Entity">&lt;</span>div<span typeof="mw:Entity">&gt;</span></span>
 <span typeof="mw:Transclusion mw:Nowiki" about="#mwt3" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<nowiki></nowiki>"}},"i":0}}]}'></span>
@@ -2012,9 +1965,9 @@ parsoid=html2wt,wt2wt
 Templates: '=' char in nested transclusions should not trigger nowiki escapes or conversion to named param
 !! options
 parsoid=html2wt,wt2wt
-!! input
+!! wikitext
 {{echo|{{echo|1=bar}}}}
-!! result
+!! html
 <p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"{{echo|1=bar}}"}},"i":0}}]}'>bar</p>
 !! end
 
@@ -2023,9 +1976,9 @@ parsoid=html2wt,wt2wt
 Templates parameters with special tokenizing behavior dont get modified because of arg escaping
 !! options
 parsoid
-!! input
+!! wikitext
 {{echo|a : b}}
-!! result
+!! 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>
 !! end
 
@@ -2035,11 +1988,11 @@ parsoid
 
 !!test
 1a. Indent-Pre and Comments
-!!input
+!! wikitext
  a
 <!--a-->
 c
-!!result
+!! html
 <pre>a
 </pre>
 <p>c
 
 !!test
 1b. Indent-Pre and Comments
-!!input
+!! wikitext
  a
  <!--a-->
 c
-!!result
+!! html
 <pre>a
 </pre>
 <p>c
 
 !!test
 1c. Indent-Pre and Comments
-!!input
+!! wikitext
 <!--a-->  a
 
  <!--a--> a
-!!result
+!! html
 <pre> a
 </pre>
 <pre> a
 !!test
 1d. Indent-Pre and Comments
 (Pre-handler currently cannot distinguish between comment/ws order and normalizes them to [comment,ws] order)
-!!input
+!! wikitext
 <!--a--> a
 
  <!--b-->b
-!!result
+!! html
 <pre>a
 </pre>
 <pre>b
 
 !!test
 2a. Indent-Pre and tables
-!!input
+!! wikitext
  {|
  |-
  !h1!!h2
  |foo||bar
  |}
-!!result
+!! html
 <table>
 
 <tr>
 
 !!test
 2b. Indent-Pre and tables
-!!input
+!! wikitext
   {|
  |-
 |foo
 |}
-!!result
+!! html
 <table>
 
 <tr>
 
 !!test
 2c. Indent-Pre and tables (bug 42252)
-!!input
+!! wikitext
 {|
  |+ foo
  !  | bar
 |}
-!!result
+!! html
 <table>
 <caption> foo
 </caption>
 
 !!test
 3a. Indent-Pre and block tags (single-line html)
-!!input
+!! wikitext
  a <p> foo </p>
  b <div> foo </div>
  c <blockquote> foo </blockquote>
  <span> foo </span>
-!!result
+!! html
  a <p> foo </p>
  b <div> foo </div>
  c <blockquote> foo </blockquote>
 !!end
 
 !!test
-3c. Indent-Pre and block tags (multi-line html)
-!!input
+3b. Indent-Pre and block tags (multi-line html)
+!! wikitext
  a <span>foo</span>
  b <div> foo </div>
-!!result
+!! html
 <pre>a <span>foo</span>
 </pre>
  b <div> foo </div>
@@ -2168,8 +2121,8 @@ c
 !!end
 
 !!test
-3b. Indent-Pre and block tags (pre-content on separate line)
-!!input
+3c. Indent-Pre and block tags (pre-content on separate line)
+!! wikitext
 <p>
  foo
 </p>
@@ -2200,7 +2153,7 @@ foo
   foo
 </li></ul>
 
-!!result
+!! html
 <p>
  foo
 </p>
@@ -2231,15 +2184,87 @@ foo
 
 !!end
 
+!!test
+4. Indent-Pre and extension tags
+!! wikitext
+ a <gallery>
+File:foobar.jpg
+</gallery>
+!! html
+ a <ul class="gallery mw-gallery-traditional">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
+                       <div class="gallerytext">
+                       </div>
+               </div></li>
+</ul>
+
+!!end
+
+!! test
+Leading pipes outside of tables
+!! options
+parsoid
+!! wikitext
+| foo
+!! html
+<p>| foo</p>
+!! end
+
+!! test
+Leading pipes outside of tables 2
+!! options
+parsoid
+!! wikitext
+a
+| foo
+b
+!! html
+<p>a
+| foo
+b</p>
+!! end
+
+!! test
+Leading pipes outside of tables 3
+!! options
+parsoid
+!! wikitext
+a
+| class="foo bar" | baz
+b
+!! html
+<p>a
+| class="foo bar" | baz
+b</p>
+!! end
+
+!!test
+Render paragraphs when indent-pre is suppressed in blocklevels
+!! wikitext
+<blockquote>
+ foo
+
+ bar
+</blockquote>
+!! html
+<blockquote>
+<p> foo
+</p><p> bar
+</p>
+</blockquote>
+
+!!end
+
 !!test
 4. Multiple spaces at start-of-line
-!!input
+!! wikitext
     <p> foo </p>
     foo
        {|
 |foo
 |}
-!!result
+!! html
     <p> foo </p>
 <pre>   foo
 </pre>
@@ -2253,11 +2278,11 @@ foo
 ## NOTE: the leading white-space chars on empty line are significant
 !! test
 5a. White-space in indent-pre
-!! input
+!! wikitext
  a<br />
  
  b
-!! result
+!! html
 <pre>a<br />
 
 b
 ## NOTE: the leading white-space chars on empty line are significant
 !! test
 5b. White-space in indent-pre
-!! input
+!! wikitext
  a
  
  b
  
  
  c
-!! result
+!! html
 <pre>a
 
 b
 
 !! test
 5c. White-space in indent-pre
-!! input
+!! wikitext
  ''a''
   ''b''
    ''c''
-!! result
+!! html
 <pre><i>a</i>
  <i>b</i>
   <i>c</i>
@@ -2299,7 +2324,7 @@ c
 
 !! test
 6. Pre-blocks should extend across lines with leading WS even when there is no wrappable content
-!! input
+!! wikitext
  a
  
  <!-- continue -->
@@ -2308,7 +2333,7 @@ c
  c
  
 d
-!! result
+!! html
 <pre>a
 
 b
 7a. Indent-pre and category links
 !! options
 parsoid=wt2html,wt2wt
-!! input
+!! wikitext
  [[Category:foo]] <!-- No pre-wrapping -->
 {{echo| [[Category:foo]]}} <!-- No pre-wrapping -->
-!! result
+!! 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 -->
@@ -2337,10 +2362,10 @@ parsoid=wt2html,wt2wt
 7b. Indent-pre and category links
 !! options
 parsoid=wt2html,wt2wt
-!! input
+!! wikitext
  [[Category:foo]] a
  [[Category:foo]] {{echo|b}}
-!! result
+!! html
 <pre>
 <link rel="mw:PageProp/Category" href="./Category:Foo"> a
 
@@ -2353,7 +2378,7 @@ parsoid=wt2html,wt2wt
 
 !!test
 HTML-pre: 1. embedded newlines
-!!input
+!! wikitext
 <pre>foo</pre>
 
 <pre>
@@ -2370,7 +2395,7 @@ foo
 
 foo
 </pre>
-!!result
+!! html
 <pre>foo</pre>
 <pre>
 foo
@@ -2389,11 +2414,11 @@ foo
 
 !!test
 HTML-pre: 2: indented text
-!!input
+!! wikitext
 <pre>
  foo
 </pre>
-!!result
+!! html
 <pre>
  foo
 </pre>
@@ -2402,7 +2427,7 @@ HTML-pre: 2: indented text
 
 !!test
 HTML-pre: 3: other wikitext
-!!input
+!! wikitext
 <pre>
 * foo
 # bar
@@ -2410,7 +2435,7 @@ HTML-pre: 3: other wikitext
 '' no-italic ''
 [[ NoLink ]]
 </pre>
-!!result
+!! html
 <pre>
 * foo
 # bar
@@ -2426,9 +2451,9 @@ HTML-pre: 3: other wikitext
 ###
 !! test
 Simple definition
-!! input
+!! wikitext
 ; name : Definition
-!! result
+!! html
 <dl>
 <dt> name&#160;</dt>
 <dd> Definition
@@ -2439,9 +2464,9 @@ Simple definition
 
 !! test
 Definition list for indentation only
-!! input
+!! wikitext
 : Indented text
-!! result
+!! html
 <dl>
 <dd> Indented text
 </dd>
@@ -2451,9 +2476,9 @@ Definition list for indentation only
 
 !! test
 Definition list with no space
-!! input
+!! wikitext
 ;name:Definition
-!! result
+!! html
 <dl>
 <dt>name</dt>
 <dd>Definition
@@ -2464,9 +2489,9 @@ Definition list with no space
 
 !! test
 Definition list with URL link
-!! input
+!! wikitext
 ; http://example.com/ : definition
-!! result
+!! html
 <dl>
 <dt> <a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a>&#160;</dt>
 <dd> definition
@@ -2477,9 +2502,9 @@ Definition list with URL link
 
 !! test
 Definition list with bracketed URL link
-!! input
+!! wikitext
 ;[http://www.example.com/ Example]:Something about it
-!! result
+!! html
 <dl>
 <dt><a rel="nofollow" class="external text" href="http://www.example.com/">Example</a></dt>
 <dd>Something about it
@@ -2490,9 +2515,9 @@ Definition list with bracketed URL link
 
 !! test
 Definition list with wikilink containing colon
-!! input
+!! wikitext
 ; [[Help:FAQ]]: The least-read page on Wikipedia
-!! result
+!! html
 <dl>
 <dt> <a href="/index.php?title=Help:FAQ&amp;action=edit&amp;redlink=1" class="new" title="Help:FAQ (page does not exist)">Help:FAQ</a></dt>
 <dd> The least-read page on Wikipedia
@@ -2504,9 +2529,9 @@ Definition list with wikilink containing colon
 # At Brion's and JeLuF's insistence... :)
 !! test
 Definition list with news link containing colon
-!! input
+!! wikitext
 ;  news:alt.wikipedia.rox: This isn't even a real newsgroup!
-!! result
+!! html
 <dl>
 <dt>  <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a></dt>
 <dd> This isn't even a real newsgroup!
@@ -2517,9 +2542,9 @@ Definition list with news link containing colon
 
 !! test
 Malformed definition list with colon
-!! input
+!! wikitext
 ;  news:alt.wikipedia.rox -- don't crash or enter an infinite loop
-!! result
+!! html
 <dl>
 <dt>  <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a> -- don't crash or enter an infinite loop
 </dt>
@@ -2529,9 +2554,9 @@ Malformed definition list with colon
 
 !! test
 Definition lists: colon in external link text
-!! input
+!! wikitext
 ; [http://www.wikipedia2.org/ Wikipedia : The Next Generation]: OK, I made that up
-!! result
+!! html
 <dl>
 <dt> <a rel="nofollow" class="external text" href="http://www.wikipedia2.org/">Wikipedia&#160;: The Next Generation</a></dt>
 <dd> OK, I made that up
@@ -2542,9 +2567,9 @@ Definition lists: colon in external link text
 
 !! test
 Definition lists: colon in HTML attribute
-!! input
+!! wikitext
 ;<b style="display: inline">bold</b>
-!! result
+!! html
 <dl>
 <dt><b style="display: inline">bold</b>
 </dt>
@@ -2554,9 +2579,9 @@ Definition lists: colon in HTML attribute
 
 !! test
 Definition lists: self-closed tag
-!! input
+!! wikitext
 ;one<br/>two : two-line fun
-!! result
+!! html
 <dl>
 <dt>one<br />two&#160;</dt>
 <dd> two-line fun
@@ -2567,14 +2592,14 @@ Definition lists: self-closed tag
 
 !! test
 Bug 11748: Literal closing tags
-!! input
+!! wikitext
 <dl>
 <dt>test 1</dt>
 <dd>test test test test test</dd>
 <dt>test 2</dt>
 <dd>test test test test test</dd>
 </dl>
-!! result
+!! html
 <dl>
 <dt>test 1</dt>
 <dd>test test test test test</dd>
@@ -2586,12 +2611,12 @@ Bug 11748: Literal closing tags
 
 !! test
 Definition and unordered list using wiki syntax nested in unordered list using html tags.
-!! input
+!! wikitext
 <ul><li>
 ; term : description
 * unordered
 </li></ul>
-!! result
+!! html
 <ul><li>
 <dl>
 <dt> term&#160;</dt>
@@ -2609,10 +2634,10 @@ Definition and unordered list using wiki syntax nested in unordered list using h
 !! test
 
 Definition list with empty definition and following paragraph
-!! input
+!! wikitext
 ; term:
 Paragraph text
-!! result
+!! html
 <dl>
 <dt> term</dt>
 <dd>
@@ -2624,13 +2649,13 @@ Paragraph text
 
 !! test
 Nested definition lists using html syntax
-!! input
+!! wikitext
 <dl><dd>
 <dl>
 <dd>Foo</dd>
 </dl>
 </dd></dl>
-!! result
+!! html
 <dl><dd>
 <dl>
 <dd>Foo</dd>
@@ -2641,11 +2666,11 @@ Nested definition lists using html syntax
 
 !! test
 Definition Lists: No nesting: Multiple dd's
-!! input
+!! wikitext
 ;x
 :a
 :b
-!! result
+!! html
 <dl>
 <dt>x
 </dt>
@@ -2659,11 +2684,11 @@ Definition Lists: No nesting: Multiple dd's
 
 !! test
 Definition Lists: Indentation: Regular
-!! input
+!! wikitext
 :i1
 ::i2
 :::i3
-!! result
+!! html
 <dl>
 <dd>i1
 <dl>
@@ -2681,10 +2706,10 @@ Definition Lists: Indentation: Regular
 
 !! test
 Definition Lists: Indentation: Missing 1st level
-!! input
+!! wikitext
 ::i2
 :::i3
-!! result
+!! html
 <dl>
 <dd><dl>
 <dd>i2
@@ -2701,9 +2726,9 @@ Definition Lists: Indentation: Missing 1st level
 
 !! test
 Definition Lists: Indentation: Multi-level indent
-!! input
+!! wikitext
 :::i3
-!! result
+!! html
 <dl>
 <dd><dl>
 <dd><dl>
@@ -2719,14 +2744,14 @@ Definition Lists: Indentation: Multi-level indent
 
 !! test
 Definition Lists: Hacky use to indent tables
-!! input
+!! wikitext
 ::{|
 |foo
 |bar
 |}
 this text
 should be left alone
-!! result
+!! html
 <dl><dd><dl><dd><table>
 <tr>
 <td>foo
@@ -2743,11 +2768,11 @@ should be left alone
 Definition Lists: Hacky use to indent tables (WS-insensitive)
 !! options
 parsoid
-!! input
+!! wikitext
 : {|
 |a
 |} 
-!! result
+!! html
 <dl>
 <dd> <table><tr><td>a</td></tr></table> </dd>
 </dl>
@@ -2789,7 +2814,7 @@ parsoid
 
 !! test
 Table / list interaction: indented table with lists in table contents
-!! input
+!! wikitext
 :{|
 |-
 | a
@@ -2798,7 +2823,7 @@ Table / list interaction: indented table with lists in table contents
 | c
 * d
 |}
-!! result
+!! html
 <dl><dd><table>
 
 <tr>
@@ -2820,7 +2845,7 @@ Table / list interaction: indented table with lists in table contents
 
 !!test
 Table / list interaction: lists nested in tables nested in indented lists
-!!input
+!! wikitext
 :{|
 |
 :a
@@ -2832,7 +2857,7 @@ Table / list interaction: lists nested in tables nested in indented lists
 
 *e
 *f
-!!result
+!! html
 <dl><dd><table>
 <tr>
 <td>
@@ -2864,11 +2889,11 @@ Table / list interaction: lists nested in tables nested in indented lists
 Definition Lists: Nesting: Multi-level (Parsoid only)
 !! options
 parsoid
-!! input
+!! wikitext
 ;t1 :d1
 ;;t2 ::d2
 ;;;t3 :::d3
-!! result
+!! html
 <dl>
   <dt>t1 </dt>
   <dd>d1</dd>
@@ -2894,10 +2919,10 @@ parsoid
 Definition Lists: Nesting: Test 2 (Parsoid only)
 !! options
 parsoid
-!! input
+!! wikitext
 ;t1
 ::d2
-!! result
+!! html
 <dl>
   <dt>t1</dt>
   <dd>
@@ -2914,10 +2939,10 @@ parsoid
 Definition Lists: Nesting: Test 3 (Parsoid only)
 !! options
 parsoid
-!! input
+!! wikitext
 :;t1
 ::::d2
-!! result
+!! html
 <dl>
   <dd>
     <dl>
@@ -2940,10 +2965,10 @@ parsoid
 
 !! test
 Definition Lists: Nesting: Test 4
-!! input
+!! wikitext
 ::;t3
 :::d3
-!! result
+!! html
 <dl>
 <dd><dl>
 <dd><dl>
@@ -2964,14 +2989,12 @@ Definition Lists: Nesting: Test 4
 ## bug in the PHP parser.  (Parsoid team thinks the PHP parser is
 ## wrong to close the <dl> after the <dt> containing the <ul>.)
 !! test
-Definition Lists: Mixed Lists: Test 1 (php)
-!! options
-php
-!! input
+Definition Lists: Mixed Lists: Test 1
+!! wikitext
 :;* foo
 ::* bar
 :; baz
-!! result
+!! html/php
 <dl>
 <dd><dl>
 <dt><ul>
@@ -2989,16 +3012,7 @@ php
 </dd>
 </dl>
 
-!! end
-!! test
-Definition Lists: Mixed Lists: Test 1 (parsoid)
-!! options
-parsoid
-!! input
-:;* foo
-::* bar
-:; baz
-!! result
+!! html/parsoid
 <dl>
 <dd><dl>
 <dt><ul>
@@ -3016,10 +3030,10 @@ parsoid
 
 !! test
 Definition Lists: Mixed Lists: Test 2
-!! input
+!! wikitext
 *: d1
 *: d2
-!! result
+!! html
 <ul>
 <li><dl>
 <dd> d1
@@ -3035,10 +3049,10 @@ Definition Lists: Mixed Lists: Test 2
 
 !! test
 Definition Lists: Mixed Lists: Test 3
-!! input
+!! wikitext
 *::: d1
 *::: d2
-!! result
+!! html
 <ul>
 <li><dl>
 <dd><dl>
@@ -3060,10 +3074,10 @@ Definition Lists: Mixed Lists: Test 3
 
 !! test
 Definition Lists: Mixed Lists: Test 4
-!! input
+!! wikitext
 *;d1 :d2
 *;d3 :d4
-!! result
+!! html
 <ul>
 <li><dl>
 <dt>d1&#160;</dt>
@@ -3081,10 +3095,10 @@ Definition Lists: Mixed Lists: Test 4
 
 !! test
 Definition Lists: Mixed Lists: Test 5
-!! input
+!! wikitext
 *:d1
 *:: d2
-!! result
+!! html
 <ul>
 <li><dl>
 <dd>d1
@@ -3102,10 +3116,10 @@ Definition Lists: Mixed Lists: Test 5
 
 !! test
 Definition Lists: Mixed Lists: Test 6
-!! input
+!! wikitext
 #*:d1
 #*::: d3
-!! result
+!! html
 <ol>
 <li><ul>
 <li><dl>
@@ -3129,10 +3143,10 @@ Definition Lists: Mixed Lists: Test 6
 
 !! test
 Definition Lists: Mixed Lists: Test 7
-!! input
+!! wikitext
 :* d1
 :* d2
-!! result
+!! html
 <dl>
 <dd><ul>
 <li> d1
@@ -3148,10 +3162,10 @@ Definition Lists: Mixed Lists: Test 7
 
 !! test
 Definition Lists: Mixed Lists: Test 8
-!! input
+!! wikitext
 :* d1
 ::* d2
-!! result
+!! html
 <dl>
 <dd><ul>
 <li> d1
@@ -3172,9 +3186,9 @@ Definition Lists: Mixed Lists: Test 8
 
 !! test
 Definition Lists: Mixed Lists: Test 9
-!! input
+!! wikitext
 *;foo :bar
-!! result
+!! html
 <ul>
 <li><dl>
 <dt>foo&#160;</dt>
@@ -3189,9 +3203,9 @@ Definition Lists: Mixed Lists: Test 9
 
 !! test
 Definition Lists: Mixed Lists: Test 10
-!! input
+!! wikitext
 *#;foo :bar
-!! result
+!! html
 <ul>
 <li><ol>
 <li><dl>
@@ -3212,13 +3226,11 @@ Definition Lists: Mixed Lists: Test 10
 # still-open tags around until the nesting is complete.
 
 !! test
-Definition Lists: Mixed Lists: Test 11 (php)
-!! options
-php
-!! input
+Definition Lists: Mixed Lists: Test 11
+!! wikitext
 *#*#;*;;foo :bar
 *#*#;boo :baz
-!! result
+!! html/php
 <ul>
 <li><ol>
 <li><ul>
@@ -3251,15 +3263,7 @@ php
 </li>
 </ul>
 
-!! end
-!! test
-Definition Lists: Mixed Lists: Test 11 (parsoid)
-!! options
-parsoid
-!! input
-*#*#;*;;foo :bar
-*#*#;boo :baz
-!! result
+!! html/parsoid
 <ul>
 <li>
 <ol>
@@ -3291,12 +3295,10 @@ parsoid
 
 
 !! test
-Definition Lists: Weird Ones: Test 1 (php)
-!! options
-php
-!! input
+Definition Lists: Weird Ones: Test 1
+!! wikitext
 *#;*::;; foo : bar (who uses this?)
-!! result
+!! html/php
 <ul>
 <li><ol>
 <li><dl>
@@ -3324,14 +3326,7 @@ php
 </li>
 </ul>
 
-!! end
-!! test
-Definition Lists: Weird Ones: Test 1 (parsoid)
-!! options
-parsoid
-!! input
-*#;*::;; foo : bar (who uses this?)
-!! result
+!! html/parsoid
 <ul>
 <li>
 <ol>
@@ -3364,20 +3359,20 @@ parsoid
 ###
 !! test
 External links: non-bracketed
-!! input
+!! wikitext
 Non-bracketed: http://example.com
-!! result
+!! html
 <p>Non-bracketed: <a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>
 </p>
 !! end
 
 !! test
 External links: numbered
-!! input
+!! wikitext
 Numbered: [http://example.com]
 Numbered: [http://example.net]
 Numbered: [http://example.com]
-!! result
+!! html
 <p>Numbered: <a rel="nofollow" class="external autonumber" href="http://example.com">[1]</a>
 Numbered: <a rel="nofollow" class="external autonumber" href="http://example.net">[2]</a>
 Numbered: <a rel="nofollow" class="external autonumber" href="http://example.com">[3]</a>
@@ -3386,73 +3381,73 @@ Numbered: <a rel="nofollow" class="external autonumber" href="http://example.com
 
 !! test
 External links: specified text
-!! input
+!! wikitext
 Specified text: [http://example.com link]
-!! result
+!! html
 <p>Specified text: <a rel="nofollow" class="external text" href="http://example.com">link</a>
 </p>
 !!end
 
 !! test
 External links: trail
-!! input
+!! wikitext
 Linktrails should not work for external links: [http://example.com link]s
-!! result
+!! html
 <p>Linktrails should not work for external links: <a rel="nofollow" class="external text" href="http://example.com">link</a>s
 </p>
 !! end
 
 !! test
 External links: dollar sign in URL
-!! input
+!! wikitext
 http://example.com/1$2345
-!! result
+!! html
 <p><a rel="nofollow" class="external free" href="http://example.com/1$2345">http://example.com/1$2345</a>
 </p>
 !! end
 
 !! test
 External links: dollar sign in URL (named)
-!! input
+!! wikitext
 [http://example.com/1$2345]
-!! result
+!! html
 <p><a rel="nofollow" class="external autonumber" href="http://example.com/1$2345">[1]</a>
 </p>
 !!end
 
 !! test
 External links: open square bracket forbidden in URL (bug 4377)
-!! input
+!! wikitext
 http://example.com/1[2345
-!! result
+!! html
 <p><a rel="nofollow" class="external free" href="http://example.com/1">http://example.com/1</a>[2345
 </p>
 !! end
 
 !! test
 External links: open square bracket forbidden in URL (named) (bug 4377)
-!! input
+!! wikitext
 [http://example.com/1[2345]
-!! result
+!! html
 <p><a rel="nofollow" class="external text" href="http://example.com/1">[2345</a>
 </p>
 !!end
 
 !! test
 External links: nowiki in URL link text (bug 6230)
-!!input
+!! wikitext
 [http://example.com/ <nowiki>''example site''</nowiki>]
-!! result
+!! html
 <p><a rel="nofollow" class="external text" href="http://example.com/">''example site''</a>
 </p>
 !! end
 
 !! test
 External links: newline forbidden in text (bug 6230 regression check)
-!! input
+!! wikitext
 [http://example.com/ first
 second]
-!! result
+!! html
 <p>[<a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a> first
 second]
 </p>
@@ -3460,63 +3455,63 @@ second]
 
 !! test
 External links: Pipe char between url and text
-!! input
+!! wikitext
 [http://example.com | link]
-!! result
+!! html
 <p><a rel="nofollow" class="external text" href="http://example.com">| link</a>
 </p>
 !!end
 
 !! test
 External links: protocol-relative URL in brackets
-!! input
+!! wikitext
 [//example.com/ Test]
-!! result
+!! html
 <p><a rel="nofollow" class="external text" href="//example.com/">Test</a>
 </p>
 !! end
 
 !! test
 External links: protocol-relative URL in brackets without text
-!! input
+!! wikitext
 [//example.com]
-!! result
+!! html
 <p><a rel="nofollow" class="external autonumber" href="//example.com">[1]</a>
 </p>
 !! end
 
 !! test
 External links: protocol-relative URL in free text is left alone
-!! input
+!! wikitext
 //example.com/Foo
-!! result
+!! html
 <p>//example.com/Foo
 </p>
 !!end
 
 !! test
 External links: protocol-relative URL in the middle of a word is left alone (bug 30269)
-!! input
+!! wikitext
 foo//example.com/Foo
-!! result
+!! html
 <p>foo//example.com/Foo
 </p>
 !! end
 
 !! test
 External image
-!! input
+!! wikitext
 External image: http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png
-!! result
+!! html
 <p>External image: <img src="http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png" alt="Ncwikicol.png" />
 </p>
 !! end
 
 !! test
 External image from https
-!! input
+!! wikitext
 External image from https: https://meta.wikimedia.org/upload/f/f1/Ncwikicol.png
-!! result
+!! html
 <p>External image from https: <img src="https://meta.wikimedia.org/upload/f/f1/Ncwikicol.png" alt="Ncwikicol.png" />
 </p>
 !! end
@@ -3525,135 +3520,135 @@ External image from https: https://meta.wikimedia.org/upload/f/f1/Ncwikicol.png
 External image (when not allowed)
 !! options
 wgAllowExternalImages=0
-!! input
+!! wikitext
 External image: http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png
-!! result
+!! html
 <p>External image: <a rel="nofollow" class="external free" href="http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png">http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png</a>
 </p>
 !! end
 
 !! test
 Link to non-http image, no img tag
-!! input
+!! wikitext
 Link to non-http image, no img tag: ftp://example.com/test.jpg
-!! result
+!! html
 <p>Link to non-http image, no img tag: <a rel="nofollow" class="external free" href="ftp://example.com/test.jpg">ftp://example.com/test.jpg</a>
 </p>
 !! end
 
 !! test
 External links: terminating separator
-!! input
+!! wikitext
 Terminating separator: http://example.com/thing,
-!! result
+!! html
 <p>Terminating separator: <a rel="nofollow" class="external free" href="http://example.com/thing">http://example.com/thing</a>,
 </p>
 !! end
 
 !! test
 External links: intervening separator
-!! input
+!! wikitext
 Intervening separator: http://example.com/1,2,3
-!! result
+!! html
 <p>Intervening separator: <a rel="nofollow" class="external free" href="http://example.com/1,2,3">http://example.com/1,2,3</a>
 </p>
 !! end
 
 !! test
 External links: old bug with URL in query
-!! input
+!! wikitext
 Old bug with URL in query: [http://example.com/thing?url=http://example.com link]
-!! result
+!! html
 <p>Old bug with URL in query: <a rel="nofollow" class="external text" href="http://example.com/thing?url=http://example.com">link</a>
 </p>
 !! end
 
 !! test
 External links: old URL-in-URL bug, mixed protocols
-!! input
+!! wikitext
 And again with mixed protocols: [ftp://example.com?url=http://example.com link]
-!! result
+!! html
 <p>And again with mixed protocols: <a rel="nofollow" class="external text" href="ftp://example.com?url=http://example.com">link</a>
 </p>
 !!end
 
 !! test
 External links: URL in text
-!! input
+!! wikitext
 URL in text: [http://example.com http://example.com]
-!! result
+!! html
 <p>URL in text: <a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>
 </p>
 !! end
 
 !! test
 External links: Clickable images
-!! input
+!! wikitext
 ja-style clickable images: [http://example.com http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png]
-!! result
+!! html
 <p>ja-style clickable images: <a rel="nofollow" class="external text" href="http://example.com"><img src="http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png" alt="Ncwikicol.png" /></a>
 </p>
 !!end
 
 !! test
 External links: raw ampersand
-!! input
+!! wikitext
 Old &amp; use: http://x&y
-!! result
+!! html
 <p>Old &amp; use: <a rel="nofollow" class="external free" href="http://x&amp;y">http://x&amp;y</a>
 </p>
 !! end
 
 !! test
 External links: encoded ampersand
-!! input
+!! wikitext
 Old &amp; use: http://x&amp;y
-!! result
+!! html
 <p>Old &amp; use: <a rel="nofollow" class="external free" href="http://x&amp;y">http://x&amp;y</a>
 </p>
 !! end
 
 !! test
 External links: encoded equals (bug 6102)
-!! input
+!! wikitext
 http://example.com/?foo&#61;bar
-!! result
+!! html
 <p><a rel="nofollow" class="external free" href="http://example.com/?foo=bar">http://example.com/?foo=bar</a>
 </p>
 !! end
 
 !! test
 External links: [raw ampersand]
-!! input
+!! wikitext
 Old &amp; use: [http://x&y]
-!! result
+!! html
 <p>Old &amp; use: <a rel="nofollow" class="external autonumber" href="http://x&amp;y">[1]</a>
 </p>
 !! end
 
 !! test
 External links: [encoded ampersand]
-!! input
+!! wikitext
 Old &amp; use: [http://x&amp;y]
-!! result
+!! html
 <p>Old &amp; use: <a rel="nofollow" class="external autonumber" href="http://x&amp;y">[1]</a>
 </p>
 !! end
 
 !! test
 External links: [encoded equals] (bug 6102)
-!! input
+!! wikitext
 [http://example.com/?foo&#61;bar]
-!! result
+!! html
 <p><a rel="nofollow" class="external autonumber" href="http://example.com/?foo=bar">[1]</a>
 </p>
 !! end
 
 !! test
 External links: [IDN ignored character reference in hostname; strip it right off]
-!! input
+!! wikitext
 [http://e&zwnj;xample.com/]
-!! result
+!! html
 <p><a rel="nofollow" class="external autonumber" href="http://example.com/">[1]</a>
 </p>
 !! end
@@ -3677,118 +3672,118 @@ External links: [IDN ignored character reference in hostname; strip it right off
 # The Parsoid team.
 !! test
 External links: IDN ignored character reference in hostname; strip it right off
-!! input
+!! wikitext
 http://e&zwnj;xample.com/
-!! result
+!! html
 <p><a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a>
 </p>
 !! end
 
 !! test
 External links: www.jpeg.org (bug 554)
-!! input
+!! wikitext
 http://www.jpeg.org
-!!result
+!! html
 <p><a rel="nofollow" class="external free" href="http://www.jpeg.org">http://www.jpeg.org</a>
 </p>
 !! end
 
 !! test
 External links: URL within URL (original bug 2)
-!! input
+!! wikitext
 [http://www.unausa.org/newindex.asp?place=http://www.unausa.org/programs/mun.asp]
-!! result
+!! html
 <p><a rel="nofollow" class="external autonumber" href="http://www.unausa.org/newindex.asp?place=http://www.unausa.org/programs/mun.asp">[1]</a>
 </p>
 !! end
 
 !! test
 BUG 361: URL inside bracketed URL
-!! input
+!! wikitext
 [http://www.example.com/foo http://www.example.com/bar]
-!! result
+!! html
 <p><a rel="nofollow" class="external text" href="http://www.example.com/foo">http://www.example.com/bar</a>
 </p>
 !! end
 
 !! test
 BUG 361: URL within URL, not bracketed
-!! input
+!! wikitext
 http://www.example.com/foo?=http://www.example.com/bar
-!! result
+!! html
 <p><a rel="nofollow" class="external free" href="http://www.example.com/foo?=http://www.example.com/bar">http://www.example.com/foo?=http://www.example.com/bar</a>
 </p>
 !! end
 
 !! test
 BUG 289: ">"-token in URL-tail
-!! input
+!! wikitext
 http://www.example.com/<hello>
-!! result
+!! html
 <p><a rel="nofollow" class="external free" href="http://www.example.com/">http://www.example.com/</a>&lt;hello&gt;
 </p>
 !!end
 
 !! test
 BUG 289: literal ">"-token in URL-tail
-!! input
+!! wikitext
 http://www.example.com/<b>html</b>
-!! result
+!! html
 <p><a rel="nofollow" class="external free" href="http://www.example.com/">http://www.example.com/</a><b>html</b>
 </p>
 !!end
 
 !! test
 BUG 289: ">"-token in bracketed URL
-!! input
+!! wikitext
 [http://www.example.com/<hello> stuff]
-!! result
+!! html
 <p><a rel="nofollow" class="external text" href="http://www.example.com/">&lt;hello&gt; stuff</a>
 </p>
 !!end
 
 !! test
 BUG 289: literal ">"-token in bracketed URL
-!! input
+!! wikitext
 [http://www.example.com/<b>html</b> stuff]
-!! result
+!! html
 <p><a rel="nofollow" class="external text" href="http://www.example.com/"><b>html</b> stuff</a>
 </p>
 !!end
 
 !! test
 BUG 289: literal double quote at end of URL
-!! input
+!! wikitext
 http://www.example.com/"hello"
-!! result
+!! html
 <p><a rel="nofollow" class="external free" href="http://www.example.com/">http://www.example.com/</a>"hello"
 </p>
 !!end
 
 !! test
 BUG 289: literal double quote in bracketed URL
-!! input
+!! wikitext
 [http://www.example.com/"hello" stuff]
-!! result
+!! html
 <p><a rel="nofollow" class="external text" href="http://www.example.com/">"hello" stuff</a>
 </p>
 !!end
 
 !! test
 External links: multiple legal whitespace is fine, Magnus. Don't break it please. (bug 5081)
-!! input
+!! wikitext
 [http://www.example.com  test]
-!! result
+!! html
 <p><a rel="nofollow" class="external text" href="http://www.example.com">test</a>
 </p>
 !! end
 
 !! test
 External links: link text with spaces
-!! input
+!! wikitext
 [http://www.example.com a b c]
 [http://www.example.com ''a'' ''b'']
-!! result
+!! html
 <p><a rel="nofollow" class="external text" href="http://www.example.com">a b c</a>
 <a rel="nofollow" class="external text" href="http://www.example.com"><i>a</i> <i>b</i></a>
 </p>
@@ -3796,32 +3791,22 @@ External links: link text with spaces
 
 !! test
 External links: wiki links within external link (Bug 3695)
-!! options
-php
-!! input
+!! wikitext
 [http://example.com [[wikilink]] embedded in ext link]
-!! result
+!! html/php
 <p><a rel="nofollow" class="external text" href="http://example.com"></a><a href="/index.php?title=Wikilink&amp;action=edit&amp;redlink=1" class="new" title="Wikilink (page does not exist)">wikilink</a><a rel="nofollow" class="external text" href="http://example.com"> embedded in ext link</a>
 </p>
-!! end
-
-!! test
-Parsoid: External links: wiki links within external link (Bug 3695)
-!! options
-parsoid
-!! input
-[http://example.com [[wikilink]] embedded in ext link]
-!! result
+!! html/parsoid
 <p><a rel="mw:ExtLink" href="http://example.com"></a><a rel="mw:WikiLink" href="./Wikilink">wikilink</a><span> embedded in ext link</span></p>
 !! end
 
 !! test
 BUG 787: Links with one slash after the url protocol are invalid
-!! input
+!! wikitext
 http:/example.com
 
 [http:/example.com title]
-!! result
+!! html
 <p>http:/example.com
 </p><p>[http:/example.com title]
 </p>
@@ -3829,22 +3814,22 @@ http:/example.com
 
 !! test
 Bracketed external links with template-generated invalid target
-!! input
+!! wikitext
 [{{echo|http:/example.com}} title]
-!! result
+!! html
 <p>[http:/example.com title]
 </p>
 !! end
 
 !! test
 Bug 2702: Mismatched <i>, <b> and <a> tags are invalid
-!! input
+!! wikitext
 ''[http://example.com text'']
 [http://example.com '''text]'''
 ''Something [http://example.com in italic'']
 ''Something [http://example.com mixed''''', even bold]'''
 '''''Now [http://example.com both''''']
-!! result
+!! html
 <p><a rel="nofollow" class="external text" href="http://example.com"><i>text</i></a>
 <a rel="nofollow" class="external text" href="http://example.com"><b>text</b></a>
 <i>Something </i><a rel="nofollow" class="external text" href="http://example.com"><i>in italic</i></a>
@@ -3856,9 +3841,9 @@ Bug 2702: Mismatched <i>, <b> and <a> tags are invalid
 
 !! test
 Bug 4781: %26 in URL
-!! input
+!! wikitext
 http://www.example.com/?title=AT%26T
-!! result
+!! html
 <p><a rel="nofollow" class="external free" href="http://www.example.com/?title=AT%26T">http://www.example.com/?title=AT%26T</a>
 </p>
 !! end
@@ -3867,18 +3852,18 @@ http://www.example.com/?title=AT%26T
 # % is actually legal in HTML5. Any change in output would need testing though.
 !! test
 Bug 4781, 5267: %25 in URL
-!! input
+!! wikitext
 http://www.example.com/?title=100%25_Bran
-!! result
+!! html
 <p><a rel="nofollow" class="external free" href="http://www.example.com/?title=100%25_Bran">http://www.example.com/?title=100%25_Bran</a>
 </p>
 !! end
 
 !! test
 Bug 4781, 5267: %28, %29 in URL
-!! input
+!! wikitext
 http://www.example.com/?title=Ben-Hur_%281959_film%29
-!! result
+!! html
 <p><a rel="nofollow" class="external free" href="http://www.example.com/?title=Ben-Hur_%281959_film%29">http://www.example.com/?title=Ben-Hur_%281959_film%29</a>
 </p>
 !! end
@@ -3886,27 +3871,27 @@ http://www.example.com/?title=Ben-Hur_%281959_film%29
 
 !! test
 Bug 4781: %26 in autonumber URL
-!! input
+!! wikitext
 [http://www.example.com/?title=AT%26T]
-!! result
+!! html
 <p><a rel="nofollow" class="external autonumber" href="http://www.example.com/?title=AT%26T">[1]</a>
 </p>
 !! end
 
 !! test
 Bug 4781, 5267: %26 in autonumber URL
-!! input
+!! wikitext
 [http://www.example.com/?title=100%25_Bran]
-!! result
+!! html
 <p><a rel="nofollow" class="external autonumber" href="http://www.example.com/?title=100%25_Bran">[1]</a>
 </p>
 !! end
 
 !! test
 Bug 4781, 5267: %28, %29 in autonumber URL
-!! input
+!! wikitext
 [http://www.example.com/?title=Ben-Hur_%281959_film%29]
-!! result
+!! html
 <p><a rel="nofollow" class="external autonumber" href="http://www.example.com/?title=Ben-Hur_%281959_film%29">[1]</a>
 </p>
 !! end
@@ -3914,104 +3899,94 @@ Bug 4781, 5267: %28, %29 in autonumber URL
 
 !! test
 Bug 4781: %26 in bracketed URL
-!! input
+!! wikitext
 [http://www.example.com/?title=AT%26T link]
-!! result
+!! html
 <p><a rel="nofollow" class="external text" href="http://www.example.com/?title=AT%26T">link</a>
 </p>
 !! end
 
 !! test
 Bug 4781, 5267: %26 in bracketed URL
-!! input
+!! wikitext
 [http://www.example.com/?title=100%25_Bran link]
-!! result
+!! html
 <p><a rel="nofollow" class="external text" href="http://www.example.com/?title=100%25_Bran">link</a>
 </p>
 !! end
 
 !! test
 Bug 4781, 5267: %28, %29 in bracketed URL
-!! input
+!! wikitext
 [http://www.example.com/?title=Ben-Hur_%281959_film%29 link]
-!! result
+!! html
 <p><a rel="nofollow" class="external text" href="http://www.example.com/?title=Ben-Hur_%281959_film%29">link</a>
 </p>
 !! end
 
 !! test
 External link containing double-single-quotes in text '' (bug 4598 sanity check)
-!! input
+!! wikitext
 Some [http://example.com/ pretty ''italics'' and stuff]!
-!! result
+!! html
 <p>Some <a rel="nofollow" class="external text" href="http://example.com/">pretty <i>italics</i> and stuff</a>!
 </p>
 !! end
 
 !! test
 External link containing double-single-quotes in text embedded in italics (bug 4598 sanity check)
-!! input
+!! wikitext
 ''Some [http://example.com/ pretty ''italics'' and stuff]!''
-!! result
+!! html
 <p><i>Some </i><a rel="nofollow" class="external text" href="http://example.com/"><i>pretty </i>italics<i> and stuff</i></a><i>!</i>
 </p>
 !! end
 
 !! test
 External link containing double-single-quotes with no space separating the url from text in italics
-!! options
-php
-!! input
+!! wikitext
 [http://www.musee-picasso.fr/pages/page_id18528_u1l2.htm''La muerte de Casagemas'' (1901) en el sitio de [[Museo Picasso (París)|Museo Picasso]].]
-!! result
+!! html/php
 <p><a rel="nofollow" class="external text" href="http://www.musee-picasso.fr/pages/page_id18528_u1l2.htm"><i>La muerte de Casagemas</i> (1901) en el sitio de <a href="/index.php?title=Museo_Picasso_(Par%C3%ADs)&amp;action=edit&amp;redlink=1" class="new" title="Museo Picasso (París) (page does not exist)">Museo Picasso</a>.</a>
 </p>
-!! end
-
-!! test
-Parsoid:External link containing double-single-quotes with no space separating the url from text in italics
-!! options
-parsoid
-!! input
-[http://www.musee-picasso.fr/pages/page_id18528_u1l2.htm''La muerte de Casagemas'' (1901) en el sitio de [[Museo Picasso (París)|Museo Picasso]].]
-!! result
+!! html/parsoid
 <p><a rel="mw:ExtLink" href="http://www.musee-picasso.fr/pages/page_id18528_u1l2.htm"><i>La muerte de Casagemas</i> (1901) en el sitio de </a><a rel="mw:WikiLink" href="./Museo_Picasso_(París)">Museo Picasso</a><span>.</span></p>
 !! end
 
 !! test
 External link with comments in link text
-!! input
+!! wikitext
 [http://www.google.com Google <!-- comment -->]
-!! result
+!! html
 <p><a rel="nofollow" class="external text" href="http://www.google.com">Google </a>
 </p>
 !! end
 
 !! test
 URL-encoding in URL functions (single parameter)
-!! input
+!! wikitext
 {{localurl:Some page|amp=&}}
-!! result
+!! html
 <p>/index.php?title=Some_page&amp;amp=&amp;
 </p>
 !! end
 
 !! test
 URL-encoding in URL functions (multiple parameters)
-!! input
+!! wikitext
 {{localurl:Some page|q=?&amp=&}}
-!! result
+!! html
 <p>/index.php?title=Some_page&amp;q=?&amp;amp=&amp;
 </p>
 !! end
 
 !! test
 Brackets in urls
-!! input
+!! wikitext
 http://example.com/index.php?foozoid%5B%5D=bar
 
 http://example.com/index.php?foozoid&#x5B;&#x5D;=bar
-!! result
+!! html
 <p><a rel="nofollow" class="external free" href="http://example.com/index.php?foozoid%5B%5D=bar">http://example.com/index.php?foozoid%5B%5D=bar</a>
 </p><p><a rel="nofollow" class="external free" href="http://example.com/index.php?foozoid%5B%5D=bar">http://example.com/index.php?foozoid%5B%5D=bar</a>
 </p>
@@ -4021,16 +3996,16 @@ http://example.com/index.php?foozoid&#x5B;&#x5D;=bar
 IPv6 urls (bug 21261)
 !! options
 disabled
-!! input
+!! wikitext
 http://[2404:130:0:1000::187:2]/index.php
-!! result
+!! html
 <p><a rel="nofollow" class="external free" href="http://[2404:130:0:1000::187:2]/index.php">http://[2404:130:0:1000::187:2]/index.php</a>
 </p>
 !! end
 
 !! test
 Non-extlinks in brackets
-!! input
+!! wikitext
 [foo]
 [foo bar]
 [foo ''bar'']
@@ -4043,7 +4018,7 @@ Non-extlinks in brackets
 [{{echo|foo}}l's errand]
 [url={{echo|foo}}]
 [url=http://example.com]
-!! result
+!! html
 <p>[foo]
 [foo bar]
 [foo <i>bar</i>]
@@ -4060,32 +4035,31 @@ Non-extlinks in brackets
 !! end
 
 !! test
-Parsoid: Percent encoding in external links
-!! options
-parsoid
-!! input
+Percent encoding in external links
+!! wikitext
 [https://github.com/search?l=&q=ResourceLoader+%40wikimedia Search]
-!! result
+!! html/php
+<p><a rel="nofollow" class="external text" href="https://github.com/search?l=&amp;q=ResourceLoader+%40wikimedia">Search</a>
+</p>
+!! html/parsoid
 <p><a rel="mw:ExtLink"
 href="https://github.com/search?l=&amp;q=ResourceLoader+%40wikimedia">Search</a></p>
 !! end
 
 !! test
-Parsoid: use url link syntax for links where the content is equal the link
-target
-!! options
-parsoid
-!! input
+Use url link syntax for links where the content is equal the link target
+!! wikitext
 http://example.com
-!! result
+!! html/php
+<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>
+</p>
+!! html/parsoid
 <p><a rel="mw:ExtLink" href="http://example.com">http://example.com</a></p>
 !! end
 
 !! test
 Parenthesis in external links, especially URL links
-!! options
-php
-!! input 
+!! wikitext
 http://example.com)
 
 http://example.com/test)
@@ -4101,7 +4075,7 @@ http://example.com/((test)
 http://example.com/a)b
 
 [http://example.com) foo]
-!! result
+!! html/php
 <p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>)
 </p><p><a rel="nofollow" class="external free" href="http://example.com/test">http://example.com/test</a>)
 </p><p><a rel="nofollow" class="external free" href="http://example.com/(test)">http://example.com/(test)</a>
@@ -4111,29 +4085,7 @@ http://example.com/a)b
 </p><p><a rel="nofollow" class="external free" href="http://example.com/a)b">http://example.com/a)b</a>
 </p><p><a rel="nofollow" class="external text" href="http://example.com)">foo</a>
 </p>
-!! end
-
-!! test
-Parenthesis in external links, especially URL links (Parsoid)
-!! options
-parsoid
-!! input 
-http://example.com)
-
-http://example.com/test)
-
-http://example.com/(test)
-
-http://example.com/((test)
-
-(http://example.com/(test))
-
-(http://example.com/(test)))))
-
-http://example.com/a)b
-
-[http://example.com) foo]
-!! result
+!! html/parsoid
 <p><a rel="mw:ExtLink" href="http://example.com">http://example.com</a>)</p>
 <p><a rel="mw:ExtLink" href="http://example.com/test">http://example.com/test</a>)</p>
 <p><a rel="mw:ExtLink" href="http://example.com/(test)">http://example.com/(test)</a></p>
@@ -4146,16 +4098,18 @@ http://example.com/a)b
 
 !! test
 Parenthesis in external links, w/ transclusion or comment
-!! options
-parsoid
-!! input
+!! wikitext
 (http://example.com/{{echo|hi}})
 
 (http://example.com<!-- hi -->)
-!! result
-<p>(<a data-mw='{"attribs":[[{"txt":"href"},{"html":"http://example.com/&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" 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;hi&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\" data-parsoid=\"{&amp;quot;dsr&amp;quot;:[20,31,null,null],&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;]}]]}\">hi&lt;/span>"}]]}' typeof="mw:ExpandedAttrs" about="#mwt2" rel="mw:ExtLink" href="http://example.com/hi" data-parsoid='{"stx":"url","a":{"href":"http://example.com/hi"},"sa":{"href":"http://example.com/{{echo|hi}}"},"dsr":[1,31,0,0]}'>http://example.com/hi</a>)</p>
+!! html/php
+<p>(<a rel="nofollow" class="external free" href="http://example.com/hi">http://example.com/hi</a>)
+</p><p>(<a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>)
+</p>
+!! html/parsoid
+<p>(<a data-mw='{"attribs":[[{"txt":"href"},{"html":"http://example.com/&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" 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;hi&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\" data-parsoid=\"{&amp;quot;dsr&amp;quot;:[20,31,null,null],&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;]}]]}\">hi&lt;/span>"}]]}' typeof="mw:ExpandedAttrs" about="#mwt2" rel="mw:ExtLink" href="http://example.com/hi" data-parsoid='{"stx":"url","a":{"href":"http://example.com/hi"},"sa":{"href":"http://example.com/{{echo|hi}}"}}'>http://example.com/hi</a>)</p>
 
-<p>(<a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url","a":{"href":"http://example.com"},"sa":{"href":"http://example.com&lt;!-- hi -->"},"dsr":[35,64,0,0]}'>http://example.com</a>)</p>
+<p>(<a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url","a":{"href":"http://example.com"},"sa":{"href":"http://example.com&lt;!-- hi -->"}}'>http://example.com</a>)</p>
 !! end
 
 ###
@@ -4164,22 +4118,23 @@ parsoid
 
 !! test
 Quotes
-!! input
+!! wikitext
 Normal text. '''Bold text.''' Normal text. ''Italic text.''
 
 Normal text. '''''Bold italic text.''''' Normal text.
-!!result
+!! html
 <p>Normal text. <b>Bold text.</b> Normal text. <i>Italic text.</i>
 </p><p>Normal text. <i><b>Bold italic text.</b></i> Normal text.
 </p>
 !! end
 
 
+# Parsoid inserts an empty bold tag pair at the end of the line, that the PHP
+# parser strips. The wikitext contains just the first half of the bold
+# quote pair.
 !! test
-Unclosed and unmatched quotes (php)
-!! options
-php
-!! input
+Unclosed and unmatched quotes
+!! wikitext
 '''''Bold italic text '''with bold deactivated''' in between.'''''
 
 '''''Bold italic text ''with italic deactivated'' in between.'''''
@@ -4200,7 +4155,7 @@ Normal text.
 ''Tom'''s car is bigger than ''Susan'''s.
 
 Plain ''italic'''s plain
-!! result
+!! html/php
 <p><i><b>Bold italic text </b>with bold deactivated<b> in between.</b></i>
 </p><p><b><i>Bold italic text </i>with italic deactivated<i> in between.</i></b>
 </p><p><b>Bold text..</b>
@@ -4212,36 +4167,7 @@ Plain ''italic'''s plain
 </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>
-!! end
-# Parsoid inserts an empty bold tag pair at the end of the line, that the PHP
-# parser strips. The wikitext contains just the first half of the bold
-# quote pair.
-!! test
-Unclosed and unmatched quotes (parsoid)
-!! options
-parsoid
-!! input
-'''''Bold italic text '''with bold deactivated''' in between.'''''
-
-'''''Bold italic text ''with italic deactivated'' in between.'''''
-
-'''Bold text..
-
-..spanning two paragraphs (should not work).'''
-
-'''Bold tag left open
-
-''Italic tag left open
-
-Normal text.
-
-<!-- Unmatching number of opening, closing tags: -->
-'''This year''''s election ''should'' beat '''last year''''s.
-
-''Tom'''s car is bigger than ''Susan'''s.
-
-Plain ''italic'''s plain
-!! result
+!! html/parsoid
 <p><i><b>Bold italic text </b>with bold deactivated<b> in between.</b></i>
 </p><p><b><i>Bold italic text </i>with italic deactivated<i> in between.</i></b>
 </p><p><b>Bold text..</b>
@@ -4264,24 +4190,16 @@ Plain ''italic'''s plain
 # This should not produce <table></table> as <table><tr><td></td></tr></table>
 # is the bare minimum required by the spec, see:
 # http://www.w3.org/TR/xhtml-modularization/dtd_module_defs.html#a_module_Basic_Tables
-!! test
-A table with no data. (php)
-!! options
-php
-!! input
-{||}
-!! result
-
-!! end
-
 # Parsoid team replies: empty table tags are legal in HTML5
 !! test
-A table with no data. (parsoid)
+A table with no data.
 !! options
 parsoid=wt2html
-!! input
+!! wikitext
 {||}
-!! result
+!! html/php
+
+!! html/parsoid
 <table></table>
 
 !! end
@@ -4290,7 +4208,7 @@ parsoid=wt2html
 A table with stray table end tags on start tag line (wt2html)
 !! options
 parsoid=wt2html
-!! input
+!! wikitext
 {|style="color: red;"|}
 
 {|style="color: red;" |}
@@ -4304,7 +4222,7 @@ parsoid=wt2html
 {|style="color: red;" |} id="foo"
 |foo
 |}
-!! result
+!! html
 <table style="color: red;"></table>
 
 <table style="color: red;">
@@ -4328,54 +4246,41 @@ parsoid=wt2html
 !! end
 
 !! test
-A table with no data (take 2) (parsoid)
-!! options
-parsoid
-!! input
+A table with no data (take 2)
+!! wikitext
 {|
 |}
-!! result
+!! html/parsoid
 <table></table>
 !! end
 
 # A table with nothing but a caption is invalid XHTML, we might want to render
 # this as <p>caption</p>
+# Parsoid team replies: table with only a caption is legal in HTML5
 !! test
-A table with nothing but a caption (php)
-!! options
-php
-!! input
+A table with nothing but a caption
+!! wikitext
 {|
 |+ caption
 |}
-!! result
+!! html/php
 <table>
 <caption> caption
 </caption><tr><td></td></tr></table>
 
-!! end
-# Parsoid team replies: table with only a caption is legal in HTML5
-!! test
-A table with nothing but a caption (parsoid)
-!! options
-parsoid
-!! input
-{|
-|+ caption
-|}
-!! result
+!! html/parsoid
 <table><caption> caption</caption></table>
 !! end
 
 !! test
 A table with caption with default-spaced attributes and a table row
-!! input
+!! wikitext
 {|
 |+ style="color: red;" | caption1
 |-
 | foo
 |}
-!! result
+!! html
 <table>
 <caption style="color: red;"> caption1
 </caption>
@@ -4387,14 +4292,14 @@ A table with caption with default-spaced attributes and a table row
 
 !! test
 A table with captions with non-default spaced attributes and a table row
-!! input
+!! wikitext
 {|
 |+style="color: red;"|caption2
 |+ style="color: red;"| caption3
 |-
 | foo
 |}
-!! result
+!! html
 <table>
 <caption style="color: red;">caption2
 </caption>
@@ -4408,14 +4313,14 @@ A table with captions with non-default spaced attributes and a table row
 
 !! test
 Table td-cell syntax variations
-!! input
+!! wikitext
 {|
 | foo bar foo | baz
 | foo bar foo || baz
 | style='color:red;' | baz
 | style='color:red;' || baz
 |}
-!! result
+!! html
 <table>
 <tr>
 <td> baz
@@ -4433,13 +4338,13 @@ Table td-cell syntax variations
 
 !! test
 Simple table
-!! input
+!! wikitext
 {|
 | 1 || 2
 |-
 | 3 || 4
 |}
-!! result
+!! html
 <table>
 <tr>
 <td> 1 </td>
@@ -4454,13 +4359,13 @@ Simple table
 
 !! test
 Simple table but with multiple dashes for row wikitext
-!! input
+!! wikitext
 {|
 | foo
 |-----
 | bar
 |}
-!! result
+!! html
 <table>
 <tr>
 <td> foo
@@ -4472,7 +4377,7 @@ Simple table but with multiple dashes for row wikitext
 !! end
 !! test
 Multiplication table
-!! input
+!! wikitext
 {| border="1" cellpadding="2"
 |+Multiplication table
 |-
@@ -4493,7 +4398,7 @@ Multiplication table
 ! 5
 | 5 || 10 || 15
 |}
-!! result
+!! html
 <table border="1" cellpadding="2">
 <caption>Multiplication table
 </caption>
@@ -4543,11 +4448,11 @@ Multiplication table
 
 !! test
 Accept "||" in table headings
-!! input
+!! wikitext
 {|
 !h1 || h2
 |}
-!! result
+!! html
 <table>
 <tr>
 <th>h1 </th>
@@ -4558,11 +4463,11 @@ Accept "||" in table headings
 
 !! test
 Accept "||" in indented table headings
-!! input
+!! wikitext
 :{|
 !h1 || h2
 |}
-!! result
+!! html
 <dl><dd><table>
 <tr>
 <th>h1 </th>
@@ -4573,12 +4478,12 @@ Accept "||" in indented table headings
 
 !! test
 Accept empty attributes in td/th cells (td/th cells starting with leading ||)
-!! input
+!! wikitext
 {|
 !| h1
 || a
 |}
-!! result
+!! html
 <table>
 <tr>
 <th> h1
@@ -4590,12 +4495,12 @@ Accept empty attributes in td/th cells (td/th cells starting with leading ||)
 
 !!test
 Accept "| !" at start of line in tables (ignore !-attribute)
-!!input
+!! wikitext
 {|
 |-
 | !style="color:red" | bar
 |}
-!!result
+!! html
 <table>
 
 <tr>
@@ -4606,7 +4511,7 @@ Accept "| !" at start of line in tables (ignore !-attribute)
 
 !!test
 Allow +/- in 2nd and later cells in a row, in 1st cell when td-attrs are present, or in 1st cell when there is a space between "|" and +/- 
-!!input
+!! wikitext
 {|
 |-
 |style='color:red;'|+1
@@ -4618,7 +4523,7 @@ Allow +/- in 2nd and later cells in a row, in 1st cell when td-attrs are present
 | +1
 | -1
 |}
-!!result
+!! html
 <table>
 
 <tr>
@@ -4645,7 +4550,7 @@ Allow +/- in 2nd and later cells in a row, in 1st cell when td-attrs are present
 
 !! test
 Table rowspan
-!! input
+!! wikitext
 {| border=1
 | Cell 1, row 1
 |rowspan=2| Cell 2, row 1 (and 2)
@@ -4654,7 +4559,7 @@ Table rowspan
 | Cell 1, row 2
 | Cell 3, row 2
 |}
-!! result
+!! html
 <table border="1">
 <tr>
 <td> Cell 1, row 1
@@ -4673,7 +4578,7 @@ Table rowspan
 
 !! test
 Nested table
-!! input
+!! wikitext
 {| border=1
 | &alpha;
 |
@@ -4684,7 +4589,7 @@ Nested table
 |}
 |the original table again
 |}
-!! result
+!! html
 <table border="1">
 <tr>
 <td> &#945;
@@ -4705,11 +4610,11 @@ Nested table
 
 !! test
 Invalid attributes in table cell (bug 1830)
-!! input
+!! wikitext
 {|
 |Cell:|broken
 |}
-!! result
+!! html
 <table>
 <tr>
 <td>broken
@@ -4720,10 +4625,10 @@ Invalid attributes in table cell (bug 1830)
 
 !! test
 Table security: embedded pipes (http://lists.wikimedia.org/mailman/htdig/wikitech-l/2006-April/022293.html)
-!! input
+!! wikitext
 {|
 | |[ftp://|x||]" onmouseover="alert(document.cookie)">test
-!! result
+!! html
 <table>
 <tr>
 <td>[<a rel="nofollow" class="external free" href="ftp://%7Cx">ftp://%7Cx</a></td>
@@ -4737,7 +4642,7 @@ Table security: embedded pipes (http://lists.wikimedia.org/mailman/htdig/wikitec
 
 !! test
 Indented table markup mixed with indented pre content (proposed in bug 6200)
-!! input
+!! wikitext
  <table>
  <tr>
  <td>
@@ -4745,7 +4650,7 @@ Indented table markup mixed with indented pre content (proposed in bug 6200)
  </td>
  </tr>
  </table>
-!! result
+!! html
  <table>
  <tr>
  <td>
@@ -4759,12 +4664,12 @@ Indented table markup mixed with indented pre content (proposed in bug 6200)
 
 !! test
 Template-generated table cell attributes and cell content
-!! input
+!! wikitext
 {|
 |{{table_attribs}}
 | {{table_attribs}}
 |}
-!! result
+!! html
 <table>
 <tr>
 <td style="color: red"> Foo
@@ -4776,11 +4681,11 @@ Template-generated table cell attributes and cell content
 
 !! test
 Template-generated table cell attributes and cell content (2)
-!! input
+!! wikitext
 {|
 |align=center {{table_attribs}}
 |}
-!! result
+!! html
 <table>
 <tr>
 <td align="center" style="color: red"> Foo
@@ -4790,11 +4695,11 @@ Template-generated table cell attributes and cell content (2)
 
 !! test
 Template-generated table cell attributes and cell content (3)
-!! input
+!! wikitext
 {|
 |align=center {{table_cells}}
 |}
-!! result
+!! html
 <table>
 <tr>
 <td align="center" style="color: red"> Foo </td>
@@ -4806,13 +4711,13 @@ Template-generated table cell attributes and cell content (3)
 
 !! test
 Table with row followed by newlines and table heading
-!! input
+!! wikitext
 {|
 |-
 
 ! foo
 |}
-!! result
+!! html
 <table>
 
 
@@ -4824,13 +4729,13 @@ Table with row followed by newlines and table heading
 
 !! test
 Table with empty line following the start tag
-!! input
+!! wikitext
 {|
 
 |-
 | foo
 |}
-!! result
+!! html
 <table>
 
 
@@ -4844,13 +4749,11 @@ Table with empty line following the start tag
 # the PHP parser. Parsoid implements the behavior below.
 !! test
 Table attributes with empty value
-!! options
-parsoid
-!! input
+!! wikitext
 {|
 | style=| hello
 |}
-!! result
+!! html/parsoid
 <table>
 <tbody>
 <tr>
@@ -4861,7 +4764,7 @@ parsoid
 
 !! test
 Wikitext table with a lot of comments
-!! input
+!! wikitext
 {|
 <!-- c0 -->
 | foo
@@ -4871,7 +4774,7 @@ Wikitext table with a lot of comments
 |<!-- c4 -->
 <!-- c5 -->
 |}
-!! result
+!! html
 <table>
 <tr>
 <td> foo
@@ -4884,12 +4787,12 @@ Wikitext table with a lot of comments
 
 !! test
 Wikitext table with double-line table cell
-!! input
+!! wikitext
 {|
 |a
 b
 |}
-!! result
+!! html
 <table>
 <tr>
 <td>a
 
 !! test
 Table cell with a single comment
-!! input
+!! wikitext
 {|
 | <!-- c1 -->
 | a
 |}
-!! result
+!! html
 <table>
 <tr>
 <td>
@@ -4920,15 +4823,13 @@ Table cell with a single comment
 # not parse this kind of table at all. The main focus for Parsoid is on
 # round-tripping, so this output is ok for now. TODO: revisit!
 !! test
-Wikitext table with html-syntax row (Parsoid)
-!! options
-parsoid
-!! input
+Wikitext table with html-syntax row
+!! wikitext
 {|
 |-
 <td>foo</td>
 |}
-!! result
+!! html/parsoid
 <table>
 <tbody>
 <tr>
@@ -4940,12 +4841,12 @@ Implicit <td> after a |-
 (PHP parser relies on Tidy to add the missing <td> tags)
 !! options
 parsoid=wt2html,wt2wt
-!! input
+!! wikitext
 {|
 |-
 a
 |}
-!! result
+!! html
 <table>
 <tr><td>a</td></tr>
 </table>
@@ -4956,7 +4857,7 @@ Pres should be recognized in an explicit <td> context, but not in an implicit <t
 (PHP parser relies on Tidy to add the missing <td> tags)
 !! options
 parsoid=wt2html,wt2wt
-!! input
+!! wikitext
 {|
 |-
 |
@@ -4964,7 +4865,7 @@ parsoid=wt2html,wt2wt
 |-
  b
 |}
-!! result
+!! html
 <table>
 <tbody>
 <tr><td><pre>a</pre></td></tr>
@@ -4978,12 +4879,12 @@ Lists should be recognized in an implicit <td> context
 (PHP parser relies on Tidy to add the missing <td> tags)
 !! options
 parsoid=wt2html,wt2wt
-!! input
+!! wikitext
 {|
 |-
 *a
 |}
-!! result
+!! html
 <table>
 <tr>
 <td><ul>
@@ -4997,7 +4898,7 @@ parsoid=wt2html,wt2wt
 Parsoid: Round-trip tables directly followed by content (bug 51219)
 !! options
 parsoid=wt2html,wt2wt
-!! input
+!! wikitext
 {|
 |foo
 |} bar
@@ -5005,7 +4906,7 @@ parsoid=wt2html,wt2wt
 {|
 |baz
 |}<b>quux</b>
-!! result
+!! html
 <table><tbody>
 <tr>
 <td>foo</td></tr></tbody></table> bar
@@ -5019,7 +4920,7 @@ parsoid=wt2html,wt2wt
 Parsoid: Default to a newline after tables in new content (bug 51219)
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 {|
 |foo
 |}
@@ -5028,7 +4929,7 @@ parsoid=html2wt
 |baz
 |}
 '''quux'''
-!! result
+!! html
 <table><tbody>
 <tr><td>foo</td></tr></tbody></table> bar
 <table><tbody>
@@ -5039,11 +4940,11 @@ parsoid=html2wt
 Parsoid: newline inducing block nodes don't suppress <nowiki>
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 <nowiki> </nowiki>a
 
 = foo =
-!! result
+!! html
  a<h1>foo</h1>
 !! end
 
@@ -5052,90 +4953,90 @@ parsoid=html2wt
 ###
 !! test
 Plain link, capitalized
-!! input
+!! wikitext
 [[Main Page]]
-!! result
+!! html
 <p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>
 </p>
 !! end
 
 !! test
 Plain link, uncapitalized
-!! input
+!! wikitext
 [[main Page]]
-!! result
+!! html
 <p><a href="/wiki/Main_Page" title="Main Page">main Page</a>
 </p>
 !! end
 
 !! test
 Piped link
-!! input
+!! wikitext
 [[Main Page|The Main Page]]
-!! result
+!! html
 <p><a href="/wiki/Main_Page" title="Main Page">The Main Page</a>
 </p>
 !! end
 
 !! test
 Piped link with comment in link text
-!! input
+!! wikitext
 [[Main Page|The Main<!--front--> Page]]
-!! result
+!! html
 <p><a href="/wiki/Main_Page" title="Main Page">The Main Page</a>
 </p>
 !! end
 
 !! test
 Broken link
-!! input
+!! wikitext
 [[Zigzagzogzagzig]]
-!! result
+!! html
 <p><a href="/index.php?title=Zigzagzogzagzig&amp;action=edit&amp;redlink=1" class="new" title="Zigzagzogzagzig (page does not exist)">Zigzagzogzagzig</a>
 </p>
 !! end
 
 !! test
 Broken link with fragment
-!! input
+!! wikitext
 [[Zigzagzogzagzig#zug]]
-!! result
+!! html
 <p><a href="/index.php?title=Zigzagzogzagzig&amp;action=edit&amp;redlink=1" class="new" title="Zigzagzogzagzig (page does not exist)">Zigzagzogzagzig#zug</a>
 </p>
 !! end
 
 !! test
 Special page link with fragment
-!! input
+!! wikitext
 [[Special:Version#anchor]]
-!! result
+!! html
 <p><a href="/wiki/Special:Version#anchor" title="Special:Version">Special:Version#anchor</a>
 </p>
 !! end
 
 !! test
 Nonexistent special page link with fragment
-!! input
+!! wikitext
 [[Special:ThisNameWillHopefullyNeverBeUsed#anchor]]
-!! result
+!! html
 <p><a href="/wiki/Special:ThisNameWillHopefullyNeverBeUsed" class="new" title="Special:ThisNameWillHopefullyNeverBeUsed (page does not exist)">Special:ThisNameWillHopefullyNeverBeUsed#anchor</a>
 </p>
 !! end
 
 !! test
 Link with prefix
-!! input
+!! wikitext
 xxx[[main Page]], xxx[[Main Page]], Xxx[[main Page]] XXX[[main Page]], XXX[[Main Page]]
-!! result
+!! html
 <p>xxx<a href="/wiki/Main_Page" title="Main Page">main Page</a>, xxx<a href="/wiki/Main_Page" title="Main Page">Main Page</a>, Xxx<a href="/wiki/Main_Page" title="Main Page">main Page</a> XXX<a href="/wiki/Main_Page" title="Main Page">main Page</a>, XXX<a href="/wiki/Main_Page" title="Main Page">Main Page</a>
 </p>
 !! end
 
 !! test
 Link with suffix
-!! input
+!! wikitext
 [[Main Page]]xxx, [[Main Page]]XXX, [[Main Page]]!!!
-!! result
+!! html
 <p><a href="/wiki/Main_Page" title="Main Page">Main Pagexxx</a>, <a href="/wiki/Main_Page" title="Main Page">Main Page</a>XXX, <a href="/wiki/Main_Page" title="Main Page">Main Page</a>!!!
 </p>
 !! end
@@ -5148,13 +5049,13 @@ Some text
 
 !! test
 Bug 43661: Piped links with identical prefixes
-!! input
+!! wikitext
 [[prefixed article|prefixed articles with spaces]]
 
 [[prefixed article|prefixed articlesaoeu]]
 
 [[Main Page|Main Page test]]
-!! result
+!! html
 <p><a href="/wiki/Prefixed_article" title="Prefixed article">prefixed articles with spaces</a>
 </p><p><a href="/wiki/Prefixed_article" title="Prefixed article">prefixed articlesaoeu</a>
 </p><p><a href="/wiki/Main_Page" title="Main Page">Main Page test</a>
@@ -5164,37 +5065,46 @@ Bug 43661: Piped links with identical prefixes
 
 !! test
 Link with HTML entity in suffix / tail
-!! input
+!! wikitext
 [[Main Page]]&quot;, [[Main Page]]&#97;
-!! result
+!! html
 <p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>&quot;, <a href="/wiki/Main_Page" title="Main Page">Main Page</a>&#97;
 </p>
 !! end
 
 !! test
 Link with 3 brackets
-!! input
-[[[main page]]]
-!! result
-<p>[[[main page]]]
+!! wikitext
+[[[Main Page]]]
+!! html
+<p>[[[Main Page]]]
+</p>
+!! end
+
+!! test
+Link with 4 brackets
+!! wikitext
+[[[[Main Page]]]]
+!! html
+<p>[[<a href="/wiki/Main_Page" title="Main Page">Main Page</a>]]
 </p>
 !! end
 
 !! test
 Piped link with 3 brackets
-!! input
+!! wikitext
 [[[main page|the main page]]]
-!! result
+!! html
 <p>[[[main page|the main page]]]
 </p>
 !! end
 
 !! test
 Piped link with extlink-like text
-!! input
+!! wikitext
 [[Main Page|[bar]]]
 [[Main Page|This is a [bar]]]
-!! result
+!! html
 <p><a href="/wiki/Main_Page" title="Main Page">[bar]</a>
 <a href="/wiki/Main_Page" title="Main Page">This is a [bar]</a>
 </p>
@@ -5202,18 +5112,18 @@ Piped link with extlink-like text
 
 !! test
 Link with multiple pipes
-!! input
+!! wikitext
 [[Main Page|The|Main|Page]]
-!! result
+!! html
 <p><a href="/wiki/Main_Page" title="Main Page">The|Main|Page</a>
 </p>
 !! end
 
 !! test
 Link to namespaces
-!! input
+!! wikitext
 [[Talk:Parser testing]], [[Meta:Disclaimers]]
-!! result
+!! html
 <p><a href="/index.php?title=Talk:Parser_testing&amp;action=edit&amp;redlink=1" class="new" title="Talk:Parser testing (page does not exist)">Talk:Parser testing</a>, <a href="/index.php?title=Meta:Disclaimers&amp;action=edit&amp;redlink=1" class="new" title="Meta:Disclaimers (page does not exist)">Meta:Disclaimers</a>
 </p>
 !! end
@@ -5227,9 +5137,9 @@ This is an article in the MemoryAlpha namespace
 
 !! test
 Namespace takes precedence over interwiki link (bug 51680)
-!! input
+!! wikitext
 [[MemoryAlpha:AlphaTest]]
-!! result
+!! html
 <p><a href="/wiki/MemoryAlpha:AlphaTest" title="MemoryAlpha:AlphaTest">MemoryAlpha:AlphaTest</a>
 </p>
 !! end
@@ -5240,54 +5150,54 @@ Namespace takes precedence over interwiki link (bug 51680)
 Link to namespace preferred over interwiki with correct rel attribute
 !! options
 parsoid=html2wt,html2html
-!! input
+!! wikitext
 [[MemoryAlpha:AlphaTest]]
-!! result
+!! html
 <p><a rel="mw:WikiLink" href="./MemoryAlpha:AlphaTest">MemoryAlpha:AlphaTest</a>
 </p>
 !! end
 
 !! test
 Piped link to namespace
-!! input
+!! wikitext
 [[Meta:Disclaimers|The disclaimers]]
-!! result
+!! html
 <p><a href="/index.php?title=Meta:Disclaimers&amp;action=edit&amp;redlink=1" class="new" title="Meta:Disclaimers (page does not exist)">The disclaimers</a>
 </p>
 !! end
 
 !! test
 Link containing }
-!! input
+!! wikitext
 [[Usually caused by a typo (oops}]]
-!! result
+!! html
 <p>[[Usually caused by a typo (oops}]]
 </p>
 !! end
 
 !! test
 Link containing % (not as a hex sequence)
-!! input
+!! wikitext
 [[7% Solution]]
-!! result
+!! html
 <p><a href="/index.php?title=7%25_Solution&amp;action=edit&amp;redlink=1" class="new" title="7% Solution (page does not exist)">7% Solution</a>
 </p>
 !! end
 
 !! test
 Link containing % as a single hex sequence interpreted to char
-!! input
+!! wikitext
 [[7%25 Solution]]
-!! result
+!! html
 <p><a href="/index.php?title=7%25_Solution&amp;action=edit&amp;redlink=1" class="new" title="7% Solution (page does not exist)">7% Solution</a>
 </p>
 !!end
 
 !! test
 Link containing % as a double hex sequence interpreted to hex sequence
-!! input
+!! wikitext
 [[7%2525 Solution]]
-!! result
+!! html
 <p>[[7%2525 Solution]]
 </p>
 !!end
@@ -5295,27 +5205,27 @@ Link containing % as a double hex sequence interpreted to hex sequence
 !! test
 Link containing "#<" and "#>" % as a hex sequences- these are valid section anchors
 Example for such a section: == < ==
-!! input
+!! wikitext
 [[%23%3c]][[%23%3e]]
-!! result
+!! html
 <p><a href="#.3C">#&lt;</a><a href="#.3E">#&gt;</a>
 </p>
 !! end
 
 !! test
 Link containing "<#" and ">#" as a hex sequences
-!! input
+!! wikitext
 [[%3c%23]][[%3e%23]]
-!! result
+!! html
 <p>[[%3c%23]][[%3e%23]]
 </p>
 !! end
 
 !! test
 Link containing an equals sign
-!! input
+!! wikitext
 [[Special:BookSources/isbn=4-00-026157-6]]
-!! result
+!! html
 <p><a href="/wiki/Special:BookSources/isbn%3D4-00-026157-6" title="Special:BookSources/isbn=4-00-026157-6">Special:BookSources/isbn=4-00-026157-6</a>
 </p>
 !! end
@@ -5331,43 +5241,43 @@ Just a test of an article title containing a tilde.
 # seen by the parser.
 !! test
 Link containing a tilde
-!! input
+!! wikitext
 [[Foo~bar]]
-!! result
+!! html
 <p><a href="/wiki/Foo%7Ebar" title="Foo~bar">Foo~bar</a>
 </p>
 !! end
 
 !! test
 Link containing double-single-quotes '' (bug 4598)
-!! input
+!! wikitext
 [[Lista d''e paise d''o munno]]
-!! result
+!! html
 <p><a href="/index.php?title=Lista_d%27%27e_paise_d%27%27o_munno&amp;action=edit&amp;redlink=1" class="new" title="Lista d''e paise d''o munno (page does not exist)">Lista d''e paise d''o munno</a>
 </p>
 !! end
 
 !! test
 Link containing double-single-quotes '' in text (bug 4598 sanity check)
-!! input
+!! wikitext
 Some [[Link|pretty ''italics'' and stuff]]!
-!! result
+!! html
 <p>Some <a href="/index.php?title=Link&amp;action=edit&amp;redlink=1" class="new" title="Link (page does not exist)">pretty <i>italics</i> and stuff</a>!
 </p>
 !! end
 
 !! test
 Link containing double-single-quotes '' in text embedded in italics (bug 4598 sanity check)
-!! input
+!! wikitext
 ''Some [[Link|pretty ''italics'' and stuff]]!
-!! result
+!! html
 <p><i>Some <a href="/index.php?title=Link&amp;action=edit&amp;redlink=1" class="new" title="Link (page does not exist)">pretty <i>italics</i> and stuff</a>!</i>
 </p>
 !! end
 
 !! test
 Link with double quotes in title part (literal) and alternate part (interpreted)
-!! input
+!! wikitext
 [[File:Denys Savchenko ''Pentecoste''.jpg]]
 
 [[''Pentecoste'']]
@@ -5375,7 +5285,7 @@ Link with double quotes in title part (literal) and alternate part (interpreted)
 [[''Pentecoste''|Pentecoste]]
 
 [[''Pentecoste''|''Pentecoste'']]
-!! result
+!! html
 <p><a href="/index.php?title=Special:Upload&amp;wpDestFile=Denys_Savchenko_%27%27Pentecoste%27%27.jpg" class="new" title="File:Denys Savchenko &#39;&#39;Pentecoste&#39;&#39;.jpg">File:Denys Savchenko <i>Pentecoste</i>.jpg</a>
 </p><p><a href="/index.php?title=%27%27Pentecoste%27%27&amp;action=edit&amp;redlink=1" class="new" title="''Pentecoste'' (page does not exist)">''Pentecoste''</a>
 </p><p><a href="/index.php?title=%27%27Pentecoste%27%27&amp;action=edit&amp;redlink=1" class="new" title="''Pentecoste'' (page does not exist)">Pentecoste</a>
@@ -5385,12 +5295,12 @@ Link with double quotes in title part (literal) and alternate part (interpreted)
 
 !! test
 Broken image links with HTML captions (bug 39700)
-!! input
+!! wikitext
 [[File:Nonexistent|<script></script>]]
 [[File:Nonexistent|100px|<script></script>]]
 [[File:Nonexistent|&lt;]]
 [[File:Nonexistent|a<i>b</i>c]]
-!! result
+!! html
 <p><a href="/index.php?title=Special:Upload&amp;wpDestFile=Nonexistent" class="new" title="File:Nonexistent">&lt;script&gt;&lt;/script&gt;</a>
 <a href="/index.php?title=Special:Upload&amp;wpDestFile=Nonexistent" class="new" title="File:Nonexistent">&lt;script&gt;&lt;/script&gt;</a>
 <a href="/index.php?title=Special:Upload&amp;wpDestFile=Nonexistent" class="new" title="File:Nonexistent">&lt;</a>
@@ -5400,47 +5310,47 @@ Broken image links with HTML captions (bug 39700)
 
 !! test
 Plain link to URL
-!! input
+!! wikitext
 [[http://www.example.com]]
-!! result
+!! html
 <p>[<a rel="nofollow" class="external autonumber" href="http://www.example.com">[1]</a>]
 </p>
 !! end
 
 !! test
 Plain link to URL with link text
-!! input
+!! wikitext
 [[http://www.example.com Link text]]
-!! result
+!! html
 <p>[<a rel="nofollow" class="external text" href="http://www.example.com">Link text</a>]
 </p>
 !! end
 
 !! test
 Plain link to protocol-relative URL
-!! input
+!! wikitext
 [[//www.example.com]]
-!! result
+!! html
 <p>[<a rel="nofollow" class="external autonumber" href="//www.example.com">[1]</a>]
 </p>
 !! end
 
 !! test
 Plain link to protocol-relative URL with link text
-!! input
+!! wikitext
 [[//www.example.com Link text]]
-!! result
+!! html
 <p>[<a rel="nofollow" class="external text" href="//www.example.com">Link text</a>]
 </p>
 !! end
 
 !! test
 Plain link to page with question mark in title
-!! input
+!! wikitext
 [[A?b]]
 
 [[A?b|Baz]]
-!! result
+!! html
 <p><a href="/wiki/A%3Fb" title="A?b">A?b</a>
 </p><p><a href="/wiki/A%3Fb" title="A?b">Baz</a>
 </p>
@@ -5460,18 +5370,18 @@ Plain link to page with question mark in title
 # -- wtm
 !! test
 Piped link to URL
-!! input
+!! wikitext
 Piped link to URL: [[http://www.example.com|an example URL]]
-!! result
+!! html
 <p>Piped link to URL: [<a rel="nofollow" class="external text" href="http://www.example.com%7Can">example URL</a>]
 </p>
 !! end
 
 !! test
 BUG 2: [[page|http://url/]] should link to page, not http://url/
-!! input
+!! wikitext
 [[Main Page|http://url/]]
-!! result
+!! html
 <p><a href="/wiki/Main_Page" title="Main Page">http://url/</a>
 </p>
 !! end
@@ -5480,9 +5390,9 @@ BUG 2: [[page|http://url/]] should link to page, not http://url/
 BUG 337: Escaped self-links should be bold
 !! options
 title=[[Bug462]]
-!! input
+!! wikitext
 [[Bu&#103;462]] [[Bug462]]
-!! result
+!! html
 <p><strong class="selflink">Bu&#103;462</strong> <strong class="selflink">Bug462</strong>
 </p>
 !! end
@@ -5491,9 +5401,9 @@ title=[[Bug462]]
 Self-link to section should not be bold
 !! options
 title=[[Main Page]]
-!! input
+!! wikitext
 [[Main Page#section]]
-!! result
+!! html
 <p><a href="/wiki/Main_Page#section" title="Main Page">Main Page#section</a>
 </p>
 !! end
@@ -5508,9 +5418,9 @@ This is 00.
 Self-link to numeric title
 !!options
 title=[[0]]
-!!input
+!! wikitext
 [[0]]
-!!result
+!! html
 <p><strong class="selflink">0</strong>
 </p>
 !!end
@@ -5519,27 +5429,27 @@ title=[[0]]
 Link to numeric-equivalent title
 !!options
 title=[[0]]
-!!input
+!! wikitext
 [[00]]
-!!result
+!! html
 <p><a href="/wiki/00" title="00">00</a>
 </p>
 !!end
 
 !! test
 <nowiki> inside a link
-!! input
+!! wikitext
 [[Main<nowiki> Page</nowiki>]] [[Main Page|the main page <nowiki>[it's not very good]</nowiki>]]
-!! result
+!! html
 <p>[[Main Page]] <a href="/wiki/Main_Page" title="Main Page">the main page [it's not very good]</a>
 </p>
 !! end
 
 !! test
 Non-breaking spaces in title
-!! input
+!! wikitext
 [[&nbsp; Main &nbsp; Page &nbsp;]]
-!! result
+!! html
 <p><a href="/wiki/Main_Page" title="Main Page">&#160; Main &#160; Page &#160;</a>
 </p>
 !!end
@@ -5548,9 +5458,9 @@ Non-breaking spaces in title
 Internal link with ca linktrail, surrounded by bold apostrophes (bug 27473 primary issue)
 !! options
 language=ca
-!! input
+!! wikitext
 '''[[Main Page]]'''
-!! result
+!! html
 <p><b><a href="/wiki/Main_Page" title="Main Page">Main Page</a></b>
 </p>
 !! end
@@ -5559,9 +5469,9 @@ language=ca
 Internal link with ca linktrail, surrounded by italic apostrophes (bug 27473 primary issue)
 !! options
 language=ca
-!! input
+!! wikitext
 ''[[Main Page]]''
-!! result
+!! html
 <p><i><a href="/wiki/Main_Page" title="Main Page">Main Page</a></i>
 </p>
 !! end
@@ -5570,9 +5480,9 @@ language=ca
 Internal link with en linktrail: no apostrophes (bug 27473)
 !! options
 language=en
-!! input
+!! wikitext
 [[Something]]'nice
-!! result
+!! html
 <p><a href="/index.php?title=Something&amp;action=edit&amp;redlink=1" class="new" title="Something (page does not exist)">Something</a>'nice
 </p>
 !! end
@@ -5581,9 +5491,9 @@ language=en
 Internal link with ca linktrail with apostrophes (bug 27473)
 !! options
 language=ca
-!! input
+!! wikitext
 [[Something]]'nice
-!! result
+!! html
 <p><a href="/index.php?title=Something&amp;action=edit&amp;redlink=1" class="new" title="Something (encara no existeix)">Something'nice</a>
 </p>
 !! end
@@ -5592,13 +5502,43 @@ language=ca
 Internal link with kaa linktrail with apostrophes (bug 27473)
 !! options
 language=kaa
-!! input
+!! wikitext
 [[Something]]'nice
-!! result
+!! html
 <p><a href="/index.php?title=Something&amp;action=edit&amp;redlink=1" class="new" title="Something (bet ele jaratılmag'an)">Something'nice</a>
 </p>
 !! end
 
+!! test
+1. Interaction of linktrail and template encapsulation
+!! options
+parsoid
+!! wikitext
+{{echo|[[Foo]]}}l
+!! html
+<p><a rel="mw:WikiLink" href="Foo" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[Foo]]"}},"i":0}},"l"]}'>Fool</a></p>
+!! end
+
+!! test
+2. Interaction of linktrail and template encapsulation
+!! options
+parsoid
+!! wikitext
+{{echo|Some [[Fool]]}}s
+!! html
+<p data-parsoid='{}'><span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"Some [[Fool]]"}},"i":0}},"s"]}' data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]}]]}'>Some </span><a rel="mw:WikiLink" href="./Fool" about="#mwt1" data-parsoid='{"stx":"simple","a":{"href":"./Fool"},"sa":{"href":"Fool"},"tail":"s"}'>Fools</a></p>
+!! end
+
+!! test
+3. Interaction of linktrail and template encapsulation
+!! options
+parsoid
+!! wikitext
+{{echo|Some [[Fool]]s are '''bold and foolish'''}}
+!! html
+<p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"Some [[Fool]]s are &#39;&#39;&#39;bold and foolish&#39;&#39;&#39;"}},"i":0}}]}' data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]}]]}'>Some <a rel="mw:WikiLink" href="./Fool" data-parsoid='{"stx":"simple","a":{"href":"./Fool"},"sa":{"href":"Fool"},"tail":"s"}'>Fools</a> are <b data-parsoid="{}">bold and foolish</b></p>
+!! end
+
 !! article
 Söfnuður
 !! text
@@ -5609,9 +5549,9 @@ Test.
 Internal link with is link prefix
 !! options
 language=is
-!! input
+!! wikitext
 Aðrir mótmælenda[[söfnuður|söfnuðir]] og
-!! result
+!! html
 <p>Aðrir <a href="/wiki/S%C3%B6fnu%C3%B0ur" title="Söfnuður">mótmælendasöfnuðir</a> og
 </p>
 !! end
@@ -5626,13 +5566,13 @@ Test.
 Internal link with is link trail and link prefix
 !! options
 language=is
-!! input
+!! wikitext
 [[mótmælendatrú|xxx]]ar
 [[mótmælendatrú]]ar
 mótmælenda[[söfnuður]]
 mótmælenda[[söfnuður|söfnuðir]]
 mótmælenda[[söfnuður|söfnuðir]]xxx
-!! result
+!! html
 <p><a href="/wiki/M%C3%B3tm%C3%A6lendatr%C3%BA" title="Mótmælendatrú">xxxar</a>
 <a href="/wiki/M%C3%B3tm%C3%A6lendatr%C3%BA" title="Mótmælendatrú">mótmælendatrúar</a>
 <a href="/wiki/S%C3%B6fnu%C3%B0ur" title="Söfnuður">mótmælendasöfnuður</a>
@@ -5645,9 +5585,9 @@ mótmælenda[[söfnuður|söfnuðir]]xxx
 Parsoid link trail escaping
 !! options
 parsoid=html2wt,html2html
-!! input
+!! wikitext
 [[apple]]<nowiki/>s
-!! result
+!! html
 <p><a rel="mw:WikiLink" href="Apple">apple</a>s</p>
 !! end
 
@@ -5656,15 +5596,15 @@ Parsoid link prefix escaping
 !! options
 language=is
 parsoid=html2wt,html2html
-!! input
+!! wikitext
 Aðrir mótmælenda<nowiki/>[[söfnuður]]
-!! result
+!! html
 <p>Aðrir mótmælenda<a rel="mw:WikiLink" href="Söfnuður">söfnuður</a></p>
 !! end
 
 !! test
 Parsoid-centric test: Whitespace in ext- and wiki-links should be preserved
-!! input
+!! wikitext
 [[Foo|  bar]]
 
 [[Foo|  ''bar'']]
@@ -5672,7 +5612,7 @@ Parsoid-centric test: Whitespace in ext- and wiki-links should be preserved
 [http://wp.org   foo]
 
 [http://wp.org   ''foo'']
-!! result
+!! html
 <p><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">  bar</a>
 </p><p><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">  <i>bar</i></a>
 </p><p><a rel="nofollow" class="external text" href="http://wp.org">foo</a>
@@ -5684,10 +5624,10 @@ Parsoid-centric test: Whitespace in ext- and wiki-links should be preserved
 Parsoid: Scoped parsing should handle mixed transclusions and plain text
 !! options
 parsoid
-!! input
+!! wikitext
 [[Foo|{{echo|a}} b {{echo|c}}]]
-!! result
-<p data-parsoid='{"dsr":[0,20,0,0]}'><a rel="mw:WikiLink" href="Foo"><span about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a"}},"i":0}}]}'>a</span> b <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"c"}},"i":0}}]}'>c</span></a></p>
+!! html
+<p><a rel="mw:WikiLink" href="Foo"><span about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a"}},"i":0}}]}'>a</span> b <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"c"}},"i":0}}]}'>c</span></a></p>
 !! end
 
 ###
@@ -5696,28 +5636,28 @@ parsoid
 
 !! test
 Inline interwiki link
-!! input
+!! wikitext
 [[MeatBall:SoftSecurity]]
-!! result
+!! html
 <p><a href="http://www.usemod.com/cgi-bin/mb.pl?SoftSecurity" class="extiw" title="meatball:SoftSecurity">MeatBall:SoftSecurity</a>
 </p>
 !! end
 
 !! test
 Inline interwiki link with empty title (bug 2372)
-!! input
+!! wikitext
 [[MeatBall:]]
-!! result
+!! html
 <p><a href="http://www.usemod.com/cgi-bin/mb.pl" class="extiw" title="meatball:">MeatBall:</a>
 </p>
 !! end
 
 !! test
 Interwiki link encoding conversion (bug 1636)
-!! input
+!! wikitext
 *[[Wikipedia:ro:Olteni&#0355;a]]
 *[[Wikipedia:ro:Olteni&#355;a]]
-!! result
+!! html
 <ul>
 <li><a href="http://en.wikipedia.org/wiki/ro:Olteni%C5%A3a" class="extiw" title="wikipedia:ro:Olteniţa">Wikipedia:ro:Olteni&#355;a</a>
 </li>
@@ -5729,9 +5669,9 @@ Interwiki link encoding conversion (bug 1636)
 
 !! test
 Interwiki link with fragment (bug 2130)
-!! input
+!! wikitext
 [[MeatBall:SoftSecurity#foo]]
-!! result
+!! html
 <p><a href="http://www.usemod.com/cgi-bin/mb.pl?SoftSecurity#foo" class="extiw" title="meatball:SoftSecurity">MeatBall:SoftSecurity#foo</a>
 </p>
 !! end
@@ -5741,29 +5681,28 @@ Interwiki link with fragment (bug 2130)
 Different interwiki prefixes mapping to the same URL
 !! options
 parsoid
-!! input
+!! wikitext
 [[wikipedia:Foo]]
 
 [[:en:Foo]]
-!! result
-<p data-parsoid='{"dsr":[0,17,0,0]}'><a rel="mw:ExtLink" href="http://en.wikipedia.org/wiki/Foo" data-parsoid='{"stx":"simple","a":{"href":"http://en.wikipedia.org/wiki/Foo"},"sa":{"href":"wikipedia:Foo"},"isIW":true,"dsr":[0,17,null,1]}'>wikipedia:Foo</a></p>
+!! html
+<p><a rel="mw:ExtLink" href="http://en.wikipedia.org/wiki/Foo" data-parsoid='{"stx":"simple","a":{"href":"http://en.wikipedia.org/wiki/Foo"},"sa":{"href":"wikipedia:Foo"},"isIW":true}'>wikipedia:Foo</a></p>
 
-
-<p data-parsoid='{"dsr":[19,30,0,0]}'><a rel="mw:ExtLink" href="//en.wikipedia.org/wiki/Foo" data-parsoid='{"stx":"simple","a":{"href":"//en.wikipedia.org/wiki/Foo"},"sa":{"href":":en:Foo"},"isIW":true,"dsr":[19,30,null,1]}'>en:Foo</a></p>
+<p><a rel="mw:ExtLink" href="//en.wikipedia.org/wiki/Foo" data-parsoid='{"stx":"simple","a":{"href":"//en.wikipedia.org/wiki/Foo"},"sa":{"href":":en:Foo"},"isIW":true}'>en:Foo</a></p>
 !! end
 
 !! test
 Interwiki links that cannot be represented in wiki syntax
 !! options
 parsoid
-!! input
+!! wikitext
 [[meatball:ok]]
 [[meatball:ok#foo|ok with fragment]]
 [[meatball:ok_as_well?|ok ending with ? mark]]
 [http://de.wikipedia.org/wiki/Foo?action=history has query]
 [http://de.wikipedia.org/wiki/#foo is just fragment]
 
-!! result
+!! html
 <p><a rel="mw:ExtLink" href="http://www.usemod.com/cgi-bin/mb.pl?ok">meatball:ok</a>
 <a rel="mw:ExtLink" href="http://www.usemod.com/cgi-bin/mb.pl?ok#foo">ok with fragment</a>
 <a rel="mw:ExtLink" href="http://www.usemod.com/cgi-bin/mb.pl?ok_as_well%3F">ok ending with ? mark</a>
@@ -5771,6 +5710,15 @@ parsoid
 <a rel="mw:ExtLink" href="http://de.wikipedia.org/wiki/#foo">is just fragment</a></p>
 !! end
 
+!! test
+Interwiki links: trail
+!! options
+parsoid
+!! wikitext
+[[wikipedia:Foo|Ba]]r
+!! html
+<p data-parsoid='{}'><a rel="mw:ExtLink" href="http://en.wikipedia.org/wiki/Foo" data-parsoid='{"stx":"piped","a":{"href":"http://en.wikipedia.org/wiki/Foo"},"sa":{"href":"wikipedia:Foo"},"isIW":true,"tail":"r"}'>Bar</a></p>
+!! end
 
 ###
 ### Interlanguage links
@@ -5779,21 +5727,21 @@ parsoid
 
 !! test
 Interlanguage link
-!! input
+!! wikitext
 Blah blah blah
 [[zh:Chinese]]
-!!result
+!! html
 <p>Blah blah blah
 </p>
 !! end
 
 !! test
 Double interlanguage link
-!! input
+!! wikitext
 Blah blah blah
 [[es:Spanish]]
 [[zh:Chinese]]
-!!result
+!! html
 <p>Blah blah blah
 </p>
 !! end
@@ -5802,10 +5750,10 @@ Blah blah blah
 Interlanguage link, with prefix links
 !! options
 language=ln
-!! input
+!! wikitext
 Blah blah blah
 [[zh:Chinese]]
-!!result
+!! html
 <p>Blah blah blah
 </p>
 !! end
@@ -5814,11 +5762,11 @@ Blah blah blah
 Double interlanguage link, with prefix links (bug 8897)
 !! options
 language=ln
-!! input
+!! wikitext
 Blah blah blah
 [[es:Spanish]]
 [[zh:Chinese]]
-!!result
+!! html
 <p>Blah blah blah
 </p>
 !! end
@@ -5827,9 +5775,9 @@ Blah blah blah
 Parsoid-specific test: Wikilinks with &nbsp; should RT properly
 !! options
 language=ln
-!! input
+!! wikitext
 [[WW&nbsp;II]]
-!!result
+!! html
 <p><a href="/index.php?title=WW_II&amp;action=edit&amp;redlink=1" class="new" title="WW II (lonkásá  ezalí tɛ̂)">WW&#160;II</a>
 </p>
 !! end
@@ -5838,11 +5786,11 @@ language=ln
 Parsoid bug 53221: Wikilinks should be properly entity-escaped
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 He&amp;nbsp;llo [[Foo|He&amp;nbsp;llo]]
 
 He&amp;nbsp;llo [[He&amp;nbsp;llo]]
-!!result
+!! html
 <p>He&amp;nbsp;llo <a href="Foo" rel="mw:WikiLink">He&amp;nbsp;llo</a></p>
 <p>He&amp;nbsp;llo <a href="He&amp;nbsp;llo" rel="mw:WikiLink">He&amp;nbsp;llo</a></p>
 !! end
@@ -5851,24 +5799,23 @@ He&amp;nbsp;llo [[He&amp;nbsp;llo]]
 Parsoid: handle constructor well
 !! options
 parsoid
-!! input
+!! wikitext
 [[constructor]]
 
 [[constructor:foo]]
-!! result
-<p data-parsoid="{&quot;dsr&quot;:[0,15,0,0]}"><a rel="mw:WikiLink" href="./Constructor" data-parsoid="{&quot;stx&quot;:&quot;simple&quot;,&quot;a&quot;:{&quot;href&quot;:&quot;./Constructor&quot;},&quot;sa&quot;:{&quot;href&quot;:&quot;constructor&quot;},&quot;dsr&quot;:[0,15,2,2]}">constructor</a></p>
-
+!! html
+<p><a rel="mw:WikiLink" href="./Constructor" data-parsoid="{&quot;stx&quot;:&quot;simple&quot;,&quot;a&quot;:{&quot;href&quot;:&quot;./Constructor&quot;},&quot;sa&quot;:{&quot;href&quot;:&quot;constructor&quot;}}">constructor</a></p>
 
-<p data-parsoid="{&quot;dsr&quot;:[17,36,0,0]}"><a rel="mw:WikiLink" href="./Foo" data-parsoid="{&quot;stx&quot;:&quot;simple&quot;,&quot;a&quot;:{&quot;href&quot;:&quot;./Foo&quot;},&quot;sa&quot;:{&quot;href&quot;:&quot;constructor:foo&quot;},&quot;dsr&quot;:[17,36,2,2]}">constructor:foo</a></p>
+<p><a rel="mw:WikiLink" href="./Foo" data-parsoid="{&quot;stx&quot;:&quot;simple&quot;,&quot;a&quot;:{&quot;href&quot;:&quot;./Foo&quot;},&quot;sa&quot;:{&quot;href&quot;:&quot;constructor:foo&quot;}}">constructor:foo</a></p>
 !! end
 
 !! test
 Parsoid: recognize interlanguage links without a target page
 !! options
 parsoid
-!! input
+!! wikitext
 [[ko:]]
-!! result
+!! html
 <p>
 <link rel="mw:PageProp/Language" href="http://ko.wikipedia.org/wiki/"></p>
 !! end
@@ -5877,34 +5824,57 @@ parsoid
 Parsoid: recognize interwiki links without a target page
 !! options
 parsoid
-!! input
+!! wikitext
 [[:ko:]]
-!! result
+!! html
 <p><a rel="mw:ExtLink" href="//ko.wikipedia.org/wiki/">ko:</a></p>
 !! end
 
+!! test
+Parsoid: Bug #45209, handle interwiki links pointing to the current wiki as plain wiki links
+!! options
+parsoid
+!! wikitext
+[[en:Foo]]
+!! html
+<p><a rel="mw:WikiLink" href="./Foo" data-parsoid='{"stx":"simple","a":{"href":"./Foo"},"sa":{"href":"en:Foo"}}'>Foo</a></p>
+!! end
+
 ###
 ### Redirects, Parsoid-only
 ###
 !! test
-Simple redirect to page
+1. Simple redirect to page
 !! options
 parsoid
-!! input
+!! wikitext
 #REDIRECT [[Main Page]]
-!! result
+!! html
 <link rel="mw:PageProp/redirect" href="./Main_Page">
 !! end
 
+# Only wt2html and html2html since "Main_Page" will serialize to "Main Page"
+!! test
+2. Other redirect variants
+!! options
+parsoid=wt2html,wt2wt
+!! wikitext
+#REDIRECT [[Main_Page]]
+#REDIRECT [[<nowiki>[[Bar]]</nowiki>]]
+!! html
+<link rel="mw:PageProp/redirect" href="./Main_Page">
+<link rel="mw:PageProp/redirect" href="./%5B%5BBar%5D%5D">
+!! end
+
 !! test
 Optional colon in #REDIRECT
 !! options
 # the colon is archaic syntax.  we support it for wt2html, but we
 # don't care that it roundtrips back to the modern syntax.
 parsoid=wt2html,html2html
-!! input
+!! wikitext
 #REDIRECT:[[Main Page]]
-!! result
+!! html
 <link rel="mw:PageProp/redirect" href="./Main_Page">
 !! end
 
@@ -5915,12 +5885,12 @@ Whitespace in #REDIRECT with optional colon
 # it for wt2html, but we don't care that it roundtrips back to the
 # modern syntax (without extra whitespace)
 parsoid=wt2html,html2html
-!! input
+!! wikitext
  
  #REDIRECT 
 : 
 [[Main Page]]
-!! result
+!! html
 <link rel="mw:PageProp/redirect" href="./Main_Page">
 !! end
 
@@ -5930,9 +5900,9 @@ Piped link in #REDIRECT
 # content after piped link is ignored.  we support this syntax,
 # but don't care that the piped link is lost when we roundtrip this.
 parsoid=wt2html
-!! input
+!! wikitext
 #REDIRECT [[Main Page|bar]]
-!! result
+!! html
 <link rel="mw:PageProp/redirect" href="./Main_Page">
 !! end
 
@@ -5940,9 +5910,9 @@ parsoid=wt2html
 Redirect to category
 !! options
 parsoid=wt2html
-!! input
+!! wikitext
 #REDIRECT [[Category:Foo]]
-!! result
+!! html
 <link rel="mw:PageProp/redirect" href="./Category:Foo"><link rel="mw:PageProp/Category" href="./Category:Foo">
 !! end
 
@@ -5950,9 +5920,9 @@ parsoid=wt2html
 Redirect to category with URL encoding
 !! options
 parsoid=wt2html
-!! input
+!! wikitext
 #REDIRECT [[Category%3AFoo]]
-!! result
+!! html
 <link rel="mw:PageProp/redirect" href="./Category:Foo"><link rel="mw:PageProp/Category" href="./Category:Foo">
 !! end
 
@@ -5960,9 +5930,9 @@ parsoid=wt2html
 Redirect to category page
 !! options
 parsoid=wt2html,html2html
-!! input
+!! wikitext
 #REDIRECT [[:Category:Foo]]
-!! result
+!! html
 <p><a rel="mw:WikiLink" href="Category:Foo">Category:Foo</a></p>
 !! end
 
@@ -5970,9 +5940,9 @@ parsoid=wt2html,html2html
 Redirect to image page (1)
 !! options
 parsoid
-!! input
+!! wikitext
 #REDIRECT [[File:Wiki.png]]
-!! result
+!! html
 <link rel="mw:PageProp/redirect" href="./File:Wiki.png">
 !! end
 
@@ -5980,9 +5950,9 @@ parsoid
 Redirect to image page (2)
 !! options
 parsoid
-!! input
+!! wikitext
 #REDIRECT [[Image:Wiki.png]]
-!! result
+!! html
 <link rel="mw:PageProp/redirect" href="./File:Wiki.png">
 !! end
 
@@ -5990,9 +5960,9 @@ parsoid
 Redirect to language
 !! options
 parsoid
-!! input
+!! wikitext
 #REDIRECT [[en:File:Wiki.png]]
-!! result
+!! html
 <link rel="mw:PageProp/redirect" href="File:Wiki.png">
 !! end
 
@@ -6000,9 +5970,9 @@ parsoid
 Redirect to interwiki
 !! options
 parsoid
-!! input
+!! wikitext
 #REDIRECT [[meatball:File:Wiki.png]]
-!! result
+!! html
 <link rel="mw:PageProp/redirect" href="File:Wiki.png">
 !! end
 
@@ -6011,32 +5981,41 @@ Non-English #REDIRECT
 !! options
 parsoid
 language=is
-!! input
+!! wikitext
 #TILVÍSUN [[Main Page]]
-!! result
+!! html
 <link rel="mw:PageProp/redirect" href="./Main_Page">
 !! end
 
+!! test
+New redirect
+!! options
+parsoid=html2wt
+!! wikitext
+Foo
+#REDIRECT [[Foo]]
+!! html
+<p>Foo<link rel="mw:PageProp/redirect" href="./Foo"></p>
+!! end
+
 ##
 ## XHTML tidiness
 ###
 
 !! test
 <br> to <br />
-!! input
+!! wikitext
 1<br>2<br />3
-!! result
+!! html
 <p>1<br />2<br />3
 </p>
 !! end
 
 !! test
 Broken br tag sanitization
-!! options
-php
-!! input
+!! wikitext
 </br>
-!! result
+!! html/php
 <p>&lt;/br&gt;
 </p>
 !! end
@@ -6046,28 +6025,28 @@ php
 Parsoid: Broken br tag recognition
 !! options
 parsoid=wt2html
-!! input
+!! wikitext
 </br>
-!! result
+!! html/parsoid
 <p><br></p>
 !! end
 
 !! test
 Incorrecly removing closing slashes from correctly formed XHTML
-!! input
+!! wikitext
 <br style="clear:both;" />
-!! result
+!! html
 <p><br style="clear:both;" />
 </p>
 !! end
 
 !! test
 Failing to transform badly formed HTML into correct XHTML
-!! input
+!! wikitext
 <br style="clear: left;">
 <br style="clear: right;">
 <br style="clear: both;">
-!! result
+!! html
 <p><br style="clear: left;" />
 <br style="clear: right;" />
 <br style="clear: both;" />
@@ -6076,14 +6055,14 @@ Failing to transform badly formed HTML into correct XHTML
 
 !! test
 Handling html with a div self-closing tag
-!! input
+!! wikitext
 <div title />
 <div title/>
 <div title/ >
 <div title=bar />
 <div title=bar/>
 <div title=bar/ >
-!! result
+!! html
 <p>&lt;div title /&gt;
 &lt;div title/&gt;
 </p>
@@ -6098,14 +6077,14 @@ Handling html with a div self-closing tag
 
 !! test
 Handling html with a br self-closing tag
-!! input
+!! wikitext
 <br title />
 <br title/>
 <br title/ >
 <br title=bar />
 <br title=bar/>
 <br title=bar/ >
-!! result
+!! html
 <p><br title="title" />
 <br title="title" />
 <br />
@@ -6117,12 +6096,12 @@ Handling html with a br self-closing tag
 
 !! test
 Horizontal ruler (should it add that extra space?)
-!! input
+!! wikitext
 <hr>
 <hr >
 foo <hr
 > bar
-!! result
+!! html
 <hr />
 <hr />
 foo <hr /> bar
@@ -6131,28 +6110,28 @@ foo <hr /> bar
 
 !! test
 Horizontal ruler -- 4+ dashes render hr
-!! input
+!! wikitext
 ----
-!! result
+!! html
 <hr />
 
 !! end
 
 !! test
 Horizontal ruler -- eats additional dashes on the same line
-!! input
+!! wikitext
 ---------
-!! result
+!! html
 <hr />
 
 !! end
 
 !! test
 Horizontal ruler -- does not collapse dashes on consecutive lines
-!! input
+!! wikitext
 ----
 ----
-!! result
+!! html
 <hr />
 <hr />
 
@@ -6160,18 +6139,18 @@ Horizontal ruler -- does not collapse dashes on consecutive lines
 
 !! test
 Horizontal ruler -- <4 dashes render as plain text
-!! input
+!! wikitext
 ---
-!! result
+!! html
 <p>---
 </p>
 !! end
 
 !! test
 Horizontal ruler -- Supports content following dashes on same line
-!! input
+!! wikitext
 ---- Foo
-!! result
+!! html
 <hr /> Foo
 
 !! end
@@ -6181,11 +6160,11 @@ Horizontal ruler -- Supports content following dashes on same line
 ###
 !! test
 Common list
-!! input
+!! wikitext
 *Common list
 * item 2
 *item 3
-!! result
+!! html
 <ul>
 <li>Common list
 </li>
@@ -6199,11 +6178,11 @@ Common list
 
 !! test
 Numbered list
-!! input
+!! wikitext
 #Numbered list
 #item 2
 # item 3
-!! result
+!! html
 <ol>
 <li>Numbered list
 </li>
@@ -6217,7 +6196,7 @@ Numbered list
 
 !! test
 Mixed list
-!! input
+!! wikitext
 *Mixed list
 *# with numbers
 ** and bullets
@@ -6233,7 +6212,7 @@ Mixed list
 *Level 1
 *** Level 3
 #** Level 3, but ordered
-!! result
+!! html
 <ul>
 <li>Mixed list
 <ol>
@@ -6300,10 +6279,10 @@ Mixed list
 
 !! test
 Nested lists 1
-!! input
+!! wikitext
 *foo
 **bar
-!! result
+!! html
 <ul>
 <li>foo
 <ul>
@@ -6317,10 +6296,10 @@ Nested lists 1
 
 !! test
 Nested lists 2
-!! input
+!! wikitext
 **foo
 *bar
-!! result
+!! html
 <ul>
 <li><ul>
 <li>foo
@@ -6335,10 +6314,10 @@ Nested lists 2
 
 !! test
 Nested lists 3 (first element empty)
-!! input
+!! wikitext
 *
 **bar
-!! result
+!! html
 <ul>
 <li>
 <ul>
@@ -6352,10 +6331,10 @@ Nested lists 3 (first element empty)
 
 !! test
 Nested lists 4 (first element empty)
-!! input
+!! wikitext
 **
 *bar
-!! result
+!! html
 <ul>
 <li><ul>
 <li>
@@ -6370,10 +6349,10 @@ Nested lists 4 (first element empty)
 
 !! test
 Nested lists 5 (both elements empty)
-!! input
+!! wikitext
 **
 *
-!! result
+!! html
 <ul>
 <li><ul>
 <li>
@@ -6388,10 +6367,10 @@ Nested lists 5 (both elements empty)
 
 !! test
 Nested lists 6 (both elements empty)
-!! input
+!! wikitext
 *
 **
-!! result
+!! html
 <ul>
 <li>
 <ul>
@@ -6405,9 +6384,9 @@ Nested lists 6 (both elements empty)
 
 !! test
 Nested lists 7 (skip initial nesting levels)
-!! input
+!! wikitext
 *** foo
-!! result
+!! html
 <ul>
 <li><ul>
 <li><ul>
@@ -6423,12 +6402,12 @@ Nested lists 7 (skip initial nesting levels)
 
 !! test
 Nested lists 8 (multiple nesting transitions)
-!! input
+!! wikitext
 * foo
 *** bar
 ** baz
 * boo
-!! result
+!! html
 <ul>
 <li> foo
 <ul>
@@ -6449,11 +6428,11 @@ Nested lists 8 (multiple nesting transitions)
 
 !! test
 1. Lists with start-of-line-transparent tokens before bullets: Comments
-!! input
+!! wikitext
 *foo
 *<!--cmt-->bar
 <!--cmt-->*baz
-!! result
+!! html
 <ul>
 <li>foo
 </li>
@@ -6467,10 +6446,10 @@ Nested lists 8 (multiple nesting transitions)
 
 !! test
 2. Lists with start-of-line-transparent tokens before bullets: Template close
-!! input
+!! wikitext
 *foo {{echo|bar
 }}*baz
-!! result
+!! html
 <ul>
 <li>foo bar
 </li>
@@ -6482,11 +6461,11 @@ Nested lists 8 (multiple nesting transitions)
 
 !! test
 List items are not parsed correctly following a <pre> block (bug 785)
-!! input
+!! wikitext
 * <pre>foo</pre>
 * <pre>bar</pre>
 * zar
-!! result
+!! html
 <ul>
 <li> <pre>foo</pre>
 </li>
@@ -6500,7 +6479,7 @@ List items are not parsed correctly following a <pre> block (bug 785)
 
 !! test
 List items from template
-!! input
+!! wikitext
 
 {{inner list}}
 * item 2
@@ -6512,7 +6491,7 @@ List items from template
 * item 0
 * notSOL{{inner list}}
 * item 2
-!! result
+!! html
 <ul>
 <li> item 1
 </li>
@@ -6542,13 +6521,13 @@ List items from template
 
 !! test
 List interrupted by empty line or heading
-!! input
+!! wikitext
 * foo
 
 ** bar
 == A heading ==
 * Another list item
-!! result
+!! html
 <ul>
 <li> foo
 </li>
@@ -6570,11 +6549,11 @@ List interrupted by empty line or heading
 
 !!test
 Multiple list tags generated by templates
-!!input
+!! wikitext
 {{echo|<li>}}a
 {{echo|<li>}}b
 {{echo|<li>}}c
-!!result
+!! html
 <li>a
 <li>b
 <li>c</li>
@@ -6585,7 +6564,7 @@ Multiple list tags generated by templates
 
 !!test
 Single-comment whitespace lines dont break lists, and neither do multi-comment whitespace lines
-!!input
+!! wikitext
 *a
 <!--This line will NOT split the list-->
 *b
@@ -6593,7 +6572,7 @@ Single-comment whitespace lines dont break lists, and neither do multi-comment w
 *c
  <!--foo--> <!----> <!--This line NOT split the list either--> 
 *d
-!!result
+!! html
 <ul>
 <li>a
 </li>
@@ -6609,7 +6588,7 @@ Single-comment whitespace lines dont break lists, and neither do multi-comment w
 
 !!test
 Replacing whitespace with tabs still doesn't break the list (gerrit 78327)
-!!input
+!! wikitext
 *a
 <!--This line will NOT split the list-->       
 *b
@@ -6618,7 +6597,7 @@ Replacing whitespace with tabs still doesn't break the list (gerrit 78327)
        <!--foo--> <!---->      <!--This line NOT split the list
         either-->       
 *d
-!!result
+!! html
 <ul>
 <li>a
 </li>
@@ -6637,7 +6616,7 @@ Test the li-hack
 (Cannot test this with PHP parser since it relies on Tidy for the hack)
 !!options
 parsoid=wt2html,wt2wt
-!!input
+!! wikitext
 * foo
 * <li>li-hack
 * {{echo|<li>templated li-hack}}
@@ -6647,7 +6626,7 @@ parsoid=wt2html,wt2wt
 <li><li>not a li-hack
 </li>
 </ul>
-!!result
+!! html
 <ul>
 <li> foo</li>
 <li>li-hack</li>
@@ -6667,14 +6646,14 @@ parsoid=wt2html,wt2wt
 Parsoid: Make sure nested lists are serialized on their own line even if HTML contains no newlines
 !! options
 parsoid
-!! input
+!! wikitext
 # foo
 ## bar
 * foo
 ** bar
 : foo
 :: bar
-!! result
+!! html
 <ol>
 <li> foo<ol>
 <li> bar</li>
@@ -6694,9 +6673,9 @@ parsoid
 Parsoid: Test of whitespace serialization with Templated bullets
 !! options
 parsoid
-!! input
+!! wikitext
 * {{bullet}}
-!! result
+!! html
 <ul>
 <li> </li><li about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"bullet","href":"./Template:Bullet"},"params":{},"i":0}}]}'> Bar</li>
 </ul>
@@ -6710,13 +6689,11 @@ parsoid
 !! test
 Unbalanced closing block tags break a list
 (Parsoid-only since php parser generates broken html -- relies on Tidy to fix up)
-!! options
-parsoid
-!! input
+!! wikitext
 <div>
 *a</div><div>
 *b</div>
-!! result
+!! html/parsoid
 <div>
 <ul>
 <li>a
@@ -6731,13 +6708,11 @@ parsoid
 !! test
 Unbalanced closing non-block tags don't break a list
 (Parsoid-only since php parser generates broken html -- relies on Tidy to fix up)
-!! options
-parsoid
-!! input
+!! wikitext
 <span>
 *a</span><span>
 *b</span>
-!! result
+!! html/parsoid
 <p><span></span>
 </p>
 <ul>
@@ -6751,12 +6726,10 @@ parsoid
 !! test
 Unclosed formatting tags that straddle lists are closed and reopened
 (Parsoid-only since php parser generates broken html -- relies on Tidy to fix up)
-!! options
-parsoid
-!! input
+!! wikitext
 # <s> a
 # b </s>
-!! result
+!! html/parsoid
 <ol>
 <li> <s> a </s>
 </li>
@@ -6768,13 +6741,11 @@ parsoid
 !!test
 List embedded in a non-block tag
 (Ugly Parsoid output -- worth fixing; Disabled for PHP parser since it relies on Tidy)
-!! options
-parsoid
-!!input
+!! wikitext
 <small>
 * foo
 </small>
-!!result
+!! html/parsoid
 <p><small></small></p>
 <small>
 <ul>
@@ -6788,12 +6759,12 @@ parsoid
 Table with missing opening <tr> tag
 !! options
 parsoid=wt2html,wt2wt
-!! input
+!! wikitext
 <table>
 <td>foo</td>
 </tr>
 </table>
-!! result
+!! html/parsoid
 <table>
 <tr>
 <td>foo</td>
@@ -6812,133 +6783,133 @@ parsoid=wt2html,wt2wt
 
 !! test
 Magic Word: {{CURRENTDAY}}
-!! input
+!! wikitext
 {{CURRENTDAY}}
-!! result
+!! html
 <p>1
 </p>
 !! end
 
 !! test
 Magic Word: {{CURRENTDAY2}}
-!! input
+!! wikitext
 {{CURRENTDAY2}}
-!! result
+!! html
 <p>01
 </p>
 !! end
 
 !! test
 Magic Word: {{CURRENTDAYNAME}}
-!! input
+!! wikitext
 {{CURRENTDAYNAME}}
-!! result
+!! html
 <p>Thursday
 </p>
 !! end
 
 !! test
 Magic Word: {{CURRENTDOW}}
-!! input
+!! wikitext
 {{CURRENTDOW}}
-!! result
+!! html
 <p>4
 </p>
 !! end
 
 !! test
 Magic Word: {{CURRENTMONTH}}
-!! input
+!! wikitext
 {{CURRENTMONTH}}
-!! result
+!! html
 <p>01
 </p>
 !! end
 
 !! test
 Magic Word: {{CURRENTMONTH1}}
-!! input
+!! wikitext
 {{CURRENTMONTH1}}
-!! result
+!! html
 <p>1
 </p>
 !! end
 
 !! test
 Magic Word: {{CURRENTMONTHABBREV}}
-!! input
+!! wikitext
 {{CURRENTMONTHABBREV}}
-!! result
+!! html
 <p>Jan
 </p>
 !! end
 
 !! test
 Magic Word: {{CURRENTMONTHNAME}}
-!! input
+!! wikitext
 {{CURRENTMONTHNAME}}
-!! result
+!! html
 <p>January
 </p>
 !! end
 
 !! test
 Magic Word: {{CURRENTMONTHNAMEGEN}}
-!! input
+!! wikitext
 {{CURRENTMONTHNAMEGEN}}
-!! result
+!! html
 <p>January
 </p>
 !! end
 
 !! test
 Magic Word: {{CURRENTTIME}}
-!! input
+!! wikitext
 {{CURRENTTIME}}
-!! result
+!! html
 <p>00:02
 </p>
 !! end
 
 !! test
 Magic Word: {{CURRENTHOUR}}
-!! input
+!! wikitext
 {{CURRENTHOUR}}
-!! result
+!! html
 <p>00
 </p>
 !! end
 
 !! test
 Magic Word: {{CURRENTWEEK}} (@bug 4594)
-!! input
+!! wikitext
 {{CURRENTWEEK}}
-!! result
+!! html
 <p>1
 </p>
 !! end
 
 !! test
 Magic Word: {{CURRENTYEAR}}
-!! input
+!! wikitext
 {{CURRENTYEAR}}
-!! result
+!! html
 <p>1970
 </p>
 !! end
 
 !! test
 Magic Word: {{CURRENTTIMESTAMP}}
-!! input
+!! wikitext
 {{CURRENTTIMESTAMP}}
-!! result
+!! html
 <p>19700101000203
 </p>
 !! end
 
 !! test
 Magic Words LOCAL (UTC)
-!! input
+!! wikitext
 * {{LOCALMONTH}}
 * {{LOCALMONTH1}}
 * {{LOCALMONTHNAME}}
@@ -6953,7 +6924,7 @@ Magic Words LOCAL (UTC)
 * {{LOCALWEEK}}
 * {{LOCALDOW}}
 * {{LOCALTIMESTAMP}}
-!! result
+!! html
 <ul>
 <li> 01
 </li>
@@ -6991,9 +6962,9 @@ Magic Words LOCAL (UTC)
 Magic Word: {{FULLPAGENAME}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
 {{FULLPAGENAME}}
-!! result
+!! html
 <p>User:Ævar Arnfjörð Bjarmason
 </p>
 !! end
@@ -7002,9 +6973,9 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{FULLPAGENAMEE}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
 {{FULLPAGENAMEE}}
-!! result
+!! html
 <p>User:%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
 </p>
 !! end
@@ -7013,9 +6984,9 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{TALKSPACE}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
 {{TALKSPACE}}
-!! result
+!! html
 <p>User talk
 </p>
 !! end
@@ -7024,9 +6995,9 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{TALKSPACE}}, same namespace
 !! options
 title=[[User talk:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
 {{TALKSPACE}}
-!! result
+!! html
 <p>User talk
 </p>
 !! end
@@ -7035,9 +7006,9 @@ title=[[User talk:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{TALKSPACE}}, main namespace
 !! options
 title=[[Parser Test]]
-!! input
+!! wikitext
 {{TALKSPACE}}
-!! result
+!! html
 <p>Talk
 </p>
 !! end
@@ -7046,9 +7017,9 @@ title=[[Parser Test]]
 Magic Word: {{TALKSPACEE}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
 {{TALKSPACEE}}
-!! result
+!! html
 <p>User_talk
 </p>
 !! end
@@ -7057,9 +7028,9 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{SUBJECTSPACE}}
 !! options
 title=[[User talk:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
 {{SUBJECTSPACE}}
-!! result
+!! html
 <p>User
 </p>
 !! end
@@ -7068,9 +7039,9 @@ title=[[User talk:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{SUBJECTSPACE}}, same namespace
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
 {{SUBJECTSPACE}}
-!! result
+!! html
 <p>User
 </p>
 !! end
@@ -7079,9 +7050,9 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{SUBJECTSPACE}}, main namespace
 !! options
 title=[[Parser Test]]
-!! input
+!! wikitext
 {{SUBJECTSPACE}}
-!! result
+!! html
 
 !! end
 
@@ -7089,9 +7060,9 @@ title=[[Parser Test]]
 Magic Word: {{SUBJECTSPACEE}}
 !! options
 title=[[User talk:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
 {{SUBJECTSPACEE}}
-!! result
+!! html
 <p>User
 </p>
 !! end
@@ -7100,9 +7071,9 @@ title=[[User talk:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{NAMESPACE}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
 {{NAMESPACE}}
-!! result
+!! html
 <p>User
 </p>
 !! end
@@ -7111,9 +7082,9 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{NAMESPACEE}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
 {{NAMESPACEE}}
-!! result
+!! html
 <p>User
 </p>
 !! end
@@ -7122,9 +7093,9 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{NAMESPACENUMBER}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
 {{NAMESPACENUMBER}}
-!! result
+!! html
 <p>2
 </p>
 !! end
@@ -7133,9 +7104,9 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{SUBPAGENAME}}
 !! options
 title=[[Ævar Arnfjörð Bjarmason/sub ö]] subpage
-!! input
+!! wikitext
 {{SUBPAGENAME}}
-!! result
+!! html
 <p>sub ö
 </p>
 !! end
@@ -7144,9 +7115,9 @@ title=[[Ævar Arnfjörð Bjarmason/sub ö]] subpage
 Magic Word: {{SUBPAGENAMEE}}
 !! options
 title=[[Ævar Arnfjörð Bjarmason/sub ö]] subpage
-!! input
+!! wikitext
 {{SUBPAGENAMEE}}
-!! result
+!! html
 <p>sub_%C3%B6
 </p>
 !! end
@@ -7155,9 +7126,9 @@ title=[[Ævar Arnfjörð Bjarmason/sub ö]] subpage
 Magic Word: {{ROOTPAGENAME}}
 !! options
 title=[[Ævar Arnfjörð Bjarmason/sub/sub2]] subpage
-!! input
+!! wikitext
 {{ROOTPAGENAME}}
-!! result
+!! html
 <p>Ævar Arnfjörð Bjarmason
 </p>
 !! end
@@ -7166,9 +7137,9 @@ title=[[Ævar Arnfjörð Bjarmason/sub/sub2]] subpage
 Magic Word: {{ROOTPAGENAMEE}}
 !! options
 title=[[Ævar Arnfjörð Bjarmason/sub/sub2]] subpage
-!! input
+!! wikitext
 {{ROOTPAGENAMEE}}
-!! result
+!! html
 <p>%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
 </p>
 !! end
@@ -7177,9 +7148,9 @@ title=[[Ævar Arnfjörð Bjarmason/sub/sub2]] subpage
 Magic Word: {{BASEPAGENAME}}
 !! options
 title=[[Ævar Arnfjörð Bjarmason/sub]] subpage
-!! input
+!! wikitext
 {{BASEPAGENAME}}
-!! result
+!! html
 <p>Ævar Arnfjörð Bjarmason
 </p>
 !! end
@@ -7188,9 +7159,9 @@ title=[[Ævar Arnfjörð Bjarmason/sub]] subpage
 Magic Word: {{BASEPAGENAMEE}}
 !! options
 title=[[Ævar Arnfjörð Bjarmason/sub]] subpage
-!! input
+!! wikitext
 {{BASEPAGENAMEE}}
-!! result
+!! html
 <p>%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
 </p>
 !! end
@@ -7199,9 +7170,9 @@ title=[[Ævar Arnfjörð Bjarmason/sub]] subpage
 Magic Word: {{TALKPAGENAME}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
 {{TALKPAGENAME}}
-!! result
+!! html
 <p>User talk:Ævar Arnfjörð Bjarmason
 </p>
 !! end
@@ -7210,9 +7181,9 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{TALKPAGENAMEE}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
 {{TALKPAGENAMEE}}
-!! result
+!! html
 <p>User_talk:%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
 </p>
 !! end
@@ -7221,9 +7192,9 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{SUBJECTPAGENAME}}
 !! options
 title=[[User talk:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
 {{SUBJECTPAGENAME}}
-!! result
+!! html
 <p>User:Ævar Arnfjörð Bjarmason
 </p>
 !! end
@@ -7232,18 +7203,18 @@ title=[[User talk:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{SUBJECTPAGENAMEE}}
 !! options
 title=[[User talk:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
 {{SUBJECTPAGENAMEE}}
-!! result
+!! html
 <p>User:%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
 </p>
 !! end
 
 !! test
 Magic Word: {{NUMBEROFFILES}}
-!! input
+!! wikitext
 {{NUMBEROFFILES}}
-!! result
+!! html
 <p>4
 </p>
 !! end
@@ -7252,9 +7223,9 @@ Magic Word: {{NUMBEROFFILES}}
 Magic Word: {{PAGENAME}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
 {{PAGENAME}}
-!! result
+!! html
 <p>Ævar Arnfjörð Bjarmason
 </p>
 !! end
@@ -7263,9 +7234,9 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{PAGENAME}} with metacharacters
 !! options
 title=[['foo & bar = baz']]
-!! input
+!! wikitext
 ''{{PAGENAME}}''
-!! result
+!! html
 <p><i>&#39;foo &#38; bar &#61; baz&#39;</i>
 </p>
 !! end
@@ -7274,9 +7245,9 @@ title=[['foo & bar = baz']]
 Magic Word: {{PAGENAME}} with metacharacters (bug 26781)
 !! options
 title=[[*RFC 1234 http://example.com/]]
-!! input
+!! wikitext
 {{PAGENAME}}
-!! result
+!! html
 <p>&#42;RFC&#32;1234 http&#58;//example.com/
 </p>
 !! end
@@ -7285,9 +7256,9 @@ title=[[*RFC 1234 http://example.com/]]
 Magic Word: {{PAGENAMEE}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
 {{PAGENAMEE}}
-!! result
+!! html
 <p>%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
 </p>
 !! end
@@ -7296,75 +7267,75 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{PAGENAMEE}} with metacharacters (bug 26781)
 !! options
 title=[[*RFC 1234 http://example.com/]]
-!! input
+!! wikitext
 {{PAGENAMEE}}
-!! result
+!! html
 <p>&#42;RFC_1234_http&#58;//example.com/
 </p>
 !! end
 
 !! test
 Magic Word: {{REVISIONID}}
-!! input
+!! wikitext
 {{REVISIONID}}
-!! result
+!! html
 <p>1337
 </p>
 !! end
 
 !! test
 Magic Word: {{SCRIPTPATH}}
-!! input
+!! wikitext
 {{SCRIPTPATH}}
-!! result
+!! html
 <p>/
 </p>
 !! end
 
 !! test
 Magic Word: {{STYLEPATH}}
-!! input
+!! wikitext
 {{STYLEPATH}}
-!! result
+!! html
 <p>/skins
 </p>
 !! end
 
 !! test
 Magic Word: {{SERVER}}
-!! input
+!! wikitext
 {{SERVER}}
-!! result
+!! html
 <p><a rel="nofollow" class="external free" href="http://example.org">http://example.org</a>
 </p>
 !! end
 
 !! test
 Magic Word: {{SERVERNAME}}
-!! input
+!! wikitext
 {{SERVERNAME}}
-!! result
+!! html
 <p>example.org
 </p>
 !! end
 
 !! test
 Magic Word: {{SITENAME}}
-!! input
+!! wikitext
 {{SITENAME}}
-!! result
+!! html
 <p>MediaWiki
 </p>
 !! end
 
 !! test
 Case-sensitive magic words, when cased differently, should just be template transclusions
-!! input
+!! wikitext
 {{CurrentMonth}}
 {{currentday}}
 {{cURreNTweEK}}
 {{currentHour}}
-!! result
+!! html
 <p><a href="/index.php?title=Template:CurrentMonth&amp;action=edit&amp;redlink=1" class="new" title="Template:CurrentMonth (page does not exist)">Template:CurrentMonth</a>
 <a href="/index.php?title=Template:Currentday&amp;action=edit&amp;redlink=1" class="new" title="Template:Currentday (page does not exist)">Template:Currentday</a>
 <a href="/index.php?title=Template:CURreNTweEK&amp;action=edit&amp;redlink=1" class="new" title="Template:CURreNTweEK (page does not exist)">Template:CURreNTweEK</a>
@@ -7374,12 +7345,12 @@ Case-sensitive magic words, when cased differently, should just be template tran
 
 !! test
 Case-insensitive magic words should still work with weird casing.
-!! input
+!! wikitext
 {{sErVeRNaMe}}
 {{LCFirst:AOEU}}
 {{ucFIRST:aoeu}}
 {{SERver}}
-!! result
+!! html
 <p>example.org
 aOEU
 Aoeu
@@ -7389,88 +7360,88 @@ Aoeu
 
 !! test
 Namespace 1 {{ns:1}}
-!! input
+!! wikitext
 {{ns:1}}
-!! result
+!! html
 <p>Talk
 </p>
 !! end
 
 !! test
 Namespace 1 {{ns:01}}
-!! input
+!! wikitext
 {{ns:01}}
-!! result
+!! html
 <p>Talk
 </p>
 !! end
 
 !! test
 Namespace 0 {{ns:0}} (bug 4783)
-!! input
+!! wikitext
 {{ns:0}}
-!! result
+!! html
 
 !! end
 
 !! test
 Namespace 0 {{ns:00}} (bug 4783)
-!! input
+!! wikitext
 {{ns:00}}
-!! result
+!! html
 
 !! end
 
 !! test
 Namespace -1 {{ns:-1}}
-!! input
+!! wikitext
 {{ns:-1}}
-!! result
+!! html
 <p>Special
 </p>
 !! end
 
 !! test
 Namespace User {{ns:User}}
-!! input
+!! wikitext
 {{ns:User}}
-!! result
+!! html
 <p>User
 </p>
 !! end
 
 !! test
 Namespace User talk {{ns:User_talk}}
-!! input
+!! wikitext
 {{ns:User_talk}}
-!! result
+!! html
 <p>User talk
 </p>
 !! end
 
 !! test
 Namespace User talk {{ns:uSeR tAlK}}
-!! input
+!! wikitext
 {{ns:uSeR tAlK}}
-!! result
+!! html
 <p>User talk
 </p>
 !! end
 
 !! test
 Namespace File {{ns:File}}
-!! input
+!! wikitext
 {{ns:File}}
-!! result
+!! html
 <p>File
 </p>
 !! end
 
 !! test
 Namespace File {{ns:Image}}
-!! input
+!! wikitext
 {{ns:Image}}
-!! result
+!! html
 <p>File
 </p>
 !! end
@@ -7479,9 +7450,9 @@ Namespace File {{ns:Image}}
 Namespace (lang=de) Benutzer {{ns:User}}
 !! options
 language=de
-!! input
+!! wikitext
 {{ns:User}}
-!! result
+!! html
 <p>Benutzer
 </p>
 !! end
@@ -7490,9 +7461,9 @@ language=de
 Namespace (lang=de) Benutzer Diskussion {{ns:3}}
 !! options
 language=de
-!! input
+!! wikitext
 {{ns:3}}
-!! result
+!! html
 <p>Benutzer Diskussion
 </p>
 !! end
@@ -7500,12 +7471,12 @@ language=de
 
 !! test
 Urlencode
-!! input
+!! wikitext
 {{urlencode:hi world?!}}
 {{urlencode:hi world?!|WIKI}}
 {{urlencode:hi world?!|PATH}}
 {{urlencode:hi world?!|QUERY}}
-!! result
+!! html
 <p>hi+world%3F%21
 hi_world%3F!
 hi%20world%3F%21
@@ -7513,41 +7484,74 @@ hi+world%3F%21
 </p>
 !! end
 
+!! test
+Magic Word: prioritize type info over data-parsoid
+!! options
+parsoid=html2wt
+!! wikitext
+__FORCETOC__
+!! html
+<meta property="mw:PageProp/forcetoc" data-parsoid='{"src":"__NOTOC__","magicSrc":"__NOTOC__"}'/>
+!! end
+
+!! test
+Magic Word: serialize on separate line (parsoid)
+!! options
+parsoid=wt2wt,html2wt
+!! wikitext
+foo
+__NOTOC__
+bar
+!! html
+foo<meta property="mw:PageProp/notoc"/>bar
+!! end
+
+!! test
+Magic Word: rt non-english wikis
+!! options
+parsoid=wt2wt
+language=de
+!! wikitext
+__NOEDITSECTION__
+!! html
+<meta property="mw:PageProp/noeditsection" data-parsoid='{"src":"__NOEDITSECTION__","magicSrc":"__NOEDITSECTION__"}'/>
+!! end
+
 ###
 ### Magic links
 ###
 !! test
 Magic links: internal link to RFC (bug 479)
-!! input
+!! wikitext
 [[RFC 123]]
-!! result
+!! html
 <p><a href="/index.php?title=RFC_123&amp;action=edit&amp;redlink=1" class="new" title="RFC 123 (page does not exist)">RFC 123</a>
 </p>
 !! end
 
 !! test
 Magic links: RFC (bug 479)
-!! input
+!! wikitext
 RFC 822
-!! result
+!! html
 <p><a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc822">RFC 822</a>
 </p>
 !! end
 
 !! test
 Magic links: ISBN (bug 1937)
-!! input
+!! wikitext
 ISBN 0-306-40615-2
-!! result
+!! html
 <p><a href="/wiki/Special:BookSources/0306406152" class="internal mw-magiclink-isbn">ISBN 0-306-40615-2</a>
 </p>
 !! end
 
 !! test
 Magic links: PMID incorrectly converts space to underscore
-!! input
+!! wikitext
 PMID 1234
-!! result
+!! html
 <p><a class="external mw-magiclink-pmid" rel="nofollow" href="//www.ncbi.nlm.nih.gov/pubmed/1234?dopt=Abstract">PMID 1234</a>
 </p>
 !! end
@@ -7558,31 +7562,42 @@ PMID 1234
 
 !! test
 Nonexistent template
-!! input
+!! wikitext
 {{thistemplatedoesnotexist}}
-!! result
+!! html
 <p><a href="/index.php?title=Template:Thistemplatedoesnotexist&amp;action=edit&amp;redlink=1" class="new" title="Template:Thistemplatedoesnotexist (page does not exist)">Template:Thistemplatedoesnotexist</a>
 </p>
 !! end
 
 !! test
 Template with invalid target containing tags
-!! input
+!! wikitext
 {{a<b>b</b>|{{echo|foo}}|{{echo|a}}={{echo|b}}|a = b}}
-!! result
+!! html
 <p>{{a<b>b</b>|foo|a=b|a = b}}
 </p>
 !! end
 
 !! test
 Template with invalid target containing unclosed tag
-!! input
+!! wikitext
 {{a<b>|{{echo|foo}}|{{echo|a}}={{echo|b}}|a = b}}
-!! result
+!! html
 <p>{{a<b>|foo|a=b|a = b}}</b>
 </p>
 !! end
 
+!! test
+Template with invalid target containing wikilink
+!! wikitext
+{{[[Main Page]]}}
+!! html/php
+<p>{{<a href="/wiki/Main_Page" title="Main Page">Main Page</a>}}
+</p>
+!! html/parsoid
+<p><span typeof="mw:Transclusion" about="#mwt1" data-mw='{"parts":[{"template":{"target":{"wt":"[[Main Page]]"},"params":{},"i":0}}]}'>{{</span><a rel="mw:WikiLink" href="./Main_Page" about="#mwt1">Main Page</a><span about="#mwt1">}}</span></p>
+!! end
+
 !! article
 Template:test
 !! text
@@ -7591,18 +7606,18 @@ This is a test template
 
 !! test
 Simple template
-!! input
+!! wikitext
 {{test}}
-!! result
+!! html
 <p>This is a test template
 </p>
 !! end
 
 !! test
 Template with explicit namespace
-!! input
+!! wikitext
 {{Template:test}}
-!! result
+!! html
 <p>This is a test template
 </p>
 !! end
@@ -7616,9 +7631,9 @@ This is a test template with parameter {{{param}}}
 
 !! test
 Template parameter
-!! input
+!! wikitext
 {{paramtest|param=foo}}
-!! result
+!! html
 <p>This is a test template with parameter foo
 </p>
 !! end
@@ -7631,9 +7646,9 @@ Template:paramtestnum
 
 !! test
 Template unnamed parameter
-!! input
+!! wikitext
 {{paramtestnum|Main Page|the main page}}
-!! result
+!! html
 <p><a href="/wiki/Main_Page" title="Main Page">the main page</a>
 </p>
 !! end
@@ -7670,27 +7685,27 @@ Template:templateasargtest2
 
 !! test
 Template with template name as unnamed argument
-!! input
+!! wikitext
 {{templateasargtestnum|templatesimple}}
-!! result
+!! html
 <p>(test)
 </p>
 !! end
 
 !! test
 Template with template name as argument
-!! input
+!! wikitext
 {{templateasargtest|templ=simple}}
-!! result
+!! html
 <p>(test)
 </p>
 !! end
 
 !! test
 Template with template name as argument (2)
-!! input
+!! wikitext
 {{templateasargtest2|templ=templatesimple}}
-!! result
+!! html
 <p>(test)
 </p>
 !! end
@@ -7709,58 +7724,58 @@ Template:templa
 
 !! test
 Template with default value
-!! input
+!! wikitext
 {{templateasargtestdefault}}
-!! result
+!! html
 <p>(test)
 </p>
 !! end
 
 !! test
 Template with default value (value set)
-!! input
+!! wikitext
 {{templateasargtestdefault|templ=templa}}
-!! result
+!! html
 <p><b>templ</b>
 </p>
 !! end
 
 !! test
 Template redirect
-!! input
+!! wikitext
 {{templateredirect}}
-!! result
+!! html
 <p>(test)
 </p>
 !! end
 
 !! test
 Template with argument in separate line
-!! input
+!! wikitext
 {{ templateasargtest  |
  templ = simple }}
-!! result
+!! html
 <p>(test)
 </p>
 !! end
 
 !! test
 Template with complex template as argument
-!! input
+!! wikitext
 {{paramtest|
   param ={{ templateasargtest  |
  templ = simple }}}}
-!! result
+!! html
 <p>This is a test template with parameter (test)
 </p>
 !! end
 
 !! test
 Template with thumb image (with link in description)
-!! input
+!! wikitext
 {{paramtest|
   param =[[Image:noimage.png|thumb|[[no link|link]] [[no link|caption]]]]}}
-!! result
+!! html
 This is a test template with parameter <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=Special:Upload&amp;wpDestFile=Noimage.png" class="new" title="File:Noimage.png">File:Noimage.png</a>  <div class="thumbcaption"><a href="/index.php?title=No_link&amp;action=edit&amp;redlink=1" class="new" title="No link (page does not exist)">link</a> <a href="/index.php?title=No_link&amp;action=edit&amp;redlink=1" class="new" title="No link (page does not exist)">caption</a></div></div></div>
 
 !! end
@@ -7774,22 +7789,22 @@ Template:complextemplate
 
 !! test
 Template with complex arguments
-!! input
+!! wikitext
 {{complextemplate|
   param ={{ templateasargtest  |
  templ = simple }}|[[Template:complextemplate|link]]}}
-!! result
+!! html
 <p><a href="/wiki/Template:Complextemplate" title="Template:Complextemplate">link</a> This is a test template with parameter (test)
 </p>
 !! end
 
 !! test
 BUG 553: link with two variables in a piped link
-!! input
+!! wikitext
 {|
 |[[{{{1}}}|{{{2}}}]]
 |}
-!! result
+!! html
 <table>
 <tr>
 <td>[[{{{1}}}|{{{2}}}]]
@@ -7799,9 +7814,9 @@ BUG 553: link with two variables in a piped link
 
 !! test
 Magic variable as template parameter
-!! input
+!! wikitext
 {{paramtest|param={{SITENAME}}}}
-!! result
+!! html
 <p>This is a test template with parameter MediaWiki
 </p>
 !! end
@@ -7814,18 +7829,18 @@ Template:linktest
 
 !! test
 Template parameter as link source
-!! input
+!! wikitext
 {{linktest|param=Main Page}}
-!! result
+!! html
 <p><a href="/wiki/Main_Page" title="Main Page">link</a>
 </p>
 !! end
 
 !!test
 Template-generated attribute string (k='v')
-!!input
+!! wikitext
 <span {{attr_str|id|v1}}>bar</span>
-!!result
+!! html
 <p><span id="v1">bar</span>
 </p>
 !!end
@@ -7838,9 +7853,9 @@ including another template, {{paramtest|param={{{arg}}}}}
 
 !! test
 Template passing argument to another template
-!! input
+!! wikitext
 {{paramtest2|arg='hmm'}}
-!! result
+!! html
 <p>including another template, This is a test template with parameter 'hmm'
 </p>
 !! end
@@ -7853,13 +7868,13 @@ Main Page
 
 !! test
 Template as link source
-!! input
+!! wikitext
 [[{{linktest2}}]]
 
 [[{{linktest2}}|Main Page]]
 
 [[{{linktest2}}]]Page
-!! result
+!! html
 <p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>
 </p><p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>
 </p><p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>Page
@@ -7881,18 +7896,18 @@ Template:loop2
 
 !! test
 Template infinite loop
-!! input
+!! wikitext
 {{loop1}}
-!! result
+!! html
 <p><span class="error">Template loop detected: <a href="/wiki/Template:Loop1" title="Template:Loop1">Template:Loop1</a></span>
 </p>
 !! end
 
 !! test
 Template from main namespace
-!! input
+!! wikitext
 {{:Main Page}}
-!! result
+!! html
 <p>blah blah
 </p>
 !! end
@@ -7909,9 +7924,9 @@ Template:table
 
 !! test
 BUG 529: Template with table, not included at beginning of line
-!! input
+!! wikitext
 foo {{table}}
-!! result
+!! html
 <p>foo 
 </p>
 <table>
@@ -7928,10 +7943,10 @@ foo {{table}}
 
 !! test
 BUG 523: Template shouldn't eat newline (or add an extra one before table)
-!! input
+!! wikitext
 foo
 {{table}}
-!! result
+!! html
 <p>foo
 </p>
 <table>
@@ -7948,22 +7963,22 @@ foo
 
 !! test
 BUG 41: Template parameters shown as broken links
-!! input
+!! wikitext
 {{{parameter}}}
-!! result
+!! html
 <p>{{{parameter}}}
 </p>
 !! end
 
 !! test
 Template with targets containing wikilinks
-!! input
+!! wikitext
 {{[[foo]]}}
 
 {{[[{{echo|foo}}]]}}
 
 {{{{echo|[[foo}}]]}}
-!! result
+!! html
 <p>{{<a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">foo</a>}}
 </p><p>{{<a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">foo</a>}}
 </p><p>{{[[foo}}]]
@@ -7984,9 +7999,9 @@ Template:MSGNW test
 msgnw keyword
 !! options
 disabled
-!! input
+!! wikitext
 {{msgnw:MSGNW test}}
-!! result
+!! html
 <p>''None'' of '''this''' should be 
 * interpreted
  but rather passed unmodified
@@ -7996,9 +8011,9 @@ disabled
 
 !! test
 int keyword
-!! input
+!! wikitext
 {{int:youhavenewmessages|lots of money|not!}}
-!! result
+!! html
 <p>You have lots of money (not!).
 </p>
 !! end
@@ -8011,9 +8026,9 @@ Foo<noinclude>zar</noinclude><includeonly>bar</includeonly>
 
 !! test
 <includeonly> and <noinclude> being included
-!! input
+!! wikitext
 {{Includes}}
-!! result
+!! html
 <p>Foobar
 </p>
 !! end
@@ -8026,9 +8041,9 @@ Template:Includes2
 
 !! test
 <onlyinclude> being included
-!! input
+!! wikitext
 {{Includes2}}
-!! result
+!! html
 <p>Foo
 </p>
 !! end
@@ -8042,66 +8057,66 @@ Template:Includes3
 
 !! test
 <onlyinclude> and <includeonly> being included
-!! input
+!! wikitext
 {{Includes3}}
-!! result
+!! html
 <p>Foo
 </p>
 !! end
 
 !! test
 <includeonly> and <noinclude> on a page
-!! input
+!! wikitext
 Foo<noinclude>zar</noinclude><includeonly>bar</includeonly>
-!! result
+!! html
 <p>Foozar
 </p>
 !! end
 
 !! test
 Un-closed <noinclude>
-!! input
+!! wikitext
 <noinclude>
-!! result
+!! html
 !! end
 
 !! test
 <onlyinclude> on a page
-!! input
+!! wikitext
 <onlyinclude>Foo</onlyinclude>bar
-!! result
+!! html
 <p>Foobar
 </p>
 !! end
 
 !! test
 Un-closed <onlyinclude>
-!! input
+!! wikitext
 <onlyinclude>
-!! result
+!! html
 !! end
 
 !!test
 Self-closed noinclude, includeonly, onlyinclude tags
-!!input
+!! wikitext
 <noinclude />
 <includeonly />
 <onlyinclude />
-!!result
+!! html
 <p><br />
 </p>
 !!end
 
 !!test
 Unbalanced includeonly and noinclude tags
-!!input
+!! wikitext
 {|
 |a</noinclude>
 |b</noinclude></noinclude>
 |c</noinclude></includeonly>
 |d</includeonly></includeonly>
 |}
-!!result
+!! html
 <table>
 <tr>
 <td>a
@@ -8126,9 +8141,9 @@ Template:Includeonly section
 
 !! test
 Bug 6563: Edit link generation for section shown by <includeonly>
-!! input
+!! wikitext
 {{includeonly section}}
-!! result
+!! html
 <h2><span class="mw-headline" id="Includeonly_section">Includeonly section</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Template:Includeonly_section&amp;action=edit&amp;section=T-1" title="Template:Includeonly section">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <h2><span class="mw-headline" id="Section_T-1">Section T-1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Template:Includeonly_section&amp;action=edit&amp;section=T-2" title="Template:Includeonly section">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
@@ -8139,23 +8154,23 @@ Bug 6563: Edit link generation for section shown by <includeonly>
 Bug 6563: Section extraction for section shown by <includeonly>
 !! options
 section=T-2
-!! input
+!! wikitext
 <includeonly>
 ==Includeonly section==
 </includeonly>
 ==Section T-2==
-!! result
+!! html
 ==Section T-2==
 !! end
 
 !! test
 Bug 6563: Edit link generation for section suppressed by <includeonly>
-!! input
+!! wikitext
 <includeonly>
 ==Includeonly section==
 </includeonly>
 ==Section 1==
-!! result
+!! html
 <h2><span class="mw-headline" id="Section_1">Section 1</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: Section 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
@@ -8164,20 +8179,20 @@ Bug 6563: Edit link generation for section suppressed by <includeonly>
 Bug 6563: Section extraction for section suppressed by <includeonly>
 !! options
 section=1
-!! input
+!! wikitext
 <includeonly>
 ==Includeonly section==
 </includeonly>
 ==Section 1==
-!! result
+!! html
 ==Section 1==
 !! end
 
 !! test
 Un-closed <includeonly>
-!! input
+!! wikitext
 <includeonly>
-!! result
+!! html
 !! end
 
 # TODO: test with DOM fragment reuse!
@@ -8185,7 +8200,7 @@ Un-closed <includeonly>
 Parsoid: DOM fragment reuse
 !! options
 parsoid=wt2wt,wt2html
-!! input
+!! wikitext
 a{{echo|b<table></table>c}}d
 
 a{{echo|b
@@ -8197,7 +8212,7 @@ c}}d
 <table></table>
 
 b}}
-!! result
+!! html
 a<span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"b
 <table></table>c"}},"i":0}}]}'>b</span>
 <table about="#mwt1"></table><span about="#mwt1">c</span>d
@@ -8223,11 +8238,11 @@ a<span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"t
 Parsoid: Merge double tds (bug 50603)
 !! options
 parsoid
-!! input
+!! wikitext
 {|
 |{{echo|{{!}} foo}}
 |}
-!! result
+!! html
 <table><tbody>
 <tr><td about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":["|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"{{!}} foo"}},"i":0}}]}'> foo</td></tr>
 </tbody></table>
@@ -8237,13 +8252,13 @@ parsoid
 Parsoid: Merge double tds in nested transclusion content (bug 50603)
 !! options
 parsoid
-!! input
+!! wikitext
 {{echo|<div>}}
 {|
 |{{echo|{{!}} foo}}
 |}
 {{echo|</div>}}
-!! result
+!! html
 <div about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<div>"}},"i":0}},"\n{|\n|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"{{!}} foo"}},"i":1}},"\n|}\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"</div>"}},"i":2}}]}'>
 <table><tbody>
 <tr><td data-mw='{"parts":["|"]}'> foo</td></tr>
@@ -8256,28 +8271,28 @@ parsoid
 ###
 !!test
 0. includeonly around the entire attribute
-!!input
+!! wikitext
 <span <includeonly>id="v1"</includeonly><noinclude>id="v2"</noinclude>>bar</span>
-!!result
+!! html
 <p><span id="v2">bar</span>
 </p>
 !!end
 
 !!test
 1. includeonly in html attr key
-!!input
+!! wikitext
 <span <noinclude>id</noinclude><includeonly>about</includeonly>="foo">bar</span>
-!!result
+!! html
 <p><span id="foo">bar</span>
 </p>
 !!end
 
 !!test
 2. includeonly in html attr value
-!!input
+!! wikitext
 <span id="<noinclude>v1</noinclude><includeonly>v2</includeonly>">bar</span>
 <span id=<noinclude>"v1"</noinclude><includeonly>"v2"</includeonly>>bar</span>
-!!result
+!! html
 <p><span id="v1">bar</span>
 <span id="v1">bar</span>
 </p>
@@ -8285,16 +8300,16 @@ parsoid
 
 !!test
 3. includeonly in part of an attr value
-!!input
+!! wikitext
 <span style="color:<noinclude>red</noinclude><includeonly>blue</includeonly>;">bar</span>
-!!result
+!! html
 <p><span style="color:red;">bar</span>
 </p>
 !!end
 
 !!test
 4. includeonly in table attributes
-!!input
+!! wikitext
 {|
 |- <noinclude>
 |-
@@ -8305,7 +8320,7 @@ parsoid
 |b
 </includeonly>
 |}
-!!result
+!! html
 <table>
 
 
@@ -8329,27 +8344,27 @@ Template:quote
 
 !!test
 Templates: Template Name/Arg clash: 1. Use of positional param
-!!input
+!! wikitext
 {{quote|foo}}
-!!result
+!! html
 <p>foo
 </p>
 !!end
 
 !!test
 Templates: Template Name/Arg clash: 2. Use of named param
-!!input
+!! wikitext
 {{quote|quote=foo}}
-!!result
+!! html
 <p>foo
 </p>
 !!end
 
 !!test
 Templates: Template Name/Arg clash: 3. Use of named param with empty input
-!!input
+!! wikitext
 {{quote|quote}}
-!!result
+!! html
 <p>quote
 </p>
 !!end
@@ -8360,19 +8375,19 @@ Templates: Template Name/Arg clash: 3. Use of named param with empty input
 
 !!test
 Templates: 1. Simple use
-!!input
+!! wikitext
 {{echo|Foo}}
-!!result
+!! html
 <p>Foo
 </p>
 !!end
 
 !!test
 Templates: 2. Inside a block tag
-!!input
+!! wikitext
 <div>{{echo|Foo}}</div>
 <blockquote>{{echo|Foo}}</blockquote>
-!!result
+!! html
 <div>Foo</div>
 <blockquote>Foo</blockquote>
 
@@ -8380,10 +8395,10 @@ Templates: 2. Inside a block tag
 
 !!test
 Templates: P-wrapping: 1a. Templates on consecutive lines
-!!input
+!! wikitext
 {{echo|Foo}}
 {{echo|bar}}
-!!result
+!! html
 <p>Foo
 bar
 </p>
@@ -8391,12 +8406,12 @@ bar
 
 !!test
 Templates: P-wrapping: 1b. Templates on consecutive lines
-!!input
+!! wikitext
 Foo
 
 {{echo|bar}}
 {{echo|baz}}
-!!result
+!! html
 <p>Foo
 </p><p>bar
 baz
@@ -8405,10 +8420,10 @@ baz
 
 !!test
 Templates: P-wrapping: 1c. Templates on consecutive lines
-!!input
+!! wikitext
 {{echo|Foo}}
 {{echo|bar}} <div>baz</div>
-!!result
+!! html
 <p>Foo
 </p>
 bar <div>baz</div>
@@ -8419,10 +8434,10 @@ bar <div>baz</div>
 Templates: P-wrapping: 1d. Template preceded by comment-only line
 !!options
 parsoid
-!!input
+!! wikitext
 <!-- foo -->
 {{echo|Bar}}
-!!result
+!! html
 <!-- foo -->
 
 <p about="#mwt223" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"Bar"}},"i":0}}]}'>Bar</p>
@@ -8430,61 +8445,61 @@ parsoid
 
 !!test
 Templates: Inline Text: 1. Multiple tmeplate uses
-!!input
+!! wikitext
 {{echo|Foo}}bar{{echo|baz}}
-!!result
+!! html
 <p>Foobarbaz
 </p>
 !!end
 
 !!test
 Templates: Inline Text: 2. Back-to-back template uses
-!!input
+!! wikitext
 {{echo|Foo}}{{echo|bar}}
-!!result
+!! html
 <p>Foobar
 </p>
 !!end
 
 !!test
 Templates: Block Tags: 1. Multiple template uses
-!!input
+!! wikitext
 {{echo|<div>Foo</div>}}<div>bar</div>{{echo|<div>baz</div>}}
-!!result
+!! html
 <div>Foo</div><div>bar</div><div>baz</div>
 
 !!end
 
 !!test
 Templates: Block Tags: 2. Back-to-back template uses
-!!input
+!! wikitext
 {{echo|<div>Foo</div>}}{{echo|<div>bar</div>}}
-!!result
+!! html
 <div>Foo</div><div>bar</div>
 
 !!end
 
 !!test
 Templates: Links: 1. Simple example
-!!input
+!! wikitext
 {{echo|[[Foo|bar]]}}
-!!result
+!! html
 <p><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">bar</a>
 </p>
 !!end
 
 !!test
 Templates: Links: 2. Generation of link href
-!!input
+!! wikitext
 [[{{echo|Foo}}|bar]]
-!!result
+!! html
 <p><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">bar</a>
 </p>
 !!end
 
 !!test
 Templates: Links: 3. Generation of part of a link href
-!!input
+!! wikitext
 [[Fo{{echo|o}}|bar]]
 
 [[Foo{{echo|bar}}]]
@@ -8496,7 +8511,7 @@ Templates: Links: 3. Generation of part of a link href
 [[:Foo{{echo|bar}}]]
 
 [[:Foo{{echo|bar}}|bar]]
-!!result
+!! html
 <p><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">bar</a>
 </p><p><a href="/index.php?title=Foobar&amp;action=edit&amp;redlink=1" class="new" title="Foobar (page does not exist)">Foobar</a>
 </p><p><a href="/index.php?title=Foobarbaz&amp;action=edit&amp;redlink=1" class="new" title="Foobarbaz (page does not exist)">Foobarbaz</a>
@@ -8508,180 +8523,180 @@ Templates: Links: 3. Generation of part of a link href
 
 !!test
 Templates: Links: 4. Multiple templates generating link href
-!!input
+!! wikitext
 [[{{echo|F}}{{echo|o}}ob{{echo|ar}}]]
-!!result
+!! html
 <p><a href="/index.php?title=Foobar&amp;action=edit&amp;redlink=1" class="new" title="Foobar (page does not exist)">Foobar</a>
 </p>
 !!end
 
 !!test
 Templates: Links: 5. Generation of link text
-!!input
+!! wikitext
 [[Foo|{{echo|bar}}]]
-!!result
+!! html
 <p><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">bar</a>
 </p>
 !!end
 
 !!test
 Templates: Links: 5. Nested templates (only outermost template should be marked)
-!!input
+!! wikitext
 {{echo|[[{{echo|Foo}}|bar]]}}
-!!result
+!! html
 <p><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">bar</a>
 </p>
 !!end
 
 !!test
 Templates: HTML Tag: 1. Generation of HTML attr. key
-!!input
+!! wikitext
 <div {{echo|style}}="color:red;">foo</div>
-!!result
+!! html
 <div style="color:red;">foo</div>
 
 !!end
 
 !!test
 Templates: HTML Tag: 2. Generation of HTML attr. value
-!!input
+!! wikitext
 <div style={{echo|'color:red;'}}>foo</div>
-!!result
+!! html
 <div style="color:red;">foo</div>
 
 !!end
 
 !!test
 Templates: HTML Tag: 3. Generation of HTML attr key and value
-!!input
+!! wikitext
 <div {{echo|style}}={{echo|'color:red;'}}>foo</div>
-!!result
+!! html
 <div style="color:red;">foo</div>
 
 !!end
 
 !!test
 Templates: HTML Tag: 4. Generation of starting piece of HTML attr value
-!!input
+!! wikitext
 <div title="{{echo|This is a long title}} with just one piece templated">foo</div>
-!!result
+!! html
 <div title="This is a long title with just one piece templated">foo</div>
 
 !!end
 
 !!test
 Templates: HTML Tag: 5. Generation of middle piece of HTML attr value
-!!input
+!! wikitext
 <div title="This is a long title with just {{echo|one piece}} templated">foo</div>
-!!result
+!! html
 <div title="This is a long title with just one piece templated">foo</div>
 
 !!end
 
 !!test
 Templates: HTML Tag: 6. Generation of end piece of HTML attr value
-!!input
+!! wikitext
 <div title="This is a long title with just one piece {{echo|templated}}">foo</div>
-!!result
+!! html
 <div title="This is a long title with just one piece templated">foo</div>
 
 !!end
 
 !!test
 Templates: HTML Tag: 7. Generation of partial attribute key string
-!!input
+!! wikitext
 <div st{{echo|yle}}="color:red;">foo</div>
-!!result
+!! html
 <div style="color:red;">foo</div>
 
 !!end
 
 !!test
 Templates: HTML Tables: 1. Generating start of a HTML table
-!!input
+!! wikitext
 {{echo|<table><tr><td>foo</td>}}</tr></table>
-!!result
+!! html
 <table><tr><td>foo</td></tr></table>
 
 !!end
 
 !!test
 Templates: HTML Tables: 2a. Generating middle of a HTML table
-!!input
+!! wikitext
 <table><tr>{{echo|<td>foo</td>}}</tr></table>
-!!result
+!! html
 <table><tr><td>foo</td></tr></table>
 
 !!end
 
 !!test
 Templates: HTML Tables: 2b. Generating middle of a HTML table
-!!input
+!! wikitext
 <table>{{echo|<tr><td>foo</td></tr>}}</table>
-!!result
+!! html
 <table><tr><td>foo</td></tr></table>
 
 !!end
 
 !!test
 Templates: HTML Tables: 3. Generating end of a HTML table
-!!input
+!! wikitext
 <table><tr>{{echo|<td>foo</td></tr></table>}}
-!!result
+!! html
 <table><tr><td>foo</td></tr></table>
 
 !!end
 
 !!test
 Templates: HTML Tables: 4a. Generating a single tag of a HTML table
-!!input
+!! wikitext
 {{echo|<table>}}<tr><td>foo</td></tr></table>
-!!result
+!! html
 <table><tr><td>foo</td></tr></table>
 
 !!end
 
 !!test
 Templates: HTML Tables: 4b. Generating a single tag of a HTML table
-!!input
+!! wikitext
 <table>{{echo|<tr>}}<td>foo</td></tr></table>
-!!result
+!! html
 <table><tr><td>foo</td></tr></table>
 
 !!end
 
 !!test
 Templates: HTML Tables: 4c. Generating a single tag of a HTML table
-!!input
+!! wikitext
 <table><tr>{{echo|<td>}}foo</td></tr></table>
-!!result
+!! html
 <table><tr><td>foo</td></tr></table>
 
 !!end
 
 !!test
 Templates: HTML Tables: 4d. Generating a single tag of a HTML table
-!!input
+!! wikitext
 <table><tr><td>foo{{echo|</td>}}</tr></table>
-!!result
+!! html
 <table><tr><td>foo</td></tr></table>
 
 !!end
 
 !!test
 Templates: HTML Tables: 4e. Generating a single tag of a HTML table
-!!input
+!! wikitext
 <table><tr><td>foo</td>{{echo|</tr>}}</table>
-!!result
+!! html
 <table><tr><td>foo</td></tr></table>
 
 !!end
 
 !!test
 Templates: HTML Tables: 4f. Generating a single tag of a HTML table
-!!input
+!! wikitext
 <table><tr><td>foo</td></tr>{{echo|</table>}}
-!!result
+!! html
 <table><tr><td>foo</td></tr></table>
 
 !!end
@@ -8690,11 +8705,11 @@ Templates: HTML Tables: 4f. Generating a single tag of a HTML table
 Templates: HTML Tables: 5. Proper fostering of categories from inside
 !!options
 parsoid=wt2html,wt2wt
-!!input
+!! wikitext
 <table>[[Category:foo1]]<tr><td>foo</td></tr></table>
 <!--Two categories (Bug 50330)-->
 <table>[[Category:bar1]][[Category:bar2]]<tr><td>foo</td></tr></table>
-!!result
+!! html
 <link rel="mw:PageProp/Category" href="./Category:Foo1"><table><tbody><tr><td>foo</td></tr></tbody></table>
 <!--Two categories (Bug 50330)-->
 <link rel="mw:PageProp/Category" href="./Category:Bar1"><link rel="mw:PageProp/Category" href="./Category:Bar2"><table><tbody><tr><td>foo</td></tr></tbody></table>
@@ -8702,11 +8717,11 @@ parsoid=wt2html,wt2wt
 
 !!test
 Templates: Wiki Tables: 1a. Fostering of entire template content
-!!input
+!! wikitext
 {|
 {{echo|a}}
 |}
-!!result
+!! html
 <table>
 a
 <tr><td></td></tr></table>
 
 !!test
 Templates: Wiki Tables: 1b. Fostering of entire template content
-!!input
+!! wikitext
 {|
 {{echo|<div>}}
 foo
 {{echo|</div>}}
 |}
-!!result
+!! html
 <table>
 <div>
 <p>foo
@@ -8733,12 +8748,12 @@ foo
 
 !!test
 Templates: Wiki Tables: 2. Fostering of partial template content
-!!input
+!! wikitext
 {|
 {{echo|a
 <div>b</div>}}
 |}
-!!result
+!! html
 <table>
 a
 <div>b</div>
 
 !!test
 Templates: Wiki Tables: 3. td-content via multiple templates
-!!input
+!! wikitext
 {|
 {{echo|{{pipe}}a}}{{echo|b}}
 |}
-!!result
+!! html
 <table>
 <tr>
 <td>ab
@@ -8762,10 +8777,10 @@ Templates: Wiki Tables: 3. td-content via multiple templates
 
 !!test
 Templates: Wiki Tables: 4. Templated tags, no content
-!!input
+!! wikitext
 {{tbl-start}}
 {{tbl-end}}
-!!result
+!! html
 <table>
 <tr><td></td></tr></table>
 
@@ -8773,11 +8788,11 @@ Templates: Wiki Tables: 4. Templated tags, no content
 
 !!test
 Templates: Wiki Tables: 5. Templated tags, regular td-tags
-!!input
+!! wikitext
 {{tbl-start}}
 |foo
 {{tbl-end}}
-!!result
+!! html
 <table>
 <tr>
 <td>foo
@@ -8787,11 +8802,11 @@ Templates: Wiki Tables: 5. Templated tags, regular td-tags
 
 !!test
 Templates: Wiki Tables: 6. Templated tags, templated td-tags
-!!input
+!! wikitext
 {{tbl-start}}
 {{!}}foo
 {{tbl-end}}
-!!result
+!! html
 <table>
 <tr>
 <td>foo
@@ -8801,12 +8816,12 @@ Templates: Wiki Tables: 6. Templated tags, templated td-tags
 
 !!test
 Templates: Lists: Multi-line list-items via templates
-!!input
+!! wikitext
 *{{echo|a {{nonexistent|
 unused}}}}
 *{{echo|b {{nonexistent|
 unused}}}}
-!!result
+!! html
 <ul>
 <li>a <a href="/index.php?title=Template:Nonexistent&amp;action=edit&amp;redlink=1" class="new" title="Template:Nonexistent (page does not exist)">Template:Nonexistent</a>
 </li>
@@ -8818,9 +8833,9 @@ unused}}}}
 
 !!test
 Templates: Ugly nesting: 1. Quotes opened/closed across templates (echo)
-!!input
+!! wikitext
 {{echo|''a}}{{echo|b''c''d}}{{echo|''e}}
-!!result
+!! html
 <p><i>ab</i>c<i>d</i>e
 </p>
 !!end
@@ -8828,11 +8843,9 @@ Templates: Ugly nesting: 1. Quotes opened/closed across templates (echo)
 !!test
 Templates: Ugly nesting: 2. Quotes opened/closed across templates (echo_with_span)
 (PHP parser generates misnested html)
-!! options
-parsoid
-!!input
+!! wikitext
 {{echo_with_span|''a}}{{echo_with_span|b''c''d}}{{echo_with_span|''e}}
-!!result
+!! html/parsoid
 <p><span about="#mwt1" typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo_with_span&quot;,&quot;href&quot;:&quot;./Template:Echo_with_span&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;''a&quot;}},&quot;i&quot;:0}}]}"><i>a</i></span><i about="#mwt2" typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo_with_span&quot;,&quot;href&quot;:&quot;./Template:Echo_with_span&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;b''c''d&quot;}},&quot;i&quot;:0}},{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo_with_span&quot;,&quot;href&quot;:&quot;./Template:Echo_with_span&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;''e&quot;}},&quot;i&quot;:1}}]}"><span>b</span></i><span about="#mwt2">c</span><i about="#mwt2">d<span></span></i><span about="#mwt2">e</span></p>
 !!end
 
@@ -8841,9 +8854,9 @@ Templates: Ugly nesting: 3. Quotes opened/closed across templates (echo_with_div
 (PHP parser generates misnested html; Parsoid html2wt mode adds newlines between {{echo}}s)
 !! options
 parsoid=wt2html,wt2wt
-!!input
+!! wikitext
 {{echo_with_div|''a}}{{echo_with_div|b''c''d}}{{echo_with_div|''e}}
-!!result
+!! html
 <div about="#mwt1" typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo_with_div&quot;,&quot;href&quot;:&quot;./Template:Echo_with_div&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;''a&quot;}},&quot;i&quot;:0}}]}"><i>a</i></div>
 <div about="#mwt2" typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo_with_div&quot;,&quot;href&quot;:&quot;./Template:Echo_with_div&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;b''c''d&quot;}},&quot;i&quot;:0}}]}"><i>b</i>c<i>d</i></div>
 <div about="#mwt3" typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo_with_div&quot;,&quot;href&quot;:&quot;./Template:Echo_with_div&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;''e&quot;}},&quot;i&quot;:0}}]}">e</div>
@@ -8851,9 +8864,9 @@ parsoid=wt2html,wt2wt
 
 !!test
 Templates: Ugly nesting: 4. Divs opened/closed across templates
-!!input
+!! wikitext
 a<div>b{{echo|c</div>d}}e
-!!result
+!! html
 a<div>bc</div>de
 
 !!end
@@ -8863,19 +8876,19 @@ Templates: Ugly templates: 1. Navbox template parses badly leading to table misn
 (Parsoid-centric)
 !! options
 parsoid
-!!input
+!! wikitext
 {|
 |{{echo|foo</table>}}
 |bar
 |}
-!!result
+!! html
 <table about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":["{|\n|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo</table>"}},"i":0}},"\n|bar\n|}"]}'>
 
 <tbody>
 <tr>
 <td>foo</td></tr></tbody></table><span about="#mwt1">
-</span><span about="#mwt1">bar</span><span about="#mwt1">
-</span>
+</span><span about="#mwt1">|bar</span><span about="#mwt1">
+|}</span>
 !!end
 
 !!test
@@ -8883,7 +8896,7 @@ Templates: Ugly templates: 2. Navbox template parses badly leading to table misn
 (Parsoid-centric)
 !! options
 parsoid
-!!input
+!! wikitext
 <table>
   <tr>
     <td>
@@ -8903,7 +8916,7 @@ parsoid
     <td>xyz</td>
   </tr>
 </table>
-!!result
+!! html
 <table about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":["<table>\n  <tr>\n    <td>\n    <table>\n      <tr>\n        <td>1. ",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo </table>"}},"i":0}},"</td>\n        <td> bar </td>\n        <td>2. ",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"baz </table>"}},"i":1}},"</td>\n      </tr>\n      <tr>\n        <td>abc</td>\n      </tr>\n    </table>\n    </td>\n  </tr>\n  <tr>\n    <td>xyz</td>\n  </tr>\n</table>"]}'>
   <tbody><tr>
     <td>
@@ -8927,10 +8940,10 @@ parsoid
 
 !! test
 Templates: Ugly templates: 3. newline-only template parameter
-!! input
+!! wikitext
 foo {{echo|
 }}
-!! result
+!! html
 <p>foo 
 </p>
 !! end
@@ -8938,10 +8951,10 @@ foo {{echo|
 # This looks like a bug: a single newline triggers p/br for some reason.
 !! test
 Templates: Ugly templates: 4. newline-only template parameter inconsistency
-!! input
+!! wikitext
 {{echo|
 }}
-!! result
+!! html
 <p><br />
 </p>
 !! end
@@ -8949,18 +8962,18 @@ Templates: Ugly templates: 4. newline-only template parameter inconsistency
 
 !!test
 Parser Functions: 1. Simple example
-!!input
+!! wikitext
 {{uc:foo}}
-!!result
+!! html
 <p>FOO
 </p>
 !!end
 
 !!test
 Parser Functions: 2. Nested use (only outermost should be marked up)
-!!input
+!! wikitext
 {{uc:{{lc:FOO}}}}
-!!result
+!! html
 <p>FOO
 </p>
 !!end
@@ -8972,9 +8985,9 @@ Parser Functions: 2. Nested use (only outermost should be marked up)
 pre-save transform: subst:
 !! options
 PST
-!! input
+!! wikitext
 {{subst:test}}
-!! result
+!! html
 This is a test template
 !! end
 
@@ -8982,9 +8995,9 @@ This is a test template
 pre-save transform: normal template
 !! options
 PST
-!! input
+!! wikitext
 {{test}}
-!! result
+!! html
 {{test}}
 !! end
 
@@ -8992,9 +9005,9 @@ PST
 pre-save transform: nonexistent template
 !! options
 PST
-!! input
+!! wikitext
 {{thistemplatedoesnotexist}}
-!! result
+!! html
 {{thistemplatedoesnotexist}}
 !! end
 
@@ -9003,9 +9016,9 @@ PST
 pre-save transform: subst magic variables
 !! options
 PST
-!! input
+!! wikitext
 {{subst:SITENAME}}
-!! result
+!! html
 MediaWiki
 !! end
 
@@ -9014,9 +9027,9 @@ MediaWiki
 pre-save transform: subst: templates with parameters
 !! options
 pst
-!! input
+!! wikitext
 {{subst:paramtest|param="something else"}}
-!! result
+!! html
 This is a test template with parameter "something else"
 !! end
 
@@ -9030,9 +9043,9 @@ Template:nowikitest
 pre-save transform: nowiki in subst (bug 1188)
 !! options
 pst
-!! input
+!! wikitext
 {{subst:nowikitest}}
-!! result
+!! html
 <nowiki>'''not wiki'''</nowiki>
 !! end
 
@@ -9047,9 +9060,9 @@ This template has <!-- a comment --> in it.
 pre-save transform: comment in subst (bug 1936)
 !! options
 pst
-!! input
+!! wikitext
 {{subst:commenttest}}
-!! result
+!! html
 This template has <!-- a comment --> in it.
 !! end
 
@@ -9057,9 +9070,9 @@ This template has <!-- a comment --> in it.
 pre-save transform: unclosed tag
 !! options
 pst noxml
-!! input
+!! wikitext
 <nowiki>'''not wiki'''
-!! result
+!! html
 <nowiki>'''not wiki'''
 !! end
 
@@ -9067,9 +9080,9 @@ pst noxml
 pre-save transform: mixed tag case
 !! options
 pst noxml
-!! input
+!! wikitext
 <NOwiki>'''not wiki'''</noWIKI>
-!! result
+!! html
 <NOwiki>'''not wiki'''</noWIKI>
 !! end
 
@@ -9077,9 +9090,9 @@ pst noxml
 pre-save transform: unclosed comment in <nowiki>
 !! options
 pst noxml
-!! input
+!! wikitext
 wiki<nowiki>nowiki<!--nowiki</nowiki>wiki
-!! result
+!! html
 wiki<nowiki>nowiki<!--nowiki</nowiki>wiki
 !!end
 
@@ -9094,9 +9107,9 @@ Template:dangerous
 
 !!test
 (confirming safety of fix for subst bug 1936)
-!! input
+!! wikitext
 {{Template:dangerous}}
-!! result
+!! html
 <p>@<span>Oh no</span>
 </p>
 !! end
@@ -9105,9 +9118,9 @@ Template:dangerous
 pre-save transform: comment containing gallery (bug 5024)
 !! options
 pst
-!! input
+!! wikitext
 <!-- <gallery>data</gallery> -->
-!!result
+!! html
 <!-- <gallery>data</gallery> -->
 !!end
 
@@ -9115,9 +9128,9 @@ pst
 pre-save transform: comment containing extension
 !! options
 pst
-!! input
+!! wikitext
 <!-- <tag>data</tag> -->
-!!result
+!! html
 <!-- <tag>data</tag> -->
 !!end
 
@@ -9125,9 +9138,9 @@ pst
 pre-save transform: comment containing nowiki
 !! options
 pst
-!! input
+!! wikitext
 <!-- <nowiki>data</nowiki> -->
-!!result
+!! html
 <!-- <nowiki>data</nowiki> -->
 !!end
 
@@ -9135,9 +9148,9 @@ pst
 pre-save transform: <noinclude> in subst (bug 3298)
 !! options
 pst
-!! input
+!! wikitext
 {{subst:Includes}}
-!! result
+!! html
 Foobar
 !! end
 
@@ -9145,9 +9158,9 @@ Foobar
 pre-save transform: <onlyinclude> in subst (bug 3298)
 !! options
 pst
-!! input
+!! wikitext
 {{subst:Includes2}}
-!! result
+!! html
 Foo
 !! end
 
@@ -9167,26 +9180,26 @@ Template:SafeSubstTest
 bug 22297: safesubst: works during PST
 !! options
 pst
-!! input
+!! wikitext
 {{subst:SafeSubstTest}}{{safesubst:SubstTest}}
-!! result
+!! html
 FoobarFoobar
 !! end
 
 !! test
 bug 22297: safesubst: works during normal parse
-!! input
+!! wikitext
 {{SafeSubstTest}}
-!! result
+!! html
 <p>Foobar
 </p>
 !! end
 
-!! test:
+!! test
 subst: does not work during normal parse
-!! input
+!! wikitext
 {{SubstTest}}
-!! result
+!! html
 <p>{{subst:Includes}}
 </p>
 !! end
@@ -9195,7 +9208,7 @@ subst: does not work during normal parse
 pre-save transform: context links ("pipe trick")
 !! options
 pst
-!! input
+!! wikitext
 [[Article (context)|]]
 [[Bar:Article|]]
 [[:Bar:Article|]]
@@ -9205,7 +9218,7 @@ pst
 [[|Article (context)]]
 [[Bar:X (Y) Z|]]
 [[:Bar:X (Y) Z|]]
-!! result
+!! html
 [[Article (context)|Article]]
 [[Bar:Article|Article]]
 [[:Bar:Article|Article]]
@@ -9221,12 +9234,12 @@ pst
 pre-save transform: context links ("pipe trick") with interwiki prefix
 !! options
 pst
-!! input
+!! wikitext
 [[interwiki:Article|]]
 [[:interwiki:Article|]]
 [[interwiki:Bar:Article|]]
 [[:interwiki:Bar:Article|]]
-!! result
+!! html
 [[interwiki:Article|Article]]
 [[:interwiki:Article|Article]]
 [[interwiki:Bar:Article|Bar:Article]]
@@ -9237,9 +9250,9 @@ pst
 pre-save transform: context links ("pipe trick") with parens in title
 !! options
 pst title=[[Somearticle (context)]]
-!! input
+!! wikitext
 [[|Article]]
-!! result
+!! html
 [[Article (context)|Article]]
 !! end
 
@@ -9247,11 +9260,11 @@ pst title=[[Somearticle (context)]]
 pre-save transform: context links ("pipe trick") with comma in title
 !! options
 pst title=[[Someplace, Somewhere]]
-!! input
+!! wikitext
 [[|Otherplace]]
 [[Otherplace, Elsewhere|]]
 [[Otherplace, Elsewhere, Anywhere|]]
-!! result
+!! html
 [[Otherplace, Somewhere|Otherplace]]
 [[Otherplace, Elsewhere|Otherplace]]
 [[Otherplace, Elsewhere, Anywhere|Otherplace]]
@@ -9261,10 +9274,10 @@ pst title=[[Someplace, Somewhere]]
 pre-save transform: context links ("pipe trick") with parens and comma
 !! options
 pst title=[[Someplace (IGNORED), Somewhere]]
-!! input
+!! wikitext
 [[|Otherplace]]
 [[Otherplace (place), Elsewhere|]]
-!! result
+!! html
 [[Otherplace, Somewhere|Otherplace]]
 [[Otherplace (place), Elsewhere|Otherplace]]
 !! end
@@ -9273,10 +9286,10 @@ pst title=[[Someplace (IGNORED), Somewhere]]
 pre-save transform: context links ("pipe trick") with comma and parens
 !! options
 pst title=[[Who, me? (context)]]
-!! input
+!! wikitext
 [[|Yes, you.]]
 [[Me, Myself, and I (1937 song)|]]
-!! result
+!! html
 [[Yes, you. (context)|Yes, you.]]
 [[Me, Myself, and I (1937 song)|Me, Myself, and I]]
 !! end
@@ -9285,9 +9298,9 @@ pst title=[[Who, me? (context)]]
 pre-save transform: context links ("pipe trick") with namespace
 !! options
 pst title=[[Ns:Somearticle]]
-!! input
+!! wikitext
 [[|Article]]
-!! result
+!! html
 [[Ns:Article|Article]]
 !! end
 
@@ -9295,9 +9308,9 @@ pst title=[[Ns:Somearticle]]
 pre-save transform: context links ("pipe trick") with namespace and parens
 !! options
 pst title=[[Ns:Somearticle (context)]]
-!! input
+!! wikitext
 [[|Article]]
-!! result
+!! html
 [[Ns:Article (context)|Article]]
 !! end
 
@@ -9305,9 +9318,9 @@ pst title=[[Ns:Somearticle (context)]]
 pre-save transform: context links ("pipe trick") with namespace and comma
 !! options
 pst title=[[Ns:Somearticle, Context, Whatever]]
-!! input
+!! wikitext
 [[|Article]]
-!! result
+!! html
 [[Ns:Article, Context, Whatever|Article]]
 !! end
 
@@ -9315,9 +9328,9 @@ pst title=[[Ns:Somearticle, Context, Whatever]]
 pre-save transform: context links ("pipe trick") with namespace, comma and parens
 !! options
 pst title=[[Ns:Somearticle, Context (context)]]
-!! input
+!! wikitext
 [[|Article]]
-!! result
+!! html
 [[Ns:Article (context)|Article]]
 !! end
 
@@ -9325,9 +9338,9 @@ pst title=[[Ns:Somearticle, Context (context)]]
 pre-save transform: context links ("pipe trick") with namespace, parens and comma
 !! options
 pst title=[[Ns:Somearticle (IGNORED), Context]]
-!! input
+!! wikitext
 [[|Article]]
-!! result
+!! html
 [[Ns:Article, Context|Article]]
 !! end
 
@@ -9335,14 +9348,14 @@ pst title=[[Ns:Somearticle (IGNORED), Context]]
 pre-save transform: context links ("pipe trick") with full-width parens and no space (Japanese and Chinese style, bug 30149)
 !! options
 pst
-!! input
+!! wikitext
 [[Article(context)|]]
 [[Bar:Article(context)|]]
 [[:Bar:Article(context)|]]
 [[|Article(context)]]
 [[Bar:X(Y)Z|]]
 [[:Bar:X(Y)Z|]]
-!! result
+!! html
 [[Article(context)|Article]]
 [[Bar:Article(context)|Article]]
 [[:Bar:Article(context)|Article]]
@@ -9355,14 +9368,14 @@ pst
 pre-save transform: context links ("pipe trick") with full-width parens and space (Japanese and Chinese style, bug 30149)
 !! options
 pst
-!! input
+!! wikitext
 [[Article (context)|]]
 [[Bar:Article (context)|]]
 [[:Bar:Article (context)|]]
 [[|Article (context)]]
 [[Bar:X (Y) Z|]]
 [[:Bar:X (Y) Z|]]
-!! result
+!! html
 [[Article (context)|Article]]
 [[Bar:Article (context)|Article]]
 [[:Bar:Article (context)|Article]]
@@ -9375,14 +9388,14 @@ pst
 pre-save transform: context links ("pipe trick") with parens and no space (Korean style, bug 30149)
 !! options
 pst
-!! input
+!! wikitext
 [[Article(context)|]]
 [[Bar:Article(context)|]]
 [[:Bar:Article(context)|]]
 [[|Article(context)]]
 [[Bar:X(Y)Z|]]
 [[:Bar:X(Y)Z|]]
-!! result
+!! html
 [[Article(context)|Article]]
 [[Bar:Article(context)|Article]]
 [[:Bar:Article(context)|Article]]
@@ -9395,14 +9408,14 @@ pst
 pre-save transform: context links ("pipe trick") with commas (bug 21660)
 !! options
 pst
-!! input
+!! wikitext
 [[Article (context), context|]]
 [[Article (context),context|]]
 [[Bar:Article (context), context|]]
 [[Bar:Article (context),context|]]
 [[:Bar:Article (context), context|]]
 [[:Bar:Article (context),context|]]
-!! result
+!! html
 [[Article (context), context|Article]]
 [[Article (context),context|Article]]
 [[Bar:Article (context), context|Article]]
@@ -9415,13 +9428,13 @@ pst
 pre-save transform: trim trailing empty lines
 !! options
 pst
-!! input
+!! wikitext
 Empty lines are trimmed
 
 
 
 
-!! result
+!! html
 Empty lines are trimmed
 !! end
 
@@ -9429,12 +9442,12 @@ Empty lines are trimmed
 pre-save transform: Signature expansion
 !! options
 pst
-!! input
+!! wikitext
 * ~~~
 * <noinclude>~~~</noinclude>
 * <includeonly>~~~</includeonly>
 * <onlyinclude>~~~</onlyinclude>
-!! result
+!! html
 * [[Special:Contributions/127.0.0.1|127.0.0.1]]
 * <noinclude>[[Special:Contributions/127.0.0.1|127.0.0.1]]</noinclude>
 * <includeonly>[[Special:Contributions/127.0.0.1|127.0.0.1]]</includeonly>
@@ -9446,7 +9459,7 @@ pst
 pre-save transform: Signature expansion in nowiki tags (bug 93)
 !! options
 pst disabled
-!! input
+!! wikitext
 Shall not expand:
 
 <nowiki>~~~~</nowiki>
@@ -9465,7 +9478,7 @@ As well as inside noinclude/onlyinclude
 
 But not inside includeonly
 <includeonly>{{subst:Foo}}</includeonly>
-!! result
+!! html
 Shall not expand:
 
 <nowiki>~~~~</nowiki>
@@ -9490,7 +9503,7 @@ But not inside includeonly
 Parsoid: Recognize nowiki with trailing space in tags
 !! options
 parsoid=wt2html
-!! input
+!! wikitext
 <nowiki ><div>[[foo]]</nowiki >
 
 a<nowiki / >b
@@ -9498,7 +9511,7 @@ a<nowiki / >b
 c<nowiki />d
 
 e<nowiki/ >f
-!! result
+!! html
 <p><span typeof="mw:Nowiki">&lt;div&gt;[[foo]]</span></p>
 <p>ab</p>
 <p>cd</p>
@@ -9509,9 +9522,9 @@ e<nowiki/ >f
 Parsoid: Recognize nowiki with odd capitalization
 !! options
 parsoid=wt2html
-!! input
+!! wikitext
 <noWikI ><div>[[foo]]</Nowiki >
-!! result
+!! html
 <p><span typeof="mw:Nowiki">&lt;div&gt;[[foo]]</span></p>
 !! end
 
@@ -9520,13 +9533,13 @@ parsoid=wt2html
 Parsoid: Escape nowiki with trailing space in tags
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 &lt;nowiki &gt; foo &lt;/nowiki &gt;
 
 a&lt;nowiki /&gt;b
 
 c&lt;nowiki/ &gt;d
-!! result
+!! html
 <p>&lt;nowiki &gt; foo &lt/nowiki ></p>
 <p>a&lt;nowiki /&gt;b</p>
 <p>c&lt;nowiki/ &gt;d</p>
@@ -9536,9 +9549,9 @@ c&lt;nowiki/ &gt;d
 Parsoid: Escape weird noWikI capitalizations
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 &lt;noWikI &gt; foo &lt;/NoWikI &gt;
-!! result
+!! html
 <p>&lt;noWikI &gt; foo &lt/NoWikI ></p>
 !! end
 
@@ -9549,9 +9562,9 @@ parsoid=html2wt
 message transform: magic variables
 !! options
 msg
-!! input
+!! wikitext
 {{SITENAME}}
-!! result
+!! html
 MediaWiki
 !! end
 
@@ -9559,9 +9572,9 @@ MediaWiki
 message transform: should not transform wiki markup
 !! options
 msg
-!! input
+!! wikitext
 ''test''
-!! result
+!! html
 ''test''
 !! end
 
@@ -9569,9 +9582,9 @@ msg
 message transform: <noinclude> in transcluded template (bug 4926)
 !! options
 msg
-!! input
+!! wikitext
 {{Includes}}
-!! result
+!! html
 Foobar
 !! end
 
@@ -9579,9 +9592,9 @@ Foobar
 message transform: <onlyinclude> in transcluded template (bug 4926)
 !! options
 msg
-!! input
+!! wikitext
 {{Includes2}}
-!! result
+!! html
 Foo
 !! end
 
@@ -9589,9 +9602,9 @@ Foo
 {{#special:}} page name, known
 !! options
 msg
-!! input
+!! wikitext
 {{#special:Recentchanges}}
-!! result
+!! html
 Special:RecentChanges
 !! end
 
@@ -9599,9 +9612,9 @@ Special:RecentChanges
 {{#special:}} page name with subpage, known
 !! options
 msg
-!! input
+!! wikitext
 {{#special:Recentchanges/param}}
-!! result
+!! html
 Special:RecentChanges/param
 !! end
 
@@ -9609,9 +9622,9 @@ Special:RecentChanges/param
 {{#special:}} page name, unknown
 !! options
 msg
-!! input
+!! wikitext
 {{#special:foobar nonexistent}}
-!! result
+!! html
 Special:Foobar nonexistent
 !! end
 
@@ -9619,9 +9632,9 @@ Special:Foobar nonexistent
 {{#speciale:}} page name, known
 !! options
 msg
-!! input
+!! wikitext
 {{#speciale:Recentchanges}}
-!! result
+!! html
 Special:RecentChanges
 !! end
 
@@ -9629,9 +9642,9 @@ Special:RecentChanges
 {{#speciale:}} page name with subpage, known
 !! options
 msg
-!! input
+!! wikitext
 {{#speciale:Recentchanges/param}}
-!! result
+!! html
 Special:RecentChanges/param
 !! end
 
@@ -9639,9 +9652,9 @@ Special:RecentChanges/param
 {{#speciale:}} page name, unknown
 !! options
 msg
-!! input
+!! wikitext
 {{#speciale:foobar nonexistent}}
-!! result
+!! html
 Special:Foobar_nonexistent
 !! end
 
@@ -9652,570 +9665,672 @@ Special:Foobar_nonexistent
 #### http://www.mediawiki.org/wiki/Parsoid/MediaWiki_DOM_spec#Images
 
 !! test
-Simple image (php)
+Simple image
 !! options
-php
-!! input
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
 [[Image:foobar.jpg]]
-!! result
+!! html/php
 <p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
-!! end
-
-!! test
-Simple image (parsoid)
-!! options
-parsoid=wt2html
-!! input
-[[Image:foobar.jpg]]
-!! result
+!! html/parsoid
 <p><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" height="220" width="1941"></a></span>
 </p>
 !! end
 
 !! test
-Simple image (using File: namespace, now canonical) (php)
-!! options
-php
-!! input
-[[File:foobar.jpg]]
-!! result
+Simple image (using File: namespace, now canonical)
+!! wikitext
+[[File:Foobar.jpg]]
+!! html/php
 <p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
-!! end
-
-!! test
-Simple image (using File: namespace, now canonical) (parsoid)
-!! options
-parsoid
-!! input
-[[File:Foobar.jpg]]
-!! result
+!! html/parsoid
 <p><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" height="220" width="1941"></a></span>
 </p>
 !! end
 
 !! test
-Right-aligned image (php)
-!! options
-php
-!! input
-[[Image:foobar.jpg|right]]
-!! result
+Right-aligned image
+!! wikitext
+[[File:Foobar.jpg|right]]
+!! html/php
 <div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
 
-!! end
-
-!! test
-Right-aligned image (parsoid)
-!! options
-parsoid
-!! input
-[[File:Foobar.jpg|right]]
-!! result
+!! html/parsoid
 <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" height="220" width="1941"></a></figure>
 !! end
 
 !! test
-Image with caption (php)
-!! options
-php
-!! input
+Image with caption
+!! wikitext
 [[File:Foobar.jpg|right|Caption text]]
-!! result
+!! html/php
 <div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
 
-!! end
-
-!! test
-Image with caption (parsoid)
-!! options
-parsoid
-!! input
-[[File:Foobar.jpg|right|Caption text]]
-!! result
+!! html/parsoid
 <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" height="220" width="1941"></a><figcaption>Caption text</figcaption></figure>
 !! end
 
 !! test
-Image with caption, bug 53312 #1 (parsoid)
-!! options
-parsoid
-!! input
+Image with caption, bug 53312 #1
+!! wikitext
 [[File:Foobar.jpg|right|Caption page stuff]]
-!! result
+!! html/php
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption page stuff"><img alt="Caption page stuff" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+
+!! html/parsoid
 <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" height="220" width="1941"></a><figcaption>Caption page stuff</figcaption></figure>
 !! end
 
 !! test
-Image with caption, bug 53312 #2 (parsoid)
-!! options
-parsoid
-!! input
+Image with caption, bug 53312 #2
+!! wikitext
 [[File:Foobar.jpg|right|Caption page=]]
-!! result
+!! html/php
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption page="><img alt="Caption page=" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+
+!! html/parsoid
 <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" height="220" width="1941"></a><figcaption>Caption page=</figcaption></figure>
 !! end
 
 !! test
-Image with caption, bug 53312 #3 (parsoid)
-!! options
-parsoid
-!! input
+Image with caption, bug 53312 #3
+!! wikitext
 [[File:Foobar.jpg|right|Caption page=stuff]]
-!! result
+!! html/php
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption page=stuff"><img alt="Caption page=stuff" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+
+!! html/parsoid
 <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" height="220" width="1941"></a><figcaption>Caption page=stuff</figcaption></figure>
 !! end
 
 !! test
-Image with empty attribute (php)
-!! options
-php
-!! input
-[[File:Foobar.jpg|right||Caption text]]
-!! result
-<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+Allow empty links in image captions (Bug 60753)
+!! wikitext
+[[File:Foobar.jpg|thumb|Caption [[Link1]]
+[[]]
+[[Link2]]
+]]
+!! html/php
+<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"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Caption <a href="/index.php?title=Link1&amp;action=edit&amp;redlink=1" class="new" title="Link1 (page does not exist)">Link1</a> [[]] <a href="/index.php?title=Link2&amp;action=edit&amp;redlink=1" class="new" title="Link2 (page does not exist)">Link2</a></div></div></div>
+
+!! html/parsoid
+<figure class="mw-default-size" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"caption","ak":"Caption [[Link1]]\n[[]]\n[[Link2]]\n"}],"dsr":[0,59,2,2]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"dsr":[2,null,null,null]}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" height="25" width="220" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"25","width":"220"},"sa":{"resource":"File:Foobar.jpg"}}'/></a><figcaption data-parsoid='{"dsr":[null,57,null,null]}'>Caption <a rel="mw:WikiLink" href="./Link1" data-parsoid='{"stx":"simple","a":{"href":"./Link1"},"sa":{"href":"Link1"},"dsr":[32,41,2,2]}'>Link1</a>
+[[]]
+<a rel="mw:WikiLink" href="./Link2" data-parsoid='{"stx":"simple","a":{"href":"./Link2"},"sa":{"href":"Link2"},"dsr":[47,56,2,2]}'>Link2</a>
+</figcaption></figure>
+!! end
 
+!! test
+Link with empty target
+!! wikitext
+[[]]
+!! html
+<p>[[]]
+</p>
 !! end
 
 !! test
-Image with empty attribute (parsoid)
+Image with empty attribute
 !! options
-parsoid=wt2html
-!! input
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
 [[File:Foobar.jpg|right||Caption text]]
-!! result
+!! html/php
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+
+!! html/parsoid
 <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" height="220" width="1941"></a><figcaption>Caption text</figcaption></figure>
 !! end
 
 !! test
-Image with attributes from template (php)
-!! options
-php
-!! input
-[[File:Foobar.jpg|{{image_attribs}}]]
-!! result
-<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+1. Block image with individual attributes from templates
+!! wikitext
+[[File:Foobar.jpg|thumb|{{echo|137px}}|This is a caption]]
+!! html/php
+<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"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is a caption</div></div></div>
 
+!! html/parsoid
+<figure typeof="mw:Image/Thumb mw:ExpandedAttrs" data-mw='{"attribs":[["thumbnail",{"html":"thumb"}],["width",{"html":"&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" 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}}]}\" data-parsoid=\"{&amp;quot;dsr&amp;quot;:[24,38,null,null],&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;]}]]}\">137px&lt;/span>"}]]}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="16" width="137"/></a><figcaption>This is a caption</figcaption></figure>
 !! end
 
 !! test
-Image with attributes from template (parsoid)
-!! options
-parsoid
-!! input
+2. Block Image with individual attributes from templates
+!! wikitext
+[[File:Foobar.jpg|{{echo|thumb}}|{{echo|137px}}|This is a caption]]
+!! html/php
+<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"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is a caption</div></div></div>
+
+!! html/parsoid
+<figure typeof="mw:Image/Thumb mw:ExpandedAttrs" data-mw='{"attribs":[["thumbnail",{"html":"&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" 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}}]}\" data-parsoid=\"{&amp;quot;dsr&amp;quot;:[18,32,null,null],&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;]}]]}\">thumb&lt;/span>"}],["width",{"html":"&lt;span about=\"#mwt2\" typeof=\"mw:Transclusion\" 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}}]}\" data-parsoid=\"{&amp;quot;dsr&amp;quot;:[33,47,null,null],&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;]}]]}\">137px&lt;/span>"}]]}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="16" width="137"/></a><figcaption>This is a caption</figcaption></figure>
+!! end
+
+!! test
+3. Inline image with individual attributes from templates
+!! wikitext
+[[File:Foobar.jpg|{{echo|50px}}]]
+!! html/php
+<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 mw:ExpandedAttrs" about="#mwt2" data-mw='{"attribs":[["width",{"html":"&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" 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;50px&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\" data-parsoid=\"{&amp;quot;dsr&amp;quot;:[18,31,null,null],&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;]}]]}\">50px&lt;/span>"}]]}' data-parsoid='{"optList":[{"ck":"width","ak":"{{echo|50px}}"}]}'><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" height="6" width="50" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"6","width":"50"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
+!! end
+
+## Parsoid does not provide editing support for images where templates produce multiple image attributes.
+## To signal this, we add a 'mw:Placeholder' type to such images. This could change in the future.
+!! test
+Image with multiple attributes from the same template
+!! wikitext
 [[File:Foobar.jpg|{{image_attribs}}]]
-!! result
-<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" height="220" width="1941"></a><figcaption>Caption text</figcaption></figure>
+!! html/php
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+
+!! html/parsoid
+<figure class="mw-default-size mw-halign-right" typeof="mw:Image mw:Placeholder"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption>Caption text</figcaption></figure>
 !! end
 
 !! test
-Image with link tails (php)
-!! options
-php
-!! input
+Image with link tails
+!! wikitext
 123[[File:Foobar.jpg]]456
 123[[File:Foobar.jpg|right]]456
 123[[File:Foobar.jpg|thumb]]456
-!! result
+!! html/php
 <p>123<a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>456
 </p>
 123<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>456
 123<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" 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"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div></div></div></div>456
 
-!! end
-
-!! test
-Image with link tails (parsoid)
-!! options
-parsoid
-!! input
-123[[File:Foobar.jpg]]456
-123[[File:Foobar.jpg|right]]456
-123[[File:Foobar.jpg|thumb]]456
-!! result
+!! 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" height="220" width="1941"></a></span>456</p>
 123<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" height="220" width="1941"></a></figure>456
-123<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/180px-Foobar.jpg" height="20" width="180"></a></figure>456
+123<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/180px-Foobar.jpg" height="25" width="220"></a></figure>456
 !! end
 
 !! test
-Image with multiple captions -- only last one is accepted (php)
-!! options
-php
-!! input
+Image with multiple captions -- only last one is accepted
+!! wikitext
 [[File:Foobar.jpg|right|Caption1 - ignored|[[Caption2]] - ignored|Caption3 - accepted]]
-!! result
+!! html/php
 <div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption3 - accepted"><img alt="Caption3 - accepted" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
 
+!! html/parsoid
+<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" height="220" width="1941"></a><figcaption>Caption3 - accepted</figcaption></figure>
 !! end
 
 !! test
-Image with multiple captions -- only last one is accepted (parsoid)
-!! options
-parsoid
-!! input
-[[File:Foobar.jpg|right|Caption1 - ignored|[[Caption2]] - ignored|Caption3 - accepted]]
-!! result
-<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" height="220" width="1941"></a><figcaption>Caption3 - accepted</figcaption></figure>
+Image with multiple widths -- use last
+!! wikitext
+[[File:Foobar.jpg|200px|300px|caption]]
+!! html/php
+<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" height="34" width="300"/></a></span></p>
 !! end
 
 !! test
-Image with width attribute at different positions (php)
-!! options
-php
-!! input
-[[File:Foobar.jpg|200px|right|Caption]]
-[[File:Foobar.jpg|right|200px|Caption]]
-[[File:Foobar.jpg|right|Caption|200px]]
-!! result
-<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>
-<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>
-<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>
+Image with multiple alignments -- use first (bug 48664)
+!! wikitext
+[[File:Foobar.jpg|thumb|left|right|center|caption]]
 
+[[File:Foobar.jpg|middle|text-top|caption]]
+!! html/php
+<div class="thumb tleft"><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"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
+<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" 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" height="220" width="1941"/></a></span></p>
 !! end
 
 !! test
-Image with width attribute at different positions (parsoid)
-!! options
-parsoid
-!! input
+Image with width attribute at different positions
+!! wikitext
 [[File:Foobar.jpg|200px|right|Caption]]
 [[File:Foobar.jpg|right|200px|Caption]]
 [[File:Foobar.jpg|right|Caption|200px]]
-!! result
+!! html/php
+<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>
+<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>
+<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/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" 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" 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" height="23" width="200"></a><figcaption>Caption</figcaption></figure>
 !! end
 
+# a sad bit of backward-compatibility
 !! test
-Image with link parameter, wiki target (php)
+Image with size specified with pxpx (bug 13500, 51628)
 !! options
-php
-!! input
-[[File:Foobar.jpg|link=Main Page]]
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+[[File:Foobar.jpg|20pxpx]]
+[[File:Foobar.jpg|200x20pxpx]]
+!! html/php
+<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/20px-Foobar.jpg" width="20" height="2" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/30px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/40px-Foobar.jpg 2x" /></a>
+<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" 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" height="20" width="177"/></a></span></p>
 !! end
 
 !! test
-Image with link parameter, wiki target (parsoid)
-!! options
-parsoid
-!! input
+Image with link parameter, wiki target
+!! wikitext
 [[File:Foobar.jpg|link=Main Page]]
-!! result
+!! html/php
+<p><a href="/wiki/Main_Page" title="Main Page"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</p>
+!! html/parsoid
 <p><span class="mw-default-size" typeof="mw:Image"><a href="Main_Page"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span></p>
 !! end
 
+# parsoid bug 49293 (part 1)
 !! test
-Image with link parameter, URL target (php)
-!! options
-php
-!! input
+Image with link parameter, URL target
+!! wikitext
 [[File:Foobar.jpg|link=http://example.com/]]
-!! result
+!! html/php
 <p><a href="http://example.com/" rel="nofollow"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
-!! end
-
-# parsoid bug 49293 (part 1)
-!! test
-Image with link parameter, URL target (parsoid)
-!! options
-parsoid
-!! input
-[[File:Foobar.jpg|link=http://example.com/]]
-!! result
+!! html/parsoid
 <p><span class="mw-default-size" typeof="mw:Image"><a href="http://example.com/"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span></p>
 !! end
 
+# parsoid bug 49293 (part 2)
 !! test
-Image with link parameter, protocol-less URL target (php)
-!! options
-php
-!! input
+Image with link parameter, protocol-less URL target
+!! wikitext
 [[File:Foobar.jpg|link=//example.com/]]
-!! result
+!! html/php
 <p><a href="//example.com/" rel="nofollow"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
-!! end
-
-# parsoid bug 49293 (part 2)
-!! test
-Image with link parameter, protocol-less URL target (parsoid)
-!! options
-parsoid
-!! input
-[[File:Foobar.jpg|link=//example.com/]]
-!! result
+!! html/parsoid
 <p><span class="mw-default-size" typeof="mw:Image"><a href="//example.com/"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span></p>
 !! end
 
 !! test
 Image with link parameter, wgExternalLinkTarget
-!! input
+!! wikitext
 [[Image:foobar.jpg|link=http://example.com/]]
 !! config
 wgExternalLinkTarget='foobar'
-!! result
+!! html
 <p><a href="http://example.com/" target="foobar" rel="nofollow"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! end
 
 !! test
 Image with link parameter, wgNoFollowLinks set to false
-!! input
+!! wikitext
 [[Image:foobar.jpg|link=http://example.com/]]
 !! config
 wgNoFollowLinks=false
-!! result
+!! html
 <p><a href="http://example.com/"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! end
 
 !! test
 Image with link parameter, wgNoFollowDomainExceptions
-!! input
+!! wikitext
 [[Image:foobar.jpg|link=http://example.com/]]
 !! config
 wgNoFollowDomainExceptions='example.com'
-!! result
+!! html
 <p><a href="http://example.com/"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! end
 
 !! test
 Image with link parameter, wgExternalLinkTarget, unnamed parameter
-!! input
+!! wikitext
 [[Image:foobar.jpg|link=http://example.com/|Title]]
 !! config
 wgExternalLinkTarget='foobar'
-!! result
+!! html
 <p><a href="http://example.com/" title="Title" target="foobar" rel="nofollow"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! end
 
 !! test
-Image with empty link parameter (php)
-!! options
-php
-!! input
+Image with empty link parameter
+!! wikitext
 [[File:Foobar.jpg|link=]]
-!! result
+!! html/php
 <p><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" />
 </p>
-!! end
-
-!! test
-Image with empty link parameter (parsoid)
-!! options
-parsoid
-!! input
-[[File:Foobar.jpg|link=]]
-!! result
+!! html/parsoid
 <p><span class="mw-default-size" typeof="mw:Image"><span><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></span></span></p>
 !! end
 
 !! test
-Image with link parameter (wiki target) and unnamed parameter (php)
-!! options
-php
-!! input
-[[File:Foobar.jpg|link=Main Page|Title]]
-!! result
+Image with link parameter (wiki target) and unnamed parameter
+!! wikitext
+[[File:Foobar.jpg|link=Main_Page|Title]]
+!! html/php
 <p><a href="/wiki/Main_Page" title="Title"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
-!! end
-
-!! test
-Image with link parameter (wiki target) and unnamed parameter (parsoid)
-!! options
-parsoid
-!! input
-[[File:Foobar.jpg|link=Main Page|Title]]
-!! result
+!! html/parsoid
 <p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"Title"}'><a href="Main_Page"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span></p>
 !! end
 
 !! test
-Image with link parameter (URL target) and unnamed parameter (php)
-!! options
-php
-!! input
+Image with link parameter (URL target) and unnamed parameter
+!! wikitext
 [[File:Foobar.jpg|link=http://example.com/|Title]]
-!! result
+!! html/php
 <p><a href="http://example.com/" title="Title" rel="nofollow"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
-!! end
-
-!! test
-Image with link parameter (URL target) and unnamed parameter (parsoid)
-!! options
-parsoid
-!! input
-[[File:Foobar.jpg|link=http://example.com/|Title]]
-!! result
+!! html/parsoid
 <p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"Title"}'><a href="http://example.com/"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span></p>
 !! end
 
 !! test
 Thumbnail image with link parameter
 !! options
-php
-!! input
-[[Image:foobar.jpg|thumb|link=http://example.com/|Title]]
-!! result
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+[[File:Foobar.jpg|thumb|link=http://example.com/|Title]]
+!! html/php
 <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="http://example.com/"><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"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></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" height="25" width="220"/></a><figcaption>Title</figcaption></figure>
 !! end
 
 !! test
 Manually-specified thumbnail image
-!! options
-php
-!! input
+!! wikitext
 [[Image:Foobar.jpg|thumb=Thumb.png|Title]]
-!! result
+!! html/php
 <div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/File:Foobar.jpg"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
 
+!! html/parsoid
+XXX NOT IMPLEMENTED XXX
 !! end
 
 !! test
 Manually-specified thumbnail image with explicit link to wiki page
-!! options
-php
-!! input
+!! wikitext
 [[Image:Foobar.jpg|thumb=Thumb.png|link=Main Page|Title]]
-!! result
+!! html/php
 <div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/Main_Page" title="Main Page"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
 
+!! html/parsoid
+XXX NOT IMPLEMENTED XXX
 !! end
 
 !! test
 Manually-specified thumbnail image with explicit link to url
-!! options
-php
-!! input
+!! wikitext
 [[Image:Foobar.jpg|thumb=Thumb.png|link=http://example.com|Title]]
-!! result
+!! html/php
 <div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="http://example.com"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
 
+!! html/parsoid
+XXX NOT IMPLEMENTED XXX
 !! end
 
 !! test
 Manually-specified thumbnail image with explicit no link
-!! options
-php
-!! input
+!! wikitext
 [[Image:Foobar.jpg|thumb=Thumb.png|link=|Title]]
-!! result
+!! html/php
 <div class="thumb tright"><div class="thumbinner" style="width:137px;"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" />  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
 
+!! html/parsoid
+XXX NOT IMPLEMENTED XXX
+!! end
+
+!! test
+Manually-specified thumbnail image with explicit link and alt text
+!! wikitext
+[[Image:Foobar.jpg|thumb=Thumb.png|link=Main Page|alt=alttext|Title]]
+!! html/php
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/Main_Page" title="Main Page"><img alt="alttext" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
+
+!! html/parsoid
+XXX NOT IMPLEMENTED XXX
+!! end
+
+!! test
+Image with frame and link
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+[[File:Foobar.jpg|frame|left|This is a test image [[Main Page]]]]
+!! html/php
+<div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
+
+!! html/parsoid
+<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a><figcaption>This is a test image <a rel="mw:WikiLink" href="Main_Page">Main Page</a></figcaption></figure>
+!! end
+
+!! test
+Image with frame and link and explicit alt
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+[[Image:Foobar.jpg|frame|left|This is a test image [[Main Page]]|alt=Altitude]]
+!! html/php
+<div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Altitude" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
+
+!! html/parsoid
+<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img alt="Altitude" resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a><figcaption>This is a test image <a rel="mw:WikiLink" href="Main_Page">Main Page</a></figcaption></figure>
+!! end
+
+!! test
+Image with wiki markup in implicit alt
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+[[Image:Foobar.jpg|testing '''bold''' in alt]]
+
+[[Image:Foobar.jpg|alt=testing '''bold''' in alt]]
+!! html/php
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="testing bold in alt"><img alt="testing bold in alt" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</p><p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="testing bold in alt" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</p>
+!! html/parsoid
+<p><span class="mw-default-size" typeof="mw:Image" data-mw="{&quot;caption&quot;:&quot;testing '''bold''' in alt&quot;}"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></span></p>
+<p><span class="mw-default-size" typeof="mw:Image"><a href="File:Foobar.jpg"><img alt="testing bold in alt" resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></span></p>
+!! end
+
+###################
+# Image sizing.
+# See https://www.mediawiki.org/wiki/Help:Images#Size_and_frame
+# and https://bugzilla.wikimedia.org/show_bug.cgi?id=62258
+# Foobar has actual size of 1941x220
+# 1. Thumbs & frameless always reduce, can't be enlarged
+# 2. Framed images ignore width; always render at default size.
+#    If given a height, they respect height but continue to ignore width.
+# 3. "Unspecified format" and border are the only types which can be
+#    enlarged.
+
+!! test
+Image: "unspecified format" and border enlarge
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+[[File:Foobar.jpg|2000px]]
+
+[[File:Foobar.jpg|border|2000px]]
+!! html/php
+<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" /></a>
+</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" 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" height="227" width="2000"/></a></span></p>
+!! end
+
+!! test
+Image: "unspecified format" and border reduce
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+[[File:Foobar.jpg|1000px]]
+
+[[File:Foobar.jpg|border|1000px]]
+!! html/php
+<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" 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><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" 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" height="113" width="1000"/></a></span></p>
+!! end
+
+!! test
+Image: thumbs reduce
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+[[File:Foobar.jpg|thumb|50px]]
+!! html/php
+<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"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></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" height="6" width="50"/></a></figure>
+!! end
+
+!! test
+Image: thumbs can't be enlarged past original size
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+[[File:Foobar.jpg|thumb|2000px]]
+!! html/php
+<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></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" height="220" width="1941"/></a></figure>
+!! end
+
+!! test
+Image: frameless can reduce in size
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+[[File:Foobar.jpg|frameless|50px]]
+!! html/php
+<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" height="6" width="50"/></a></span></p>
 !! end
 
 !! test
-Manually-specified thumbnail image with explicit link and alt text
+Image: frameless can't be enlarged past original size
 !! options
-php
-!! input
-[[Image:Foobar.jpg|thumb=Thumb.png|link=Main Page|alt=alttext|Title]]
-!! result
-<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/Main_Page" title="Main Page"><img alt="alttext" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
-
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+[[File:Foobar.jpg|frameless|2000px]]
+!! html/php
+<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</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" height="220" width="1941"/></a></span></p>
 !! end
 
 !! test
-Image with frame and link
-!! input
-[[Image:Foobar.jpg|frame|left|This is a test image [[Main Page]]]]
-!! result
-<div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
+Image: framed images ignore size if only width is given
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+[[File:Foobar.jpg|frame]]
 
-!! end
+[[File:Foobar.jpg|frame|50px]]
 
-!! test
-Image with frame and link and explicit alt
-!! input
-[[Image:Foobar.jpg|frame|left|This is a test image [[Main Page]]|alt=Altitude]]
-!! result
-<div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Altitude" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
+[[File:Foobar.jpg|frame|2000px]]
+!! html/php
+<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption"></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption"></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption"></div></div></div>
 
+!! html/parsoid
+<figure class="mw-default-size" typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></figure><figure typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></figure><figure typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></figure>
 !! end
 
 !! test
-Image with wiki markup in implicit alt
-!! input
-[[Image:Foobar.jpg|testing '''bold''' in alt]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="testing bold in alt"><img alt="testing bold in alt" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
+Image: framed images respect size if given a height, but ignore width.
+!! wikitext
+[[File:Foobar.jpg|frame|50x50px]]
+!! html/php
+<div class="thumb tright"><div class="thumbinner" style="width:444px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/442px-Foobar.jpg" width="442" height="50" class="thumbimage" /></a>  <div class="thumbcaption"></div></div></div>
 
-!! test
-Image with wiki markup in explicit alt
-!! input
-[[Image:Foobar.jpg|alt=testing '''bold''' in alt]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="testing bold in alt" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
+!! html/parsoid
+<figure typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="50" width="442"/></a></figure>
 !! end
 
+###################
+
 !! test
 Link to image page- image page normally doesn't exists, hence edit link
 Add test with existing image page
 #<p><a href="/wiki/File:Test" title="Image:Test">Image:test</a>
-!! input
+!! wikitext
 [[:Image:test]]
-!! result
+!! html
 <p><a href="/index.php?title=File:Test&amp;action=edit&amp;redlink=1" class="new" title="File:Test (page does not exist)">Image:test</a>
 </p>
 !! end
 
 !! test
 bug 18784  Link to non-existent image page with caption should use caption as link text
-!! input
+!! wikitext
 [[:Image:test|caption]]
-!! result
+!! html
 <p><a href="/index.php?title=File:Test&amp;action=edit&amp;redlink=1" class="new" title="File:Test (page does not exist)">caption</a>
 </p>
 !! end
 
 !! test
 Frameless image caption with a free URL
-!! input
-[[Image:foobar.jpg|http://example.com]]
-!! result
+!! wikitext
+[[File:Foobar.jpg|http://example.com]]
+!! html/php
 <p><a href="/wiki/File:Foobar.jpg" class="image" title="http://example.com"><img alt="http://example.com" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
+!! html/parsoid
+<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"http://example.com"}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></span></p>
 !! end
 
 !! test
 Thumbnail image caption with a free URL
-!! input
-[[Image:foobar.jpg|thumb|http://example.com]]
-!! result
+!! wikitext
+[[File:Foobar.jpg|thumb|http://example.com]]
+!! html/php
 <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"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></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" height="25" width="220"/></a><figcaption><a rel="mw:ExtLink" href="http://example.com">http://example.com</a></figcaption></figure>
 !! end
 
 !! test
 Thumbnail image caption with a free URL and explicit alt
-!! input
-[[Image:foobar.jpg|thumb|http://example.com|alt=Alteration]]
-!! result
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+[[File:Foobar.jpg|thumb|http://example.com|alt=Alteration]]
+!! html/php
 <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Alteration" 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"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></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" height="25" width="220"/></a><figcaption><a rel="mw:ExtLink" href="http://example.com">http://example.com</a></figcaption></figure>
 !! end
 
 !! test
 SVG thumbnails with no language set
 !! options
-!! input
+!! wikitext
 [[File:Foobar.svg|thumb|caption]]
-!! result
+!! html
 <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="180" 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"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
 
 !! end
@@ -10223,9 +10338,9 @@ SVG thumbnails with no language set
 !! test
 SVG thumbnails with language de
 !! options
-!! input
+!! wikitext
 [[File:Foobar.svg|thumb|caption|lang=de]]
-!! result
+!! html
 <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="180" 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"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
 
 !! end
@@ -10233,36 +10348,36 @@ SVG thumbnails with language de
 !! test
 SVG thumbnails with invalid language code
 !! options
-!! input
+!! wikitext
 [[File:Foobar.svg|thumb|caption|lang=invalid.language.code]]
-!! result
+!! html
 <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="180" 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"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>lang=invalid.language.code</div></div></div>
 
 !! end
 
 !! test
 BUG 1887: A ISBN with a thumbnail
-!! input
+!! wikitext
 [[Image:foobar.jpg|thumb|ISBN 1235467890]]
-!! result
+!! html
 <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"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div><a href="/wiki/Special:BookSources/1235467890" class="internal mw-magiclink-isbn">ISBN 1235467890</a></div></div></div>
 
 !! end
 
 !! test
 BUG 1887: A RFC with a thumbnail
-!! input
+!! wikitext
 [[Image:foobar.jpg|thumb|This is RFC 12354]]
-!! result
+!! html
 <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"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is <a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc12354">RFC 12354</a></div></div></div>
 
 !! end
 
 !! test
 BUG 1887: A mailto link with a thumbnail
-!! input
+!! wikitext
 [[Image:foobar.jpg|thumb|Please mailto:nobody@example.com]]
-!! result
+!! html
 <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"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Please <a rel="nofollow" class="external free" href="mailto:nobody@example.com">mailto:nobody@example.com</a></div></div></div>
 
 !! end
@@ -10270,82 +10385,82 @@ BUG 1887: A mailto link with a thumbnail
 # Pending resolution to bug 368
 !! test
 BUG 648: Frameless image caption with a link
-!! input
+!! wikitext
 [[Image:foobar.jpg|text with a [[link]] in it]]
-!! result
+!! html
 <p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a link in it"><img alt="text with a link in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! end
 
 !! test
 BUG 648: Frameless image caption with a link (suffix)
-!! input
+!! wikitext
 [[Image:foobar.jpg|text with a [[link]]foo in it]]
-!! result
+!! html
 <p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a linkfoo in it"><img alt="text with a linkfoo in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! end
 
 !! test
 BUG 648: Frameless image caption with an interwiki link
-!! input
+!! wikitext
 [[Image:foobar.jpg|text with a [[MeatBall:Link]] in it]]
-!! result
+!! html
 <p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a MeatBall:Link in it"><img alt="text with a MeatBall:Link in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! end
 
 !! test
 BUG 648: Frameless image caption with a piped interwiki link
-!! input
+!! wikitext
 [[Image:foobar.jpg|text with a [[MeatBall:Link|link]] in it]]
-!! result
+!! html
 <p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a link in it"><img alt="text with a link in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! end
 
 !! test
 Escape HTML special chars in image alt text
-!! input
+!! wikitext
 [[Image:foobar.jpg|& < > "]]
-!! result
+!! html
 <p><a href="/wiki/File:Foobar.jpg" class="image" title="&amp; &lt; &gt; &quot;"><img alt="&amp; &lt; &gt; &quot;" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! end
 
 !! test
 BUG 499: Alt text should have &#1234;, not &amp;1234;
-!! input
+!! wikitext
 [[Image:foobar.jpg|&#9792;]]
-!! result
+!! html
 <p><a href="/wiki/File:Foobar.jpg" class="image" title="♀"><img alt="♀" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! end
 
 !! test
 Broken image caption with link
-!! input
+!! wikitext
 [[Image:Foobar.jpg|thumb|This is a broken caption. But [[Main Page|this]] is just an ordinary link.
-!! result
+!! html
 <p>[[Image:Foobar.jpg|thumb|This is a broken caption. But <a href="/wiki/Main_Page" title="Main Page">this</a> is just an ordinary link.
 </p>
 !! end
 
 !! test
 Image caption containing another image
-!! input
+!! wikitext
 [[Image:Foobar.jpg|thumb|This is a caption with another [[Image:icon.png|image]] inside it!]]
-!! result
+!! html
 <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"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is a caption with another <a href="/index.php?title=Special:Upload&amp;wpDestFile=Icon.png" class="new" title="File:Icon.png">image</a> inside it!</div></div></div>
 
 !! end
 
 !! test
 Image caption containing a newline
-!! input
+!! wikitext
 [[Image:Foobar.jpg|This
 *is some text]]
-!! result
+!! html
 <p><a href="/wiki/File:Foobar.jpg" class="image" title="This *is some text"><img alt="This *is some text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !!end
@@ -10353,60 +10468,119 @@ Image caption containing a newline
 !!test
 Parsoid: Image caption containing leading space
 (The leading space should not trigger nowiki escaping in wt2wt mode)
-!! input
+!! wikitext
 [[Image:Foobar.jpg|thumb| bar]]
-!! result
+!! html
 <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"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>bar</div></div></div>
 
 !!end
 
+!! test
+Images: caption containing a table
+!! wikitext
+[[Image:Foobar.jpg|thumb|200px|This is an example image thumbnail caption with a table
+{|
+! Foo !! Bar
+|-
+| Foo1 || Bar1
+|}
+and some more text.]]
+!! html/php
+<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"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></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" 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>
+<tr>
+<td>Foo1 </td>
+<td>Bar1</td></tr></tbody></table>and some more text.</figcaption></figure>
+!! end
+
 !! test
 Bug 3090: External links other than http: in image captions
-!! input
-[[Image:Foobar.jpg|thumb|200px|This caption has [irc://example.net irc] and [https://example.com Secure] ext links in it.]]
-!! result
+!! wikitext
+[[File:Foobar.jpg|thumb|200x200px|This caption has [irc://example.net irc] and [https://example.com Secure] ext links in it.]]
+!! html/php
 <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"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></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" 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
 Custom class
-!! input
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
 [[Image:foobar.jpg|a|class=b]]
-!! result
+!! html/php
 <p><a href="/wiki/File:Foobar.jpg" class="image" title="a"><img alt="a" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="b" /></a>
 </p>
+!! html/parsoid
+<p><span class="mw-default-size b" typeof="mw:Image" data-mw='{"caption":"a"}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></span></p>
 !! end
 
 !! test
 Localized image handling (1).
 !! options
+parsoid=wt2html,wt2wt,html2html
 language=es
-!! input
+!! wikitext
 [[Archivo:Foobar.jpg|izquierda|enlace=foo|caption]]
-!! result
+!! html/php
 <div class="floatleft"><a href="/wiki/Foo" title="caption"><img alt="caption" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
 
+!! html/parsoid
+<figure class="mw-default-size mw-halign-left" typeof="mw:Image"><a href="./Foo"><img resource="./Archivo:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a><figcaption>caption</figcaption></figure>
 !! end
 
 !! test
 Localized image handling (2).
 !! options
+parsoid=wt2html,wt2wt,html2html
 language=es
-!! input
+!! wikitext
 [[Archivo:Foobar.jpg|miniatura|izquierda|enlace=foo|caption]]
-!! result
+!! html/php
 <div class="thumb tleft"><div class="thumbinner" style="width:182px;"><a href="/wiki/Foo" title="Foo"><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/Archivo:Foobar.jpg" class="internal" title="Aumentar"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></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" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
 !! end
 
 !! test
 "border", "frameless" and "class" attributes on an image.
-!! input
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
 [[File:Foobar.jpg|frameless|border|class=extra|caption]]
-!! result
+!! html/php
 <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" class="extra thumbborder" 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 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" height="25" width="220"/></a></span></p>
+!! end
+
+# Note that 'right' is the default alignment, despite the misspelled 'righ' below
+!! test
+Invalid image attributes (bug 62500)
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+[[File:Foobar.jpg|thumb|float|left|caption]]
+
+[[File:Foobar.jpg|thumb|righ|caption]]
+
+[[File:Foobar.jpg|bogus1|thumb|bogus2|left|bogus3|caption]]
+!! html/php
+<div class="thumb tleft"><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"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
+<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"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
+<div class="thumb tleft"><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"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></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" 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" 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" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
 !! end
 
 !! article
@@ -10417,9 +10591,9 @@ File:Barfoo.jpg
 
 !! test
 Redirected image
-!! input
+!! wikitext
 [[Image:Barfoo.jpg]]
-!! result
+!! html
 <p><a href="/wiki/File:Barfoo.jpg" title="File:Barfoo.jpg">File:Barfoo.jpg</a>
 </p>
 !! end
@@ -10428,9 +10602,9 @@ Redirected image
 Missing image with uploads disabled
 !! options
 wgEnableUploads=0
-!! input
+!! wikitext
 [[Image:Foobaz.jpg]]
-!! result
+!! html
 <p><a href="/wiki/File:Foobaz.jpg" title="File:Foobaz.jpg">File:Foobaz.jpg</a>
 </p>
 !! end
@@ -10444,13 +10618,10 @@ wgEnableUploads=0
 
 !! test
 Parsoid-specific image handling - simple image with size and middle alignment
-!! options
-parsoid
-!! input
-[[Image:Foobar.jpg|50px|middle]]
-!! result
-<p>
-<span class="mw-valign-middle" typeof="mw:Image">
+!! 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/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" height="6" width="50">
 </a>
@@ -10459,30 +10630,39 @@ parsoid
 !! end
 
 !! test
-Parsoid-specific image handling - simple image with both sizes, a baseline alignment, and a caption
+Parsoid-specific image handling - simple image with size, middle alignment,
+non-standard namespace alias
 !! options
-parsoid
-!! input
-[[Image:Foobar.jpg|500x10px|baseline|caption]]
-!! result
-<p>
-<span class="mw-valign-baseline" typeof="mw:Image" data-mw="{&quot;caption&quot;:&quot;caption&quot;}">
+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/thumb/3/3a/Foobar.jpg/89px-Foobar.jpg" height="10" width="89">
+<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" height="6" width="50">
 </a>
 </span>
 </p>
 !! end
 
 !! test
-Parsoid-specific image handling - simple image with border and size spec
+Parsoid-specific image handling - simple image with size and middle alignment
+(existing content)
+!! 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/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" 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
+Parsoid-specific image handling - simple image with size and middle alignment
+and non-standard namespace name
 !! options
-parsoid
-!! input
-[[Image:Foobar.jpg|50px|border|caption]]
-!! result
-<p>
-<span class="mw-image-border" typeof="mw:Image" data-mw="{&quot;caption&quot;:&quot;caption&quot;}">
+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/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" height="6" width="50">
 </a>
@@ -10490,28 +10670,49 @@ parsoid
 </p>
 !! end
 
+!! test
+Parsoid-specific image handling - simple image with both sizes, a baseline alignment, and a caption
+!! wikitext
+[[File:Foobar.jpg|500x10px|baseline|caption]]
+!! html/parsoid
+<p><span class="mw-valign-baseline" typeof="mw:Image" data-mw='{"caption":"caption"}' data-parsoid='{"optList":[{"ck":"width","ak":"500x10px"},{"ck":"baseline","ak":"baseline"},{"ck":"caption","ak":"caption"}],"size":"500x10"}'><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/89px-Foobar.jpg" height="10" width="89" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"10","width":"89"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
+!! end
+
+!! test
+Parsoid-specific image handling - simple image with border and size spec
+!! wikitext
+[[File:Foobar.jpg|50px|border|caption]]
+!! html/parsoid
+<p><span class="mw-image-border" typeof="mw:Image" data-mw='{"caption":"caption"}' data-parsoid='{"optList":[{"ck":"width","ak":"50px"},{"ck":"border","ak":"border"},{"ck":"caption","ak":"caption"}]}'><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" 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
 Parsoid-specific image handling - thumbnail with halign, valign, and caption
-!! options
-parsoid
-!! input
-[[Image:Foobar.jpg|thumb|left|baseline|caption content]]
-!! result
+!! 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/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" height="21" width="180" />
+<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" height="25" width="220" />
 </a>
 <figcaption>caption content</figcaption>
 </figure>
 !! end
 
+!! test
+Parsoid-specific image handling - thumbnail with halign, valign, and caption
+(existing content)
+!! 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" 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
 Parsoid-specific image handling - thumbnail with specific size, halign, valign, and caption
-!! options
-parsoid
-!! input
-[[Image:Foobar.jpg|thumb|50x50px|right|middle|caption]]
-!! result
+!! 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/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" height="6" width="50" />
@@ -10520,13 +10721,20 @@ parsoid
 </figure>
 !! end
 
+!! test
+Parsoid-specific image handling - thumbnail with specific size, halign,
+valign, and caption (existing content)
+!! wikitext
+[[File:Foobar.jpg|thumb|50x50px|right|middle|caption]]
+!! html/parsoid
+<figure class="mw-halign-right mw-valign-middle" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"width","ak":"50x50px"},{"ck":"right","ak":"right"},{"ck":"middle","ak":"middle"},{"ck":"caption","ak":"caption"}],"size":"50x50"}'><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" height="6" width="50" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"6","width":"50"},"sa":{"resource":"File:Foobar.jpg"}}'/></a><figcaption>caption</figcaption></figure>
+!! end
+
 !! test
 Parsoid-specific image handling - framed image with specific size and caption
-!! options
-parsoid
-!! input
-[[Image:Foobar.jpg|500x50px|frame|caption]]
-!! result
+!! wikitext
+[[Image:Foobar.jpg|frame|500x50px|caption]]
+!! html/parsoid
 <figure typeof="mw:Image/Frame">
 <a href="File:Foobar.jpg">
 <img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/442px-Foobar.jpg" height="50" width="442" />
@@ -10535,13 +10743,20 @@ parsoid
 </figure>
 !! end
 
+!! test
+Parsoid-specific image handling - framed image with specific size and caption
+(existing content)
+!! wikitext
+[[File:Foobar.jpg|442x50px|frame|caption]]
+!! html/parsoid
+<figure typeof="mw:Image/Frame" data-parsoid='{"optList":[{"ck":"width","ak":"442x50px"},{"ck":"framed","ak":"frame"},{"ck":"caption","ak":"caption"}],"size":"442x50"}'><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/442px-Foobar.jpg" height="50" width="442" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"50","width":"442"},"sa":{"resource":"File:Foobar.jpg"}}'/></a><figcaption>caption</figcaption></figure>
+!! end
+
 !! test
 Parsoid-specific image handling - framed image with specific size, halign, valign, and caption
-!! options
-parsoid
-!! input
-[[Image:Foobar.jpg|500x50px|frame|left|baseline|caption]]
-!! result
+!! wikitext
+[[Image:Foobar.jpg|left|baseline|frame|500x50px|caption]]
+!! html/parsoid
 <figure class="mw-halign-left mw-valign-baseline" typeof="mw:Image/Frame">
 <a href="File:Foobar.jpg">
 <img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/442px-Foobar.jpg" height="50" width="442" />
@@ -10550,44 +10765,39 @@ parsoid
 </figure>
 !! end
 
+!! test
+Parsoid-specific image handling - framed image with specific size, halign,
+valign, and caption (existing content)
+!! wikitext
+[[File:Foobar.jpg|442x50px|frame|left|baseline|caption]]
+!! html/parsoid
+<figure class="mw-halign-left mw-valign-baseline" typeof="mw:Image/Frame" data-parsoid='{"optList":[{"ck":"width","ak":"442x50px"},{"ck":"framed","ak":"frame"},{"ck":"left","ak":"left"},{"ck":"baseline","ak":"baseline"},{"ck":"caption","ak":"caption"}],"size":"442x50"}'><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/442px-Foobar.jpg" height="50" width="442" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"50","width":"442"},"sa":{"resource":"File:Foobar.jpg"}}'/></a><figcaption>caption</figcaption></figure>
+!! end
+
 !! test
 Parsoid-specific image handling - frameless image with specific size, border, and caption
-!! options
-parsoid
-!! input
-[[Image:Foobar.jpg|frameless|500x50px|border|caption]]
-!! result
-<p>
-<span class="mw-image-border" typeof="mw:Image/Frameless" data-mw="{&quot;caption&quot;:&quot;caption&quot;}">
-<a href="File:Foobar.jpg">
-<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/442px-Foobar.jpg" height="50" width="442" />
-</a>
-</p>
+!! wikitext
+[[File:Foobar.jpg|frameless|442x50px|border|caption]]
+!! html/parsoid
+<p><span class="mw-image-border" typeof="mw:Image/Frameless" data-mw='{"caption":"caption"}' data-parsoid='{"optList":[{"ck":"frameless","ak":"frameless"},{"ck":"width","ak":"442x50px"},{"ck":"border","ak":"border"},{"ck":"caption","ak":"caption"}],"size":"442x50"}'><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/442px-Foobar.jpg" height="50" width="442" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"50","width":"442"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
 !! end
 
-#!! test
-#Parsoid-specific image handling - simple image with a formatted caption
-#!! options
-#parsoid
-#!! input
-#[[Image:Foobar.jpg|<table><tr><td>a</td><td>b</td></tr><tr><td>c</td></tr></table>]]
-#!! result
-#<p>
-#<span typeof="mw:Image">
-#<a class="mw-default-size" href="Image:Foobar.jpg">
-#<img alt="Foobar.jpg" class="mw-default-size" src="http://example.com/images/3/3a/Foobar.jpg" height="220" width="1941">
-#</a>
-#<span>abc</span>
-#</span>
-#</p>
+!! test
+Parsoid-specific image handling - simple image with a formatted caption
+!! wikitext
+[[File:Foobar.jpg|<table><tr><td>a</td><td>b</td></tr><tr><td>c</td></tr></table>]]
+!! html/parsoid
+<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"&lt;table>&lt;tr>&lt;td>a&lt;/td>&lt;td>b&lt;/td>&lt;/tr>&lt;tr>&lt;td>c&lt;/td>&lt;/tr>&lt;/table>"}'>
+<a href="File:Foobar.jpg">
+<img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941">
+</a></span></p>
+!! end
 
 !! test
 Parsoid-specific image handling - caption with a template in it
-!! options
-parsoid
-!! input
-[[File:Foobar.jpg|thumb|200x200px|This caption has a {{echo|transclusion}} in it.]]
-!! result
+!! wikitext
+[[File:Foobar.jpg|thumb|200x23px|This caption has a {{echo|transclusion}} in it.]]
+!! html/parsoid
 <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" height="23" width="200"></a><figcaption>This caption has a <span about="#mwt1" 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;transclusion&quot;}},&quot;i&quot;:0}}]}">transclusion</span> in it.</figcaption></figure>
 !! end
 
@@ -10595,16 +10805,44 @@ parsoid
 Parsoid-specific image handling - caption with unbalanced tags in it
 !! options
 parsoid=wt2html,wt2wt,html2html
-!! input
+!! wikitext
 foo
 [[File:Foobar.jpg|thumb|200x200px|This caption has a <center>unbalanced tag in it.]]
 bar
-!! result
+!! 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" height="23" width="200"></a><figcaption>This caption has a <center>unbalanced tag in it.</center></figcaption></figure>
 <p>bar</p>
 !! end
 
+!! test
+Parsoid-specific image handling - empty 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" height="25" width="220"/></a><figcaption></figcaption></figure>
+!! end
+
+!! test
+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" height="25" width="220"/></a><figcaption> </figcaption></figure>
+!! end
+
+!! test
+Parsoid-specific image handling - lang option
+!! wikitext
+foo
+[[File:Foobar.svg|lang=de|caption]]
+bar
+!! html/parsoid
+<p>foo
+<span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"caption"}'><a href="./File:Foobar.svg"><img resource="./File:Foobar.svg" src="//example.com/images/f/ff/Foobar.svg" lang="de" height="180" width="240"/></a></span>
+bar</p>
+!! end
+
 
 ###
 ### Subpages
@@ -10619,9 +10857,9 @@ foo
 Subpage link
 !! options
 subpage title=[[Subpage test]]
-!! input
+!! wikitext
 [[/subpage]]
-!! result
+!! html
 <p><a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">/subpage</a>
 </p>
 !! end
@@ -10630,9 +10868,9 @@ subpage title=[[Subpage test]]
 Subpage noslash link
 !! options
 subpage title=[[Subpage test]]
-!!input
+!! wikitext
 [[/subpage/]]
-!! result
+!! html
 <p><a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">subpage</a>
 </p>
 !! end
@@ -10643,11 +10881,11 @@ Relative subpage noslash link
 !! options
 parsoid=wt2wt,wt2html,html2html
 subpage title=[[Subpage test/1/2/3/4]]
-!!input
+!! wikitext
 [[../../subpage/]]
 
 [[../../subpage]]
-!! result
+!! html
 <p><a rel="mw:WikiLink" href="Subpage_test/1/2/subpage/">subpage</a></p>
 <p><a rel="mw:WikiLink" href="Subpage_test/1/2/subpage">Subpage_test/1/2/subpage</a></p>
 !! end
@@ -10657,13 +10895,13 @@ subpage title=[[Subpage test/1/2/3/4]]
 Parsoid: dot-slash prefixed wikilinks
 !! options
 parsoid=wt2wt,wt2html,html2html
-!!input
+!! wikitext
 [[./foo]]
 
 [[././bar]]
 
 [[././baz/]]
-!! result
+!! html
 <p><a rel="mw:WikiLink" href="./Foo">foo</a></p>
 <p><a rel="mw:WikiLink" href="./Bar">bar</a></p>
 <p><a rel="mw:WikiLink" href="./Baz/">baz/</a></p>
@@ -10671,9 +10909,9 @@ parsoid=wt2wt,wt2html,html2html
 
 !! test
 Disabled subpages
-!! input
+!! wikitext
 [[/subpage]]
-!! result
+!! html
 <p><a href="/index.php?title=/subpage&amp;action=edit&amp;redlink=1" class="new" title="/subpage (page does not exist)">/subpage</a>
 </p>
 !! end
@@ -10682,9 +10920,9 @@ Disabled subpages
 BUG 561: {{/Subpage}}
 !! options
 subpage title=[[Page]]
-!! input
+!! wikitext
 {{/Subpage}}
-!! result
+!! html
 <p><a href="/index.php?title=Page/Subpage&amp;action=edit&amp;redlink=1" class="new" title="Page/Subpage (page does not exist)">Page/Subpage</a>
 </p>
 !! end
@@ -10700,9 +10938,9 @@ blah
 
 !! test
 Link to category
-!! input
+!! wikitext
 [[:Category:MediaWiki User's Guide]]
-!! result
+!! html
 <p><a href="/wiki/Category:MediaWiki_User%27s_Guide" title="Category:MediaWiki User's Guide">Category:MediaWiki User's Guide</a>
 </p>
 !! end
@@ -10711,17 +10949,17 @@ Link to category
 Simple category
 !! options
 cat
-!! input
+!! wikitext
 [[Category:MediaWiki User's Guide]]
-!! result
+!! html
 <a href="/wiki/Category:MediaWiki_User%27s_Guide" title="Category:MediaWiki User's Guide">MediaWiki User's Guide</a>
 !! end
 
 !! test
 PAGESINCATEGORY invalid title fatal (r33546 fix)
-!! input
+!! wikitext
 {{PAGESINCATEGORY:<bogus>}}
-!! result
+!! html
 <p>0
 </p>
 !! end
@@ -10730,9 +10968,9 @@ PAGESINCATEGORY invalid title fatal (r33546 fix)
 Category with different sort key
 !! options
 cat
-!! input
+!! wikitext
 [[Category:MediaWiki User's Guide|Foo]]
-!! result
+!! html
 <a href="/wiki/Category:MediaWiki_User%27s_Guide" title="Category:MediaWiki User's Guide">MediaWiki User's Guide</a>
 !! end
 
@@ -10740,9 +10978,9 @@ cat
 Category with identical sort key
 !! options
 cat
-!! input
+!! wikitext
 [[Category:MediaWiki User's Guide|MediaWiki User's Guide]]
-!! result
+!! html
 <a href="/wiki/Category:MediaWiki_User%27s_Guide" title="Category:MediaWiki User's Guide">MediaWiki User's Guide</a>
 !! end
 
@@ -10751,9 +10989,9 @@ Category with empty sort key
 !! options
 cat
 pst
-!! input
+!! wikitext
 [[Category:MediaWiki User's Guide|]]
-!! result
+!! html
 [[Category:MediaWiki User's Guide|MediaWiki User's Guide]]
 !! end
 
@@ -10762,9 +11000,9 @@ Category with empty sort key and parentheses
 !! options
 cat
 pst
-!! input
+!! wikitext
 [[Category:Foo (bar)|]]
-!! result
+!! html
 [[Category:Foo (bar)|Foo]]
 !! end
 
@@ -10773,9 +11011,9 @@ Category with link tail
 !! options
 cat
 pst
-!! input
+!! wikitext
 123[[Category:Foo]]456
-!! result
+!! html
 123[[Category:Foo]]456
 !! end
 
@@ -10784,9 +11022,9 @@ Category with template
 !! options
 cat
 pst
-!! input
+!! wikitext
 [[Category:{{echo|Foo}}]]
-!! result
+!! html
 [[Category:{{echo|Foo}}]]
 !! end
 
@@ -10795,9 +11033,9 @@ Category with template in sort key
 !! options
 cat
 pst
-!! input
+!! wikitext
 [[Category:Foo|{{echo|Bar}}]]
-!! result
+!! html
 [[Category:Foo|{{echo|Bar}}]]
 !! end
 
@@ -10806,15 +11044,15 @@ Category with template in sort key and title
 !! options
 cat
 pst
-!! input
+!! wikitext
 [[Category:{{echo|Foo}}|{{echo|Bar}}]]
-!! result
+!! html
 [[Category:{{echo|Foo}}|{{echo|Bar}}]]
 !! end
 
 !! test
 Category / paragraph interactions
-!! input
+!! wikitext
 Foo [[Category:Baz]] Bar
 
 Foo [[Category:Baz]]
@@ -10840,7 +11078,7 @@ Bar
 [[Category:Baz]]
  {{echo|[[Category:Baz]]}}
 [[Category:Baz]]
-!! result
+!! html
 <p>Foo Bar
 </p><p>Foo
 Bar
@@ -10856,11 +11094,11 @@ Bar
 Parsoid: Serialize link to category page with colon escape
 !! options
 parsoid
-!! input
+!! wikitext
 
 [[:Category:Foo]]
 [[:Category:Foo|Bar]]
-!! result
+!! html
 <p>
 <a rel="mw:WikiLink" href="Category:Foo">Category:Foo</a>
 <a rel="mw:WikiLink" href="Category:Foo">Bar</a>
@@ -10872,9 +11110,9 @@ Parsoid: Link prefix/suffixes aren't applied to category links
 !! options
 parsoid=wt2html,wt2wt,html2html
 language=is
-!! input
+!! wikitext
 x[[Category:Foo]]y
-!! result
+!! html
 <p>x<link rel="mw:PageProp/Category" href="Category:Foo">y</p>
 !! end
 
@@ -10882,11 +11120,11 @@ x[[Category:Foo]]y
 Parsoid: Serialize link to file page with colon escape
 !! options
 parsoid
-!! input
+!! wikitext
 
 [[:File:Foo.png]]
 [[:File:Foo.png|Bar]]
-!! result
+!! html
 <p>
 <a rel="mw:WikiLink" href="File:Foo.png">File:Foo.png</a>
 <a rel="mw:WikiLink" href="File:Foo.png">Bar</a>
@@ -10897,10 +11135,10 @@ parsoid
 Parsoid: Serialize a genuine category link without colon escape
 !! options
 parsoid
-!! input
+!! wikitext
 [[Category:Foo]]
 [[Category:Foo|Bar]]
-!! result
+!! html
 <link rel="mw:PageProp/Category" href="Category:Foo">
 <link rel="mw:PageProp/Category" href="Category:Foo#Bar">
 !! end
@@ -10909,9 +11147,9 @@ parsoid
 Parsoid: Defaultsort
 !! options
 parsoid
-!! input
+!! wikitext
 {{DEFAULTSORT:Foo}}
-!! result
+!! html
 <meta property="mw:PageProp/categorydefaultsort" content="Foo"/>
 !! end
 
@@ -10922,11 +11160,11 @@ parsoid
 Inter-language links
 !! options
 ill
-!! input
+!! wikitext
 [[es:Alimento]]
 [[fr:Nourriture]]
 [[zh:&#39135;&#21697;]]
-!! result
+!! html
 es:Alimento fr:Nourriture zh:食品
 !! end
 
@@ -10934,12 +11172,12 @@ es:Alimento fr:Nourriture zh:食品
 Duplicate interlanguage links (bug 24502)
 !! options
 ill
-!! input
+!! wikitext
 [[es:1]]
 [[es:2]]
 [[fr:1]]
 [[fr:2]]
-!! result
+!! html
 es:1 fr:1
 !! end
 
@@ -10948,7 +11186,7 @@ es:1 fr:1
 ###
 !! test
 Basic section headings
-!! input
+!! wikitext
 == Headline 1 ==
 Some text
 
@@ -10956,7 +11194,7 @@ Some text
 More
 ===Smaller headline===
 Blah blah
-!! result
+!! html
 <h2><span class="mw-headline" id="Headline_1">Headline 1</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: Headline 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p>Some text
 </p>
@@ -10970,7 +11208,7 @@ Blah blah
 
 !! test
 Section headings with TOC
-!! input
+!! wikitext
 == Headline 1 ==
 === Subheadline 1 ===
 ===== Skipping a level =====
@@ -10979,7 +11217,7 @@ Section headings with TOC
 == Headline 2 ==
 Some text
 ===Another headline===
-!! result
+!! html
 <div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Headline_1"><span class="tocnumber">1</span> <span class="toctext">Headline 1</span></a>
@@ -11017,7 +11255,7 @@ Some text
 # perl -e 'print "="x$_," Level $_ heading","="x$_,"\n" for 1..10'
 !! test
 Handling of sections up to level 6 and beyond
-!! input
+!! wikitext
 = Level 1 Heading=
 == Level 2 Heading==
 === Level 3 Heading===
@@ -11028,7 +11266,7 @@ Handling of sections up to level 6 and beyond
 ======== Level 8 Heading========
 ========= Level 9 Heading=========
 ========== Level 10 Heading==========
-!! result
+!! html
 <div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Level_1_Heading"><span class="tocnumber">1</span> <span class="toctext">Level 1 Heading</span></a>
@@ -11074,14 +11312,14 @@ Handling of sections up to level 6 and beyond
 
 !! test
 TOC regression (bug 9764)
-!! input
+!! wikitext
 == title 1 ==
 === title 1.1 ===
 ==== title 1.1.1 ====
 === title 1.2 ===
 == title 2 ==
 === title 2.1 ===
-!! result
+!! html
 <div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
@@ -11115,14 +11353,14 @@ TOC regression (bug 9764)
 TOC with wgMaxTocLevel=3 (bug 6204)
 !! options
 wgMaxTocLevel=3
-!! input
+!! wikitext
 == title 1 ==
 === title 1.1 ===
 ==== title 1.1.1 ====
 === title 1.2 ===
 == title 2 ==
 === title 2.1 ===
-!! result
+!! html
 <div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
@@ -11152,13 +11390,13 @@ wgMaxTocLevel=3
 TOC with wgMaxTocLevel=3 and two level four headings (bug 6204)
 !! options
 wgMaxTocLevel=3
-!! input
+!! wikitext
 ==Section 1==
 ===Section 1.1===
 ====Section 1.1.1====
 ====Section 1.1.1.1====
 ==Section 2==
-!! result
+!! html
 <div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Section_1"><span class="tocnumber">1</span> <span class="toctext">Section 1</span></a>
@@ -11181,10 +11419,10 @@ wgMaxTocLevel=3
 
 !! test
 Resolving duplicate section names
-!! input
+!! wikitext
 == Foo bar ==
 == Foo bar ==
-!! result
+!! html
 <h2><span class="mw-headline" id="Foo_bar">Foo bar</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: Foo bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <h2><span class="mw-headline" id="Foo_bar_2">Foo bar</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
@@ -11192,10 +11430,10 @@ Resolving duplicate section names
 
 !! test
 Resolving duplicate section names with differing case (bug 10721)
-!! input
+!! wikitext
 == Foo bar ==
 == Foo Bar ==
-!! result
+!! html
 <h2><span class="mw-headline" id="Foo_bar">Foo bar</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: Foo bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <h2><span class="mw-headline" id="Foo_Bar_2">Foo Bar</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
@@ -11210,12 +11448,12 @@ Template:sections
 
 !! test
 Template with sections, __NOTOC__
-!! input
+!! wikitext
 __NOTOC__
 ==Section 0==
 {{sections}}
 ==Section 4==
-!! result
+!! html
 <h2><span class="mw-headline" id="Section_0">Section 0</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: Section 0">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <h3><span class="mw-headline" id="Section_1">Section 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=T-1" title="Template:Sections">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
 <h2><span class="mw-headline" id="Section_2">Section 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=T-2" title="Template:Sections">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
@@ -11225,11 +11463,11 @@ __NOTOC__
 
 !! test
 __NOEDITSECTION__ keyword
-!! input
+!! wikitext
 __NOEDITSECTION__
 ==Section 1==
 ==Section 2==
-!! result
+!! html
 <h2><span class="mw-headline" id="Section_1">Section 1</span></h2>
 <h2><span class="mw-headline" id="Section_2">Section 2</span></h2>
 
@@ -11237,21 +11475,21 @@ __NOEDITSECTION__
 
 !! test
 Link inside a section heading
-!! input
+!! wikitext
 ==Section with a [[Main Page|link]] in it==
-!! result
+!! html
 <h2><span class="mw-headline" id="Section_with_a_link_in_it">Section with a <a href="/wiki/Main_Page" title="Main Page">link</a> in it</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: Section with a link in it">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
 !! test
 TOC regression (bug 12077)
-!! input
+!! wikitext
 __TOC__
 == title 1 ==
 === title 1.1 ===
 == title 2 ==
-!! result
+!! html
 <div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
@@ -11271,22 +11509,22 @@ __TOC__
 
 !! test
 BUG 1219 URL next to image (good)
-!! input
+!! wikitext
 http://example.com [[Image:foobar.jpg]]
-!! result
+!! html
 <p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a> <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !!end
 
 !! test
 Short headings with trailing space should match behavior of Parser::doHeadings (bug 19910)
-!! input
+!! wikitext
 === 
 The line above must have a trailing space!
 === <!--
 --> <!-- -->
 But just in case it doesn't...
-!! result
+!! html
 <h1><span class="mw-headline" id=".3D">=</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: =">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
 <p>The line above must have a trailing space!
 </p>
@@ -11297,7 +11535,7 @@ But just in case it doesn't...
 
 !! test
 Header with special characters (bug 25462)
-!! input
+!! wikitext
 The tooltips shall not show entities to the user (ie. be double escaped)
 
 == text > text ==
@@ -11314,7 +11552,7 @@ section 4
 
 == text " text ==
 section 5
-!! result
+!! html
 <p>The tooltips shall not show entities to the user (ie. be double escaped)
 </p>
 <div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
@@ -11347,12 +11585,12 @@ section 5
 !! test
 Headers with excess '=' characters
 (Are similar tests necessary beyond the 1st level?)
-!! input
+!! wikitext
 =foo==
 ==foo=
 =''italic'' heading==
 ==''italic'' heading=
-!! result
+!! html
 <div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#foo.3D"><span class="tocnumber">1</span> <span class="toctext">foo=</span></a></li>
@@ -11372,7 +11610,7 @@ Headers with excess '=' characters
 !! test
 HTML headers vs TOC (bug 23393)
 (__NOEDITSECTION__ for clearer output, doesn't matter here)
-!! input
+!! wikitext
 <h1>Header 1</h1>
 == Header 1.1 ==
 == Header 1.2 ==
@@ -11382,7 +11620,7 @@ HTML headers vs TOC (bug 23393)
 == Header 2.1 ==
 == Header 2.2 ==
 __NOEDITSECTION__
-!! result
+!! html
 <div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1"><a href="#Header_1"><span class="tocnumber">1</span> <span class="toctext">Header 1</span></a>
@@ -11411,18 +11649,18 @@ __NOEDITSECTION__
 
 !! test
 BUG 1219 URL next to image (broken)
-!! input
+!! wikitext
 http://example.com[[Image:foobar.jpg]]
-!! result
+!! html
 <p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !!end
 
 !! test
 Bug 1186 news: in the middle of text
-!! input
+!! wikitext
 http://en.wikinews.org/wiki/Wikinews:Workplace
-!! result
+!! html
 <p><a rel="nofollow" class="external free" href="http://en.wikinews.org/wiki/Wikinews:Workplace">http://en.wikinews.org/wiki/Wikinews:Workplace</a>
 </p>
 !!end
@@ -11430,18 +11668,18 @@ http://en.wikinews.org/wiki/Wikinews:Workplace
 
 !! test
 Namespaced link must have a title
-!! input
+!! wikitext
 [[Project:]]
-!! result
+!! html
 <p>[[Project:]]
 </p>
 !!end
 
 !! test
 Namespaced link must have a title (bad fragment version)
-!! input
+!! wikitext
 [[Project:#fragment]]
-!! result
+!! html
 <p>[[Project:#fragment]]
 </p>
 !!end
@@ -11453,45 +11691,45 @@ Namespaced link must have a title (bad fragment version)
 
 !! test
 div with no attributes
-!! input
+!! wikitext
 <div>HTML rocks</div>
-!! result
+!! html
 <div>HTML rocks</div>
 
 !! end
 
 !! test
 div with double-quoted attribute
-!! input
+!! wikitext
 <div id="rock">HTML rocks</div>
-!! result
+!! html
 <div id="rock">HTML rocks</div>
 
 !! end
 
 !! test
 div with single-quoted attribute
-!! input
+!! wikitext
 <div id='rock'>HTML rocks</div>
-!! result
+!! html
 <div id="rock">HTML rocks</div>
 
 !! end
 
 !! test
 div with unquoted attribute
-!! input
+!! wikitext
 <div id=rock>HTML rocks</div>
-!! result
+!! html
 <div id="rock">HTML rocks</div>
 
 !! end
 
 !! test
 div with illegal double attributes
-!! input
+!! wikitext
 <div id="a" id="b">HTML rocks</div>
-!! result
+!! html
 <div id="b">HTML rocks</div>
 
 !!end
@@ -11502,9 +11740,9 @@ div with illegal double attributes
 div with empty attribute value, space before equals
 !! options
 parsoid
-!! input
+!! wikitext
 <div class =>HTML rocks</div>
-!! result
+!! html
 <div class="">HTML rocks</div>
 
 !! end
@@ -11515,9 +11753,9 @@ parsoid
 div with braces in attribute value
 !! options
 parsoid
-!! input
+!! wikitext
 <div title="{}">Foo</div>
-!! result
+!! html
 <div title="{}">Foo</div>
 !! end
 
@@ -11532,29 +11770,29 @@ parsoid
 div with empty attribute value, no space before equals
 !! options
 parsoid
-!! input
+!! wikitext
 <div class=>HTML rocks</div>
-!! result
+!! html
 <div class="">HTML rocks</div>
 
 !! end
 
 !! test
 HTML multiple attributes correction
-!! input
+!! wikitext
 <p class="error" class="awesome">Awesome!</p>
-!! result
+!! html
 <p class="awesome">Awesome!</p>
 
 !!end
 
 !! test
 Table multiple attributes correction
-!! input
+!! wikitext
 {|
 !+ class="error" class="awesome"| status
 |}
-!! result
+!! html
 <table>
 <tr>
 <th class="awesome"> status
@@ -11564,63 +11802,63 @@ Table multiple attributes correction
 
 !! test
 DIV IN UPPERCASE
-!! input
+!! wikitext
 <DIV ID="x">HTML ROCKS</DIV>
-!! result
+!! html
 <div id="x">HTML ROCKS</div>
 
 !!end
 
 !! test
 Non-ASCII pseudo-tags are rendered as text
-!! input
+!! wikitext
 <khyô>
-!! result
+!! html
 <p>&lt;khyô&gt;
 </p>
 !! end
 
 !! test
 Pseudo-tag with URL 'name' renders as url link
-!! input
+!! wikitext
 <http://example.com/>
-!! result
+!! html
 <p>&lt;<a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a>&gt;
 </p>
 !! end
 
 !! test
 text with amp in the middle of nowhere
-!! input
+!! wikitext
 Remember AT&T?
-!!result
+!! html
 <p>Remember AT&amp;T?
 </p>
 !! end
 
 !! test
 text with character entity: eacute
-!! input
+!! wikitext
 I always thought &eacute; was a cute letter.
-!! result
+!! html
 <p>I always thought &#233; was a cute letter.
 </p>
 !! end
 
 !! test
 text with entity-escaped character entity-like string: eacute
-!! input
+!! wikitext
 I always thought &amp;eacute; was a cute letter.
-!! result
+!! html
 <p>I always thought &amp;eacute; was a cute letter.
 </p>
 !! end
 
 !! test
 text with undefined character entity: xacute
-!! input
+!! wikitext
 I always thought &xacute; was a cute letter.
-!! result
+!! html
 <p>I always thought &amp;xacute; was a cute letter.
 </p>
 !! end
@@ -11630,11 +11868,11 @@ I always thought &xacute; was a cute letter.
 HTML5 tags
 !! options
 parsoid
-!! input
+!! wikitext
 <data value="5">five</data>
 <time datetime="2000-01-01T00:00Z">The new millenium started</time>
 <mark>This highlighted text</mark>
-!! result
+!! html
 <p><data value="5">five</data>
 <time datetime="2000-01-01T00:00Z">The new millenium started</time>
 <mark>This highlighted text</mark></p>
@@ -11642,9 +11880,9 @@ parsoid
 
 !! test
 HTML tag with leading space is parsed as text
-!! input
+!! wikitext
 < div>foo< /div>
-!! result
+!! html
 <p>&lt; div&gt;foo&lt; /div&gt;
 </p>
 !! end
@@ -11658,9 +11896,9 @@ HTML tag with leading space is parsed as text
 # the test case, instead of <big>
 !! test
 Ensure that HTML adoption agency algorithm is properly implemented.
-!! input
+!! wikitext
 <big>X<big>Y</big>Z</big>
-!! result
+!! html
 <p><big>X<big>Y</big>Z</big>
 </p>
 !! end
@@ -11668,9 +11906,9 @@ Ensure that HTML adoption agency algorithm is properly implemented.
 # This was bug 41545 in the PHP parser.
 !! test
 Nesting of <kbd>
-!! input
+!! wikitext
 <kbd>X<kbd>Y</kbd>Z</kbd>
-!! result
+!! html
 <p><kbd>X<kbd>Y</kbd>Z</kbd>
 </p>
 !! end
@@ -11680,45 +11918,45 @@ Nesting of <kbd>
 # not covered; see bug 51081 for discussion.
 !! test
 Nesting of <em>
-!! input
+!! wikitext
 <em>X<em>Y</em>Z</em>
-!! result
+!! html
 <p><em>X<em>Y</em>Z</em>
 </p>
 !! end
 
 !! test
 Nesting of <strong>
-!! input
+!! wikitext
 <strong>X<strong>Y</strong>Z</strong>
-!! result
+!! html
 <p><strong>X<strong>Y</strong>Z</strong>
 </p>
 !! end
 
 !! test
 Nesting of <q>
-!! input
+!! wikitext
 <q>X<q>Y</q>Z</q>
-!! result
+!! html
 <p><q>X<q>Y</q>Z</q>
 </p>
 !! end
 
 !! test
 Nesting of <ruby>
-!! input
+!! wikitext
 <ruby>X<ruby>Y</ruby>Z</ruby>
-!! result
+!! html
 <p><ruby>X<ruby>Y</ruby>Z</ruby>
 </p>
 !! end
 
 !! test
 Nesting of <bdo>
-!! input
+!! wikitext
 <bdo>X<bdo>Y</bdo>Z</bdo>
-!! result
+!! html
 <p><bdo>X<bdo>Y</bdo>Z</bdo>
 </p>
 !! end
@@ -11730,18 +11968,18 @@ Nesting of <bdo>
 
 !! test
 Media link
-!! input
+!! wikitext
 [[Media:Foobar.jpg]]
-!! result
+!! html
 <p><a href="http://example.com/images/3/3a/Foobar.jpg" class="internal" title="Foobar.jpg">Media:Foobar.jpg</a>
 </p>
 !! end
 
 !! test
 Media link with text
-!! input
+!! wikitext
 [[Media:Foobar.jpg|A neat file to look at]]
-!! result
+!! html
 <p><a href="http://example.com/images/3/3a/Foobar.jpg" class="internal" title="Foobar.jpg">A neat file to look at</a>
 </p>
 !! end
@@ -11750,36 +11988,36 @@ Media link with text
 !! test
 Media link with nasty text
 fixme: doBlockLevels won't wrap this in a paragraph because it contains a div
-!! input
+!! wikitext
 [[Media:Foobar.jpg|Safe Link<div style=display:none>" onmouseover="alert(document.cookie)" onfoo="</div>]]
-!! result
+!! html
 <a href="http://example.com/images/3/3a/Foobar.jpg" class="internal" title="Foobar.jpg">Safe Link&lt;div style="display:none"&gt;" onmouseover="alert(document.cookie)" onfoo="&lt;/div&gt;</a>
 
 !! end
 
 !! test
 Media link to nonexistent file (bug 1702)
-!! input
+!! wikitext
 [[Media:No such.jpg]]
-!! result
+!! html
 <p><a href="/index.php?title=Special:Upload&amp;wpDestFile=No_such.jpg" class="new" title="No such.jpg">Media:No such.jpg</a>
 </p>
 !! end
 
 !! test
 Image link to nonexistent file (bug 1850 - good)
-!! input
+!! wikitext
 [[Image:No such.jpg]]
-!! result
+!! html
 <p><a href="/index.php?title=Special:Upload&amp;wpDestFile=No_such.jpg" class="new" title="File:No such.jpg">File:No such.jpg</a>
 </p>
 !! end
 
 !! test
 :Image link to nonexistent file (bug 1850 - bad)
-!! input
+!! wikitext
 [[:Image:No such.jpg]]
-!! result
+!! html
 <p><a href="/index.php?title=File:No_such.jpg&amp;action=edit&amp;redlink=1" class="new" title="File:No such.jpg (page does not exist)">Image:No such.jpg</a>
 </p>
 !! end
@@ -11788,9 +12026,9 @@ Image link to nonexistent file (bug 1850 - good)
 
 !! test
 Character reference normalization in link text (bug 1938)
-!! input
+!! wikitext
 [[Main Page|this&that]]
-!! result
+!! html
 <p><a href="/wiki/Main_Page" title="Main Page">this&amp;that</a>
 </p>
 !!end
@@ -11805,13 +12043,13 @@ The page's name is U+05d0 U+05b7, with non-canonical form U+FB2E
 
 !! test
 (bug 19451) Links should refer to the normalized form.
-!! input
+!! wikitext
 [[&#xFB2E;]]
 [[&#x5d0;&#x5b7;]]
 [[&#x5d0;ַ]]
 [[א&#x5b7;]]
 [[אַ]]
-!! result
+!! html
 <p><a href="/wiki/%D7%90%D6%B7" title="אַ">&#xfb2e;</a>
 <a href="/wiki/%D7%90%D6%B7" title="אַ">&#x5d0;&#x5b7;</a>
 <a href="/wiki/%D7%90%D6%B7" title="אַ">&#x5d0;ַ</a>
@@ -11822,81 +12060,81 @@ The page's name is U+05d0 U+05b7, with non-canonical form U+FB2E
 
 !! test
 Empty attribute crash test (bug 2067)
-!! input
+!! wikitext
 <font color="">foo</font>
-!! result
+!! html
 <p><font color="">foo</font>
 </p>
 !! end
 
 !! test
 Empty attribute crash test single-quotes (bug 2067)
-!! input
+!! wikitext
 <font color=''>foo</font>
-!! result
+!! html
 <p><font color="">foo</font>
 </p>
 !! end
 
 !! test
 Attribute test: equals, then nothing
-!! input
+!! wikitext
 <font color=>foo</font>
-!! result
+!! html
 <p><font>foo</font>
 </p>
 !! end
 
 !! test
 Attribute test: unquoted value
-!! input
+!! wikitext
 <font color=x>foo</font>
-!! result
+!! html
 <p><font color="x">foo</font>
 </p>
 !! end
 
 !! test
 Attribute test: unquoted but illegal value (hash)
-!! input
+!! wikitext
 <font color=#x>foo</font>
-!! result
+!! html
 <p><font color="#x">foo</font>
 </p>
 !! end
 
 !! test
 Attribute test: no value
-!! input
+!! wikitext
 <font color>foo</font>
-!! result
+!! html
 <p><font color="color">foo</font>
 </p>
 !! end
 
 !! test
 Bug 2095: link with three closing brackets
-!! input
+!! wikitext
 [[Main Page]]]
-!! result
+!! html
 <p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>]
 </p>
 !! end
 
 !! test
 Bug 2095: link with pipe and three closing brackets
-!! input
+!! wikitext
 [[Main Page|link]]]
-!! result
+!! html
 <p><a href="/wiki/Main_Page" title="Main Page">link</a>]
 </p>
 !! end
 
 !! test
 Bug 2095: link with pipe and three closing brackets, version 2
-!! input
+!! wikitext
 [[Main Page|[http://example.com/]]]
-!! result
+!! html
 <p><a href="/wiki/Main_Page" title="Main Page">[http://example.com/]</a>
 </p>
 !! end
@@ -11926,90 +12164,90 @@ Template:Div style
 
 !! test
 Bug 2304: HTML attribute safety (safe template; regression bug 2309)
-!! input
+!! wikitext
 <div title="{{test}}"></div>
-!! result
+!! html
 <div title="This is a test template"></div>
 
 !! end
 
 !! test
 Bug 2304: HTML attribute safety (dangerous template; 2309)
-!! input
+!! wikitext
 <div title="{{dangerous attribute}}"></div>
-!! result
+!! html
 <div title=""></div>
 
 !! end
 
 !! test
 Bug 2304: HTML attribute safety (dangerous style template; 2309)
-!! input
+!! wikitext
 <div style="{{dangerous style attribute}}"></div>
-!! result
+!! html
 <div style="/* insecure input */"></div>
 
 !! end
 
 !! test
 Bug 2304: HTML attribute safety (safe parameter; 2309)
-!! input
+!! wikitext
 {{div style|width: 200px}}
-!! result
+!! html
 <div style="float: right; width: 200px">Magic div</div>
 
 !! end
 
 !! test
 Bug 2304: HTML attribute safety (unsafe parameter; 2309)
-!! input
+!! wikitext
 {{div style|width: expression(alert(document.cookie))}}
-!! result
+!! html
 <div style="/* insecure input */">Magic div</div>
 
 !! end
 
 !! test
 Bug 2304: HTML attribute safety (unsafe breakout parameter; 2309)
-!! input
+!! wikitext
 {{div style|"><script>alert(document.cookie)</script>}}
-!! result
+!! html
 <div style="float: right;">&lt;script&gt;alert(document.cookie)&lt;/script&gt;"&gt;Magic div</div>
 
 !! end
 
 !! test
 Bug 2304: HTML attribute safety (unsafe breakout parameter 2; 2309)
-!! input
+!! wikitext
 {{div style|" ><script>alert(document.cookie)</script>}}
-!! result
+!! html
 <div style="float: right;">&lt;script&gt;alert(document.cookie)&lt;/script&gt;"&gt;Magic div</div>
 
 !! end
 
 !! test
 Bug 2304: HTML attribute safety (link)
-!! input
+!! wikitext
 <div title="[[Main Page]]"></div>
-!! result
+!! html
 <div title="&#91;&#91;Main Page]]"></div>
 
 !! end
 
 !! test
 Bug 2304: HTML attribute safety (italics)
-!! input
+!! wikitext
 <div title="''foobar''"></div>
-!! result
+!! html
 <div title="&#39;&#39;foobar&#39;&#39;"></div>
 
 !! end
 
 !! test
 Bug 2304: HTML attribute safety (bold)
-!! input
+!! wikitext
 <div title="'''foobar'''"></div>
-!! result
+!! html
 <div title="&#39;&#39;&#39;foobar&#39;&#39;&#39;"></div>
 
 !! end
@@ -12017,63 +12255,63 @@ Bug 2304: HTML attribute safety (bold)
 
 !! test
 Bug 2304: HTML attribute safety (ISBN)
-!! input
+!! wikitext
 <div title="ISBN 1234567890"></div>
-!! result
+!! html
 <div title="&#73;SBN 1234567890"></div>
 
 !! end
 
 !! test
 Bug 2304: HTML attribute safety (RFC)
-!! input
+!! wikitext
 <div title="RFC 1234"></div>
-!! result
+!! html
 <div title="&#82;FC 1234"></div>
 
 !! end
 
 !! test
 Bug 2304: HTML attribute safety (PMID)
-!! input
+!! wikitext
 <div title="PMID 1234567890"></div>
-!! result
+!! html
 <div title="&#80;MID 1234567890"></div>
 
 !! end
 
 !! test
 Bug 2304: HTML attribute safety (web link)
-!! input
+!! wikitext
 <div title="http://example.com/"></div>
-!! result
+!! html
 <div title="http&#58;//example.com/"></div>
 
 !! end
 
 !! test
 Bug 2304: HTML attribute safety (named web link)
-!! input
+!! wikitext
 <div title="[http://example.com/ link]"></div>
-!! result
+!! html
 <div title="&#91;http&#58;//example.com/ link]"></div>
 
 !! end
 
 !! test
 Bug 3244: HTML attribute safety (extension; safe)
-!! input
+!! wikitext
 <div style="<nowiki>background:blue</nowiki>"></div>
-!! result
+!! html
 <div style="background:blue"></div>
 
 !! end
 
 !! test
 Bug 3244: HTML attribute safety (extension; unsafe)
-!! input
+!! wikitext
 <div style="<nowiki>border-left:expression(alert(document.cookie))</nowiki>"></div>
-!! result
+!! html
 <div style="/* insecure input */"></div>
 
 !! end
@@ -12082,55 +12320,55 @@ Bug 3244: HTML attribute safety (extension; unsafe)
 
 !! test
 MSIE CSS safety test: spurious slash
-!! input
+!! wikitext
 <div style="background-image:u\rl(javascript:alert('boo'))">evil</div>
-!! result
+!! html
 <div style="/* insecure input */">evil</div>
 
 !! end
 
 !! test
 MSIE CSS safety test: hex code
-!! input
+!! wikitext
 <div style="background-image:u\72l(javascript:alert('boo'))">evil</div>
-!! result
+!! html
 <div style="/* insecure input */">evil</div>
 
 !! end
 
 !! test
 MSIE CSS safety test: comment in url
-!! input
+!! wikitext
 <div style="background-image:u/**/rl(javascript:alert('boo'))">evil</div>
-!! result
+!! html
 <div style="background-image:u rl(javascript:alert(&#39;boo&#39;))">evil</div>
 
 !! end
 
 !! test
 MSIE CSS safety test: comment in expression
-!! input
+!! wikitext
 <div style="background-image:expres/**/sion(alert('boo4'))">evil4</div>
-!! result
+!! html
 <div style="background-image:expres sion(alert(&#39;boo4&#39;))">evil4</div>
 
 !! end
 
 !! test
 CSS safety test (all browsers): vertical tab (bug 55332 / CVE-2013-4567)
-!! input
+!! wikitext
 <p style="font-size: 100px; background-image:url\b(https://www.google.com/images/srpr/logo6w.png)">A</p>
-!! result
+!! html
 <p style="/* invalid control char */">A</p>
 
 !! end
 
 !! test
 MSIE 6 CSS safety test: Fullwidth (bug 55332)
-!! input
+!! wikitext
 <p style="font-size: 100px; color: expression((title='XSSed'),'red')">A</p>
 <div style="top:EXPRESSION(alert())">B</div>
-!! result
+!! html
 <p style="/* insecure input */">A</p>
 <div style="/* insecure input */">B</div>
 
@@ -12138,10 +12376,10 @@ MSIE 6 CSS safety test: Fullwidth (bug 55332)
 
 !! test
 MSIE 6 CSS safety test: IPA extensions (bug 55332)
-!! input
+!! wikitext
 <div style="background-image:uʀʟ(javascript:alert())">A</div>
 <p style="font-size: 100px; color: expʀessɪoɴ((title='XSSed'),'red')">B</p>
-!! result
+!! html
 <div style="/* insecure input */">A</div>
 <p style="/* insecure input */">B</p>
 
@@ -12149,11 +12387,11 @@ MSIE 6 CSS safety test: IPA extensions (bug 55332)
 
 !! test
 MSIE 6 CSS safety test: sup/sub script (bug 55332)
-!! input
+!! wikitext
 <div style="background-image:url⁽javascript:alert())">A</div>
 <div style="background-image:url₍javascript:alert())">B</div>
 <p style="font-size: 100px; color: expressioⁿ((title='XSSed'),'red')">C</p>
-!! result
+!! html
 <div style="/* insecure input */">A</div>
 <div style="/* insecure input */">B</div>
 <p style="/* insecure input */">C</p>
@@ -12162,18 +12400,18 @@ MSIE 6 CSS safety test: sup/sub script (bug 55332)
 
 !! test
 Opera -o-link CSS
-!! input
+!! wikitext
 <div
 title="&#100;&#97;&#116;&#97;&#58;&#116;&#101;&#120;&#116;&#47;&#104;&#116;&#109;&#108;&#44;&#60;&#105;&#109;&#103;&#32;&#115;&#114;&#99;&#61;&#49;&#32;&#111;&#110;&#101;&#114;&#114;&#111;&#114;&#61;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;&#62;"
 style="-o-link:attr(title);-o-link-source:current">X</div>
-!! result
+!! html
 <div title="data:text/html,&lt;img src=1 onerror=alert(1)&gt;" style="/* insecure input */">X</div>
 
 !! end
 
 !! test
 MSIE 6 CSS safety test: Repetition markers (bug 55332)
-!! input
+!! wikitext
 <p style="font-size: 100px; color: expres〱ion((title='XSSed'),'red')">A</p>
 <p style="font-size: 100px; color: expresゝion((title='XSSed'),'red')">B</p>
 <p style="font-size: 100px; color: expresーion((title='XSSed'),'red')">C</p>
@@ -12181,7 +12419,7 @@ MSIE 6 CSS safety test: Repetition markers (bug 55332)
 <p style="font-size: 100px; color: expresﹽion((title='XSSed'),'red')">E</p>
 <p style="font-size: 100px; color: expresﹼion((title='XSSed'),'red')">F</p>
 <p style="font-size: 100px; color: expresーion((title='XSSed'),'red')">G</p>
-!! result
+!! html
 <p style="/* insecure input */">A</p>
 <p style="/* insecure input */">B</p>
 <p style="/* insecure input */">C</p>
@@ -12194,11 +12432,11 @@ MSIE 6 CSS safety test: Repetition markers (bug 55332)
 
 !! test
 Table attribute legitimate extension
-!! input
+!! wikitext
 {|
 !+ style="<nowiki>color:blue</nowiki>"| status
 |}
-!! result
+!! html
 <table>
 <tr>
 <th style="color:blue"> status
@@ -12208,11 +12446,11 @@ Table attribute legitimate extension
 
 !! test
 Table attribute safety
-!! input
+!! wikitext
 {|
 !+ style="<nowiki>border-width:expression(0+alert(document.cookie))</nowiki>"| status
 |}
-!! result
+!! html
 <table>
 <tr>
 <th style="/* insecure input */"> status
@@ -12222,18 +12460,18 @@ Table attribute safety
 
 !! test
 CSS line continuation 1
-!! input
+!! wikitext
 <div style="background-image: u\&#10;rl(test.jpg);"></div>
-!! result
+!! html
 <div style="/* insecure input */"></div>
 
 !! end
 
 !! test
 CSS line continuation 2
-!! input
+!! wikitext
 <div style="background-image: u\&#13;rl(test.jpg); "></div>
-!! result
+!! html
 <div style="/* insecure input */"></div>
 
 !! end
@@ -12246,9 +12484,9 @@ Template:Identity
 
 !! test
 Expansion of multi-line templates in attribute values (bug 6255)
-!! input
+!! wikitext
 <div style="background: {{identity|#00FF00}}">-</div>
-!! result
+!! html
 <div style="background: #00FF00">-</div>
 
 !! end
@@ -12256,19 +12494,19 @@ Expansion of multi-line templates in attribute values (bug 6255)
 
 !! test
 Expansion of multi-line templates in attribute values (bug 6255 sanity check)
-!! input
+!! wikitext
 <div style="background: 
 #00FF00">-</div>
-!! result
+!! html
 <div style="background: #00FF00">-</div>
 
 !! end
 
 !! test
 Expansion of multi-line templates in attribute values (bug 6255 sanity check 2)
-!! input
+!! wikitext
 <div style="background: &#10;#00FF00">-</div>
-!! result
+!! html
 <div style="background: &#10;#00FF00">-</div>
 
 !! end
@@ -12278,9 +12516,9 @@ Expansion of multi-line templates in attribute values (bug 6255 sanity check 2)
 ###
 !! test
 Parser hook: empty input
-!! input
+!! wikitext
 <tag></tag>
-!! result
+!! html
 <pre>
 ''
 array (
@@ -12291,9 +12529,9 @@ array (
 
 !! test
 Parser hook: empty input using terminated empty elements
-!! input
+!! wikitext
 <tag/>
-!! result
+!! html
 <pre>
 NULL
 array (
@@ -12304,9 +12542,9 @@ array (
 
 !! test
 Parser hook: empty input using terminated empty elements (space before)
-!! input
+!! wikitext
 <tag />
-!! result
+!! html
 <pre>
 NULL
 array (
@@ -12317,9 +12555,9 @@ array (
 
 !! test
 Parser hook: basic input
-!! input
+!! wikitext
 <tag>input</tag>
-!! result
+!! html
 <pre>
 'input'
 array (
@@ -12331,9 +12569,9 @@ array (
 
 !! test
 Parser hook: case insensitive
-!! input
+!! wikitext
 <TAG>input</TAG>
-!! result
+!! html
 <pre>
 'input'
 array (
@@ -12345,9 +12583,9 @@ array (
 
 !! test
 Parser hook: case insensitive, redux
-!! input
+!! wikitext
 <TaG>input</TAg>
-!! result
+!! html
 <pre>
 'input'
 array (
@@ -12360,9 +12598,9 @@ array (
 Parser hook: nested tags
 !! options
 noxml
-!! input
+!! wikitext
 <tag><tag></tag></tag>
-!! result
+!! html
 <pre>
 '<tag>'
 array (
@@ -12373,9 +12611,9 @@ array (
 
 !! test
 Parser hook: basic arguments
-!! input
+!! wikitext
 <tag width=200 height = "100" depth = '50' square></tag>
-!! result
+!! html
 <pre>
 ''
 array (
@@ -12390,9 +12628,9 @@ array (
 
 !! test
 Parser hook: argument containing a forward slash (bug 5344)
-!! input
+!! wikitext
 <tag filename='/tmp/bla'></tag>
-!! result
+!! html
 <pre>
 ''
 array (
@@ -12404,9 +12642,9 @@ array (
 
 !! test
 Parser hook: empty input using terminated empty elements (bug 2374)
-!! input
+!! wikitext
 <tag foo=bar/>text
-!! result
+!! html
 <pre>
 NULL
 array (
@@ -12419,11 +12657,11 @@ array (
 # </tag> should be output literally since there is no matching tag that begins it
 !! test
 Parser hook: basic arguments using terminated empty elements (bug 2374)
-!! input
+!! wikitext
 <tag width=200 height = "100" depth = '50' square/>
 other stuff
 </tag>
-!! result
+!! html
 <pre>
 NULL
 array (
@@ -12444,10 +12682,10 @@ array (
 
 !! test
 Parser hook: static parser hook not inside a comment
-!! input
+!! wikitext
 <statictag>hello, world</statictag>
 <statictag action=flush/>
-!! result
+!! html
 <p>hello, world
 </p>
 !! end
@@ -12455,10 +12693,10 @@ Parser hook: static parser hook not inside a comment
 
 !! test
 Parser hook: static parser hook inside a comment
-!! input
+!! wikitext
 <!-- <statictag>hello, world</statictag> -->
 <statictag action=flush/>
-!! result
+!! html
 <p><br />
 </p>
 !! end
@@ -12480,9 +12718,9 @@ Template:Map-one-parameter
 
 !! test
 Nested template calls
-!! input
+!! wikitext
 {{Map-one-parameter|One-parameter|param}}
-!! result
+!! html
 <p>(My parameter is: param)
 </p>
 !! end
@@ -12493,45 +12731,45 @@ Nested template calls
 ###
 !! test
 Sanitizer: Closing of open tags
-!! input
+!! wikitext
 <s></s><table></table>
-!! result
+!! html
 <s></s><table></table>
 
 !! end
 
 !! test
 Sanitizer: Closing of open but not closed tags
-!! input
+!! wikitext
 <s>foo
-!! result
+!! html
 <p><s>foo</s>
 </p>
 !! end
 
 !! test
 Sanitizer: Closing of closed but not open tags
-!! input
+!! wikitext
 </s>
-!! result
+!! html
 <p>&lt;/s&gt;
 </p>
 !! end
 
 !! test
 Sanitizer: Closing of closed but not open table tags
-!! input
+!! wikitext
 Table not started</td></tr></table>
-!! result
+!! html
 <p>Table not started&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
 </p>
 !! end
 
 !! test
 Sanitizer: Escaping of spaces, multibyte characters, colons & other stuff in id=""
-!! input
+!! wikitext
 <span id="æ: v">byte</span>[[#æ: v|backlink]]
-!! result
+!! html
 <p><span id=".C3.A6:_v">byte</span><a href="#.C3.A6:_v">backlink</a>
 </p>
 !! end
@@ -12540,9 +12778,9 @@ Sanitizer: Escaping of spaces, multibyte characters, colons & other stuff in id=
 Sanitizer: Validating the contents of the id attribute (bug 4515)
 !! options
 disabled
-!! input
+!! wikitext
 <br id=9 />
-!! result
+!! html
 Something, but definitely not <br id="9" />...
 !! end
 
@@ -12550,15 +12788,15 @@ Something, but definitely not <br id="9" />...
 Sanitizer: Validating id attribute uniqueness (bug 4515, bug 6301)
 !! options
 disabled
-!! input
+!! wikitext
 <br id="foo" /><br id="foo" />
-!! result
+!! html
 Something need to be done. foo-2 ? 
 !! end
 
 !! test
 Sanitizer: Validating that <meta> and <link> work, but only for Microdata
-!! input
+!! wikitext
 <div itemscope>
        <meta itemprop="hello" content="world">
        <meta http-equiv="refresh" content="5">
@@ -12567,7 +12805,7 @@ Sanitizer: Validating that <meta> and <link> work, but only for Microdata
        <link rel="stylesheet" href="{{SERVER}}">
        <link rel="stylesheet" itemprop="hello" href="{{SERVER}}">
 </div>
-!! result
+!! html
 <div itemscope="itemscope">
 <p>    <meta itemprop="hello" content="world" />
        &lt;meta http-equiv="refresh" content="5"&gt;
@@ -12584,7 +12822,7 @@ Sanitizer: Validating that <meta> and <link> work, but only for Microdata
 Language converter: output gets cut off unexpectedly (bug 5757)
 !! options
 language=zh
-!! input
+!! wikitext
 this bit is safe: }-
 
 but if we add a conversion instance: -{zh-cn:xxx;zh-tw:yyy}-
@@ -12592,7 +12830,7 @@ but if we add a conversion instance: -{zh-cn:xxx;zh-tw:yyy}-
 then we get cut off here: }-
 
 all additional text is vanished
-!! result
+!! html
 <p>this bit is safe: }-
 </p><p>but if we add a conversion instance: xxx
 </p><p>then we get cut off here: }-
@@ -12603,10 +12841,10 @@ all additional text is vanished
 !! test
 Self closed html pairs (bug 5487)
 !! options
-!! input
+!! wikitext
 <center><font id="bug" />Centered text</center>
 <div><font id="bug2" />In div text</div>
-!! result
+!! html
 <center>&lt;font id="bug" /&gt;Centered text</center>
 <div>&lt;font id="bug2" /&gt;In div text</div>
 
@@ -12618,27 +12856,27 @@ Self closed html pairs (bug 5487)
 
 !! test
 Punctuation: nbsp before exclamation
-!! input
+!! wikitext
 C'est grave !
-!! result
+!! html
 <p>C'est grave&#160;!
 </p>
 !! end
 
 !! test
 Punctuation: CSS !important (bug 11874)
-!! input
+!! wikitext
 <div style="width:50% !important">important</div>
-!! result
+!! html
 <div style="width:50% !important">important</div>
 
 !!end
 
 !! test
 Punctuation: CSS ! important (bug 11874; with space after)
-!! input
+!! wikitext
 <div style="width:50% ! important">important</div>
-!! result
+!! html
 <div style="width:50% ! important">important</div>
 
 !!end
@@ -12646,12 +12884,12 @@ Punctuation: CSS ! important (bug 11874; with space after)
 
 !! test
 HTML bullet list, closed tags (bug 5497)
-!! input
+!! wikitext
 <ul>
 <li>One</li>
 <li>Two</li>
 </ul>
-!! result
+!! html
 <ul>
 <li>One</li>
 <li>Two</li>
@@ -12663,12 +12901,12 @@ HTML bullet list, closed tags (bug 5497)
 HTML bullet list, unclosed tags (bug 5497)
 !! options
 disabled
-!! input
+!! wikitext
 <ul>
 <li>One
 <li>Two
 </ul>
-!! result
+!! html
 <ul>
 <li>One
 </li>
@@ -12680,12 +12918,12 @@ disabled
 
 !! test
 HTML ordered list, closed tags (bug 5497)
-!! input
+!! wikitext
 <ol>
 <li>One</li>
 <li>Two</li>
 </ol>
-!! result
+!! html
 <ol>
 <li>One</li>
 <li>Two</li>
@@ -12697,12 +12935,12 @@ HTML ordered list, closed tags (bug 5497)
 HTML ordered list, unclosed tags (bug 5497)
 !! options
 disabled
-!! input
+!! wikitext
 <ol>
 <li>One
 <li>Two
 </ol>
-!! result
+!! html
 <ol>
 <li>One
 </li>
@@ -12714,7 +12952,7 @@ disabled
 
 !! test
 HTML nested bullet list, closed tags (bug 5497)
-!! input
+!! wikitext
 <ul>
 <li>One</li>
 <li>Two:
@@ -12724,7 +12962,7 @@ HTML nested bullet list, closed tags (bug 5497)
 </ul>
 </li>
 </ul>
-!! result
+!! html
 <ul>
 <li>One</li>
 <li>Two:
@@ -12741,7 +12979,7 @@ HTML nested bullet list, closed tags (bug 5497)
 HTML nested bullet list, open tags (bug 5497)
 !! options
 disabled
-!! input
+!! wikitext
 <ul>
 <li>One
 <li>Two:
@@ -12750,7 +12988,7 @@ disabled
 <li>Sub-two
 </ul>
 </ul>
-!! result
+!! html
 <ul>
 <li>One
 </li>
@@ -12768,7 +13006,7 @@ disabled
 
 !! test
 HTML nested ordered list, closed tags (bug 5497)
-!! input
+!! wikitext
 <ol>
 <li>One</li>
 <li>Two:
@@ -12778,7 +13016,7 @@ HTML nested ordered list, closed tags (bug 5497)
 </ol>
 </li>
 </ol>
-!! result
+!! html
 <ol>
 <li>One</li>
 <li>Two:
@@ -12795,7 +13033,7 @@ HTML nested ordered list, closed tags (bug 5497)
 HTML nested ordered list, open tags (bug 5497)
 !! options
 disabled
-!! input
+!! wikitext
 <ol>
 <li>One
 <li>Two:
@@ -12804,7 +13042,7 @@ disabled
 <li>Sub-two
 </ol>
 </ol>
-!! result
+!! html
 <ol>
 <li>One
 </li>
@@ -12822,10 +13060,10 @@ disabled
 
 !! test
 HTML ordered list item with parameters oddity
-!! input
+!! wikitext
 <ol><li id="fragment">One</li>
 </ol>
-!! result
+!! html
 <ol><li id="fragment">One</li>
 </ol>
 
@@ -12833,7 +13071,7 @@ HTML ordered list item with parameters oddity
 
 !!test
 bug 5918: autonumbering
-!! input
+!! wikitext
 [http://first/] [http://second] [ftp://ftp]
 
 ftp://inlineftp
@@ -12843,7 +13081,7 @@ ftp://inlineftp
 [mailto:enclosed@mail.tld]
 
 mailto:inline@mail.tld
-!! result
+!! html
 <p><a rel="nofollow" class="external autonumber" href="http://first/">[1]</a> <a rel="nofollow" class="external autonumber" href="http://second">[2]</a> <a rel="nofollow" class="external autonumber" href="ftp://ftp">[3]</a>
 </p><p><a rel="nofollow" class="external free" href="ftp://inlineftp">ftp://inlineftp</a>
 </p><p><a rel="nofollow" class="external text" href="mailto:enclosed@mail.tld">With target</a>
@@ -12860,10 +13098,10 @@ mailto:inline@mail.tld
 
 !! test
 Fuzz testing: Parser13
-!! input
+!! wikitext
 {| 
 | http://a|
-!! result
+!! html
 <table>
 <tr>
 <td>
@@ -12875,10 +13113,10 @@ Fuzz testing: Parser13
 
 !! test
 Fuzz testing: Parser14
-!! input
+!! wikitext
 == onmouseover= ==
 http://__TOC__
-!! result
+!! html
 <h2><span class="mw-headline" id="onmouseover.3D">onmouseover=</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: onmouseover=">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 http://<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
@@ -12891,10 +13129,10 @@ http://<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 
 !! test
 Fuzz testing: Parser14-table
-!! input
+!! wikitext
 ==a==
 {| STYLE=__TOC__
-!! result
+!! html
 <h2><span class="mw-headline" id="a">a</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: a">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <table style="&#95;_TOC&#95;_">
 <tr><td></td></tr>
@@ -12907,10 +13145,10 @@ Fuzz testing: Parser14-table
 Fuzz testing: Parser16
 !! options
 noxml
-!! input
+!! wikitext
 {|
 !https://||||||
-!! result
+!! html
 <table>
 <tr>
 <th>https://</th>
@@ -12925,11 +13163,11 @@ noxml
 
 !! test
 Fuzz testing: Parser21
-!! input
+!! wikitext
 {|
 ! irc://{{ftp://a" onmouseover="alert('hello world');"
 |
-!! result
+!! html
 <table>
 <tr>
 <th> <a rel="nofollow" class="external free" href="irc://{{ftp://a">irc://{{ftp://a</a>" onmouseover="alert('hello world');"
@@ -12943,11 +13181,11 @@ Fuzz testing: Parser21
 
 !! test
 Fuzz testing: Parser22
-!! input
+!! wikitext
 http://===r:::https://b
 
 {|
-!!result
+!! html
 <p><a rel="nofollow" class="external free" href="http://===r:::https://b">http://===r:::https://b</a>
 </p>
 <table>
@@ -12961,7 +13199,7 @@ http://===r:::https://b
 Fuzz testing: Parser24
 !! options
 noxml
-!! input
+!! wikitext
 {|
 {{{|
 <u CLASS=
@@ -12970,7 +13208,7 @@ noxml
 
 MOVE YOUR MOUSE CURSOR OVER THIS TEXT
 |
-!! result
+!! html
 <table>
 {{{|
 <u class="&#124;">}}}} &gt;
@@ -12995,13 +13233,13 @@ MOVE YOUR MOUSE CURSOR OVER THIS TEXT
 # }}}blah" onmouseover="alert('hello world');" align="left"<b>MOVE MOUSE CURSOR OVER HERE</b>
 !!test
 Fuzz testing: Parser25 (bug 6055)
-!! input
+!! wikitext
 {{{
 | 
 <LI CLASS=||
  >
 }}}blah" onmouseover="alert('hello world');" align="left"'''MOVE MOUSE CURSOR OVER HERE
-!! result
+!! html
 <p>&lt;LI CLASS=blah" onmouseover="alert('hello world');" align="left"<b>MOVE MOUSE CURSOR OVER HERE</b>
 </p>
 !! end
@@ -13009,9 +13247,9 @@ Fuzz testing: Parser25 (bug 6055)
 !!test
 Fuzz testing: URL adjacent extension (with space, clean)
 !! options
-!! input
+!! wikitext
 http://example.com <nowiki>junk</nowiki>
-!! result
+!! html
 <p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a> junk
 </p>
 !!end
@@ -13019,9 +13257,9 @@ http://example.com <nowiki>junk</nowiki>
 !!test
 Fuzz testing: URL adjacent extension (no space, dirty; nowiki)
 !! options
-!! input
+!! wikitext
 http://example.com<nowiki>junk</nowiki>
-!! result
+!! html
 <p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>junk
 </p>
 !!end
@@ -13029,27 +13267,27 @@ http://example.com<nowiki>junk</nowiki>
 !!test
 Fuzz testing: URL adjacent extension (no space, dirty; pre)
 !! options
-!! input
+!! wikitext
 http://example.com<pre>junk</pre>
-!! result
+!! html
 <a rel="nofollow" class="external free" href="http://example.com">http://example.com</a><pre>junk</pre>
 
 !!end
 
 !!test
 Fuzz testing: image with bogus manual thumbnail
-!!input
+!! wikitext
 [[Image:foobar.jpg|thumbnail= ]]
-!!result
+!! html
 <div class="thumb tright"><div class="thumbinner" style="width:182px;">Error creating thumbnail:   <div class="thumbcaption"></div></div></div>
 
 !!end
 
 !! test
 Fuzz testing: encoded newline in generated HTML replacements (bug 6577)
-!! input
+!! wikitext
 <pre dir="&#10;"></pre>
-!! result
+!! html
 <pre dir="&#10;"></pre>
 
 !! end
@@ -13057,7 +13295,7 @@ Fuzz testing: encoded newline in generated HTML replacements (bug 6577)
 !! test
 Parsing optional HTML elements (Bug 6171)
 !! options
-!! input
+!! wikitext
 <table>
   <tr>
     <td> Some tabular data</td>
@@ -13065,7 +13303,7 @@ Parsing optional HTML elements (Bug 6171)
     <td> And yet som tabular data</td>
   </tr>
 </table>
-!! result
+!! html
 <table>
   <tr>
     <td> Some tabular data</td>
@@ -13079,7 +13317,7 @@ Parsing optional HTML elements (Bug 6171)
 !! test
 Correct handling of <td>, <tr> (Bug 6171)
 !! options
-!! input
+!! wikitext
 <table>
   <tr>
     <td> Some tabular data</td>
@@ -13087,7 +13325,7 @@ Correct handling of <td>, <tr> (Bug 6171)
     <td> And yet som tabular data</td>
   </tr>
 </table>
-!! result
+!! html
 <table>
   <tr>
     <td> Some tabular data</td>
@@ -13101,20 +13339,20 @@ Correct handling of <td>, <tr> (Bug 6171)
 
 !! test
 Parsing crashing regression (fr:JavaScript)
-!! input
+!! wikitext
 </body></x>
-!! result
+!! html
 <p>&lt;/body&gt;&lt;/x&gt;
 </p>
 !! end
 
 !! test
 Inline wiki vs wiki block nesting
-!! input
+!! wikitext
 '''Bold paragraph
 
 New wiki paragraph
-!! result
+!! html
 <p><b>Bold paragraph</b>
 </p><p>New wiki paragraph
 </p>
@@ -13124,11 +13362,11 @@ New wiki paragraph
 Inline HTML vs wiki block nesting
 !! options
 disabled
-!! input
+!! wikitext
 <b>Bold paragraph
 
 New wiki paragraph
-!! result
+!! html
 <p><b>Bold paragraph</b>
 </p><p>New wiki paragraph
 </p>
@@ -13143,9 +13381,9 @@ New wiki paragraph
 !!test
 Mixing markup for italics and bold
 !! options
-!! input
+!! wikitext
 '''bold''''''bold''bolditalics'''''
-!! result
+!! html
 <p>'<i>bold'</i><b>bold<i>bolditalics</i></b>
 </p>
 !! end
@@ -13160,66 +13398,66 @@ Article for special page transclusion test
 !! test
 Special page transclusion
 !! options
-!! input
+!! wikitext
 {{Special:Prefixindex/Xyzzyx}}
-!! result
-<table id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
+!! html
+<table class="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
 
 !! end
 
 !! test
 Special page transclusion twice (bug 5021)
 !! options
-!! input
+!! wikitext
 {{Special:Prefixindex/Xyzzyx}}
 {{Special:Prefixindex/Xyzzyx}}
-!! result
-<table id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
-<table id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
+!! html
+<table class="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
+<table class="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
 
 !! end
 
 !! test
 Transclusion of default MediaWiki message
-!! input
+!! wikitext
 {{MediaWiki:Mainpage}}
-!!result
+!! html
 <p>Main Page
 </p>
 !! end
 
 !! test
 Transclusion of nonexistent MediaWiki message
-!! input
+!! wikitext
 {{MediaWiki:Mainpagexxx}}
-!!result
+!! html
 <p><a href="/index.php?title=MediaWiki:Mainpagexxx&amp;action=edit&amp;redlink=1" class="new" title="MediaWiki:Mainpagexxx (page does not exist)">MediaWiki:Mainpagexxx</a>
 </p>
 !! end
 
 !! test
 Transclusion of MediaWiki message with underscore
-!! input
+!! wikitext
 {{MediaWiki:history_short}}
-!! result
+!! html
 <p>History
 </p>
 !! end
 
 !! test
 Transclusion of MediaWiki message with space
-!! input
+!! wikitext
 {{MediaWiki:history short}}
-!! result
+!! html
 <p>History
 </p>
 !! end
 
 !! test
 Invalid header with following text
-!! input
+!! wikitext
 = x = y
-!! result
+!! html
 <p>= x = y
 </p>
 !! end
@@ -13229,7 +13467,7 @@ Invalid header with following text
 Section extraction test (section 0)
 !! options
 section=0
-!! input
+!! wikitext
 start
 ==a==
 ===aa===
@@ -13241,7 +13479,7 @@ start
 ===bc===
 ==c==
 ===ca===
-!! result
+!! html
 start
 !! end
 
@@ -13249,7 +13487,7 @@ start
 Section extraction test (section 1)
 !! options
 section=1
-!! input
+!! wikitext
 start
 ==a==
 ===aa===
@@ -13261,7 +13499,7 @@ start
 ===bc===
 ==c==
 ===ca===
-!! result
+!! html
 ==a==
 ===aa===
 ====aaa====
@@ -13271,7 +13509,7 @@ start
 Section extraction test (section 2)
 !! options
 section=2
-!! input
+!! wikitext
 start
 ==a==
 ===aa===
@@ -13283,7 +13521,7 @@ start
 ===bc===
 ==c==
 ===ca===
-!! result
+!! html
 ===aa===
 ====aaa====
 !! end
@@ -13292,7 +13530,7 @@ start
 Section extraction test (section 3)
 !! options
 section=3
-!! input
+!! wikitext
 start
 ==a==
 ===aa===
@@ -13304,7 +13542,7 @@ start
 ===bc===
 ==c==
 ===ca===
-!! result
+!! html
 ====aaa====
 !! end
 
@@ -13312,7 +13550,7 @@ start
 Section extraction test (section 4)
 !! options
 section=4
-!! input
+!! wikitext
 start
 ==a==
 ===aa===
@@ -13324,7 +13562,7 @@ start
 ===bc===
 ==c==
 ===ca===
-!! result
+!! html
 ==b==
 ===ba===
 ===bb===
@@ -13336,7 +13574,7 @@ start
 Section extraction test (section 5)
 !! options
 section=5
-!! input
+!! wikitext
 start
 ==a==
 ===aa===
@@ -13348,7 +13586,7 @@ start
 ===bc===
 ==c==
 ===ca===
-!! result
+!! html
 ===ba===
 !! end
 
@@ -13356,7 +13594,7 @@ start
 Section extraction test (section 6)
 !! options
 section=6
-!! input
+!! wikitext
 start
 ==a==
 ===aa===
@@ -13368,7 +13606,7 @@ start
 ===bc===
 ==c==
 ===ca===
-!! result
+!! html
 ===bb===
 ====bba====
 !! end
@@ -13377,7 +13615,7 @@ start
 Section extraction test (section 7)
 !! options
 section=7
-!! input
+!! wikitext
 start
 ==a==
 ===aa===
@@ -13389,7 +13627,7 @@ start
 ===bc===
 ==c==
 ===ca===
-!! result
+!! html
 ====bba====
 !! end
 
@@ -13397,7 +13635,7 @@ start
 Section extraction test (section 8)
 !! options
 section=8
-!! input
+!! wikitext
 start
 ==a==
 ===aa===
@@ -13409,7 +13647,7 @@ start
 ===bc===
 ==c==
 ===ca===
-!! result
+!! html
 ===bc===
 !! end
 
@@ -13417,7 +13655,7 @@ start
 Section extraction test (section 9)
 !! options
 section=9
-!! input
+!! wikitext
 start
 ==a==
 ===aa===
@@ -13429,7 +13667,7 @@ start
 ===bc===
 ==c==
 ===ca===
-!! result
+!! html
 ==c==
 ===ca===
 !! end
@@ -13438,7 +13676,7 @@ start
 Section extraction test (section 10)
 !! options
 section=10
-!! input
+!! wikitext
 start
 ==a==
 ===aa===
@@ -13450,7 +13688,7 @@ start
 ===bc===
 ==c==
 ===ca===
-!! result
+!! html
 ===ca===
 !! end
 
@@ -13458,7 +13696,7 @@ start
 Section extraction test (nonexistent section 11)
 !! options
 section=11
-!! input
+!! wikitext
 start
 ==a==
 ===aa===
@@ -13470,18 +13708,18 @@ start
 ===bc===
 ==c==
 ===ca===
-!! result
+!! html
 !! end
 
 !! test
 Section extraction test with bogus heading (section 1)
 !! options
 section=1
-!! input
+!! wikitext
 ==a==
 ==bogus== not a legal section
 ==b==
-!! result
+!! html
 ==a==
 ==bogus== not a legal section
 !! end
@@ -13490,11 +13728,11 @@ section=1
 Section extraction test with bogus heading (section 2)
 !! options
 section=2
-!! input
+!! wikitext
 ==a==
 ==bogus== not a legal section
 ==b==
-!! result
+!! html
 ==b==
 !! end
 
@@ -13502,11 +13740,11 @@ section=2
 Section extraction test with comment after heading (section 1)
 !! options
 section=1
-!! input
+!! wikitext
 ==a==
 ==b== <!-- -->
 ==c==
-!! result
+!! html
 ==a==
 !! end
 
@@ -13514,11 +13752,11 @@ section=1
 Section extraction test with comment after heading (section 2)
 !! options
 section=2
-!! input
+!! wikitext
 ==a==
 ==b== <!-- -->
 ==c==
-!! result
+!! html
 ==b== <!-- -->
 !! end
 
@@ -13526,11 +13764,11 @@ section=2
 Section extraction test with bogus <nowiki> heading (section 1)
 !! options
 section=1
-!! input
+!! wikitext
 ==a==
 ==bogus== <nowiki>not a legal section</nowiki>
 ==b==
-!! result
+!! html
 ==a==
 ==bogus== <nowiki>not a legal section</nowiki>
 !! end
@@ -13539,11 +13777,11 @@ section=1
 Section extraction test with bogus <nowiki> heading (section 2)
 !! options
 section=2
-!! input
+!! wikitext
 ==a==
 ==bogus== <nowiki>not a legal section</nowiki>
 ==b==
-!! result
+!! html
 ==b==
 !! end
 
@@ -13554,10 +13792,10 @@ section=2
 Section extraction prefixed by comment (section 1)
 !! options
 section=1
-!! input
+!! wikitext
 <!-- -->==sec1==
 ==sec2==
-!!result
+!! html
 ==sec2==
 !!end
 
@@ -13565,10 +13803,10 @@ section=1
 Section extraction prefixed by comment (section 2)
 !! options
 section=2
-!! input
+!! wikitext
 <!-- -->==sec1==
 ==sec2==
-!!result
+!! html
 
 !!end
 
@@ -13579,14 +13817,14 @@ section=2
 Section extraction, mixed wiki and html (section 1)
 !! options
 section=1
-!! input
+!! wikitext
 <h2>unmarked</h2>
 unmarked
 ==1==
 one
 ==2==
 two
-!! result
+!! html
 ==1==
 one
 !! end
@@ -13595,14 +13833,14 @@ one
 Section extraction, mixed wiki and html (section 2)
 !! options
 section=2
-!! input
+!! wikitext
 <h2>unmarked</h2>
 unmarked
 ==1==
 one
 ==2==
 two
-!! result
+!! html
 ==2==
 two
 !! end
@@ -13613,10 +13851,10 @@ two
 Section extraction, heading surrounded by <noinclude>
 !! options
 section=1
-!! input
+!! wikitext
 <noinclude>==unmarked==</noinclude>
 ==marked==
-!! result
+!! html
 ==marked==
 !!end
 
@@ -13625,13 +13863,13 @@ section=1
 Sectiion with all-equals
 !! options
 section=2
-!! input
+!! wikitext
 === 
 The line above must have a trailing space
 === <!--
 --> <!-- -->
 But just in case it doesn't...
-!! result
+!! html
 === <!--
 --> <!-- -->
 But just in case it doesn't...
@@ -13641,7 +13879,7 @@ But just in case it doesn't...
 Section replacement test (section 0)
 !! options
 replace=0,"xxx"
-!! input
+!! wikitext
 start
 ==a==
 ===aa===
@@ -13653,7 +13891,7 @@ start
 ===bc===
 ==c==
 ===ca===
-!! result
+!! html
 xxx
 
 ==a==
@@ -13672,7 +13910,7 @@ xxx
 Section replacement test (section 1)
 !! options
 replace=1,"xxx"
-!! input
+!! wikitext
 start
 ==a==
 ===aa===
@@ -13684,7 +13922,7 @@ start
 ===bc===
 ==c==
 ===ca===
-!! result
+!! html
 start
 xxx
 
@@ -13701,7 +13939,7 @@ xxx
 Section replacement test (section 2)
 !! options
 replace=2,"xxx"
-!! input
+!! wikitext
 start
 ==a==
 ===aa===
@@ -13713,7 +13951,7 @@ start
 ===bc===
 ==c==
 ===ca===
-!! result
+!! html
 start
 ==a==
 xxx
@@ -13731,7 +13969,7 @@ xxx
 Section replacement test (section 3)
 !! options
 replace=3,"xxx"
-!! input
+!! wikitext
 start
 ==a==
 ===aa===
@@ -13743,7 +13981,7 @@ start
 ===bc===
 ==c==
 ===ca===
-!! result
+!! html
 start
 ==a==
 ===aa===
@@ -13762,7 +14000,7 @@ xxx
 Section replacement test (section 4)
 !! options
 replace=4,"xxx"
-!! input
+!! wikitext
 start
 ==a==
 ===aa===
@@ -13774,7 +14012,7 @@ start
 ===bc===
 ==c==
 ===ca===
-!! result
+!! html
 start
 ==a==
 ===aa===
@@ -13789,7 +14027,7 @@ xxx
 Section replacement test (section 5)
 !! options
 replace=5,"xxx"
-!! input
+!! wikitext
 start
 ==a==
 ===aa===
@@ -13801,7 +14039,7 @@ start
 ===bc===
 ==c==
 ===ca===
-!! result
+!! html
 start
 ==a==
 ===aa===
@@ -13820,7 +14058,7 @@ xxx
 Section replacement test (section 6)
 !! options
 replace=6,"xxx"
-!! input
+!! wikitext
 start
 ==a==
 ===aa===
@@ -13832,7 +14070,7 @@ start
 ===bc===
 ==c==
 ===ca===
-!! result
+!! html
 start
 ==a==
 ===aa===
@@ -13850,7 +14088,7 @@ xxx
 Section replacement test (section 7)
 !! options
 replace=7,"xxx"
-!! input
+!! wikitext
 start
 ==a==
 ===aa===
@@ -13862,7 +14100,7 @@ start
 ===bc===
 ==c==
 ===ca===
-!! result
+!! html
 start
 ==a==
 ===aa===
@@ -13881,7 +14119,7 @@ xxx
 Section replacement test (section 8)
 !! options
 replace=8,"xxx"
-!! input
+!! wikitext
 start
 ==a==
 ===aa===
@@ -13893,7 +14131,7 @@ start
 ===bc===
 ==c==
 ===ca===
-!! result
+!! html
 start
 ==a==
 ===aa===
@@ -13912,7 +14150,7 @@ xxx
 Section replacement test (section 9)
 !! options
 replace=9,"xxx"
-!! input
+!! wikitext
 start
 ==a==
 ===aa===
@@ -13924,7 +14162,7 @@ start
 ===bc===
 ==c==
 ===ca===
-!! result
+!! html
 start
 ==a==
 ===aa===
@@ -13941,7 +14179,7 @@ xxx
 Section replacement test (section 10)
 !! options
 replace=10,"xxx"
-!! input
+!! wikitext
 start
 ==a==
 ===aa===
@@ -13953,7 +14191,7 @@ start
 ===bc===
 ==c==
 ===ca===
-!! result
+!! html
 start
 ==a==
 ===aa===
@@ -13971,11 +14209,11 @@ xxx
 Section replacement test with initial whitespace (bug 13728)
 !! options
 replace=2,"xxx"
-!! input
+!! wikitext
  Preformatted initial line
 ==a==
 ===a===
-!! result
+!! html
  Preformatted initial line
 ==a==
 xxx
@@ -13986,10 +14224,10 @@ xxx
 Section extraction, heading followed by pre with 20 spaces (bug 6398)
 !! options
 section=1
-!! input
+!! wikitext
 ==a==
                     a
-!! result
+!! html
 ==a==
                     a
 !! end
@@ -13998,10 +14236,10 @@ section=1
 Section extraction, heading followed by pre with 19 spaces (bug 6398 sanity check)
 !! options
 section=1
-!! input
+!! wikitext
 ==a==
                    a
-!! result
+!! html
 ==a==
                    a
 !! end
@@ -14011,7 +14249,7 @@ section=1
 Section extraction, <pre> around bogus header (bug 10309)
 !! options
 noxml section=2
-!! input
+!! wikitext
 == Section One ==
 <pre>
 =======
@@ -14019,7 +14257,7 @@ noxml section=2
 
 == Section Two ==
 stuff
-!! result
+!! html
 == Section Two ==
 stuff
 !! end
@@ -14028,7 +14266,7 @@ stuff
 Section replacement, <pre> around bogus header (bug 10309)
 !! options
 noxml replace=2,"xxx"
-!! input
+!! wikitext
 == Section One ==
 <pre>
 =======
@@ -14036,7 +14274,7 @@ noxml replace=2,"xxx"
 
 == Section Two ==
 stuff
-!! result
+!! html
 == Section One ==
 <pre>
 =======
@@ -14049,9 +14287,9 @@ xxx
 
 !! test
 Handling of &#x0A; in URLs
-!! input
+!! wikitext
 **irc://&#x0A;a
-!! result
+!! html
 <ul>
 <li><ul>
 <li><a rel="nofollow" class="external free" href="irc://%0Aa">irc://%0Aa</a>
@@ -14062,30 +14300,21 @@ Handling of &#x0A; in URLs
 
 !!end
 
-!! test
-5 quotes, code coverage +1 line (php)
-!! options
-php
-!! input
-'''''
-!! result
-!! end
 # The PHP parser strips the empty tags out for giggles; parsoid doesn't.
 !! test
-5 quotes, code coverage +1 line (parsoid)
-!! options
-parsoid
-!! input
+5 quotes, code coverage +1 line
+!! wikitext
 '''''
-!! result
+!! html/php
+!! html/parsoid
 <p><b><i></i></b></p>
 !! end
 
 !! test
 Special:Search page linking.
-!! input
+!! wikitext
 {{Special:search}}
-!! result
+!! html
 <p><a href="/wiki/Special:Search" title="Special:Search">Special:Search</a>
 </p>
 !! end
@@ -14094,7 +14323,7 @@ Special:Search page linking.
 Say the magic word
 !! options
 title=[[Parser test]]
-!! input
+!! wikitext
 * {{PAGENAME}}
 * {{PAGENAMEE}}
 * {{FULLPAGENAME}}
@@ -14117,7 +14346,7 @@ title=[[Parser test]]
 * {{SUBJECTSPACE}}
 * {{SUBJECTSPACEE}}
 * {{Dynamic|{{NUMBEROFUSERS}}|{{NUMBEROFPAGES}}|{{CURRENTVERSION}}|{{CONTENTLANGUAGE}}|{{DIRECTIONMARK}}|{{CURRENTTIMESTAMP}}|{{NUMBEROFARTICLES}}}}
-!! result
+!! html
 <ul>
 <li> Parser test
 </li>
@@ -14170,7 +14399,7 @@ title=[[Parser test]]
 
 !! test
 Gallery
-!! input
+!! wikitext
 <gallery>
 image1.png |
 image2.gif|||||
@@ -14181,7 +14410,7 @@ image4    |300px| centre
 [[x|xx]]]]
 * image6
 </gallery>
-!! result
+!! html
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
                        <div class="thumb" style="height: 150px;">Image1.png</div>
@@ -14225,7 +14454,7 @@ image4    |300px| centre
 
 !! test
 Gallery (with options)
-!! input
+!! wikitext
 <gallery widths='70px' heights='40px' perrow='2' caption='Foo [[Main Page]]' >
 File:Nonexistant.jpg|caption
 File:Nonexistant.jpg
@@ -14233,7 +14462,7 @@ image:foobar.jpg|some '''caption''' [[Main Page]]
 image:foobar.jpg
 image:foobar.jpg|Blabla|alt=This is a foo-bar.|blabla.
 </gallery>
-!! result
+!! html
 <ul class="gallery mw-gallery-traditional" style="max-width: 226px;_width: 226px;">
        <li class='gallerycaption'>Foo <a href="/wiki/Main_Page" title="Main Page">Main Page</a></li>
                <li class="gallerybox" style="width: 105px"><div style="width: 105px">
@@ -14273,12 +14502,12 @@ image:foobar.jpg|Blabla|alt=This is a foo-bar.|blabla.
 
 !! test
 Gallery with wikitext inside caption
-!! input
+!! wikitext
 <gallery>
 File:foobar.jpg|[[File:foobar.jpg|20px|desc|alt=inneralt]]|alt=galleryalt
 File:foobar.jpg|{{Test|unamedParam|alt=param}}|alt=galleryalt
 </gallery>
-!! result
+!! html
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
                        <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
@@ -14300,14 +14529,14 @@ File:foobar.jpg|{{Test|unamedParam|alt=param}}|alt=galleryalt
 
 !! test
 gallery (with showfilename option)
-!! input
+!! wikitext
 <gallery showfilename>
 File:Nonexistant.jpg|caption
 File:Nonexistant.jpg
 image:foobar.jpg|some '''caption''' [[Main Page]]
 File:Foobar.jpg
 </gallery>
-!! result
+!! html
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
                        <div class="thumb" style="height: 150px;">Nonexistant.jpg</div>
@@ -14345,14 +14574,14 @@ some <b>caption</b> <a href="/wiki/Main_Page" title="Main Page">Main Page</a>
 
 !! test
 Gallery (with namespace-less filenames)
-!! input
+!! wikitext
 <gallery>
 File:Nonexistant.jpg
 Nonexistant.jpg
 image:foobar.jpg
 foobar.jpg
 </gallery>
-!! result
+!! html
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
                        <div class="thumb" style="height: 150px;">Nonexistant.jpg</div>
@@ -14380,163 +14609,172 @@ foobar.jpg
 
 !! test
 HTML Hex character encoding (spells the word "JavaScript")
-!! input
+!! wikitext
 &#x4A;&#x061;&#x0076;&#x00061;&#x000053;&#x0000063;&#114;&#x0000069;&#00000112;&#x0000000074;
-!! result
+!! html
 <p>&#x4a;&#x61;&#x76;&#x61;&#x53;&#x63;&#114;&#x69;&#112;&#x74;
 </p>
 !! end
 
 !! test
 HTML Hex character encoding bogus encoding (bug 26437 regression check)
-!! input
+!! wikitext
 &#xsee;&#XSEE;
-!! result
+!! html
 <p>&amp;#xsee;&amp;#XSEE;
 </p>
 !! end
 
 !! test
 HTML Hex character encoding mixed case
-!! input
+!! wikitext
 &#xEE;&#Xee;
-!! result
+!! html
 <p>&#xee;&#xee;
 </p>
 !! end
 
 !! test
 __FORCETOC__ override
-!! input
+!! wikitext
 __NEWSECTIONLINK__
 __FORCETOC__
-!! result
+!! html
 <p><br />
 </p>
 !! end
 
 !! test
 ISBN code coverage
-!! input
+!! wikitext
 ISBN  978-0-1234-56&#x20;789
-!! result
+!! html
 <p><a href="/wiki/Special:BookSources/9780123456" class="internal mw-magiclink-isbn">ISBN 978-0-1234-56</a>&#x20;789
 </p>
 !! end
 
 !! test
 ISBN followed by 5 spaces
-!! input
+!! wikitext
 ISBN    
-!! result
+!! html
 <p>ISBN    
 </p>
 !! end
 
 !! test
 Double ISBN
-!! input
+!! wikitext
 ISBN ISBN 1234567890
-!! result
+!! html
 <p>ISBN <a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1234567890</a>
 </p>
 !! end
 
+!! test
+ISBN with an X
+!! wikitext
+ISBN 3-462-04561-X
+!! html
+<p><a href="/wiki/Special:BookSources/346204561X" class="internal mw-magiclink-isbn">ISBN 3-462-04561-X</a>
+</p>
+!! end
+
 !! test
 Bug 22905: <abbr> followed by ISBN followed by </a>
-!! input
+!! wikitext
 <abbr>(fr)</abbr> ISBN 2753300917 [http://www.example.com example.com]
-!! result
+!! html
 <p><abbr>(fr)</abbr> <a href="/wiki/Special:BookSources/2753300917" class="internal mw-magiclink-isbn">ISBN 2753300917</a> <a rel="nofollow" class="external text" href="http://www.example.com">example.com</a>
 </p>
 !! end
 
 !! test
 Double RFC
-!! input
+!! wikitext
 RFC RFC 1234
-!! result
+!! html
 <p>RFC <a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc1234">RFC 1234</a>
 </p>
 !! end
 
 !! test
 Double RFC with a wiki link
-!! input
+!! wikitext
 RFC [[RFC 1234]]
-!! result
+!! html
 <p>RFC <a href="/index.php?title=RFC_1234&amp;action=edit&amp;redlink=1" class="new" title="RFC 1234 (page does not exist)">RFC 1234</a>
 </p>
 !! end
 
 !! test
 RFC code coverage
-!! input
+!! wikitext
 RFC   983&#x20;987
-!! result
+!! html
 <p><a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc983">RFC 983</a>&#x20;987
 </p>
 !! end
 
 !! test
 Centre-aligned image
-!! input
+!! wikitext
 [[Image:foobar.jpg|centre]]
-!! result
+!! html
 <div class="center"><div class="floatnone"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div></div>
 
 !!end
 
 !! test
 None-aligned image
-!! input
+!! wikitext
 [[Image:foobar.jpg|none]]
-!! result
+!! html
 <div class="floatnone"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
 
 !!end
 
 !! test
 Width + Height sized image (using px) (height is ignored)
-!! input
+!! wikitext
 [[Image:foobar.jpg|640x480px]]
-!! result
+!! html
 <p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg" width="640" height="73" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/960px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/1280px-Foobar.jpg 2x" /></a>
 </p>
 !!end
 
 !! test
 Width-sized image (using px, no following whitespace)
-!! input
+!! wikitext
 [[Image:foobar.jpg|640px]]
-!! result
+!! html
 <p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg" width="640" height="73" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/960px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/1280px-Foobar.jpg 2x" /></a>
 </p>
 !!end
 
 !! test
 Width-sized image (using px, with following whitespace - test regression from r39467)
-!! input
+!! wikitext
 [[Image:foobar.jpg|640px ]]
-!! result
+!! html
 <p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg" width="640" height="73" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/960px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/1280px-Foobar.jpg 2x" /></a>
 </p>
 !!end
 
 !! test
 Width-sized image (using px, with preceding whitespace - test regression from r39467)
-!! input
+!! wikitext
 [[Image:foobar.jpg| 640px]]
-!! result
+!! html
 <p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg" width="640" height="73" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/960px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/1280px-Foobar.jpg 2x" /></a>
 </p>
 !!end
 
 !! test
 Another italics / bold test
-!! input
+!! wikitext
  ''' ''x'
-!! result
+!! html
 <pre>'<i> </i>x'
 </pre>
 !!end
@@ -14548,9 +14786,9 @@ Another italics / bold test
 dt/dd/dl test
 !! options
 disabled
-!! input
+!! wikitext
 :;;;::
-!! result
+!! html
 <dl>
 <dd><dl>
 <dt><dl>
@@ -14577,18 +14815,18 @@ disabled
 # Images with the "|" character in external URLs in comment tags; Eats half the comment, leaves unmatched "</a>" tag.
 !! test
 Images with the "|" character in the comment
-!! input
+!! wikitext
 [[image:Foobar.jpg|thumb|An [http://test/?param1=|left|&param2=|x external] URL]]
-!! result
+!! html
 <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"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>An <a rel="nofollow" class="external text" href="http://test/?param1=%7Cleft%7C&amp;param2=%7Cx">external</a> URL</div></div></div>
 
 !!end
 
 !! test
 [Before] HTML without raw HTML enabled ($wgRawHtml==false)
-!! input
+!! wikitext
 <html><script>alert(1);</script></html>
-!! result
+!! html
 <p>&lt;html&gt;&lt;script&gt;alert(1);&lt;/script&gt;&lt;/html&gt;
 </p>
 !! end
@@ -14597,9 +14835,9 @@ Images with the "|" character in the comment
 HTML with raw HTML ($wgRawHtml==true)
 !! options
 wgRawHtml=1
-!! input
+!! wikitext
 <html><script>alert(1);</script></html>
-!! result
+!! html
 <p><script>alert(1);</script>
 </p>
 !! end
@@ -14608,9 +14846,9 @@ wgRawHtml=1
 Parents of subpages, one level up
 !! options
 subpage title=[[Subpage test/L1/L2/L3]]
-!! input
+!! wikitext
 [[../|L2]]
-!! result
+!! html
 <p><a href="/index.php?title=Subpage_test/L1/L2&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1/L2 (page does not exist)">L2</a>
 </p>
 !! end
@@ -14620,9 +14858,9 @@ subpage title=[[Subpage test/L1/L2/L3]]
 Parents of subpages, one level up, not named
 !! options
 subpage title=[[Subpage test/L1/L2/L3]]
-!! input
+!! wikitext
 [[../]]
-!! result
+!! html
 <p><a href="/index.php?title=Subpage_test/L1/L2&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1/L2 (page does not exist)">Subpage test/L1/L2</a>
 </p>
 !! end
@@ -14633,11 +14871,11 @@ subpage title=[[Subpage test/L1/L2/L3]]
 Parents of subpages, two levels up
 !! options
 subpage title=[[Subpage test/L1/L2/L3]]
-!! input
+!! wikitext
 [[../../|L1]]2
 
 [[../../|L1]]l
-!! result
+!! html
 <p><a href="/index.php?title=Subpage_test/L1&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1 (page does not exist)">L1</a>2
 </p><p><a href="/index.php?title=Subpage_test/L1&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1 (page does not exist)">L1l</a>
 </p>
@@ -14647,9 +14885,9 @@ subpage title=[[Subpage test/L1/L2/L3]]
 Parents of subpages, two levels up, without trailing slash or name.
 !! options
 subpage title=[[Subpage test/L1/L2/L3]]
-!! input
+!! wikitext
 [[../..]]
-!! result
+!! html
 <p>[[../..]]
 </p>
 !! end
@@ -14658,9 +14896,9 @@ subpage title=[[Subpage test/L1/L2/L3]]
 Parents of subpages, two levels up, with lots of extra trailing slashes.
 !! options
 subpage title=[[Subpage test/L1/L2/L3]]
-!! input
+!! wikitext
 [[../../////]]
-!! result
+!! html
 <p><a href="/index.php?title=Subpage_test/L1////&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1//// (page does not exist)">///</a>
 </p>
 !! end
@@ -14675,9 +14913,9 @@ Sibling article
 Transclusion of a sibling page (one level up)
 !! options
 subpage title=[[Subpage test/L1/L2/L3]]
-!! input
+!! wikitext
 {{../L3Sibling}}
-!! result
+!! html
 <p>Sibling article
 </p>
 !! end
@@ -14686,9 +14924,9 @@ subpage title=[[Subpage test/L1/L2/L3]]
 Transclusion of a child page
 !! options
 subpage title=[[Subpage test/L1/L2]]
-!! input
+!! wikitext
 {{/L3Sibling}}
-!! result
+!! html
 <p>Sibling article
 </p>
 !! end
@@ -14697,20 +14935,20 @@ subpage title=[[Subpage test/L1/L2]]
 Non-transclusion because of too many up levels
 !! options
 subpage title=[[Subpage test/L1/L2/L3]]
-!! input
+!! wikitext
 {{../../../../More than parent}}
-!! result
+!! html
 <p>{{../../../../More than parent}}
 </p>
 !! end
 
 !! test
 Definition list code coverage
-!! input
+!! wikitext
 ; title   : def
 ; title : def
 ;title: def
-!! result
+!! html
 <dl>
 <dt> title  &#160;</dt>
 <dd> def
@@ -14727,27 +14965,27 @@ Definition list code coverage
 
 !! test
 Don't fall for the self-closing div
-!! input
+!! wikitext
 <div>hello world</div/>
-!! result
+!! html
 <div>hello world</div>
 
 !! end
 
 !! test
 MSGNW magic word
-!! input
+!! wikitext
 {{MSGNW:msg}}
-!! result
+!! html
 <p>&#91;&#91;:Template:Msg&#93;&#93;
 </p>
 !! end
 
 !! test
 RAW magic word
-!! input
+!! wikitext
 {{RAW:QUERTY}}
-!! result
+!! html
 <p><a href="/index.php?title=Template:QUERTY&amp;action=edit&amp;redlink=1" class="new" title="Template:QUERTY (page does not exist)">Template:QUERTY</a>
 </p>
 !! end
@@ -14755,19 +14993,19 @@ RAW magic word
 # This isn't needed for XHTML conformance, but would be handy as a fallback security measure
 !! test
 Always escape literal '>' in output, not just after '<'
-!! input
+!! wikitext
 ><>
-!! result
+!! html
 <p>&gt;&lt;&gt;
 </p>
 !! end
 
 !! test
 Template caching
-!! input
+!! wikitext
 {{Test}}
 {{Test}}
-!! result
+!! html
 <p>This is a test template
 This is a test template
 </p>
@@ -14782,9 +15020,9 @@ MediaWiki:Fake
 
 !! test
 Inclusion of !userCanEdit() content
-!! input
+!! wikitext
 {{MediaWiki:Fake}}
-!! result
+!! html
 <h2><span class="mw-headline" id="header">header</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=MediaWiki:Fake&amp;action=edit&amp;section=T-1" title="MediaWiki:Fake">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
@@ -14792,14 +15030,14 @@ Inclusion of !userCanEdit() content
 
 !! test
 Out-of-order TOC heading levels
-!! input
+!! wikitext
 ==2==
 ======6======
 ===3===
 =1=
 =====5=====
 ==2==
-!! result
+!! html
 <div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#2"><span class="tocnumber">1</span> <span class="toctext">2</span></a>
@@ -14829,9 +15067,9 @@ Out-of-order TOC heading levels
 
 !! test
 ISBN with a dummy number
-!! input
+!! wikitext
 ISBN ---
-!! result
+!! html
 <p>ISBN ---
 </p>
 !! end
@@ -14839,9 +15077,9 @@ ISBN ---
 
 !! test
 ISBN with space-delimited number
-!! input
+!! wikitext
 ISBN 92 9017 032 8
-!! result
+!! html
 <p><a href="/wiki/Special:BookSources/9290170328" class="internal mw-magiclink-isbn">ISBN 92 9017 032 8</a>
 </p>
 !! end
@@ -14849,9 +15087,9 @@ ISBN 92 9017 032 8
 
 !! test
 ISBN with multiple spaces, no number
-!! input
+!! wikitext
 ISBN  foo
-!! result
+!! html
 <p>ISBN  foo
 </p>
 !! end
@@ -14859,13 +15097,13 @@ ISBN  foo
 
 !! test
 ISBN length
-!! input
+!! wikitext
 ISBN 123456789
 
 ISBN 1234567890
 
 ISBN 12345678901
-!! result
+!! html
 <p>ISBN 123456789
 </p><p><a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1234567890</a>
 </p><p>ISBN 12345678901
@@ -14875,11 +15113,11 @@ ISBN 12345678901
 
 !! test
 ISBN with trailing year (bug 8110)
-!! input
+!! wikitext
 ISBN 1-234-56789-0 - 2006
 
 ISBN 1 234 56789 0 - 2006
-!! result
+!! html
 <p><a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1-234-56789-0</a> - 2006
 </p><p><a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1 234 56789 0</a> - 2006
 </p>
@@ -14888,47 +15126,47 @@ ISBN 1 234 56789 0 - 2006
 
 !! test
 anchorencode
-!! input
+!! wikitext
 {{anchorencode:foo bar©#%n}}
-!! result
+!! html
 <p>foo_bar.C2.A9.23.25n
 </p>
 !! end
 
 !! test
 anchorencode trims spaces
-!! input
+!! wikitext
 {{anchorencode: __pretty__please__}}
-!! result
+!! html
 <p>pretty_please
 </p>
 !! end
 
 !! test
 anchorencode deals with links
-!! input
+!! wikitext
 {{anchorencode: [[hello|world]] [[hi]]}}
-!! result
+!! html
 <p>world_hi
 </p>
 !! end
 
 !! test
 anchorencode deals with templates
-!! input
+!! wikitext
 {{anchorencode: {{Foo}} }}
-!! result
+!! html
 <p>FOO
 </p>
 !! end
 
 !! test
 anchorencode encodes like the TOC generator: (bug 18431)
-!! input
+!! wikitext
 === _ +:.3A%3A&&amp;]] ===
 {{anchorencode: _ +:.3A%3A&&amp;]] }}
 __NOEDITSECTION__
-!! result
+!! html
 <h3><span class="mw-headline" id=".2B:.3A.253A.26.26.5D.5D">_ +:.3A%3A&amp;&amp;]]</span></h3>
 <p>.2B:.3A.253A.26.26.5D.5D
 </p>
@@ -14936,7 +15174,7 @@ __NOEDITSECTION__
 
 !! test
 Bug 6200: blockquotes and paragraph formatting
-!! input
+!! wikitext
 <blockquote>
 foo
 </blockquote>
@@ -14944,7 +15182,7 @@ foo
 bar
 
  baz
-!! result
+!! html
 <blockquote>
 <p>foo
 </p>
@@ -14957,7 +15195,7 @@ bar
 
 !! test
 Bug 8293: Use of center tag ruins paragraph formatting
-!! input
+!! wikitext
 <center>
 foo
 </center>
@@ -14965,7 +15203,7 @@ foo
 bar
 
  baz
-!! result
+!! html
 <center>
 <p>foo
 </p>
@@ -14977,24 +15215,14 @@ bar
 !! end
 
 !!test
-Parsing of overlapping (improperly nested) inline html tags (PHP parser)
-!!options
-php
-!!input
+Parsing of overlapping (improperly nested) inline html tags
+!! wikitext
 <span><s>x</span></s>
-!!result
+!! html/php
 <p><span><s>x&lt;/span&gt;</s></span>
 </p>
-!!end
-
-!!test
-Parsing of overlapping (improperly nested) inline html tags (Parsoid)
-!!options
-parsoid
-!!input
-<span><s>x</span></s>
-!!result
-<p><span><s>x</s></span><s></s>
+!! html/parsoid
+<p><span><s>x</s></span>
 </p>
 !!end
 
@@ -15005,9 +15233,9 @@ parsoid
 Self-link in language variants
 !! options
 title=[[Dunav]] language=sr
-!! input
+!! wikitext
 Both [[Dunav]] and [[Дунав]] are names for this river.
-!! result
+!! html
 <p>Both <strong class="selflink">Dunav</strong> and <strong class="selflink">Дунав</strong> are names for this river.
 </p>
 !!end
@@ -15022,9 +15250,9 @@ content
 Link to another existing title shouldn't be parsed as self-link even if it's a variant of this title
 !! options
 title=[[Duna]] language=sr
-!! input
+!! wikitext
 [[Дуна]] is not a self-link while [[Duna]] and [[Dуна]] are still self-links.
-!! result
+!! html
 <p><a href="/wiki/%D0%94%D1%83%D0%BD%D0%B0" title="Дуна">Дуна</a> is not a self-link while <strong class="selflink">Duna</strong> and <strong class="selflink">Dуна</strong> are still self-links.
 </p>
 !! end
@@ -15033,9 +15261,9 @@ title=[[Duna]] language=sr
 Link to a section of a variant of this title shouldn't be parsed as self-link
 !! options
 title=[[Duna]] language=sr
-!! input
+!! wikitext
 [[Dуна]] is a self-link while [[Dunа#Foo]] and [[Dуна#Foo]] are not self-links.
-!! result
+!! html
 <p><strong class="selflink">Dуна</strong> is a self-link while <a href="/wiki/%D0%94%D1%83%D0%BD%D0%B0" title="Дуна">Dunа#Foo</a> and <a href="/wiki/%D0%94%D1%83%D0%BD%D0%B0" title="Дуна">Dуна#Foo</a> are not self-links.
 </p>
 !! end
@@ -15044,9 +15272,9 @@ title=[[Duna]] language=sr
 Link to pages in language variants
 !! options
 language=sr
-!! input
+!! wikitext
 Main Page can be written as [[Маин Паге]]
-!! result
+!! html
 <p>Main Page can be written as <a href="/wiki/Main_Page" title="Main Page">Маин Паге</a>
 </p>
 !!end
@@ -15056,9 +15284,9 @@ Main Page can be written as [[Маин Паге]]
 Multiple links to pages in language variants
 !! options
 language=sr
-!! input
+!! wikitext
 [[Main Page]] can be written as [[Маин Паге]] same as [[Маин Паге]].
-!! result
+!! html
 <p><a href="/wiki/Main_Page" title="Main Page">Main Page</a> can be written as <a href="/wiki/Main_Page" title="Main Page">Маин Паге</a> same as <a href="/wiki/Main_Page" title="Main Page">Маин Паге</a>.
 </p>
 !!end
@@ -15068,9 +15296,9 @@ language=sr
 Simple template in language variants
 !! options
 language=sr
-!! input
+!! wikitext
 {{тест}}
-!! result
+!! html
 <p>This is a test template
 </p>
 !! end
@@ -15080,9 +15308,9 @@ language=sr
 Template with explicit namespace in language variants
 !! options
 language=sr
-!! input
+!! wikitext
 {{Template:тест}}
-!! result
+!! html
 <p>This is a test template
 </p>
 !! end
@@ -15092,9 +15320,9 @@ language=sr
 Basic test for template parameter in language variants
 !! options
 language=sr
-!! input
+!! wikitext
 {{парамтест|param=foo}}
-!! result
+!! html
 <p>This is a test template with parameter foo
 </p>
 !! end
@@ -15104,9 +15332,9 @@ language=sr
 Simple category in language variants
 !! options
 language=sr cat
-!! input
+!! wikitext
 [[Category:МедиаWики Усер'с Гуиде]]
-!! result
+!! html
 <a href="/wiki/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%98%D0%B0:MediaWiki_User%27s_Guide" title="Категорија:MediaWiki User's Guide">MediaWiki User's Guide</a>
 !! end
 
@@ -15127,9 +15355,9 @@ blah
 Don't convert blue categorylinks to another variant (bug 33210)
 !! options
 language=zh cat
-!! input
+!! wikitext
 [[A]][[Category:分类]]
-!! result
+!! html
 <a href="/wiki/Category:%E5%88%86%E7%B1%BB" title="Category:分类">分类</a>
 !! end
 
@@ -15138,9 +15366,9 @@ language=zh cat
 Stripping -{}- tags (language variants)
 !! options
 language=sr
-!! input
+!! wikitext
 Latin proverb: -{Ne nuntium necare}-
-!! result
+!! html
 <p>Latin proverb: Ne nuntium necare
 </p>
 !! end
@@ -15150,9 +15378,9 @@ Latin proverb: -{Ne nuntium necare}-
 Prevent conversion with -{}- tags (language variants)
 !! options
 language=sr variant=sr-ec
-!! input
+!! wikitext
 Latinski: -{Ne nuntium necare}-
-!! result
+!! html
 <p>Латински: Ne nuntium necare
 </p>
 !! end
@@ -15162,9 +15390,9 @@ Latinski: -{Ne nuntium necare}-
 Prevent conversion of text with -{}- tags (language variants)
 !! options
 language=sr variant=sr-ec
-!! input
+!! wikitext
 Latinski: -{Ne nuntium necare}-
-!! result
+!! html
 <p>Латински: Ne nuntium necare
 </p>
 !! end
@@ -15174,9 +15402,9 @@ Latinski: -{Ne nuntium necare}-
 Prevent conversion of links with -{}- tags (language variants)
 !! options
 language=sr variant=sr-ec
-!! input
+!! wikitext
 -{[[Main Page]]}-
-!! result
+!! html
 <p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>
 </p>
 !! end
@@ -15186,9 +15414,9 @@ language=sr variant=sr-ec
 -{}- tags within headlines (within html for parserConvert())
 !! options
 language=sr variant=sr-ec
-!! input
+!! wikitext
 == -{Naslov}- ==
-!! result
+!! html
 <h2><span class="mw-headline" id="-.7BNaslov.7D-">Naslov</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="Уредите одељак „Naslov“">уреди</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
@@ -15198,9 +15426,9 @@ language=sr variant=sr-ec
 Explicit definition of language variant alternatives
 !! options
 language=zh variant=zh-tw
-!! input
+!! wikitext
 -{zh:China;zh-tw:Taiwan}-, not China
-!! result
+!! html
 <p>Taiwan, not China
 </p>
 !! end
@@ -15210,10 +15438,10 @@ language=zh variant=zh-tw
 Conversion around HTML tags
 !! options
 language=sr variant=sr-ec
-!! input
+!! wikitext
 -{H|span=>sr-ec:script;title=>sr-ec:src;}-
 <span title="La-{sr-el:L;sr-ec:C;}-tin">ski</span>
-!! result
+!! html
 <p>
 <span title="ЛаCтин">ски</span>
 </p>
@@ -15224,12 +15452,12 @@ language=sr variant=sr-ec
 Explicit session-wise language variant mapping (A flag and - flag)
 !! options
 language=zh variant=zh-tw
-!! input
+!! wikitext
 Taiwan is not China.
 But -{A|zh:China;zh-tw:Taiwan}- is China,
 (This-{-|zh:China;zh-tw:Taiwan}- should be stripped!)
 and -{China}- is China.
-!! result
+!! html
 <p>Taiwan is not China.
 But Taiwan is Taiwan,
 (This should be stripped!)
@@ -15241,10 +15469,10 @@ and China is China.
 Explicit session-wise language variant mapping (H flag for hide)
 !! options
 language=zh variant=zh-tw
-!! input
+!! wikitext
 (This-{H|zh:China;zh-tw:Taiwan}- should be stripped!)
 Taiwan is China.
-!! result
+!! html
 <p>(This should be stripped!)
 Taiwan is Taiwan.
 </p>
@@ -15254,9 +15482,9 @@ Taiwan is Taiwan.
 Adding explicit conversion rule for title (T flag)
 !! options
 language=zh variant=zh-tw showtitle
-!! input
+!! wikitext
 Should be stripped-{T|zh:China;zh-tw:Taiwan}-!
-!! result
+!! html
 Taiwan
 <p>Should be stripped!
 </p>
@@ -15266,9 +15494,9 @@ Taiwan
 Testing that changing the language variant here in the tests actually works
 !! options
 language=zh variant=zh showtitle
-!! input
+!! wikitext
 Should be stripped-{T|zh:China;zh-tw:Taiwan}-!
-!! result
+!! html
 China
 <p>Should be stripped!
 </p>
@@ -15278,10 +15506,10 @@ China
 Recursive conversion of alt and title attrs shouldn't clear converter state
 !! options
 language=zh variant=zh-cn showtitle
-!! input
+!! wikitext
 -{H|zh-cn:Exclamation;zh-tw:exclamation;}-
 Should be stripped-{T|zh-cn:China;zh-tw:Taiwan}-<span title="exclamation">!</span>
-!! result
+!! html
 China
 <p>
 Should be stripped<span title="Exclamation">!</span>
@@ -15292,10 +15520,10 @@ Should be stripped<span title="Exclamation">!</span>
 Bug 24072: more test on conversion rule for title
 !! options
 language=zh variant=zh-tw showtitle
-!! input
+!! wikitext
 This should be stripped-{T|zh:China;zh-tw:Taiwan}-!
 This won't take interferes with the title rule-{H|zh:Beijing;zh-tw:Taipei}-.
-!! result
+!! html
 Taiwan
 <p>This should be stripped!
 This won't take interferes with the title rule.
@@ -15306,9 +15534,9 @@ This won't take interferes with the title rule.
 Partly disable title conversion if variant == main language code
 !! options
 language=zh variant=zh title=[[ZH]] showtitle
-!! input
+!! wikitext
 -{T|zh-cn:CN;zh-tw:TW}-
-!! result
+!! html
 ZH
 <p>
 </p>
@@ -15318,9 +15546,9 @@ ZH
 Partly disable title conversion if variant == main language code, more
 !! options
 language=zh variant=zh title=[[ZH]] showtitle
-!! input
+!! wikitext
 -{T|TW}-
-!! result
+!! html
 ZH
 <p>
 </p>
@@ -15330,9 +15558,9 @@ ZH
 Raw output of variant escape tags (R flag)
 !! options
 language=zh variant=zh-tw
-!! input
+!! wikitext
 Raw: -{R|zh:China;zh-tw:Taiwan}-
-!! result
+!! html
 <p>Raw: zh:China;zh-tw:Taiwan
 </p>
 !! end
@@ -15341,9 +15569,9 @@ Raw: -{R|zh:China;zh-tw:Taiwan}-
 Nested using of manual convert syntax
 !! options
 language=zh variant=zh-hk
-!! input
+!! wikitext
 Nested: -{zh-hans:Hi -{zh-cn:China;zh-sg:Singapore;}-;zh-hant:Hello -{zh-tw:Taiwan;zh-hk:H-{ong}- K-{}-ong;}-;}-!
-!! result
+!! html
 <p>Nested: Hello Hong Kong!
 </p>
 !! end
@@ -15352,7 +15580,7 @@ Nested: -{zh-hans:Hi -{zh-cn:China;zh-sg:Singapore;}-;zh-hant:Hello -{zh-tw:Taiw
 Proper conversion of text in external links
 !! options
 language=sr variant=sr-ec
-!! input
+!! wikitext
 http://www.google.com
 gopher://www.google.com
 [http://www.google.com http://www.google.com]
@@ -15360,7 +15588,7 @@ gopher://www.google.com
 [https://www.google.com irc://www.google.com]
 [ftp://www.google.com www.google.com/ftp://dir]
 [//www.google.com www.google.com]
-!! result
+!! html
 <p><a rel="nofollow" class="external free" href="http://www.google.com">http://www.google.com</a>
 <a rel="nofollow" class="external free" href="gopher://www.google.com">gopher://www.google.com</a>
 <a rel="nofollow" class="external free" href="http://www.google.com">http://www.google.com</a>
@@ -15375,9 +15603,9 @@ gopher://www.google.com
 Do not convert roman numbers to language variants
 !! options
 language=sr variant=sr-ec
-!! input
+!! wikitext
 Fridrih IV je car.
-!! result
+!! html
 <p>Фридрих IV је цар.
 </p>
 !! end
@@ -15386,9 +15614,9 @@ Fridrih IV je car.
 Unclosed language converter markup "-{"
 !! options
 language=sr
-!! input
+!! wikitext
 -{T|hello
-!! result
+!! html
 <p>-{T|hello
 </p>
 !! end
@@ -15397,9 +15625,9 @@ language=sr
 Don't convert raw rule "-{R|=&gt;}-" to "=>"
 !! options
 language=sr
-!! input
+!! wikitext
 -{R|=&gt;}-
-!! result
+!! html
 <p>=&gt;
 </p>
 !!end
@@ -15408,9 +15636,9 @@ language=sr
 Don't break link parsing if language converter markup is in the caption.
 !! options
 language=sr variant=sr-ec
-!! input
+!! wikitext
 [[Main Page|-{R|main page}-]]
-!! result
+!! html
 <p><a href="/wiki/Main_Page" title="Маин Паге">main page</a>
 </p>
 !! end
@@ -15421,9 +15649,9 @@ Don't break image parsing if language converter markup is in the caption.
 !! options
 language=sr
 disabled
-!! input
+!! wikitext
 [[File:Foobar.jpg|-{R|caption}-]]
-!! result
+!! html
 <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" /></a>
 </p>
 !! end
@@ -15434,9 +15662,9 @@ Don't break list handling if language converter markup is in the item.
 !! options
 language=zh variant=zh-cn
 disabled
-!! input
+!! wikitext
 ;-{zh-cn:AAA;zh-tw:BBB}-
-!! result
+!! html
 <dl><dt>AAA
 </dt></dl>
 
@@ -15448,12 +15676,12 @@ Don't break table handling if language converter markup is in the cell.
 !! options
 language=sr variant=sr-ec
 disabled
-!! input
+!! wikitext
 {|
 |-
 | -{R|B}-
 |}
-!! result
+!! html
 <table>
 
 <tr>
@@ -15464,9 +15692,9 @@ disabled
 
 !! test
 Bug 529: Uncovered bullet
-!! input
+!! wikitext
 * Foo {{bullet}}
-!! result
+!! html
 <ul>
 <li> Foo 
 </li>
@@ -15484,9 +15712,9 @@ Bug 529: Uncovered bullet
 # the expected output and your parser's output.
 !! test
 Bug 529: Uncovered bullet leaving empty list, normally removed by tidy
-!! input
+!! wikitext
 ******* Foo {{bullet}}
-!! result
+!! html
 <ul>
 <li><ul>
 <li><ul>
@@ -15516,12 +15744,12 @@ Bug 529: Uncovered bullet leaving empty list, normally removed by tidy
 
 !! test
 Bug 529: Uncovered table already at line-start
-!! input
+!! wikitext
 x
 
 {{table}}
 y
-!! result
+!! html
 <p>x
 </p>
 <table>
 
 !! test
 Bug 529: Uncovered bullet in parser function result
-!! input
+!! wikitext
 * Foo {{lc:{{bullet}} }}
-!! result
+!! html
 <ul>
 <li> Foo 
 </li>
@@ -15553,18 +15781,18 @@ Bug 529: Uncovered bullet in parser function result
 
 !! test
 Bug 5678: Double-parsed template argument
-!! input
+!! wikitext
 {{lc:{{{1}}}|hello}}
-!! result
+!! html
 <p>{{{1}}}
 </p>
 !! end
 
 !! test
 Bug 5678: Double-parsed template invocation
-!! input
+!! wikitext
 {{lc:{{paramtest {{!}} param = hello }} }}
-!! result
+!! html
 <p>{{paramtest | param = hello }}
 </p>
 !! end
@@ -15574,7 +15802,7 @@ Case insensitivity of parser functions for non-ASCII characters (bug 8143)
 !! options
 language=cs
 title=[[Main Page]]
-!! input
+!! wikitext
 {{PRVNÍVELKÉ:ěščř}}
 {{prvnívelké:ěščř}}
 {{PRVNÍMALÉ:ěščř}}
@@ -15583,7 +15811,7 @@ title=[[Main Page]]
 {{malá:ěščř}}
 {{VELKÁ:ěščř}}
 {{velká:ěščř}}
-!! result
+!! html
 <p>Ěščř
 Ěščř
 ěščř
@@ -15597,10 +15825,10 @@ title=[[Main Page]]
 
 !! test
 Morwen/13: Unclosed link followed by heading
-!! input
+!! wikitext
 [[link
 ==heading==
-!! result
+!! html
 <p>[[link
 </p>
 <h2><span class="mw-headline" id="heading">heading</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: heading">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
@@ -15609,10 +15837,10 @@ Morwen/13: Unclosed link followed by heading
 
 !! test
 HHP2.1: Heuristics for headings in preprocessor parenthetical structures
-!! input
+!! wikitext
 {{foo|
 =heading=
-!! result
+!! html
 <p>{{foo|
 </p>
 <h1><span class="mw-headline" id="heading">heading</span></h1>
@@ -15621,10 +15849,10 @@ HHP2.1: Heuristics for headings in preprocessor parenthetical structures
 
 !! test
 HHP2.2: Heuristics for headings in preprocessor parenthetical structures
-!! input
+!! wikitext
 {{foo|
 ==heading==
-!! result
+!! html
 <p>{{foo|
 </p>
 <h2><span class="mw-headline" id="heading">heading</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: heading">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
@@ -15635,19 +15863,19 @@ HHP2.2: Heuristics for headings in preprocessor parenthetical structures
 Tildes in comments
 !! options
 pst
-!! input
+!! wikitext
 <!-- ~~~~ -->
-!! result
+!! html
 <!-- ~~~~ -->
 !! end
 
 !! test
 Paragraphs inside divs (no extra line breaks)
-!! input
+!! wikitext
 <div>Line one
 
 Line two</div>
-!! result
+!! html
 <div>Line one
 Line two</div>
 
@@ -15655,12 +15883,12 @@ Line two</div>
 
 !! test
 Paragraphs inside divs (extra line break on open)
-!! input
+!! wikitext
 <div>
 Line one
 
 Line two</div>
-!! result
+!! html
 <div>
 <p>Line one
 </p>
@@ -15670,12 +15898,12 @@ Line two</div>
 
 !! test
 Paragraphs inside divs (extra line break on close)
-!! input
+!! wikitext
 <div>Line one
 
 Line two
 </div>
-!! result
+!! html
 <div>Line one
 <p>Line two
 </p>
@@ -15685,13 +15913,13 @@ Line two
 
 !! test
 Paragraphs inside divs (extra line break on open and close)
-!! input
+!! wikitext
 <div>
 Line one
 
 Line two
 </div>
-!! result
+!! html
 <div>
 <p>Line one
 </p><p>Line two
@@ -15704,10 +15932,10 @@ Line two
 Nesting tags, paragraphs on lines which begin with <div>
 !! options
 disabled
-!! input
+!! wikitext
 <div></div><strong>A
 B</strong>
-!! result
+!! html
 <div></div>
 <p><strong>A
 B</strong>
@@ -15717,11 +15945,11 @@ B</strong>
 # Bug 6200: <blockquote> should behave like <div> with respect to line breaks
 !! test
 Bug 6200: paragraphs inside blockquotes (no extra line breaks)
-!! input
+!! wikitext
 <blockquote>Line one
 
 Line two</blockquote>
-!! result
+!! html
 <blockquote>Line one
 Line two</blockquote>
 
@@ -15729,12 +15957,12 @@ Line two</blockquote>
 
 !! test
 Bug 6200: paragraphs inside blockquotes (extra line break on open)
-!! input
+!! wikitext
 <blockquote>
 Line one
 
 Line two</blockquote>
-!! result
+!! html
 <blockquote>
 <p>Line one
 </p>
@@ -15744,12 +15972,12 @@ Line two</blockquote>
 
 !! test
 Bug 6200: paragraphs inside blockquotes (extra line break on close)
-!! input
+!! wikitext
 <blockquote>Line one
 
 Line two
 </blockquote>
-!! result
+!! html
 <blockquote>Line one
 <p>Line two
 </p>
@@ -15759,13 +15987,13 @@ Line two
 
 !! test
 Bug 6200: paragraphs inside blockquotes (extra line break on open and close)
-!! input
+!! wikitext
 <blockquote>
 Line one
 
 Line two
 </blockquote>
-!! result
+!! html
 <blockquote>
 <p>Line one
 </p><p>Line two
@@ -15776,11 +16004,11 @@ Line two
 
 !! test
 Paragraphs inside blockquotes/divs (no extra line breaks)
-!! input
+!! wikitext
 <blockquote><div>Line one
 
 Line two</div></blockquote>
-!! result
+!! html
 <blockquote><div>Line one
 Line two</div></blockquote>
 
@@ -15788,12 +16016,12 @@ Line two</div></blockquote>
 
 !! test
 Paragraphs inside blockquotes/divs (extra line break on open)
-!! input
+!! wikitext
 <blockquote><div>
 Line one
 
 Line two</div></blockquote>
-!! result
+!! html
 <blockquote><div>
 <p>Line one
 </p>
@@ -15803,12 +16031,12 @@ Line two</div></blockquote>
 
 !! test
 Paragraphs inside blockquotes/divs (extra line break on close)
-!! input
+!! wikitext
 <blockquote><div>Line one
 
 Line two
 </div></blockquote>
-!! result
+!! html
 <blockquote><div>Line one
 <p>Line two
 </p>
@@ -15818,13 +16046,13 @@ Line two
 
 !! test
 Paragraphs inside blockquotes/divs (extra line break on open and close)
-!! input
+!! wikitext
 <blockquote><div>
 Line one
 
 Line two
 </div></blockquote>
-!! result
+!! html
 <blockquote><div>
 <p>Line one
 </p><p>Line two
@@ -15837,11 +16065,11 @@ Line two
 Interwiki links trounced by replaceExternalLinks after early LinkHolderArray expansion
 !! options
 wgLinkHolderBatchSize=0
-!! input
+!! wikitext
 [[meatball:1]]
 [[meatball:2]]
 [[meatball:3]]
-!! result
+!! html
 <p><a href="http://www.usemod.com/cgi-bin/mb.pl?1" class="extiw" title="meatball:1">meatball:1</a>
 <a href="http://www.usemod.com/cgi-bin/mb.pl?2" class="extiw" title="meatball:2">meatball:2</a>
 <a href="http://www.usemod.com/cgi-bin/mb.pl?3" class="extiw" title="meatball:3">meatball:3</a>
@@ -15850,9 +16078,9 @@ wgLinkHolderBatchSize=0
 
 !! test
 Free external link invading image caption
-!! input
+!! wikitext
 [[Image:Foobar.jpg|thumb|http://x|hello]]
-!! result
+!! html
 <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"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>hello</div></div></div>
 
 !! end
@@ -15861,54 +16089,54 @@ Free external link invading image caption
 Bug 15196: localised external link numbers
 !! options
 language=fa
-!! input
+!! wikitext
 [http://en.wikipedia.org/]
-!! result
+!! html
 <p><a rel="nofollow" class="external autonumber" href="http://en.wikipedia.org/">[۱]</a>
 </p>
 !! end
 
 !! test
 Multibyte character in padleft
-!! input
+!! wikitext
 {{padleft:-Hello|7|Æ}}
-!! result
+!! html
 <p>Æ-Hello
 </p>
 !! end
 
 !! test
 Multibyte character in padright
-!! input
+!! wikitext
 {{padright:Hello-|7|Æ}}
-!! result
+!! html
 <p>Hello-Æ
 </p>
 !! end
 
 !!test
 formatdate parser function
-!!input
+!! wikitext
 {{#formatdate:2009-03-24}}
-!! result
+!! html
 <p><span class="mw-formatted-date" title="2009-03-24">2009-03-24</span>
 </p>
 !! end
 
 !!test
 formatdate parser function, with default format
-!!input
+!! wikitext
 {{#formatdate:2009-03-24|mdy}}
-!! result
+!! html
 <p><span class="mw-formatted-date" title="2009-03-24">March 24, 2009</span>
 </p>
 !! end
 
 !! test
 Spacing of numbers in formatted dates
-!! input
+!! wikitext
 {{#formatdate:January 15}}
-!! result
+!! html
 <p><span class="mw-formatted-date" title="01-15">January 15</span>
 </p>
 !! end
@@ -15917,9 +16145,9 @@ Spacing of numbers in formatted dates
 formatdate parser function, with default format and on a page of which the content language is always English and different from the wiki content language
 !! options
 language=nl title=[[MediaWiki:Common.css]]
-!! input
+!! wikitext
 {{#formatdate:2009-03-24|dmy}}
-!! result
+!! html
 <p><span class="mw-formatted-date" title="2009-03-24">24 March 2009</span>
 </p>
 !! end
@@ -15936,9 +16164,9 @@ language=nl title=[[MediaWiki:Common.css]]
 Edit comment with link
 !! options
 comment
-!! input
+!! wikitext
 I like the [[Main Page]] a lot
-!! result
+!! html
 I like the <a href="/wiki/Main_Page" title="Main Page">Main Page</a> a lot
 !!end
 
@@ -15946,9 +16174,9 @@ I like the <a href="/wiki/Main_Page" title="Main Page">Main Page</a> a lot
 Edit comment with link and link text
 !! options
 comment
-!! input
+!! wikitext
 I like the [[Main Page|best pages]] a lot
-!! result
+!! html
 I like the <a href="/wiki/Main_Page" title="Main Page">best pages</a> a lot
 !!end
 
@@ -15956,9 +16184,9 @@ I like the <a href="/wiki/Main_Page" title="Main Page">best pages</a> a lot
 Edit comment with link and link text with suffix
 !! options
 comment
-!! input
+!! wikitext
 I like the [[Main Page|best page]]s a lot
-!! result
+!! html
 I like the <a href="/wiki/Main_Page" title="Main Page">best pages</a> a lot
 !!end
 
@@ -15966,9 +16194,9 @@ I like the <a href="/wiki/Main_Page" title="Main Page">best pages</a> a lot
 Edit comment with section link (non-local, eg in history list)
 !! options
 comment title=[[Main Page]]
-!! input
+!! wikitext
 /* External links */ removed bogus entries
-!! result
+!! html
 <a href="/wiki/Main_Page#External_links" title="Main Page">→</a>‎<span dir="auto"><span class="autocomment">External links: </span> removed bogus entries</span>
 !!end
 
@@ -15976,9 +16204,9 @@ comment title=[[Main Page]]
 Edit comment with section link and text before it (non-local, eg in history list)
 !! options
 comment title=[[Main Page]]
-!! input
+!! wikitext
 pre-comment text /* External links */ removed bogus entries
-!! result
+!! html
 pre-comment text <a href="/wiki/Main_Page#External_links" title="Main Page">→</a>‎<span dir="auto"><span class="autocomment">External links: </span> removed bogus entries</span>
 !!end
 
@@ -15986,9 +16214,9 @@ pre-comment text <a href="/wiki/Main_Page#External_links" title="Main Page">→<
 Edit comment with section link (local, eg in diff view)
 !! options
 comment local title=[[Main Page]]
-!! input
+!! wikitext
 /* External links */ removed bogus entries
-!! result
+!! html
 <a href="#External_links">→</a>‎<span dir="auto"><span class="autocomment">External links: </span> removed bogus entries</span>
 !!end
 
@@ -15998,9 +16226,9 @@ Edit comment with subpage link (bug 14080)
 comment
 subpage
 title=[[Subpage test]]
-!! input
+!! wikitext
 Poked at a [[/subpage]] here...
-!! result
+!! html
 Poked at a <a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">/subpage</a> here...
 !!end
 
@@ -16010,9 +16238,9 @@ Edit comment with subpage link and link text (bug 14080)
 comment
 subpage
 title=[[Subpage test]]
-!! input
+!! wikitext
 Poked at a [[/subpage|neat little page]] here...
-!! result
+!! html
 Poked at a <a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">neat little page</a> here...
 !!end
 
@@ -16021,9 +16249,9 @@ Edit comment with bogus subpage link in non-subpage NS (bug 14080)
 !! options
 comment
 title=[[Subpage test]]
-!! input
+!! wikitext
 Poked at a [[/subpage]] here...
-!! result
+!! html
 Poked at a <a href="/index.php?title=/subpage&amp;action=edit&amp;redlink=1" class="new" title="/subpage (page does not exist)">/subpage</a> here...
 !!end
 
@@ -16033,9 +16261,9 @@ Edit comment with bare anchor link (local, as on diff)
 comment
 local
 title=[[Main Page]]
-!!input
+!! wikitext
 [[#section]]
-!! result
+!! html
 <a href="#section">#section</a>
 !! end
 
@@ -16044,26 +16272,26 @@ Edit comment with bare anchor link (non-local, as on history)
 !! options
 comment
 title=[[Main Page]]
-!!input
+!! wikitext
 [[#section]]
-!! result
+!! html
 <a href="/wiki/Main_Page#section" title="Main Page">#section</a>
 !! end
 
 !! test
 Anchor starting with underscore
-!!input
+!! wikitext
 [[#_ref|One]]
-!! result
+!! html
 <p><a href="#_ref">One</a>
 </p>
 !! end
 
 !! test
 Id starting with underscore
-!!input
+!! wikitext
 <div id="_ref"></div>
-!! result
+!! html
 <div id="_ref"></div>
 
 !! end
@@ -16073,9 +16301,9 @@ Space normalisation on autocomment (bug 22784)
 !! options
 comment
 title=[[Main Page]]
-!!input
+!! wikitext
 /* __hello__world__ */
-!! result
+!! html
 <a href="/wiki/Main_Page#hello_world" title="Main Page">→</a>‎<span dir="auto"><span class="autocomment">__hello__world__</span></span>
 !! end
 
@@ -16083,9 +16311,9 @@ title=[[Main Page]]
 percent-encoding and + signs in comments (Bug 26410)
 !! options
 comment
-!!input
+!! wikitext
 [[ABC%33D% ++]] [[ABC%33D% ++|+%20]]
-!! result
+!! html
 <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
 
@@ -16093,20 +16321,20 @@ comment
 Bad images - basic functionality
 !! options
 disabled
-!! input
+!! wikitext
 [[File:Bad.jpg]]
-!! result
+!! html
 !! end
 
 !! test
 Bad images - bug 16039: text after bad image disappears
 !! options
 disabled
-!! input
+!! wikitext
 Foo bar
 [[File:Bad.jpg]]
 Bar foo
-!! result
+!! html
 <p>Foo bar
 </p><p>Bar foo
 </p>
@@ -16119,9 +16347,9 @@ showtitle
 !! config
 wgAllowDisplayTitle=true
 wgRestrictDisplayTitle=false
-!! input
+!! wikitext
 this is not the the title
-!! result
+!! html
 Parser test
 <p>this is not the the title
 </p>
@@ -16135,10 +16363,10 @@ title=[[Screen]]
 !! config
 wgAllowDisplayTitle=true
 wgRestrictDisplayTitle=false
-!! input
+!! wikitext
 this is not the the title
 {{DISPLAYTITLE:whatever}}
-!! result
+!! html
 whatever
 <p>this is not the the title
 </p>
@@ -16152,10 +16380,10 @@ title=[[Screen]]
 !! config
 wgAllowDisplayTitle=true
 wgRestrictDisplayTitle=true
-!! input
+!! wikitext
 this is not the the title
 {{DISPLAYTITLE:whatever}}
-!! result
+!! html
 Screen
 <p>this is not the the title
 </p>
@@ -16169,10 +16397,10 @@ title=[[Screen]]
 !! config
 wgAllowDisplayTitle=true
 wgRestrictDisplayTitle=true
-!! input
+!! wikitext
 this is not the the title
 {{DISPLAYTITLE:screen}}
-!! result
+!! html
 screen
 <p>this is not the the title
 </p>
@@ -16185,10 +16413,10 @@ showtitle
 title=[[Screen]]
 !! config
 wgAllowDisplayTitle=false
-!! input
+!! wikitext
 this is not the the title
 {{DISPLAYTITLE:screen}}
-!! result
+!! html
 Screen
 <p>this is not the the title
 <a href="/index.php?title=Template:DISPLAYTITLE:screen&amp;action=edit&amp;redlink=1" class="new" title="Template:DISPLAYTITLE:screen (page does not exist)">Template:DISPLAYTITLE:screen</a>
@@ -16202,9 +16430,9 @@ showtitle
 title=[[Screen]]
 !! config
 wgAllowDisplayTitle=false
-!! input
+!! wikitext
 this is not the the title
-!! result
+!! html
 Screen
 <p>this is not the the title
 </p>
@@ -16218,10 +16446,10 @@ title=[[Screen]]
 !! config
 wgAllowDisplayTitle=true
 wgRestrictDisplayTitle=true
-!! input
+!! wikitext
 this is not the the title
 {{DISPLAYTITLE:<span style="display: none;">s</span>creen}}
-!! result
+!! html
 <span style="/* attempt to bypass $wgRestrictDisplayTitle */">s</span>creen
 <p>this is not the the title
 </p>
@@ -16235,10 +16463,10 @@ title=[[Screen]]
 !! config
 wgAllowDisplayTitle=true
 wgRestrictDisplayTitle=true
-!! input
+!! wikitext
 this is not the the title
 {{DISPLAYTITLE:<span style="color: red;">s</span>creen}}
-!! result
+!! html
 <span style="color: red;">s</span>creen
 <p>this is not the the title
 </p>
@@ -16248,9 +16476,9 @@ this is not the the title
 preload: check <noinclude> and <includeonly>
 !! options
 preload
-!! input
+!! wikitext
 Hello <noinclude>cruel</noinclude><includeonly>kind</includeonly> world.
-!! result
+!! html
 Hello kind world.
 !! end
 
@@ -16258,9 +16486,9 @@ Hello kind world.
 preload: check <onlyinclude>
 !! options
 preload
-!! input
+!! wikitext
 Goodbye <onlyinclude>Hello world</onlyinclude>
-!! result
+!! html
 Hello world
 !! end
 
@@ -16268,9 +16496,9 @@ Hello world
 preload: can pass tags through if we want to
 !! options
 preload
-!! input
+!! wikitext
 <includeonly><</includeonly>includeonly>Hello world<includeonly><</includeonly>/includeonly>
-!! result
+!! html
 <includeonly>Hello world</includeonly>
 !! end
 
@@ -16278,9 +16506,9 @@ preload
 preload: check that it doesn't try to do tricks
 !! options
 preload
-!! input
+!! wikitext
 * <!-- Hello --> ''{{world}}'' {{<includeonly>subst:</includeonly>How are you}}{{ {{{|safesubst:}}} #if:1|2|3}}
-!! result
+!! html
 * <!-- Hello --> ''{{world}}'' {{subst:How are you}}{{ {{{|safesubst:}}} #if:1|2|3}}
 !! end
 
@@ -16288,12 +16516,12 @@ preload
 Play a bit with r67090 and bug 3158
 !! options
 disabled
-!! input
+!! wikitext
 <div style="width:50% !important">&nbsp;</div>
 <div style="width:50%&nbsp;!important">&nbsp;</div>
 <div style="width:50%&#160;!important">&nbsp;</div>
 <div style="border : solid;">&nbsp;</div>
-!! result
+!! html
 <div style="width:50% !important">&nbsp;</div>
 <div style="width:50% !important">&nbsp;</div>
 <div style="width:50% !important">&nbsp;</div>
@@ -16303,10 +16531,10 @@ disabled
 
 !! test
 HTML5 data attributes
-!! input
+!! wikitext
 <span data-foo="bar">Baz</span>
 <p data-abc-def_hij="">Quuz</p>
-!! result
+!! html
 <p><span data-foo="bar">Baz</span>
 </p>
 <p data-abc-def_hij="">Quuz</p>
@@ -16315,12 +16543,12 @@ HTML5 data attributes
 
 !! test
 percent-encoding and + signs in internal links (Bug 26410)
-!! input
+!! wikitext
 [[User:+%]] [[Page+title%]]
 [[%+]] [[%+|%20]] [[%+ ]] [[%+r]]
 [[%]] [[+]] [[image:%+abc%39|foo|[[bar]]]]
 [[%33%45]] [[%33%45+]]
-!! result
+!! html
 <p><a href="/index.php?title=User:%2B%25&amp;action=edit&amp;redlink=1" class="new" title="User:+% (page does not exist)">User:+%</a> <a href="/index.php?title=Page%2Btitle%25&amp;action=edit&amp;redlink=1" class="new" title="Page+title% (page does not exist)">Page+title%</a>
 <a href="/index.php?title=%25%2B&amp;action=edit&amp;redlink=1" class="new" title="%+ (page does not exist)">%+</a> <a href="/index.php?title=%25%2B&amp;action=edit&amp;redlink=1" class="new" title="%+ (page does not exist)">%20</a> <a href="/index.php?title=%25%2B&amp;action=edit&amp;redlink=1" class="new" title="%+ (page does not exist)">%+ </a> <a href="/index.php?title=%25%2Br&amp;action=edit&amp;redlink=1" class="new" title="%+r (page does not exist)">%+r</a>
 <a href="/index.php?title=%25&amp;action=edit&amp;redlink=1" class="new" title="% (page does not exist)">%</a> <a href="/index.php?title=%2B&amp;action=edit&amp;redlink=1" class="new" title="+ (page does not exist)">+</a> <a href="/index.php?title=Special:Upload&amp;wpDestFile=%25%2Babc9" class="new" title="File:%+abc9">bar</a>
@@ -16330,10 +16558,10 @@ percent-encoding and + signs in internal links (Bug 26410)
 
 !! test
 Special characters in embedded file links (bug 27679)
-!! input
+!! wikitext
 [[File:Contains & ampersand.jpg]]
 [[File:Does not exist.jpg|Title with & ampersand]]
-!! result
+!! html
 <p><a href="/index.php?title=Special:Upload&amp;wpDestFile=Contains_%26_ampersand.jpg" class="new" title="File:Contains &amp; ampersand.jpg">File:Contains &amp; ampersand.jpg</a>
 <a href="/index.php?title=Special:Upload&amp;wpDestFile=Does_not_exist.jpg" class="new" title="File:Does not exist.jpg">Title with &amp; ampersand</a>
 </p>
@@ -16342,36 +16570,36 @@ Special characters in embedded file links (bug 27679)
 
 !! test
 Confirm that 'apos' named character reference doesn't make it to output (not legal in HTML 4)
-!! input
+!! wikitext
 Text&apos;s been normalized?
-!! result
+!! html
 <p>Text&#39;s been normalized?
 </p>
 !! end
 
 !! test
 Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate free external links
-!! input
+!! wikitext
 http://www.example.org/ <-- U+3000 (vim: ^Vu3000)
-!! result
+!! html
 <p><a rel="nofollow" class="external free" href="http://www.example.org/">http://www.example.org/</a> &lt;-- U+3000 (vim: ^Vu3000)
 </p>
 !! end
 
 !! test
 Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate bracketed external links
-!! input
+!! wikitext
 [http://www.example.org/ ideograms]
-!! result
+!! html
 <p><a rel="nofollow" class="external text" href="http://www.example.org/">ideograms</a>
 </p>
 !! end
 
 !! test
 Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate external images links
-!! input
+!! wikitext
 http://www.example.org/pic.png <-- U+3000 (vim: ^Vu3000)
-!! result
+!! html
 <p><img src="http://www.example.org/pic.png" alt="pic.png" /> &lt;-- U+3000 (vim: ^Vu3000)
 </p>
 !! end
@@ -16397,9 +16625,9 @@ Template:Identical
 
 !! test
 Bug 31098 Template which includes system messages which includes the template
-!! input
+!! wikitext
 {{Identical}}
-!! result
+!! html
 <p><span class="error">Template loop detected: <a href="/wiki/Template:Identical" title="Template:Identical">Template:Identical</a></span>
 <span class="error">Template loop detected: <a href="/wiki/Template:Identical" title="Template:Identical">Template:Identical</a></span>
 </p>
@@ -16409,9 +16637,9 @@ Bug 31098 Template which includes system messages which includes the template
 Bug31490 Turkish: ucfirst 'blah'
 !! options
 language=tr
-!! input
+!! wikitext
 {{ucfirst:blah}}
-!! result
+!! html
 <p>Blah
 </p>
 !! end
@@ -16420,9 +16648,9 @@ language=tr
 Bug31490 Turkish: ucfirst 'ix'
 !! options
 language=tr
-!! input
+!! wikitext
 {{ucfirst:ix}}
-!! result
+!! html
 <p>İx
 </p>
 !! end
@@ -16431,9 +16659,9 @@ language=tr
 Bug31490 Turkish: lcfirst 'BLAH'
 !! options
 language=tr
-!! input
+!! wikitext
 {{lcfirst:BLAH}}
-!! result
+!! html
 <p>bLAH
 </p>
 !! end
@@ -16442,9 +16670,9 @@ language=tr
 Bug31490 Turkish: ucfırst (with a dotless i)
 !! options
 language=tr
-!! input
+!! wikitext
 {{ucfırst:blah}}
-!! result
+!! html
 <p><a href="/index.php?title=%C5%9Eablon:Ucf%C4%B1rst:blah&amp;action=edit&amp;redlink=1" class="new" title="Şablon:Ucfırst:blah (sayfa mevcut değil)">Şablon:Ucfırst:blah</a>
 </p>
 !! end
@@ -16453,9 +16681,9 @@ language=tr
 Bug31490 ucfırst (with a dotless i) with English language
 !! options
 language=en
-!! input
+!! wikitext
 {{ucfırst:blah}}
-!! result
+!! html
 <p><a href="/index.php?title=Template:Ucf%C4%B1rst:blah&amp;action=edit&amp;redlink=1" class="new" title="Template:Ucfırst:blah (page does not exist)">Template:Ucfırst:blah</a>
 </p>
 !! end
@@ -16464,10 +16692,10 @@ language=en
 Bug 26375: TOC with italics
 !! options
 title=[[Main Page]]
-!! input
+!! wikitext
 __TOC__
 == ''Lost'' episodes ==
-!! result
+!! html
 <div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Lost_episodes"><span class="tocnumber">1</span> <span class="toctext"><i>Lost</i> episodes</span></a></li>
@@ -16482,10 +16710,10 @@ __TOC__
 Bug 26375: TOC with bold
 !! options
 title=[[Main Page]]
-!! input
+!! wikitext
 __TOC__
 == '''should be bold''' then normal text ==
-!! result
+!! html
 <div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#should_be_bold_then_normal_text"><span class="tocnumber">1</span> <span class="toctext"><b>should be bold</b> then normal text</span></a></li>
@@ -16500,10 +16728,10 @@ __TOC__
 Bug 33845: Headings become cursive in TOC when they contain an image
 !! options
 title=[[Main Page]]
-!! input
+!! wikitext
 __TOC__
 == Image [[Image:foobar.jpg]] ==
-!! result
+!! html
 <div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Image"><span class="tocnumber">1</span> <span class="toctext">Image</span></a></li>
@@ -16518,10 +16746,10 @@ __TOC__
 Bug 33845 (2): Headings become bold in TOC when they contain a blockquote
 !! options
 title=[[Main Page]]
-!! input
+!! wikitext
 __TOC__
 == <blockquote>Quote</blockquote> ==
-!! result
+!! html
 <div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Quote"><span class="tocnumber">1</span> <span class="toctext">Quote</span></a></li>
@@ -16536,12 +16764,12 @@ __TOC__
 Unclosed tags in TOC
 !! options
 title=[[Main Page]]
-!! input
+!! wikitext
 __TOC__
 == Proof: 2 < 3 ==
 <small>Hanc marginis exiguitas non caperet.</small>
 QED
-!! result
+!! html
 <div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Proof:_2_.3C_3"><span class="tocnumber">1</span> <span class="toctext">Proof: 2 &lt; 3</span></a></li>
@@ -16556,12 +16784,12 @@ QED
 
 !! test
 Multiple tags in TOC
-!! input
+!! wikitext
 __TOC__
 == <i>Foo</i> <b>Bar</b> ==
 
 == <i>Foo</i> <blockquote>Bar</blockquote> ==
-!! result
+!! html
 <div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Foo_Bar"><span class="tocnumber">1</span> <span class="toctext"><i>Foo</i> <b>Bar</b></span></a></li>
@@ -16576,12 +16804,12 @@ __TOC__
 
 !! test
 Tags with parameters in TOC
-!! input
+!! wikitext
 __TOC__
 == <sup class="in-h2">Hello</sup> ==
 
 == <sup class="a > b">Evilbye</sup> ==
-!! result
+!! html
 <div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Hello"><span class="tocnumber">1</span> <span class="toctext"><sup>Hello</sup></span></a></li>
@@ -16596,7 +16824,7 @@ __TOC__
 
 !! test
 span tags with directionality in TOC
-!! input
+!! wikitext
 __TOC__
 == <span dir="ltr">C++</span> ==
 
@@ -16607,7 +16835,7 @@ __TOC__
 == <span style="font-style: italic" dir="ltr">All attributes on these span tags must be deleted from the TOC</span> ==
 
 == <span dir="ltr" style="font-style: italic">Attributes after dir on these span tags must be deleted from the TOC</span> ==
-!! result
+!! html
 <div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#C.2B.2B"><span class="tocnumber">1</span> <span class="toctext"><span dir="ltr">C++</span></span></a></li>
@@ -16636,20 +16864,20 @@ MediaWiki:Bug32057
 Bug 32057: Title needed when expanding <h> nodes.
 !! options
 title=[[Main Page]]
-!! input
+!! wikitext
 {{int:Bug32057}}
-!! result
+!! html
 <h2><span class="mw-headline" id="Headline_text">Headline text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Headline text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
 !! test
 Strip marker in urlencode
-!! input
+!! wikitext
 {{urlencode:x<nowiki/>y}}
 {{urlencode:x<nowiki/>y|wiki}}
 {{urlencode:x<nowiki/>y|path}}
-!! result
+!! html
 <p>xy
 xy
 xy
 
 !! test
 Strip marker in lc
-!! input
+!! wikitext
 {{lc:x<nowiki/>y}}
-!! result
+!! html
 <p>xy
 </p>
 !! end
 
 !! test
 Strip marker in uc
-!! input
+!! wikitext
 {{uc:x<nowiki/>y}}
-!! result
+!! html
 <p>XY
 </p>
 !! end
 
 !! test
 Strip marker in formatNum
-!! input
+!! wikitext
 {{formatnum:1<nowiki/>2}}
 {{formatnum:1<nowiki/>2|R}}
-!! result
+!! html
 <p>12
 12
 </p>
@@ -16689,10 +16917,10 @@ Strip marker in formatNum
 Check noCommafy in formatNum
 !! options
 language=be-tarask
-!! input
+!! wikitext
 {{formatnum:123456.78}}
 {{formatnum:123456.78|NOSEP}}
-!! result
+!! html
 <p>123 456,78
 123456.78
 </p>
@@ -16700,11 +16928,11 @@ language=be-tarask
 
 !! test
 Wrong option for formatNum (bug 56199)
-!! input
+!! wikitext
 {{formatnum:1,234.56|Random}}
 {{formatnum:1,234.56|EVERYTHING}}
 {{formatnum:1234.56|any argument that has the string 'NOSEP'}}
-!! result
+!! html
 <p>1,234.56
 1,234.56
 1,234.56
@@ -16715,67 +16943,67 @@ Wrong option for formatNum (bug 56199)
 Strip marker in grammar
 !! options
 language=fi
-!! input
+!! wikitext
 {{grammar:elative|foo<nowiki/>bar}}
-!! result
+!! html
 <p>foobarista
 </p>
 !! end
 
 !! test
 Strip marker in padleft
-!! input
+!! wikitext
 {{padleft:|2|x<nowiki/>y}}
-!! result
+!! html
 <p>xy
 </p>
 !! end
 
 !! test
 Strip marker in padright
-!! input
+!! wikitext
 {{padright:|2|x<nowiki/>y}}
-!! result
+!! html
 <p>xy
 </p>
 !! end
 
 !! test
 Strip marker in anchorencode
-!! input
+!! wikitext
 {{anchorencode:x<nowiki/>y}}
-!! result
+!! html
 <p>xy
 </p>
 !! end
 
 !! test
 nowiki inside link inside heading (bug 18295)
-!! input
+!! wikitext
 ==[[foo|x<nowiki>y</nowiki>z]]==
-!! result
+!! html
 <h2><span class="mw-headline" id="xyz"><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">xyz</a></span><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: xyz">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
 !! test
 new support for bdi element (bug 31817)
-!! input
+!! wikitext
 <p dir="rtl" lang="he">ולדימיר לנין (ברוסית: <bdi lang="ru">Владимир Ленин</bdi>, 24 באפריל 1870–22 בינואר 1924) הוא מנהיג פוליטי קומוניסטי רוסי.</p>
-!! result
+!! html
 <p dir="rtl" lang="he">ולדימיר לנין (ברוסית: <bdi lang="ru">Владимир Ленин</bdi>, 24 באפריל 1870–22 בינואר 1924) הוא מנהיג פוליטי קומוניסטי רוסי.</p>
 
 !!end
 
 !! test
 Ignore pipe between table row attributes
-!! input
+!! wikitext
 {|
 | quux
 |- id=foo | style='color: red'
 | bar
 |}
-!! result
+!! html
 <table>
 <tr>
 <td> quux
@@ -16788,11 +17016,11 @@ Ignore pipe between table row attributes
 
 !!test
 Gallery override link with WikiLink (bug 34852)
-!! input
+!! wikitext
 <gallery>
 File:foobar.jpg|caption|alt=galleryalt|link=InterWikiLink
 </gallery>
-!! result
+!! html
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
                        <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/InterWikiLink"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
@@ -16807,11 +17035,11 @@ File:foobar.jpg|caption|alt=galleryalt|link=InterWikiLink
 
 !!test
 Gallery override link with absolute external link (bug 34852)
-!! input
+!! wikitext
 <gallery>
 File:foobar.jpg|caption|alt=galleryalt|link=http://www.example.org
 </gallery>
-!! result
+!! html
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
                        <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="http://www.example.org"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
@@ -16826,11 +17054,11 @@ File:foobar.jpg|caption|alt=galleryalt|link=http://www.example.org
 
 !!test
 Gallery override link with malicious javascript (bug 34852)
-!! input
+!! wikitext
 <gallery>
 File:foobar.jpg|caption|alt=galleryalt|link=" onclick="alert('malicious javascript code!');
 </gallery>
-!! result
+!! html
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
                        <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/%22_onclick%3D%22alert(%27malicious_javascript_code!%27);"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
@@ -16845,11 +17073,11 @@ File:foobar.jpg|caption|alt=galleryalt|link=" onclick="alert('malicious javascri
 
 !!test
 Gallery with invalid title as link (bug 43964)
-!! input
+!! wikitext
 <gallery>
 File:foobar.jpg|link=<
 </gallery>
-!! result
+!! html
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
                        <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
@@ -16862,19 +17090,19 @@ File:foobar.jpg|link=<
 
 !!test
 Language parser function
-!! input
+!! wikitext
 {{#language:ar}}
-!! result
+!! html
 <p>العربية
 </p>
 !! end
 
 !!test
 Padleft and padright as substr
-!! input
+!! wikitext
 {{padleft:|3|abcde}}
 {{padright:|3|abcde}}
-!! result
+!! html
 <p>abc
 abc
 </p>
@@ -16882,11 +17110,11 @@ abc
 
 !!test
 Special parser function
-!! input
+!! wikitext
 {{#special:RandomPage}}
 {{#special:BaDtItLe}}
 {{#special:Foobar}}
-!! result
+!! html
 <p>Special:Random
 Special:Badtitle
 Special:Foobar
@@ -16895,27 +17123,27 @@ Special:Foobar
 
 !!test
 Bug 34939 - Case insensitive link parsing ([HttP://])
-!! input
+!! wikitext
 [HttP://MediaWiki.Org/]
-!! result
+!! html
 <p><a rel="nofollow" class="external autonumber" href="HttP://MediaWiki.Org/">[1]</a>
 </p>
 !! end
 
 !!test
 Bug 34939 - Case insensitive link parsing ([HttP:// title])
-!! input
+!! wikitext
 [HttP://MediaWiki.Org/ MediaWiki]
-!! result
+!! html
 <p><a rel="nofollow" class="external text" href="HttP://MediaWiki.Org/">MediaWiki</a>
 </p>
 !! end
 
 !!test
 Bug 34939 - Case insensitive link parsing (HttP://)
-!! input
+!! wikitext
 HttP://MediaWiki.Org/
-!! result
+!! html
 <p><a rel="nofollow" class="external free" href="HttP://MediaWiki.Org/">HttP://MediaWiki.Org/</a>
 </p>
 !! end
@@ -16924,14 +17152,14 @@ HttP://MediaWiki.Org/
 Disable TOC
 !! options
 notoc
-!! input
+!! wikitext
 Lead
 == Section 1 ==
 == Section 2 ==
 == Section 3 ==
 == Section 4 ==
 == Section 5 ==
-!! result
+!! html
 <p>Lead
 </p>
 
@@ -16952,11 +17180,11 @@ Lead
 1. SOL-sensitive wikitext tokens as template-args
 !!options
 parsoid=wt2html,wt2wt
-!!input
+!! wikitext
 {{echo|*a}}
 {{echo|#a}}
 {{echo|:a}}
-!!result
+!! html
 <span about="#mwt1" typeof="mw:Transclusion">
 </span><ul about="#mwt1"><li>a</li>
 </ul>
@@ -16978,11 +17206,11 @@ parsoid=wt2html,wt2wt
 Ref: 1. ref-location should be replaced with an index span
 !!options
 parsoid
-!!input
+!! wikitext
 A <ref>foo</ref>
 B <ref name="x">foo</ref>
 C <ref name="y" />
-!!result
+!! html
 <p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span>
 B <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"x"}}' id="cite_ref-x-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-2">[2]</a></span>
 C <span about="#mwt3" class="reference" data-mw='{"name":"ref","attrs":{"name":"y"}}' id="cite_ref-y-3-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-y-3">[3]</a></span></p>
@@ -16992,10 +17220,10 @@ C <span about="#mwt3" class="reference" data-mw='{"name":"ref","attrs":{"name":"
 Ref: 2. ref-tags with identical names should all get the same index
 !!options
 parsoid
-!!input
+!! wikitext
 A <ref name="x">foo</ref>
 B <ref name="x" />
-!!result
+!! html
 <p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"x"}}' id="cite_ref-x-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-1">[1]</a></span>
 B <span about="#mwt2" class="reference" data-mw='{"name":"ref","attrs":{"name":"x"}}' id="cite_ref-x-1-1" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-1">[1]</a></span></p>
 !!end
@@ -17004,11 +17232,11 @@ B <span about="#mwt2" class="reference" data-mw='{"name":"ref","attrs":{"name":"
 Ref: 3. spaces in ref-names should be ignored
 !!options
 parsoid
-!!input
+!! wikitext
 A <ref name="x">foo</ref>
 B <ref name=" x " />
 C <ref name= x  />
-!!result
+!! html
 <p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"x"}}' id="cite_ref-x-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-1">[1]</a></span>
 B <span about="#mwt2" class="reference" data-mw='{"name":"ref","attrs":{"name":"x"}}' id="cite_ref-x-1-1" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-1">[1]</a></span>
 C <span about="#mwt3" class="reference" data-mw='{"name":"ref","attrs":{"name":"x"}}' id="cite_ref-x-1-2" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-1">[1]</a></span></p>
@@ -17019,9 +17247,9 @@ Ref: 4. 'constructor' should be accepted as a valid ref-name
 (NOTE: constructor is a predefined property in JS and constructor as a ref-name can clash with it if not handled properly)
 !!options
 parsoid
-!!input
+!! wikitext
 A <ref name="constructor">foo</ref>
-!!result
+!! html
 <p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"constructor"}}' id="cite_ref-constructor-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-constructor-1">[1]</a></span></p>
 !!end
 
@@ -17029,17 +17257,17 @@ A <ref name="constructor">foo</ref>
 Ref: 5. body should accept generic wikitext
 !!options
 parsoid
-!!input
+!! wikitext
 A <ref>
  This is a '''[[bolded link]]''' and this is a {{echo|transclusion}}
 </ref>
 
 <references />
-!!result
-<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"This is a &lt;b data-parsoid=&#39;{\"dsr\":[19,40,3,3]}&#39;>&lt;a rel=\"mw:WikiLink\" href=\"./Bolded_link\" data-parsoid=&#39;{\"stx\":\"simple\",\"a\":{\"href\":\"./Bolded_link\"},\"sa\":{\"href\":\"bolded link\"},\"dsr\":[22,37,2,2]}&#39;>bolded link&lt;/a>&lt;/b> and this is a &lt;span about=\"#mwt5\" typeof=\"mw:Transclusion\" data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"transclusion\"}},\"i\":0}}]}&#39; data-parsoid=&#39;{\"dsr\":[55,76,null,null],\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]]}&#39;>transclusion&lt;/span>\n"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
+!! html
+<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"This is a &lt;b data-parsoid=&#39;{\"dsr\":[19,40,3,3]}&#39;>&lt;a rel=\"mw:WikiLink\" href=\"./Bolded_link\" data-parsoid=&#39;{\"stx\":\"simple\",\"a\":{\"href\":\"./Bolded_link\"},\"sa\":{\"href\":\"bolded link\"},\"dsr\":[22,37,2,2]}&#39;>bolded link&lt;/a>&lt;/b> and this is a &lt;span about=\"#mwt3\" typeof=\"mw:Transclusion\" data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"transclusion\"}},\"i\":0}}]}&#39; data-parsoid=&#39;{\"dsr\":[55,76,null,null],\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]]}&#39;>transclusion&lt;/span>\n"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><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-0">↑</a></span> This is a <b><a rel="mw:WikiLink" href="./Bolded_link">bolded link</a></b> and this is a <span about="#mwt5" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"transclusion"}},"i":0}}]}'>transclusion</span>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> This is a <b><a rel="mw:WikiLink" href="./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>
 </li>
 </ol>
 !!end
@@ -17048,7 +17276,7 @@ A <ref>
 Ref: 6. indent-pres should not be output in ref-body
 !!options
 parsoid
-!!input
+!! wikitext
 A <ref>
  foo
  bar
@@ -17056,7 +17284,7 @@ A <ref>
 </ref>
 
 <references />
-!!result
+!! html
 <p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo\n bar\n baz\n"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
 
 <ol class="references" typeof="mw:Extension/references" about="#mwt3" data-mw='{"name":"references","attrs":{}}'>
@@ -17071,7 +17299,7 @@ A <ref>
 Ref: 7. No p-wrapping in ref-body
 !!options
 parsoid
-!!input
+!! wikitext
 A <ref>
 foo
 
@@ -17086,7 +17314,7 @@ booz
 </ref>
 
 <references />
-!!result
+!! html
 <p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo\n\nbar\n\n\nbaz\n\n\n\nbooz\n"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
 
 <ol about="#mwt2" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
@@ -17108,11 +17336,11 @@ booz
 Ref: 8. transclusion wikitext has lower precedence
 !!options
 parsoid
-!!input
+!! wikitext
 A <ref> foo {{echo|</ref> B C}}
 
 <references />
-!!result
+!! html
 <p>A <span class="reference" data-mw="{&quot;name&quot;:&quot;ref&quot;,&quot;body&quot;:{&quot;html&quot;:&quot;foo <span typeof=\&quot;mw:Nowiki\&quot; data-parsoid='{\&quot;src\&quot;:\&quot;{{\&quot;,\&quot;dsr\&quot;:[12,14,0,0]}'>{{</span>echo|&quot;},&quot;attrs&quot;:{}}" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> B C<span typeof="mw:Nowiki">}}</span></p>
 <ol class="references" typeof="mw:Extension/references" data-mw="{&quot;name&quot;:&quot;references&quot;,&quot;attrs&quot;:{}}">
 <li id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo <span typeof="mw:Nowiki">{{</span>echo|</li>
@@ -17123,10 +17351,10 @@ A <ref> foo {{echo|</ref> B C}}
 Ref: 9. unclosed comments should not leak out of ref-body
 !!options
 parsoid
-!!input
+!! wikitext
 A <ref> foo <!--</ref> B C
 <references />
-!!result
+!! html
 <p>A <span class="reference" data-mw='{"name":"ref","body":{"html":"foo &lt;!---->"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> B C</p>
 <ol class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
 <li id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo </li>
@@ -17137,16 +17365,16 @@ A <ref> foo <!--</ref> B C
 Ref: 10. Unclosed HTML tags should not leak out of ref-body
 !!options
 parsoid
-!!input
+!! wikitext
 A <ref> <b> foo </ref> B C
 
 <references />
-!!result
-<p data-parsoid='{"dsr":[0,26,0,0]}'>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"&lt;b data-parsoid=&#39;{\"stx\":\"html\",\"autoInsertedEnd\":true,\"dsr\":[8,16,3,0]}&#39;> foo &lt;/b>"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"&lt;ref> &lt;b> foo &lt;/ref>","dsr":[2,22,5,6]}'><a href="#cite_note-1">[1]</a></span> B C</p>
+!! html
+<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"&lt;b data-parsoid=&#39;{\"stx\":\"html\",\"autoInsertedEnd\":true,\"dsr\":[8,16,3,0]}&#39;> foo &lt;/b>"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"&lt;ref> &lt;b> foo &lt;/ref>"}'><a href="#cite_note-1">[1]</a></span> B C</p>
 
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt4" data-parsoid='{"src":"&lt;references />","dsr":[28,42,2,2]}' data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1" data-parsoid="{}"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> <b data-parsoid='{"stx":"html","autoInsertedEnd":true,"dsr":[8,16,3,0]}'> foo </b></li>
+<ol class="references" typeof="mw:Extension/references" about="#mwt4" data-parsoid='{"src":"&lt;references />"}' data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1" data-parsoid="{}"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> <b data-parsoid='{"stx":"html","autoInsertedEnd":true}'> foo </b></li>
 </ol>
 !!end
 
@@ -17154,26 +17382,26 @@ A <ref> <b> foo </ref> B C
 Ref: 11. ref-tags acts like an inline element wrt P-wrapping
 !!options
 parsoid
-!!input
+!! wikitext
 A <ref>foo</ref> B
 C <ref>bar</ref> D
-!!result
-<p data-parsoid='{"dsr":[0,37,0,0]}'>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"&lt;ref>foo&lt;/ref>","dsr":[2,16,5,6]}'><a href="#cite_note-1">[1]</a></span> B
-C <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{}}' id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"&lt;ref>bar&lt;/ref>","dsr":[21,35,5,6]}'><a href="#cite_note-2">[2]</a></span> D</p>
+!! html
+<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"&lt;ref>foo&lt;/ref>"}'><a href="#cite_note-1">[1]</a></span> B
+C <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{}}' id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"&lt;ref>bar&lt;/ref>"}'><a href="#cite_note-2">[2]</a></span> D</p>
 !!end
 
 !!test
 Ref: 12. ref-tags act as trailing newline migration barrier
 !!options
 parsoid
-!!input
+!! wikitext
 <!--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 />
 <ref />
 
 c
-!!result
+!! html
 <p><!--the newline at the end of this line moves out of the p-tag-->a</p>
 
 
 Ref: 13. ref-tags are not SOL-transparent and block indent-pres
 !!options
 parsoid
-!!input
+!! wikitext
 <ref>foo</ref> A
 <ref>bar
 </ref> B
-!!result
+!! html
 <p><span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> A
 <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"bar\n"},"attrs":{}}' id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-2">[2]</a></span> B</p>
 !!end
@@ -17201,14 +17429,14 @@ parsoid
 Ref: 14. A nested ref-tag should be emitted as plain text
 !!options
 parsoid
-!!input
+!! wikitext
 <ref>foo <ref>bar</ref> baz</ref>
 
 <references />
-!!result
-<p data-parsoid='{"dsr":[0,33,0,0]}'><span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo &amp;lt;ref>bar&amp;lt;/ref> baz"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"&lt;ref>foo &lt;ref>bar&lt;/ref> baz&lt;/ref>","dsr":[0,33,5,6]}'><a href="#cite_note-1">[1]</a></span></p>
+!! html
+<p><span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo &amp;lt;ref>bar&amp;lt;/ref> baz"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"&lt;ref>foo &lt;ref>bar&lt;/ref> baz&lt;/ref>"}'><a href="#cite_note-1">[1]</a></span></p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt5" data-parsoid='{"src":"&lt;references />","dsr":[35,49,2,2]}' data-mw='{"name":"references","attrs":{}}'>
+<ol class="references" typeof="mw:Extension/references" about="#mwt5" data-parsoid='{"src":"&lt;references />"}' data-mw='{"name":"references","attrs":{}}'>
 <li about="#cite_note-1" id="cite_note-1" data-parsoid="{}"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo &lt;ref>bar&lt;/ref> baz</li>
 </ol>
 !!end
@@ -17217,12 +17445,12 @@ parsoid
 Ref: 15. ref-tags with identical names should get identical indexes
 !!options
 parsoid
-!!input
+!! wikitext
 A1 <ref name="a">foo</ref> A2 <ref name="a" />
 B1 <ref name="b" /> B2 <ref name="b">bar</ref>
 
 <references />
-!!result
+!! html
 <p>A1 <span about="#mwt3" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"a"}}' id="cite_ref-a-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-a-1">[1]</a></span> A2 <span about="#mwt4" class="reference" data-mw='{"name":"ref","attrs":{"name":"a"}}' id="cite_ref-a-1-1" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-a-1">[1]</a></span>
 B1 <span about="#mwt7" class="reference" data-mw='{"name":"ref","attrs":{"name":"b"}}' id="cite_ref-b-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-b-2">[2]</a></span> B2 <span about="#mwt8" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"name":"b"}}' id="cite_ref-b-2-1" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-b-2">[2]</a></span></p>
 
@@ -17235,11 +17463,11 @@ B1 <span about="#mwt7" class="reference" data-mw='{"name":"ref","attrs":{"name":
 Ref: 16. Tokenizer should accept non-standard whitespace in <ref> and </ref> tags
 !!options
 parsoid=wt2html
-!!input
+!! wikitext
 A <ref >foo</ref >
 
 <references />
-!!result
+!! html
 <p>A <span class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
 
 <ol class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
@@ -17250,9 +17478,9 @@ A <ref >foo</ref >
 References: 1. references tag without any refs should be handled properly
 !!options
 parsoid
-!!input
+!! wikitext
 <references />
-!!result
+!! html
 <ol about="#mwt2" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'></ol>
 !!end
 
@@ -17260,14 +17488,14 @@ parsoid
 References: 2. references tag with group only outputs references from that group
 !!options
 parsoid
-!!input
+!! wikitext
 A <ref group="a">foo</ref>
 B <ref group="b">bar</ref>
 
 <references group="a" />
-!!result
+!! html
 <p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"group":"a"}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[a 1]</a></span>
-B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"group":"b"}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[b 1]</a></span></p>
+B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"group":"b"}}' id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-2">[b 1]</a></span></p>
 
 <ol about="#mwt6" class="references" typeof="mw:Extension/references" 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-0">↑</a></span> foo</li>
 </ol>
@@ -17277,7 +17505,7 @@ B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"b
 References: 3. ref list should be cleared after processing references
 !!options
 parsoid
-!!input
+!! wikitext
 A <ref>foo</ref>
 
 <references />
@@ -17285,15 +17513,15 @@ A <ref>foo</ref>
 B <ref>bar</ref>
 
 <references />
-!!result
+!! html
 <p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
 
 <ol about="#mwt4" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo</li>
 </ol>
 
-<p>B <span about="#mwt6" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
+<p>B <span about="#mwt6" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{}}' id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-2">[1]</a></span></p>
 
-<ol about="#mwt8" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> bar</li>
+<ol about="#mwt8" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-2" id="cite_note-2"><span rel="mw:referencedBy"><a href="#cite_ref-2-0">↑</a></span> bar</li>
 </ol>
 !!end
 
@@ -17301,7 +17529,7 @@ B <ref>bar</ref>
 References: 4. only referenced group should be cleared after processing references
 !!options
 parsoid
-!!input
+!! wikitext
 A <ref group="a">afoo</ref>
 B <ref>bfoo</ref>
 
@@ -17310,16 +17538,16 @@ B <ref>bfoo</ref>
 C <ref>cfoo</ref>
 
 <references />
-!!result
+!! html
 <p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"afoo"},"attrs":{"group":"a"}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[a 1]</a></span>
-B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bfoo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"<ref>bfoo</ref>","dsr":[30,45,5,6]}'><a href="#cite_note-1">[1]</a></span></p>
+B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bfoo"},"attrs":{}}' id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"<ref>bfoo</ref>"}'><a href="#cite_note-2">[1]</a></span></p>
 
 <ol about="#mwt6" class="references" typeof="mw:Extension/references" 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-0">↑</a></span> afoo</li>
 </ol>
 
-<p>C <span about="#mwt8" class="reference" data-mw='{"name":"ref","body":{"html":"cfoo"},"attrs":{}}' id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-2">[2]</a></span></p>
+<p>C <span about="#mwt8" class="reference" data-mw='{"name":"ref","body":{"html":"cfoo"},"attrs":{}}' id="cite_ref-3-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-3">[2]</a></span></p>
 
-<ol about="#mwt10" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> bfoo</li><li about="#cite_note-2" id="cite_note-2"><span rel="mw:referencedBy"><a href="#cite_ref-2-0">↑</a></span> cfoo</li>
+<ol about="#mwt10" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-2" id="cite_note-2"><span rel="mw:referencedBy"><a href="#cite_ref-2-0">↑</a></span> bfoo</li><li about="#cite_note-3" id="cite_note-3"><span rel="mw:referencedBy"><a href="#cite_ref-3-0">↑</a></span> cfoo</li>
 </ol>
 !!end
 
@@ -17327,7 +17555,7 @@ B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"b
 References: 5. ref tags in references should be processed while ignoring all other content
 !!options
 parsoid
-!!input
+!! wikitext
 A <ref name="a" />
 B <ref name="b">bar</ref>
 
@@ -17335,12 +17563,12 @@ B <ref name="b">bar</ref>
 <ref name="a">foo</ref>
 This should just get lost.
 </references>
-!!result
-<p data-parsoid='{"dsr":[0,57,0,0]}'>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","attrs":{"name":"a"}}' id="cite_ref-a-1-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"&lt;ref name=\"a\" />","dsr":[2,18,16,0]}'><a href="#cite_note-a-1">[1]</a></span>
-B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"name":"b"}}' id="cite_ref-b-2-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"&lt;ref name=\"b\">bar&lt;/ref>","dsr":[21,44,14,6]}'><a href="#cite_note-b-2">[2]</a></span></p>
+!! html
+<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","attrs":{"name":"a"}}' id="cite_ref-a-1-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"&lt;ref name=\"a\" />"}'><a href="#cite_note-a-1">[1]</a></span>
+B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"name":"b"}}' id="cite_ref-b-2-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"&lt;ref name=\"b\">bar&lt;/ref>"}'><a href="#cite_note-b-2">[2]</a></span></p>
 
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-parsoid='{"src":"&lt;references>\n&lt;ref name=\"a\">foo&lt;/ref>\nThis should just get lost.\n&lt;/references>","dsr":[46,123,2,2]}' 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\" data-mw=&#39;{\"name\":\"ref\",\"body\":{\"html\":\"foo\"},\"attrs\":{\"name\":\"a\"}}&#39; rel=\"dc:references\" typeof=\"mw:Extension/ref\">&lt;a href=\"#cite_note-a-1\">[1]&lt;/a>&lt;/span>\n"},"attrs":{}}'>
+<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-parsoid='{"src":"&lt;references>\n&lt;ref name=\"a\">foo&lt;/ref>\nThis should just get lost.\n&lt;/references>"}' 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\" data-mw=&#39;{\"name\":\"ref\",\"body\":{\"html\":\"foo\"},\"attrs\":{\"name\":\"a\"}}&#39; rel=\"dc:references\" typeof=\"mw:Extension/ref\">&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" data-parsoid="{}"><span rel="mw:referencedBy"><a href="#cite_ref-a-1-0">↑</a></span> foo</li>
 <li about="#cite_note-b-2" id="cite_note-b-2" data-parsoid="{}"><span rel="mw:referencedBy"><a href="#cite_ref-b-2-0">↑</a></span> bar</li>
 </ol>
@@ -17350,9 +17578,9 @@ B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"b
 References: 6. <references /> from a transclusion
 !!options
 parsoid
-!!input
+!! wikitext
 <ref>Foo</ref> {{echo|<references />}}
-!!result
+!! html
 <span about="#mwt3" class="reference" data-mw='{"name":"ref","body":{"html":"Foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> <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-0">↑</a></span> Foo</li></ol>
 !!end
 
@@ -17360,28 +17588,51 @@ parsoid
 References: 7. Multiple references tags (one without and one with nested refs) should be correctly handled
 !! options
 parsoid
-!! input
+!! wikitext
 A <ref>foo bar for a</ref>
-B <ref name="b" />
+B <ref group="X" name="b" />
 
 <references />
 
-<references>
+<references group="X">
 <ref name="b">foo</ref>
 </references>
-!! result
-<p data-parsoid='{"dsr":[0,45,0,0]}'>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo bar for a"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"&lt;ref>foo bar for a&lt;/ref>","dsr":[2,26,5,6]}'><a href="#cite_note-1">[1]</a></span>
-B <span about="#mwt4" class="reference" data-mw='{"name":"ref","attrs":{"name":"b"}}' id="cite_ref-b-2-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"&lt;ref name=\"b\" />","dsr":[29,45,16,0]}'><a href="#cite_note-b-2">[2]</a></span></p>
+!! html
+<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo bar for a"},"attrs":{}}' id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"&lt;ref>foo bar for a&lt;/ref>"}'><a href="#cite_note-2" data-parsoid="{}">[2]</a></span>
+B <span about="#mwt4" class="reference" data-mw='{"name":"ref","attrs":{"group":"X","name":"b"}}' id="cite_ref-b-3-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"&lt;ref name=\"b\" group=\"X\" />"}'><a href="#cite_note-b-3" data-parsoid="{}">[X 1]</a></span></p>
+
+<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-parsoid='{"src":"&lt;references />"}' data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-b-1" id="cite_note-b-1" data-parsoid="{}"><span rel="mw:referencedBy" data-parsoid="{}">↑</span> foo</li><li about="#cite_note-2" id="cite_note-2" data-parsoid="{}"><span rel="mw:referencedBy" data-parsoid="{}"><a href="#cite_ref-2-0" data-parsoid="{}">↑</a></span> foo bar for a</li></ol>
+
+<ol class="references" typeof="mw:Extension/references" about="#mwt8" data-parsoid='{"src":"&lt;references group=\"X\">\n&lt;ref name=\"b\">foo&lt;/ref>\n&lt;/references>","group":"X"}' data-mw='{"name":"references","body":{"extsrc":"&lt;ref name=\"b\">foo&lt;/ref>","html":"\n&lt;span about=\"#mwt10\" class=\"reference\" data-mw=&#39;{\"name\":\"ref\",\"body\":{\"html\":\"foo\"},\"attrs\":{\"name\":\"b\"}}&#39; rel=\"dc:references\" typeof=\"mw:Extension/ref\">&lt;a href=\"#cite_note-b-1\">[1]&lt;/a>&lt;/span>\n"},"attrs":{"group":"X"}}'><li about="#cite_note-b-3" id="cite_note-b-3" data-parsoid="{}"><span rel="mw:referencedBy" data-parsoid="{}"><a href="#cite_ref-b-3-0" data-parsoid="{}">↑</a></span> </li></ol>
+!! end
+
+# This test is wt2html only because we're permitting the serializer to produce
+# dirty diffs, normalizing the unclosed references to the self-closed version.
+!! test
+Generate references for unclosed references tag
+!! options
+parsoid=wt2html
+!! wikitext
+a<ref>foo</ref>
 
+<references>
+!! html
+<p data-parsoid='{}'>a<span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"&lt;ref>foo&lt;/ref>"}'><a href="#cite_note-1" data-parsoid="{}">[1]</a></span></p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-parsoid='{"src":"&lt;references />","dsr":[47,61,2,2]}' data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1" data-parsoid="{}"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo bar for a</li>
-<li about="#cite_note-b-2" id="cite_note-b-2" data-parsoid="{}"><span rel="mw:referencedBy"><a href="#cite_ref-b-2-0">↑</a></span> </li></ol>
 
+<ol class="references" typeof="mw:Extension/references" about="#mwt4" data-parsoid='{"src":"&lt;references>"}' data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1" data-parsoid="{}"><span rel="mw:referencedBy" data-parsoid="{}"><a href="#cite_ref-1-0" data-parsoid="{}">↑</a></span> foo</li></ol>
+!! end
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt8" data-parsoid='{"src":"&lt;references>\n&lt;ref name=\"b\">foo&lt;/ref>\n&lt;/references>","dsr":[63,113,2,2]}' data-mw='{"name":"references","body":{"extsrc":"&lt;ref name=\"b\">foo&lt;/ref>","html":"\n&lt;span about=\"#mwt10\" class=\"reference\" data-mw=&#39;{\"name\":\"ref\",\"body\":{\"html\":\"foo\"},\"attrs\":{\"name\":\"b\"}}&#39; rel=\"dc:references\" typeof=\"mw:Extension/ref\">&lt;a href=\"#cite_note-b-1\">[1]&lt;/a>&lt;/span>\n"},"attrs":{}}'>
-<li about="#cite_note-b-1" id="cite_note-b-1" data-parsoid="{}"><span rel="mw:referencedBy">↑</span> foo</li>
-</ol>
+!! test
+New reference serializes on its own line
+!! options
+parsoid=wt2wt,html2wt
+!! wikitext
+foo
+<references />
+!! html
+foo<ol class="references" typeof="mw:Extension/references" about="#mwt2" data-mw='{"name":"references","attrs":{}}'></ol>
 !! end
 
 #### ----------------------------------------------------------------
@@ -17410,7 +17661,7 @@ B <span about="#mwt4" class="reference" data-mw='{"name":"ref","attrs":{"name":"
 Headings: 0. Unnested
 !! options
 parsoid
-!! input
+!! wikitext
 <nowiki>=foo=</nowiki>
 
 <nowiki> =foo= </nowiki>
@@ -17418,7 +17669,7 @@ parsoid
 <nowiki>=foo=</nowiki>
 
 =foo''a''<nowiki>=</nowiki>
-!! result
+!! html
 <p><span typeof="mw:Nowiki">=foo=</span></p>
 
 <p><span typeof="mw:Nowiki"> =foo= </span>
@@ -17433,7 +17684,7 @@ Headings: 1. Nested inside html
 (New headings and existing headings are handled differently)
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 = =foo= =
 
 == =foo= ==
@@ -17447,7 +17698,7 @@ parsoid=html2wt
 =====<nowiki>=foo=</nowiki>=====
 ======<nowiki>=foo=</nowiki>======
 
-!! result
+!! html
 <h1>=foo=</h1>
 <h2>=foo=</h2>
 <h3>=foo=</h3>
@@ -17464,7 +17715,7 @@ parsoid=html2wt
 Headings: 2. Outside heading nest on a single line <h1>foo</h1>*bar
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 = foo =
 <nowiki>*</nowiki>bar
 
@@ -17473,7 +17724,7 @@ parsoid=html2wt
 
 = foo =
 <nowiki>=bar=</nowiki>
-!! result
+!! html
 <h1>foo</h1>*bar
 <h1>foo</h1>=bar
 <h1>foo</h1>=bar=
@@ -17483,9 +17734,9 @@ parsoid=html2wt
 Headings: 3. Nested inside html with wikitext split by html tags
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 = ='''bold'''<nowiki>foo=</nowiki> =
-!! result
+!! html
 <h1>=<b>bold</b><span typeof="mw:Nowiki">foo=</span></h1>
 !!end
 
@@ -17493,7 +17744,7 @@ parsoid=html2wt
 Headings: 4a. No escaping needed (testing just h1 and h2)
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 = =foo =
 
 = foo= =
@@ -17509,7 +17760,7 @@ parsoid=html2wt
 = ''=''foo= =
 
 = <nowiki>=</nowiki> =
-!! result
+!! html
 <h1>=foo</h1>
 <h1>foo=</h1>
 <h1> =foo= </h1>
@@ -17524,11 +17775,11 @@ parsoid=html2wt
 Headings: 4b. No escaping needed (inside p-tags)
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 ===
 =foo= x
 =foo= <s></s>
-!! result
+!! html
 <p>===
 =foo= x
 =foo= <s></s>
@@ -17539,7 +17790,7 @@ parsoid=html2wt
 Headings: 5. Empty headings
 !! options
 parsoid
-!! input
+!! wikitext
 =<nowiki/>=
 
 ==<nowiki/>==
@@ -17551,7 +17802,7 @@ parsoid
 =====<nowiki/>=====
 
 ======<nowiki/>======
-!! result
+!! html
 <h1></h1>
 <h2></h2>
 <h3></h3>
@@ -17564,7 +17815,7 @@ parsoid
 Headings: 6a. Heading chars in SOL context (with trailing spaces)
 !! options
 parsoid
-!! input
+!! wikitext
 <nowiki>=a=</nowiki>
 
 <nowiki>=a=</nowiki> 
@@ -17572,7 +17823,7 @@ parsoid
 <nowiki>=a=</nowiki>   
 
 <nowiki>=a=</nowiki>   
-!! result
+!! html
 <p>=a=</p>
 <p>=a= </p>
 <p>=a= </p>
@@ -17583,7 +17834,7 @@ parsoid
 Headings: 6b. Heading chars in SOL context (with trailing newlines)
 !! options
 parsoid
-!! input
+!! wikitext
 <nowiki>=a=
 b</nowiki>
 
@@ -17595,7 +17846,7 @@ b</nowiki>
 
 <nowiki>=a=     
 b</nowiki>
-!! result
+!! html
 <p>=a=
 b</p>
 <p>=a= 
@@ -17611,10 +17862,10 @@ b</p>
 Headings: 6c. Heading chars in SOL context (leading newline break)
 !! options
 parsoid
-!! input
+!! wikitext
 a
 <nowiki>=b=</nowiki>
-!! result
+!! html
 <p>a
 =b=</p>
 !!end
 Headings: 6d. Heading chars in SOL context (with interspersed comments)
 !! options
 parsoid
-!! input
+!! wikitext
 <!--c0--><nowiki>=a=</nowiki>
 
 <!--c1--><nowiki>=a=</nowiki> <!--c2-->         <!--c3-->
-!! result
+!! html
 <p><!--c0-->=a=</p>
 <p><!--c1-->=a= <!--c2-->       <!--c3--></p>
 !!end
@@ -17636,9 +17887,9 @@ parsoid
 Headings: 6d. Heading chars in SOL context (No escaping needed)
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 =a=<div>b</div>
-!! result
+!! html
 =a=<div>b</div>
 !!end
 
@@ -17655,11 +17906,11 @@ parsoid=html2wt
 
 !! test
 Lists: 0. Outside nests
-!! input
+!! wikitext
 <nowiki>*</nowiki>foo
 
 <nowiki>#</nowiki>foo
-!! result
+!! html
 <p>*foo
 </p><p>#foo
 </p>
@@ -17667,7 +17918,7 @@ Lists: 0. Outside nests
 
 !! test
 Lists: 1. Nested inside html
-!! input
+!! wikitext
 *<nowiki>*foo</nowiki>
 
 *<nowiki>#foo</nowiki>
@@ -17683,7 +17934,7 @@ Lists: 1. Nested inside html
 #<nowiki>:foo</nowiki>
 
 #<nowiki>;foo</nowiki>
-!! result
+!! html
 <ul>
 <li>*foo
 </li>
@@ -17721,7 +17972,7 @@ Lists: 1. Nested inside html
 
 !! test
 Lists: 2. Inside definition lists
-!! input
+!! wikitext
 ;<nowiki>;foo</nowiki>
 
 ;<nowiki>:foo</nowiki>
@@ -17730,7 +17981,7 @@ Lists: 2. Inside definition lists
 :bar
 
 :<nowiki>:foo</nowiki>
-!! result
+!! html
 <dl>
 <dt>;foo
 </dt>
@@ -17754,11 +18005,11 @@ Lists: 2. Inside definition lists
 
 !! test
 Lists: 3. Only bullets at start of text should be escaped
-!! input
+!! wikitext
 *<nowiki>*foo*bar</nowiki>
 
 *<nowiki>*foo</nowiki>''it''*bar
-!! result
+!! html
 <ul>
 <li>*foo*bar
 </li>
@@ -17774,7 +18025,7 @@ Lists: 3. Only bullets at start of text should be escaped
 Lists: 4. No escapes needed
 !! options
 parsoid
-!! input
+!! wikitext
 *foo*bar
 
 *''foo''*bar
@@ -17782,7 +18033,7 @@ parsoid
 *[[Foo]]: bar
 
 *[[Foo]]*bar
-!! result
+!! html
 <ul>
 <li>foo*bar
 </li>
@@ -17803,7 +18054,7 @@ parsoid
 
 !! test
 Lists: 5. No unnecessary escapes
-!! input
+!! wikitext
 * bar <span><nowiki>[[foo]]</nowiki></span>
 
 *=bar <span><nowiki>[[foo]]</nowiki></span>
@@ -17815,7 +18066,7 @@ Lists: 5. No unnecessary escapes
 *=bar <span>foo]]</span>=
 
 * <s></s>: a
-!! result
+!! html
 <ul>
 <li> bar <span>[[foo]]</span>
 </li>
@@ -17847,18 +18098,18 @@ Lists: 5. No unnecessary escapes
 Lists: 6. Escape bullets in SOL position
 !! options
 parsoid
-!! input
+!! wikitext
 <!--cmt--><nowiki>*foo</nowiki>
-!! result
+!! html
 <p><!--cmt--><span typeof="mw:Nowiki">*foo</span></p>
 !!end
 
 !! test
 Lists: 7. Escape bullets in a multi-line context
-!! input
+!! wikitext
 a
 <nowiki>*</nowiki>b
-!! result
+!! html
 <p>a
 *b
 </p>
 HRs: 1. Single line
 !! options
 parsoid
-!! input
+!! wikitext
 ----<nowiki>----</nowiki>
 ----=foo=
 ----*foo
-!! result
+!! html
 <hr><span typeof="mw:Nowiki">----</span>
 <hr>=foo=
 <hr>*foo
@@ -17903,10 +18154,10 @@ parsoid
 
 !! test
 Tables: 1a. Simple example
-!! input
+!! wikitext
 <nowiki>{|
 |}</nowiki>
-!! result
+!! html
 <p>{|
 |}
 </p>
@@ -17914,27 +18165,27 @@ Tables: 1a. Simple example
 
 !! test
 Tables: 1b. No escaping needed
-!! input
+!! wikitext
 !foo
-!! result
+!! html
 <p>!foo
 </p>
 !! end
 
 !! test
 Tables: 1c. No escaping needed
-!! input
+!! wikitext
 |foo
-!! result
+!! html
 <p>|foo
 </p>
 !! end
 
 !! test
 Tables: 1d. No escaping needed
-!! input
+!! wikitext
 |}foo
-!! result
+!! html
 <p>|}foo
 </p>
 !! end
@@ -17943,13 +18194,13 @@ Tables: 1d. No escaping needed
 Tables: 2a. Nested in td
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 {|
 |<nowiki>foo|bar</nowiki>
 |-
 |x<div><nowiki>a|b</nowiki></div>
 |}
-!! result
+!! html
 <table><tbody><tr>
 <td>foo|bar</td></tr>
 <tr><td>x<div>a|b</div></td>
@@ -17960,12 +18211,12 @@ parsoid=html2wt
 Tables: 2b. Nested in td
 !! options
 parsoid
-!! input
+!! wikitext
 {|
 |<nowiki>foo||bar</nowiki>
 |''it''<nowiki>foo||bar</nowiki>
 |}
-!! result
+!! html
 <table><tbody><tr>
 <td><span typeof="mw:Nowiki">foo||bar</span></td>
 <td><i>it</i><span typeof="mw:Nowiki">foo||bar</span></td></tr></tbody></table>
@@ -17975,11 +18226,11 @@ parsoid
 Tables: 2c. Nested in td -- no escaping needed
 !! options
 parsoid
-!! input
+!! wikitext
 {|
 |foo!!bar
 |}
-!! result
+!! html
 <table><tbody><tr><td>foo!!bar
 </td></tr></tbody></table>
 
@@ -17989,11 +18240,11 @@ parsoid
 Tables: 3a. Nested in th
 !! options
 parsoid
-!! input
+!! wikitext
 {|
 !foo!bar
 |}
-!! result
+!! html
 <table><tbody><tr><th>foo!bar
 </th></tr></tbody></table>
 
@@ -18003,11 +18254,11 @@ parsoid
 Tables: 3b. Nested in th
 !! options
 parsoid
-!! input
+!! wikitext
 {|
 !<nowiki>foo!!bar</nowiki>
 |}
-!! result
+!! html
 <table>
 <tbody><tr><th><span typeof="mw:Nowiki">foo!!bar</span></th></tr>
 </tbody></table>
@@ -18017,11 +18268,11 @@ parsoid
 Tables: 3c. Nested in th -- no escaping needed
 !! options
 parsoid
-!! input
+!! wikitext
 {|
 !<nowiki>foo||bar</nowiki>
 |}
-!! result
+!! html
 <table><tbody><tr>
 <th><span typeof="mw:Nowiki">foo||bar</span></th></tr></tbody></table>
 !! end
@@ -18030,13 +18281,13 @@ parsoid
 Tables: 4a. Escape -
 !! options
 parsoid
-!! input
+!! wikitext
 {|
 !-bar
 |-
 |<nowiki>-bar</nowiki>
 |}
-!! result
+!! html
 <table><tbody>
 <tr><th>-bar</th></tr>
 <tr>
@@ -18047,13 +18298,13 @@ parsoid
 Tables: 4b. Escape +
 !! options
 parsoid
-!! input
+!! wikitext
 {|
 !+bar
 |-
 |<nowiki>+bar</nowiki>
 |}
-!! result
+!! html
 <table><tbody>
 <tr><th>+bar</th></tr>
 <tr>
@@ -18064,7 +18315,7 @@ parsoid
 Tables: 4c. No escaping needed
 !! options
 parsoid
-!! input
+!! wikitext
 {|
 |foo-bar
 |foo+bar
@@ -18080,7 +18331,7 @@ bar|baz
 |x
 <div>a|b</div>
 |}
-!! result
+!! html
 <table><tbody>
 <tr><td>foo-bar</td><td>foo+bar</td></tr>
 <tr><td><i>foo</i>-bar</td><td><i>foo</i>+bar</td></tr>
@@ -18097,13 +18348,13 @@ bar|baz
 Tables: 4d. No escaping needed
 !! options
 parsoid
-!! input
+!! wikitext
 {|
 |[[Foo]]-bar
 ||+1
 ||-2
 |}
-!! result
+!! html
 <table>
 <tbody><tr><td><a rel="mw:WikiLink" href="./Foo">Foo</a>-bar</td>
 <td data-parsoid='{"startTagSrc":"|","attrSepSrc":"|"}'>+1</td>
@@ -18111,6 +18362,23 @@ parsoid
 </tbody></table>
 !! end
 
+!! test
+Tables: Digest broken attributes on table and tr tag
+!! options
+parsoid=wt2html
+!! wikitext
+{| || |} ++
+|- || || ++ --
+|- > [
+|}
+!! html
+<table>
+<tbody>
+<tr></tr>
+<tr></tr>
+</tbody></table>
+!! end
+
 #### --------------- Links ----------------
 #### 1. Quote marks in link text
 #### 2. Wikilinks: Escapes needed
@@ -18122,9 +18390,9 @@ parsoid
 Links 1. Quote marks in link text
 !! options
 parsoid
-!! input
+!! wikitext
 [[Foo|Foo<nowiki>''boo''</nowiki>]]
-!! result
+!! html
 <a rel="mw:WikiLink" href="Foo">Foo''boo''</a>
 !! end
 
@@ -18132,18 +18400,20 @@ parsoid
 Links 2. WikiLinks: Escapes needed
 !! options
 parsoid
-!! input
-[[Foo|<nowiki>[Foobar]</nowiki>]]
+!! wikitext
+[[Foo|[Foobar]]]
 [[Foo|<nowiki>Foobar]</nowiki>]]
 [[Foo|x [Foobar] x]]
-[[Foo|<nowiki>x [http://google.com g] x</nowiki>]]
+[[Foo|x <nowiki>[http://google.com g]</nowiki> x]]
 [[Foo|<nowiki>[[Bar]]</nowiki>]]
 [[Foo|<nowiki>x [[Bar]] x</nowiki>]]
 [[Foo|<nowiki>|Bar</nowiki>]]
 [[Foo|<nowiki>]]bar</nowiki>]]
 [[Foo|<nowiki>[[bar</nowiki>]]
+[[Foo|<nowiki>x [[ y</nowiki>]]
+[[Foo|<nowiki>x ]] y</nowiki>]]
 [[Foo|<nowiki>x ]] y [[ z</nowiki>]]
-!! result
+!! html
 <a href="Foo" rel="mw:WikiLink">[Foobar]</a>
 <a href="Foo" rel="mw:WikiLink">Foobar]</a>
 <a href="Foo" rel="mw:WikiLink">x [Foobar] x</a>
@@ -18153,6 +18423,8 @@ parsoid
 <a href="Foo" rel="mw:WikiLink">|Bar</a>
 <a href="Foo" rel="mw:WikiLink">]]bar</a>
 <a href="Foo" rel="mw:WikiLink">[[bar</a>
+<a href="Foo" rel="mw:WikiLink">x [[ y</a>
+<a href="Foo" rel="mw:WikiLink">x ]] y</a>
 <a href="Foo" rel="mw:WikiLink">x ]] y [[ z</a>
 !! end
 
@@ -18160,10 +18432,10 @@ parsoid
 Links 3. WikiLinks: No escapes needed
 !! options
 parsoid
-!! input
+!! wikitext
 [[Foo|[Foobar]]
 [[Foo|foo|bar]]
-!! result
+!! html
 <a href="Foo" rel="mw:WikiLink">[Foobar</a>
 <a href="Foo" rel="mw:WikiLink">foo|bar</a>
 !! end
@@ -18172,7 +18444,7 @@ parsoid
 Links 4. ExtLinks: Escapes needed
 !! options
 parsoid
-!! input
+!! wikitext
 [http://google.com <nowiki>[google]</nowiki>]
 [http://google.com <nowiki>google]</nowiki>]
 
@@ -18180,7 +18452,7 @@ parsoid
 
 <nowiki>[http://google.com google]</nowiki>
 
-!! result
+!! html
 <p><a href="http://google.com" rel="mw:ExtLink">[google]</a>
 <a href="http://google.com" rel="mw:ExtLink">google]</a></p>
 <p>[http://google.com]</p>
@@ -18191,9 +18463,9 @@ parsoid
 Links 5. ExtLinks: No escapes needed
 !! options
 parsoid
-!! input
+!! wikitext
 [http://google.com [google]
-!! result
+!! html
 <a href="http://google.com" rel="mw:ExtLink">[google</a>
 !! end
 
@@ -18207,7 +18479,7 @@ parsoid
 1. Quotes inside <b> and <i>
 !! options
 parsoid=html2wt,wt2wt
-!! input
+!! wikitext
 ''<nowiki>'foo'</nowiki>''
 ''<nowiki>''foo''</nowiki>''
 ''<nowiki>'''foo'''</nowiki>''
@@ -18225,7 +18497,7 @@ parsoid=html2wt,wt2wt
 '<nowiki/>'''foo'''<nowiki/>'
 ''fools'<span> errand</span>''
 ''<span>fool</span>'s errand''
-!! result
+!! html
 <p><i>'foo'</i>
 <i>''foo''</i>
 <i>'''foo'''</i>
@@ -18247,11 +18519,11 @@ parsoid=html2wt,wt2wt
 
 !! test
 2. Link fragments separated by <i> and <b> tags
-!! input
+!! wikitext
 [[''foo''<nowiki>hello]]</nowiki>
 
 [['''foo'''<nowiki>hello]]</nowiki>
-!! result
+!! html
 <p>[[<i>foo</i>hello]]
 </p><p>[[<b>foo</b>hello]]
 </p>
@@ -18261,11 +18533,11 @@ parsoid=html2wt,wt2wt
 3. Link fragments inside <i> and <b>
 (FIXME: Escaping one or both of [[ and ]] is also acceptable --
  this is one of the shortcomings of this format)
-!! input
+!! wikitext
 ''[[foo''<nowiki>]]</nowiki>
 
 '''[[foo'''<nowiki>]]</nowiki>
-!! result
+!! html
 <p><i>[[foo</i>]]
 </p><p><b>[[foo</b>]]
 </p>
@@ -18273,10 +18545,10 @@ parsoid=html2wt,wt2wt
 
 !! test
 4. No escaping needed
-!! input
+!! wikitext
 '<span>''bar''</span>'
 '<span>'''bar'''</span>'
-!! result
+!! html
 <p>'<span><i>bar</i></span>'
 '<span><b>bar</b></span>'
 </p>
@@ -18288,7 +18560,7 @@ parsoid=html2wt,wt2wt
 
 !! test
 1. No unnecessary escapes
-!! input
+!! wikitext
 bar <span><nowiki>[[foo]]</nowiki></span>
 
 =bar <span><nowiki>[[foo]]</nowiki></span>
@@ -18298,7 +18570,7 @@ bar <span><nowiki>[[foo]]</nowiki></span>
 ]]bar <span><nowiki>[[foo]]</nowiki></span>
 
 =bar <span>foo]]</span><nowiki>=</nowiki>
-!! result
+!! html
 <p>bar <span>[[foo]]</span>
 </p><p>=bar <span>[[foo]]</span>
 </p><p>[[bar <span>[[foo]]</span>
@@ -18314,7 +18586,7 @@ bar <span><nowiki>[[foo]]</nowiki></span>
 1. Leading whitespace in SOL context should be escaped
 !! options
 parsoid
-!! input
+!! wikitext
 <nowiki> </nowiki>a
 
 <nowiki> </nowiki> a
 
 a
 <nowiki>       </nowiki> b
-!! result
+!! html
 <p> a</p>
 <p>  a</p>
 <p>    a(tab)</p>
 1. Valid behavior switches should be escaped
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 <nowiki>__TOC__</nowiki>
-!! result
+!! html
 __TOC__
 !! end
 
@@ -18362,10 +18634,10 @@ __TOC__
 2. Invalid behavior switches should not be escaped
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 __TOO__
 __|__
-!! result
+!! html
 __TOO__
 __|__
 !! end
@@ -18380,18 +18652,18 @@ __|__
 1. a tags
 !! options
 parsoid
-!! input
+!! wikitext
 <a href="http://google.com">google</a>
-!! result
+!! html
 &lt;a href=&quot;http://google.com&quot;&gt;google&lt;/a&gt;
 !! end
 
 !! test
 2. other tags
-!! input
+!! wikitext
 <nowiki><div>foo</div>
 <div style="color:red">foo</div></nowiki>
-!! result
+!! html
 <p>&lt;div&gt;foo&lt;/div&gt;
 &lt;div style=&quot;color:red&quot;&gt;foo&lt;/div&gt;
 </p>
@@ -18399,11 +18671,11 @@ parsoid
 
 !! test
 3. multi-line html tag
-!! input
+!! wikitext
 <nowiki><div
 >foo</div
 ></nowiki>
-!! result
+!! html
 <p>&lt;div
 &gt;foo&lt;/div
 &gt;
@@ -18412,13 +18684,13 @@ parsoid
 
 !! test
 4. extension tags
-!! input
+!! wikitext
 <nowiki><ref>foo</ref></nowiki>
 
 <nowiki><ref>bar</nowiki>
 
 baz<nowiki></ref></nowiki>
-!! result
+!! html
 <p>&lt;ref&gt;foo&lt;/ref&gt;
 </p><p>&lt;ref&gt;bar
 </p><p>baz&lt;/ref&gt;
@@ -18428,9 +18700,9 @@ baz<nowiki></ref></nowiki>
 #### --------------- Others ---------------
 !! test
 Escaping nowikis
-!! input
+!! wikitext
 &lt;nowiki&gt;foo&lt;/nowiki&gt;
-!! result
+!! html
 <p>&lt;nowiki&gt;foo&lt;/nowiki&gt;
 </p>
 !! end
@@ -18440,16 +18712,16 @@ Escaping nowikis
 (Bug 52035) Nowiki-escaping should not get tripped by " :" in text
 !! options
 parsoid=wt2wt,html2wt
-!! input
+!! wikitext
 foo's bar :
-!! result
+!! html
 <p>foo's bar :</p>
 !! end
 
 !! test
 
 Tag-like HTML structures are passed through as text
-!! input
+!! wikitext
 <x y>
 
 <x.y>
@@ -18463,7 +18735,7 @@ x<y
 a>b
 
 1<d e>f
-!! result
+!! html
 <p>&lt;x y&gt;
 </p><p>&lt;x.y&gt;
 </p><p>&lt;x-y&gt;
@@ -18479,36 +18751,36 @@ a>b
 # https://bugzilla.wikimedia.org/show_bug.cgi?id=17663)
 !! test
 Tag names followed by punctuation should not be recognized as tags
-!! input
+!! wikitext
 <s.ome> text
-!! result
+!! html
 <p>&lt;s.ome&gt; text
 </p>
 !! end
 
 !! test
 HTML tag with necessary entities in attributes
-!! input
+!! wikitext
 <span title="&amp;amp;">foo</span>
-!! result
+!! html
 <p><span title="&amp;amp;">foo</span>
 </p>
 !! end
 
 !! test
 HTML tag with 'unnecessary' entity encoding in attributes
-!! input
+!! wikitext
 <span title="&amp;">foo</span>
-!! result
+!! html
 <p><span title="&amp;">foo</span>
 </p>
 !! end
 
 !! test
 HTML tag with broken attribute value quoting
-!! input
+!! wikitext
 <span title="Hello world>Foo</span>
-!! result
+!! html
 <p><span>Foo</span>
 </p>
 !! end
@@ -18517,20 +18789,20 @@ HTML tag with broken attribute value quoting
 Parsoid-only: HTML tag with broken attribute value quoting
 !! options
 parsoid
-!! input
+!! wikitext
 <span title="Hello world>Foo</span>
-!! result
+!! html
 <p><span title="Hello world">Foo</span>
 </p>
 !! end
 
 !! test
 Table with broken attribute value quoting
-!! input
+!! wikitext
 {|
 | title="Hello world|Foo
 |}
-!! result
+!! html
 <table>
 <tr>
 <td>Foo
@@ -18540,12 +18812,12 @@ Table with broken attribute value quoting
 
 !! test
 Table with broken attribute value quoting on consecutive lines
-!! input
+!! wikitext
 {|
 | title="Hello world|Foo
 | style="color:red|Bar
 |}
-!! result
+!! html
 <table>
 <tr>
 <td>Foo
@@ -18559,12 +18831,12 @@ Table with broken attribute value quoting on consecutive lines
 Parsoid-only: Table with broken attribute value quoting on consecutive lines
 !! options
 parsoid
-!! input
+!! wikitext
 {|
 | title="Hello world|Foo
 | style="color:red|Bar
 |}
-!! result
+!! html
 <table><tbody>
 <tr>
 <td title="Hello world">Foo
@@ -18577,9 +18849,9 @@ parsoid
 Parsoid-only: Don't wrap broken template tags in <nowiki> on wt2wt (Bug 42353)
 !! options
 parsoid
-!! input
+!! wikitext
 {{}}
-!! result
+!! html
 {{}}
 !! end
 
@@ -18587,19 +18859,19 @@ parsoid
 Parsoid-only: Don't wrap broken template tags in <nowiki> on wt2wt (Bug 42353)
 !! options
 parsoid
-!! input
+!! wikitext
 }}{{
-!! result
+!! html
 }}{{
 !! end
 
 !!test
 Accept empty td cell attribute
-!!input
+!! wikitext
 {|
 | align="center" | foo ||  |
 |}
-!!result
+!! html
 <table>
 <tr>
 <td align="center"> foo </td>
@@ -18610,11 +18882,11 @@ Accept empty td cell attribute
 
 !!test
 Non-empty attributes in th-cells
-!!input
+!! wikitext
 {|
 ! Foo !! style="color: red" | Bar
 |}
-!!result
+!! html
 <table>
 <tr>
 <th> Foo </th>
@@ -18625,11 +18897,11 @@ Non-empty attributes in th-cells
 
 !!test
 Accept empty attributes in th-cells
-!!input
+!! wikitext
 {|
 !| foo !!| bar
 |}
-!!result
+!! html
 <table>
 <tr>
 <th> foo </th>
@@ -18640,14 +18912,14 @@ Accept empty attributes in th-cells
 
 !!test
 Empty table rows go away
-!!input
+!! wikitext
 {|
 | Hello
 | there
 |- class="foo"
 |-
 |}
-!! result
+!! html
 <table>
 <tr>
 <td> Hello
@@ -18667,11 +18939,11 @@ Empty table rows go away
 
 !!test
 RT-ed inter-element separators should be valid separators
-!!input
+!! wikitext
 {|
 |- [[foo]]
 |}
-!!result
+!! html
 <table>
 
 </table>
@@ -18683,7 +18955,7 @@ Trailing newlines in a deep dom-subtree that ends a wikitext line should be migr
 (Parsoid-only since PHP parser relies on Tidy for correct output)
 !!options
 parsoid
-!!input
+!! wikitext
 {|
 |<small>foo
 bar
@@ -18692,18 +18964,18 @@ bar
 {|
 |<small>foo<small>
 |}
-!!result
+!! html
 !!end
 
 !!test
 Empty TD followed by TD with tpl-generated attribute
-!!input
+!! wikitext
 {|
 |-
 |
 |{{echo|style='color:red'}}|foo
 |}
-!!result
+!! html
 <table>
 
 <tr>
@@ -18716,13 +18988,13 @@ Empty TD followed by TD with tpl-generated attribute
 
 !!test
 Indented table with an empty td
-!!input
+!! wikitext
  {|
  |-
  |
  |foo
  |}
-!!result
+!! html
 <table>
 
 <tr>
@@ -18738,12 +19010,12 @@ Empty TR followed by a template-generated TR
 (Parsoid-specific since PHP parser doesn't handle this mixed tbl-wikitext)
 !!options
 parsoid
-!!input
+!! wikitext
 {|
 |-
 {{echo|<tr><td>foo</td></tr>}}
 |}
-!!result
+!! html
 <table>
 <tbody>
 <tr></tr>
@@ -18758,14 +19030,14 @@ parsoid
 Empty TR followed by mixed-ws-comment line should RT correctly
 !!options
 parsoid
-!!input
+!! wikitext
 {|
 |-
  <!--c-->
 |-
 <!--c--> <!--d-->
 |}
-!!result
+!! html
 <table>
 <tbody>
 <tr></tr>
@@ -18780,10 +19052,10 @@ parsoid
 Multi-line image caption generated by templates with/without trailing newlines
 !!options
 parsoid
-!!input
+!! wikitext
 [[File:foo.jpg|thumb|300px|foo\n{{echo|A}}\n{{echo|B}}\n{{echo|C}}]]
 [[File:foo.jpg|thumb|300px|foo\n{{echo|A}}\n{{echo|B}}\n{{echo|C}}\n\n]]
-!!result
+!! html
 <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=Special:Upload&amp;wpDestFile=Foo.jpg" class="new" title="File:Foo.jpg">File:Foo.jpg</a>  <div class="thumbcaption">foo\nA\nB\nC</div></div></div>
 <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=Special:Upload&amp;wpDestFile=Foo.jpg" class="new" title="File:Foo.jpg">File:Foo.jpg</a>  <div class="thumbcaption">foo\nA\nB\nC\n\n</div></div></div>
 
@@ -18795,10 +19067,10 @@ parsoid
 Improperly nested inline or quotes tags with whitespace in between
 !!options
 parsoid
-!!input
+!! wikitext
 <span> <s>x</span> </s>
 ''' ''x''' ''
-!!result
+!! html
 <p><span> <s>x</s></span><s> </s>
 <b> <i>x</i></b><i> </i>
 </p>
@@ -18808,9 +19080,9 @@ parsoid
 Encapsulate protected attributes from wt
 !!options
 parsoid
-!!input
+!! wikitext
 <div typeof="mw:placeholder stuff" data-parsoid="weird" data-parsoid-other="no" about="time" rel="mw:true">foo</div>
-!!result
+!! html
 <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
@@ -18822,32 +19094,50 @@ parsoid
 Ensure ParagraphWrapper can deal with stray closing pre tags
 !!options
 parsoid=wt2html
-!!input
+!! wikitext
 plain text</pre>
-!!result
+!! html
 plain text
 !!end
 
 !!test
-Ensure fostered text content is wrapped in spans
+1. Ensure fostered text content is wrapped in spans
 !!options
 parsoid=wt2html
-!!input
+!! wikitext
 <table>hi</table><table>ho</table>
-!!result
+!! html
 <span>hi</span>
 <table></table>
 <span>ho</span>
 <table></table>
 !!end
 
+!!test
+2. Ensure fostered text content is wrapped in spans (traps regressions around fostered marker on the span getting lost)
+!!options
+parsoid=wt2html,wt2wt
+!! wikitext
+<table>
+<tr> || ||
+<td> a
+</table>
+!! html
+<span> || ||</span>
+<table>
+<tbody>
+<tr>
+<td> a</td></tr>
+</tbody></table>
+!!end
+
 !!test
 Encapsulation properly handles null DSR information from foster box
 !!options
 parsoid=wt2html,wt2wt
-!!input
+!! wikitext
 {{echo|<table>foo<tr><td>bar</td></tr></table>}}
-!!result
+!! html
 <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>
@@ -18862,9 +19152,9 @@ parsoid=wt2html,wt2wt
 1. Encapsulate foster-parented transclusion content
 !!options
 parsoid=wt2wt,wt2html
-!!input
+!! wikitext
 <table>{{echo|foo<tr><td>bar</td></tr>}}</table>
-!!result
+!! html
 <span 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>
@@ -18879,9 +19169,9 @@ parsoid=wt2wt,wt2html
 2. Encapsulate foster-parented transclusion content
 !!options
 parsoid=wt2wt,wt2html
-!!input
+!! wikitext
 <table><div>{{echo|foo}}</div><tr><td>bar</td></tr></table>
-!!result
+!! html
 <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>
@@ -18897,9 +19187,9 @@ parsoid=wt2wt,wt2html
 3. Encapsulate foster-parented transclusion content
 !!options
 parsoid=wt2wt,wt2html
-!!input
+!! wikitext
 <table><div><p>{{echo|foo</p></div><tr><td>}}bar</td></tr></table>
-!!result
+!! html
 <div typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[&quot;
 <table>
 <div>
@@ -18917,9 +19207,9 @@ parsoid=wt2wt,wt2html
 4. Encapsulate foster-parented transclusion content
 !!options
 parsoid=wt2wt,wt2html
-!!input
+!! wikitext
 <table><div><p>{{echo|foo</p></div><tr><td>}}bar</td></tr></table>
-!!result
+!! html
 <div typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[&quot;
 <table>
 <div>
@@ -18937,9 +19227,9 @@ parsoid=wt2wt,wt2html
 5. Encapsulate foster-parented transclusion content
 !!options
 parsoid=wt2wt,wt2html
-!!input
+!! wikitext
 <table><tr><td><div><p>{{echo|foo</p></div></td>foo}}</tr></table>
-!!result
+!! html
 <span typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[&quot;
 <table>
 <tr>
@@ -18958,9 +19248,9 @@ parsoid=wt2wt,wt2html
 6. Encapsulate foster-parented transclusion content
 !!options
 parsoid=wt2wt,wt2html
-!!input
+!! wikitext
 <table><tr><td><div><p>{{echo|foo</p></div></td>foo</tr></table>}}<p>ok</p>
-!!result
+!! html
 <span typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[&quot;
 <table>
 <tr>
@@ -18980,9 +19270,9 @@ parsoid=wt2wt,wt2html
 7. Encapsulate foster-parented transclusion content
 !!options
 parsoid=wt2wt,wt2html
-!!input
+!! wikitext
 <table>{{echo|<p>foo</p>}}<td>bar</td></table>
-!!result
+!! html
 <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;
@@ -18997,13 +19287,13 @@ parsoid=wt2wt,wt2html
 8. Encapsulate foster-parented transclusion content
 !!options
 parsoid=wt2wt,wt2html
-!!input
+!! wikitext
 {{echo|a
 }}{|{{echo|style='color:red'}}
 |-
 |b
 |}
-!!result
+!! 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><span 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}}}</span>
 <table>
 <tbody>
@@ -19015,22 +19305,32 @@ parsoid=wt2wt,wt2html
 Table in fosterable position
 !!options
 parsoid=wt2html,wt2wt
-!!input
+!! wikitext
 {{OpenTable}}
 <div>
 {|
 |}
 </div>
 |}
-!!result
-<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,"dsr":[0,19,null,null],"src":"{{OpenTable}}\n&lt;div>","pi":[[]]}'></div><span about="#mwt1" data-parsoid="{}">
+!! html
+<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" data-parsoid="{}">
 </span>
-<table about="#mwt1" data-parsoid='{"autoInsertedEnd":true,"dsr":[null,19,2,0]}'></table>
+<table about="#mwt1" data-parsoid='{"autoInsertedEnd":true}'></table>
 
-<table data-parsoid='{"dsr":[20,25,2,2]}'>
+<table>
 </table>
 !!end
 
+!!test
+Support <object> element with .data attribute
+!!options
+parsoid=html2wt
+!! wikitext
+<object data="test.swf"></object>
+!! html
+<object data="test.swf"></object>
+!!end
+
 # -----------------------------------------------------------------
 # The following section of tests are primarily to spec requirements
 # around serialization of new/edited content.
@@ -19039,34 +19339,143 @@ parsoid=wt2html,wt2wt
 # ----------------------------------------------------------------
 
 !! test
-Image: Modifying size of an image
+Image: Modifying size of an image (1)
+!! options
+parsoid=html2wt
+!! wikitext
+[[Image:Foobar.jpg|200x200px]]
+!! html
+<p><span typeof="mw:Image" data-parsoid='{"optList":[{"ck":"width","ak":"230x230px"}]}'><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/230px-Foobar.jpg" height="22" width="200" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"26","width":"230"},"sa":{"resource":"Image:Foobar.jpg"}}'/></a></span></p>
+!!end
+
+!! test
+Image: Modifying size of an image (2)
+!! options
+parsoid=html2wt
+!! wikitext
+[[Image:Foobar.jpg|500x500px]]
+!! html
+<p><span typeof="mw:Image" data-parsoid='{"optList":[{"ck":"width","ak":"230x230px"}]}'><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/230px-Foobar.jpg" height="100" width="500" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"26","width":"230"},"sa":{"resource":"Image:Foobar.jpg"}}'/></a></span></p>
+!!end
+
+# note that the data-parsoid value conflicts with the figure's class
+!! test
+Image: Modifying alignment of an image (bug 48665)
+!! options
+parsoid=html2wt
+!! wikitext
+[[Image:Foobar.jpg|thumb|caption|left]]
+!! html
+<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"caption","ak":"caption"},{"ck":"right","ak":"right"}]}'><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" height="20" width="180" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"20","width":"180"},"sa":{"resource":"Image:Foobar.jpg"}}'/></a><figcaption>caption</figcaption></figure>
+!! end
+
+!! test
+Image: Modifying valign of an image (bug 49221)
+!! options
+parsoid=html2wt
+!! wikitext
+[[File:Foobar.jpg|20px|text-top]]
+!! html
+<p><span class="mw-valign-text-top" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"width","ak":"20px"},{"ck":"text_top","ak":"text-top"}]}'><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/20px-Foobar.jpg" height="2" width="20" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"2","width":"20"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
+!! end
+
+!! test
+Image: Modifying alt attribute of an image (bug 56400)
 !! options
 parsoid=html2wt
-!! input
-[[Image:Wiki.png|230x230px]]
-!! result
-<p data-parsoid='{"dsr":[0,24,0,0]}'><span typeof="mw:Image" data-parsoid='{"optList":[{"ck":"width","ak":"100px"}],"cacheKey":"[[Image:Wiki.png|100px]]","img":{"h":115,"w":100,"wdset":true},"dsr":[0,24,null,null]}'><a href="./File:Wiki.png" data-parsoid='{"a":{"href":"./File:Wiki.png"}}'><img resource="./File:Wiki.png" src="//upload.wikimedia.org/wikipedia/en/thumb/b/bc/Wiki.png/100px-Wiki.png" height="230" width="200" data-parsoid='{"a":{"resource":"./File:Wiki.png"},"sa":{"resource":"Image:Wiki.png"}}'></a></span></p>
+!! wikitext
+[[File:Foobar.jpg|thumb|some caption|alt=some alternate edited text]]
+!! html
+<figure class="mw-default-size" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"caption","ak":"some caption"},{"ck":"alt","ak":"alt=some alternate text"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img alt="some alternate edited text" resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" height="20" width="180" data-parsoid='{"a":{"alt":"some alternate edited text","resource":"./File:Foobar.jpg","height":"20","width":"180"},"sa":{"alt":"alt=some alternate edited text","resource":"File:Foobar.jpg"}}'/></a><figcaption>some caption</figcaption></figure>
 !!end
 
 !! test
-Image: New block level image should have \n before and after
+Image: Modifying caption of an image
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
+[[Image:Foobar.jpg|thumb|new caption]]
+!! html
+<figure class="mw-default-size" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"caption","ak":"original caption"}]}'><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" height="20" width="180" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"20","width":"180"},"sa":{"resource":"Image:Foobar.jpg"}}'/></a><figcaption>new caption</figcaption></figure>
+!!end
+
+!! test
+Image: empty alt attribute (bug 48924)
+!! options
+parsoid
+!! wikitext
+[[File:Foobar.jpg|thumb|alt=|bar]]
+!! html
+<figure class="mw-default-size" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"alt","ak":"alt="},{"ck":"caption","ak":"bar"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img alt="" resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" height="25" width="220" data-parsoid='{"a":{"alt":"","resource":"./File:Foobar.jpg","height":"25","width":"220"},"sa":{"alt":"alt=","resource":"File:Foobar.jpg"}}'/></a><figcaption>bar</figcaption></figure>
+!! end
+
+#!! test
+#Image: new attributes should be serialized in wiki's language for RTL languages (bug 51852)
+#!! options
+#parsoid=html2wt
+#language=ar
+#!! input
+#[[Imagen:Foobar.jpg|derecha|miniaturadeimagen]]
+#!! result
+#<figure class="mw-default-size mw-halign-right" typeof="mw:Image/Thumb"><a href="Imagen:Foobar.jpg"><img resource="./Imagen:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="20" width="180"/></a></figure>
+#!! end
+
+!! test
+Image: Block level image should have \n before and after
+!! options
+parsoid
+!! wikitext
+123
+[[File:Foobar.jpg|right|thumb|150x150px]]
+456
+!! html
+<p>123</p><figure typeof="mw:Image/Thumb" class="mw-halign-right"><a href="./File:Foobar.png"><img src="http://192.168.142.128/mw/images/thumb/b/bc/Foobar.png/131px-Foobar.png" width="131" height="150" resource="./File:Foobar.png" data-parsoid='{"a":{"resource":"./File:Foobar.png","width":"131"},"sa":{"resource":"File:Foobar.png","width":"150"}}'></a></figure><p>456</p>
+!!end
+
+!! test
+Image: New block level image should have \n before and after (existing
+content)
+!! options
+parsoid
+!! wikitext
 123
-[[File:Wiki.png|right|thumb|150x150px]]
+[[File:Foobar.jpg|right|thumb|150x150px]]
 456
-!! result
-<p>123</p><figure typeof="mw:Image/Thumb" class="mw-halign-right"><a href="./File:Wiki.png"><img src="http://192.168.142.128/mw/images/thumb/b/bc/Wiki.png/131px-Wiki.png" width="131" height="150" resource="./File:Wiki.png"></a></figure><p>456</p>
+!! html
+<p data-parsoid='{"dsr":[0,3,0,0]}'>123</p>
+<figure class="mw-halign-right" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"right","ak":"right"},{"ck":"thumbnail","ak":"thumb"},{"ck":"width","ak":"150x150px"}],"dsr":[4,45,2,2]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"dsr":[6,43,null,null]}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/150px-Foobar.jpg" height="17" width="150" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"17","width":"150"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></figure>
+<p data-parsoid='{"dsr":[46,49,0,0]}'>456</p>
+!!end
+
+!! test
+Images: 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" 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" height="19" width="170"/></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" height="57" width="500"/></a><figcaption>caption</figcaption></figure>
+!!end
+
+!! test
+Images: 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" height="57" width="500"/></a></span></p>
 !!end
 
 !! test
 Lists: Serialize correctly even when list content is wrapped in p-tags (like VE does)
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 * foo
-!! result
+!! html
 <ul>
 <li><p>foo</p></li>
 </ul>
@@ -19076,9 +19485,9 @@ parsoid=html2wt
 Lists: Serialize correctly even when list tags has unneeded whitespace between tags
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 * foo
-!! result
+!! html
 <ul> <li>foo</li></ul>
 !! end
 
@@ -19086,7 +19495,7 @@ parsoid=html2wt
 Don't strip leading whitespace when handling indent-pre suppressing tags
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 {|
   | indented row
 |}
@@ -19100,7 +19509,7 @@ parsoid=html2wt
 </blockquote>
 foo
  <div>bar</div>
-!! result
+!! html
 <table>
   <tr><td> indented row</td></tr>
 </table>
@@ -19119,7 +19528,7 @@ foo
 Strip leading whitespace when handling indent-pre inducing tags
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 foo
 <span>bar</span>
 
@@ -19132,7 +19541,7 @@ foo
 <div>
 <span>foo</span>
 </div>
-!! result
+!! html
 <p>foo</p>
  <span>bar</span>
 
@@ -19151,11 +19560,11 @@ foo
 Lists: Add space after bullets
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 * foo
 * bar
 * <span> baz</span>
-!! result
+!! html
 <ul>
 <li>foo</li>
 <li> bar</li>
@@ -19163,11 +19572,22 @@ parsoid=html2wt
 </ul>
 !! end
 
+!! test
+Lists: Dont insert newlines in a serialized list item.
+!! options
+parsoid=html2wt
+!! wikitext
+* a<br>b
+* c
+!! html
+<ul><li>a<br>b</li><li>c</li></ul>
+!! end
+
 !! test
 Headings: Add space before/after == (Bug 51744)
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 == foo ==
 
 == bar ==
@@ -19175,7 +19595,7 @@ parsoid=html2wt
 == baz ==
 
 == <span> baz</span> ==
-!! result
+!! html
 <h2>foo</h2>
 <h2> bar</h2>
 <h2>baz </h2>
@@ -19186,7 +19606,7 @@ parsoid=html2wt
 Parsoid: Serialize positional parameters with = in them as named parameter
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 {{echo|1 = f=oo}}
 
 {{echo|1 = f=oo|2 = bar}}
@@ -19194,7 +19614,7 @@ parsoid=html2wt
 <!--Orig params with data-parsoid has heuristics for handling = chars-->
 <!--FIXME: But maybe the heuristic needs fixing to apply to new params as well-->
 {{echo|<nowiki>f=oo</nowiki>|bar}}
-!! result
+!! html
 <p about="#mwt1" typeof="mw:Transclusion"
 data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"f=oo"}},"i":0}}]}'>foo</p>
 
@@ -19210,7 +19630,7 @@ data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},
 Parsoid: Correctly serialize block-node children when they are a combination of text and p-nodes
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 <div>a
 b
 </div>
 
 b
 </div>
-!! result
+!! html
 <div>a<p>b</p></div>
 <div>a
 <p>b</p></div>
 1. I/B quote minimization: wikitext-only tags should be combined
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 ''AB''
 
 '''AB'''
@@ -19255,7 +19675,7 @@ parsoid=html2wt
 '''''AB'''''
 
 '''''AB'''''
-!! result
+!! html
 <p><i>A</i><i>B</i></p>
 <p><b>A</b><b>B</b></p>
 <p><i>A</i><b><i>B</i></b></p>
@@ -19270,11 +19690,11 @@ parsoid=html2wt
 2. I/B quote minimization: wikitext and html tags should not be combined
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 ''A''<i>B</i>
 
 ''A'''''<i>B</i>'''
-!! result
+!! html
 <p><i>A</i><i data-parsoid='{"stx":"html"}'>B</i></p>
 <p><i>A</i><b><i data-parsoid='{"stx":"html"}'>B</i></b></p>
 !! end
@@ -19283,11 +19703,11 @@ parsoid=html2wt
 3. I/B quote minimization: templated content stops minimization
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 ''A''{{echo|''B''}}
 
 ''A''{{echo|'''''B'''''}}
-!! result
+!! html
 <p><i>A</i><i about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&#39;&#39;B&#39;&#39;"}},"i":0}}]}'>B</i>
 <p><i>A</i><b about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&#39;&#39;&#39;&#39;&#39;B&#39;&#39;&#39;&#39;&#39;"}},"i":0}}]}'><i>B</i></b>
 !! end
@@ -19296,13 +19716,13 @@ parsoid=html2wt
 4. I/B quote minimization: new content should be mimimized with adjacent old content
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 ''AB''
 
 '''AB'''
 
 ''A'''B'''''
-!! result
+!! html
 <p><i>A</i><i data-parsoid='{}'>B</i></p>
 <p><b data-parsoid='{}'>A</b><b>B</b></p>
 <p><i>A</i><b data-parsoid='{}'><i data-parsoid='{}'>B</i></b></p>
@@ -19316,9 +19736,9 @@ parsoid=html2wt
 Bug 54262: New entities
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 foo
-!! result
+!! html
 <span typeof="mw:Entity">foo</span>
 !! end
 
@@ -19329,7 +19749,7 @@ foo
 Magic words
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 __TOC__
 __NOTOC__
 __FORCETOC__
@@ -19339,7 +19759,7 @@ __NOGALLERY__
 __NOEDITSECTION__
 __NOTITLECONVERT__
 __NOCONTENTCONVERT__
-!! result
+!! html
 <meta property='mw:PageProp/toc' />
 <meta property='mw:PageProp/notoc' />
 <meta property='mw:PageProp/forcetoc' />
@@ -19356,7 +19776,7 @@ __NOCONTENTCONVERT__
 Consecutive <pre>s should not get merged
 !! options
 parsoid=html2wt,html2html
-!! input
+!! wikitext
  a
 
  b
@@ -19370,7 +19790,7 @@ parsoid=html2wt,html2html
 
  
  f
-!! result
+!! html
 <pre>a</pre><pre>b</pre>
 
 <pre>c
@@ -19388,9 +19808,9 @@ f</pre>
 Edited ISBN links not serializable as ISBN links should serialize as wikilinks
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 [[Special:BookSources/1234567890|ISBN 1234567895]]
-!! result
+!! html
 <a rel="mw:ExtLink" href="./Special:BookSources/1234567890">ISBN 1234567895</a>
 !! end
 
@@ -19398,9 +19818,9 @@ parsoid=html2wt
 Edited RFC links not serializable as RFC links should serialize as extlinks
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 [//tools.ietf.org/html/rfc123 New RFC]
-!! result
+!! html
 <a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink">New RFC</a>
 !! end
 
@@ -19408,12 +19828,22 @@ parsoid=html2wt
 Edited PMID links not serializable as PMID links should serialize as extlinks
 !! options
 parsoid=html2wt
-!! input
+!! wikitext
 [//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract New PMID]
-!! result
+!! html
 <a href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract" rel="mw:ExtLink">New PMID</a>
 !! end
 
+!! test
+Edited Redirect link should emit a non-piped wikitext link
+!! options
+parsoid=html2wt
+!! wikitext
+#REDIRECT [[Bar]]
+!! html
+<link rel="mw:PageProp/redirect" href="Bar" data-parsoid='{"src":"#REDIRECT ","a":{"href":"./Foo"},"sa":{"href":"Foo"}}'>
+!! end
+
 # -----------------------------------------------------------------
 # End of section for Parsoid-only html2wt tests for serialization
 # of new content
index 87e214c..277826c 100644 (file)
@@ -1,9 +1,9 @@
 <?php
 
+/**
+ * @since 1.18
+ */
 abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
-       public $suite;
-       public $regex = '';
-       public $runDisabled = false;
 
        /**
         * $called tracks whether the setUp and tearDown method has been called.
@@ -20,14 +20,21 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        private $called = array();
 
        /**
-        * @var Array of TestUser
+        * @var TestUser[]
+        * @since 1.20
         */
        public static $users;
 
        /**
         * @var DatabaseBase
+        * @since 1.18
         */
        protected $db;
+
+       /**
+        * @var array
+        * @since 1.19
+        */
        protected $tablesUsed = array(); // tables with data
 
        private static $useTemporaryTables = true;
@@ -48,7 +55,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         *
         * @var array
         */
-       private $tmpfiles = array();
+       private $tmpFiles = array();
 
        /**
         * Holds original values of MediaWiki configuration settings
@@ -64,6 +71,10 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        const DB_PREFIX = 'unittest_';
        const ORA_DB_PREFIX = 'ut_';
 
+       /**
+        * @var array
+        * @since 1.18
+        */
        protected $supportedDBs = array(
                'mysql',
                'sqlite',
@@ -71,14 +82,14 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                'oracle'
        );
 
-       function __construct( $name = null, array $data = array(), $dataName = '' ) {
+       public function __construct( $name = null, array $data = array(), $dataName = '' ) {
                parent::__construct( $name, $data, $dataName );
 
                $this->backupGlobals = false;
                $this->backupStaticAttributes = false;
        }
 
-       function run( PHPUnit_Framework_TestResult $result = null ) {
+       public function run( PHPUnit_Framework_TestResult $result = null ) {
                /* Some functions require some kind of caching, and will end up using the db,
                 * which we can't allow, as that would open a new connection for mysql.
                 * Replace with a HashBag. They would not be going to persist anyway.
@@ -130,22 +141,29 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                }
        }
 
-       function usesTemporaryTables() {
+       /**
+        * @since 1.21
+        *
+        * @return bool
+        */
+       public function usesTemporaryTables() {
                return self::$useTemporaryTables;
        }
 
        /**
-        * obtains a new temporary file name
+        * Obtains a new temporary file name
         *
         * The obtained filename is enlisted to be removed upon tearDown
         *
-        * @return string: absolute name of the temporary file
+        * @since 1.20
+        *
+        * @return string absolute name of the temporary file
         */
        protected function getNewTempFile() {
-               $fname = tempnam( wfTempDir(), 'MW_PHPUnit_' . get_class( $this ) . '_' );
-               $this->tmpfiles[] = $fname;
+               $fileName = tempnam( wfTempDir(), 'MW_PHPUnit_' . get_class( $this ) . '_' );
+               $this->tmpFiles[] = $fileName;
 
-               return $fname;
+               return $fileName;
        }
 
        /**
@@ -154,26 +172,24 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * The obtained directory is enlisted to be removed (recursively with all its contained
         * files) upon tearDown.
         *
-        * @return string: absolute name of the temporary directory
+        * @since 1.20
+        *
+        * @return string Absolute name of the temporary directory
         */
        protected function getNewTempDirectory() {
                // Starting of with a temporary /file/.
-               $fname = $this->getNewTempFile();
+               $fileName = $this->getNewTempFile();
 
                // Converting the temporary /file/ to a /directory/
                //
                // The following is not atomic, but at least we now have a single place,
                // where temporary directory creation is bundled and can be improved
-               unlink( $fname );
-               $this->assertTrue( wfMkdirParents( $fname ) );
+               unlink( $fileName );
+               $this->assertTrue( wfMkdirParents( $fileName ) );
 
-               return $fname;
+               return $fileName;
        }
 
-       /**
-        * setUp and tearDown should (where significant)
-        * happen in reverse order.
-        */
        protected function setUp() {
                wfProfileIn( __METHOD__ );
                parent::setUp();
@@ -181,23 +197,12 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                $this->phpErrorLevel = intval( ini_get( 'error_reporting' ) );
 
-               /*
-               // @todo global variables to restore for *every* test
-               array(
-                       'wgLang',
-                       'wgContLang',
-                       'wgLanguageCode',
-                       'wgUser',
-                       'wgTitle',
-               );
-               */
-
                // Cleaning up temporary files
-               foreach ( $this->tmpfiles as $fname ) {
-                       if ( is_file( $fname ) || ( is_link( $fname ) ) ) {
-                               unlink( $fname );
-                       } elseif ( is_dir( $fname ) ) {
-                               wfRecursiveRemoveDir( $fname );
+               foreach ( $this->tmpFiles as $fileName ) {
+                       if ( is_file( $fileName ) || ( is_link( $fileName ) ) ) {
+                               unlink( $fileName );
+                       } elseif ( is_dir( $fileName ) ) {
+                               wfRecursiveRemoveDir( $fileName );
                        }
                }
 
@@ -218,11 +223,11 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                wfProfileIn( __METHOD__ );
 
                // Cleaning up temporary files
-               foreach ( $this->tmpfiles as $fname ) {
-                       if ( is_file( $fname ) || ( is_link( $fname ) ) ) {
-                               unlink( $fname );
-                       } elseif ( is_dir( $fname ) ) {
-                               wfRecursiveRemoveDir( $fname );
+               foreach ( $this->tmpFiles as $fileName ) {
+                       if ( is_file( $fileName ) || ( is_link( $fileName ) ) ) {
+                               unlink( $fileName );
+                       } elseif ( is_dir( $fileName ) ) {
+                               wfRecursiveRemoveDir( $fileName );
                        }
                }
 
@@ -269,13 +274,11 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        }
 
        /**
-        * Individual test functions may override globals (either directly or through this
-        * setMwGlobals() function), however one must call this method at least once for
-        * each key within the setUp().
-        * That way the key is added to the array of globals that will be reset afterwards
-        * in the tearDown(). And, equally important, that way all other tests are executed
-        * with the same settings (instead of using the unreliable local settings for most
-        * tests and fix it only for some tests).
+        * Sets a global, maintaining a stashed version of the previous global to be
+        * restored in tearDown
+        *
+        * The key is added to the array of globals that will be reset afterwards
+        * in the tearDown().
         *
         * @example
         * <code>
@@ -299,24 +302,61 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         *  of key/value pairs.
         * @param mixed $value Value to set the global to (ignored
         *  if an array is given as first argument).
+        *
+        * @since 1.21
         */
        protected function setMwGlobals( $pairs, $value = null ) {
-
-               // Normalize (string, value) to an array
                if ( is_string( $pairs ) ) {
                        $pairs = array( $pairs => $value );
                }
 
+               $this->stashMwGlobals( array_keys( $pairs ) );
+
                foreach ( $pairs as $key => $value ) {
+                       $GLOBALS[$key] = $value;
+               }
+       }
+
+       /**
+        * Stashes the global, will be restored in tearDown()
+        *
+        * Individual test functions may override globals through the setMwGlobals() function
+        * or directly. When directly overriding globals their keys should first be passed to this
+        * method in setUp to avoid breaking global state for other tests
+        *
+        * That way all other tests are executed with the same settings (instead of using the
+        * unreliable local settings for most tests and fix it only for some tests).
+        *
+        * @param array|string $globalKeys Key to the global variable, or an array of keys.
+        *
+        * @throws Exception when trying to stash an unset global
+        * @since 1.23
+        */
+       protected function stashMwGlobals( $globalKeys ) {
+               if ( is_string( $globalKeys ) ) {
+                       $globalKeys = array( $globalKeys );
+               }
+
+               foreach ( $globalKeys as $globalKey ) {
                        // NOTE: make sure we only save the global once or a second call to
                        // setMwGlobals() on the same global would override the original
                        // value.
-                       if ( !array_key_exists( $key, $this->mwGlobals ) ) {
-                               $this->mwGlobals[$key] = $GLOBALS[$key];
+                       if ( !array_key_exists( $globalKey, $this->mwGlobals ) ) {
+                               if ( !array_key_exists( $globalKey, $GLOBALS ) ) {
+                                       throw new Exception( "Global with key {$globalKey} doesn't exist and cant be stashed" );
+                               }
+                               // NOTE: we serialize then unserialize the value in case it is an object
+                               // this stops any objects being passed by reference. We could use clone
+                               // and if is_object but this does account for objects within objects!
+                               try {
+                                       $this->mwGlobals[$globalKey] = unserialize( serialize( $GLOBALS[$globalKey] ) );
+                               }
+                                       // NOTE; some things such as Closures are not serializable
+                                       // in this case just set the value!
+                               catch( Exception $e ) {
+                                       $this->mwGlobals[$globalKey] = $GLOBALS[$globalKey];
+                               }
                        }
-
-                       // Override the global
-                       $GLOBALS[$key] = $value;
                }
        }
 
@@ -325,10 +365,12 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * Useful for setting some entries in a configuration array, instead of
         * setting the entire array.
         *
-        * @param String $name The name of the global, as in wgFooBar
-        * @param Array $values The array containing the entries to set in that global
+        * @param string $name The name of the global, as in wgFooBar
+        * @param array $values The array containing the entries to set in that global
         *
         * @throws MWException if the designated global is not an array.
+        *
+        * @since 1.21
         */
        protected function mergeMwGlobalArrayValue( $name, $values ) {
                if ( !isset( $GLOBALS[$name] ) ) {
@@ -348,11 +390,19 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                $this->setMwGlobals( $name, $merged );
        }
 
-       function dbPrefix() {
+       /**
+        * @return string
+        * @since 1.18
+        */
+       public function dbPrefix() {
                return $this->db->getType() == 'oracle' ? self::ORA_DB_PREFIX : self::DB_PREFIX;
        }
 
-       function needsDB() {
+       /**
+        * @return bool
+        * @since 1.18
+        */
+       public function needsDB() {
                # if the test says it uses database tables, it needs the database
                if ( $this->tablesUsed ) {
                        return true;
@@ -370,15 +420,13 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        /**
         * Stub. If a test needs to add additional data to the database, it should
         * implement this method and do so
+        *
+        * @since 1.18
         */
-       function addDBData() {
+       public function addDBData() {
        }
 
        private function addCoreDBData() {
-               # disabled for performance
-               #$this->tablesUsed[] = 'page';
-               #$this->tablesUsed[] = 'revision';
-
                if ( $this->db->getType() == 'oracle' ) {
 
                        # Insert 0 user to prevent FK violations
@@ -433,6 +481,8 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * Restores MediaWiki to using the table set (table prefix) it was using before
         * setupTestDB() was called. Useful if we need to perform database operations
         * after the test run has finished (such as saving logs or profiling info).
+        *
+        * @since 1.21
         */
        public static function teardownTestDB() {
                if ( !self::$dbSetup ) {
@@ -453,6 +503,8 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * This is used to generate a dummy table set, typically consisting of temporary
         * tables, that will be used by tests instead of the original wiki database tables.
         *
+        * @since 1.21
+        *
         * @note: the original table prefix is stored in self::$oldTablePrefix. This is used
         * by teardownTestDB() to return the wiki to using the original table set.
         *
@@ -467,7 +519,8 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        public static function setupTestDB( DatabaseBase $db, $prefix ) {
                global $wgDBprefix;
                if ( $wgDBprefix === $prefix ) {
-                       throw new MWException( 'Cannot run unit tests, the database prefix is already "' . $prefix . '"' );
+                       throw new MWException(
+                               'Cannot run unit tests, the database prefix is already "' . $prefix . '"' );
                }
 
                if ( self::$dbSetup ) {
@@ -522,17 +575,21 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                }
        }
 
-       function __call( $func, $args ) {
+       /**
+        * @since 1.18
+        *
+        * @param string $func
+        * @param array $args
+        *
+        * @return mixed
+        * @throws MWException
+        */
+       public function __call( $func, $args ) {
                static $compatibility = array(
-                       'assertInternalType' => 'assertType',
-                       'assertNotInternalType' => 'assertNotType',
-                       'assertInstanceOf' => 'assertType',
-                       'assertEmpty' => 'assertEmpty2',
+                       'assertEmpty' => 'assertEmpty2', // assertEmpty was added in phpunit 3.7.32
                );
 
-               if ( method_exists( $this->suite, $func ) ) {
-                       return call_user_func_array( array( $this->suite, $func ), $args );
-               } elseif ( isset( $compatibility[$func] ) ) {
+               if ( isset( $compatibility[$func] ) ) {
                        return call_user_func_array( array( $this, $compatibility[$func] ), $args );
                } else {
                        throw new MWException( "Called non-existant $func method on "
@@ -540,6 +597,9 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                }
        }
 
+       /**
+        * Used as a compatibility method for phpunit < 3.7.32
+        */
        private function assertEmpty2( $value, $msg ) {
                return $this->assertTrue( $value == '', $msg );
        }
@@ -554,6 +614,13 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                return strpos( $table, 'unittest_' ) !== 0;
        }
 
+       /**
+        * @since 1.18
+        *
+        * @param DataBaseBase $db
+        *
+        * @return array
+        */
        public static function listTables( $db ) {
                global $wgDBprefix;
 
@@ -581,31 +648,41 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                return $tables;
        }
 
+       /**
+        * @throws MWException
+        * @since 1.18
+        */
        protected function checkDbIsSupported() {
                if ( !in_array( $this->db->getType(), $this->supportedDBs ) ) {
                        throw new MWException( $this->db->getType() . " is not currently supported for unit testing." );
                }
        }
 
+       /**
+        * @since 1.18
+        */
        public function getCliArg( $offset ) {
-
                if ( isset( MediaWikiPHPUnitCommand::$additionalOptions[$offset] ) ) {
                        return MediaWikiPHPUnitCommand::$additionalOptions[$offset];
                }
        }
 
+       /**
+        * @since 1.18
+        */
        public function setCliArg( $offset, $value ) {
-
                MediaWikiPHPUnitCommand::$additionalOptions[$offset] = $value;
        }
 
        /**
         * Don't throw a warning if $function is deprecated and called later
         *
-        * @param $function String
+        * @since 1.19
+        *
+        * @param string $function
         * @return null
         */
-       function hideDeprecated( $function ) {
+       public function hideDeprecated( $function ) {
                wfSuppressWarnings();
                wfDeprecated( $function );
                wfRestoreWarnings();
@@ -619,12 +696,12 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         *
         * @since 1.20
         *
-        * @param $table String|Array the table(s) to query
-        * @param $fields String|Array the columns to include in the result (and to sort by)
-        * @param $condition String|Array "where" condition(s)
-        * @param $expectedRows Array - an array of arrays giving the expected rows.
+        * @param string|array $table The table(s) to query
+        * @param string|array $fields The columns to include in the result (and to sort by)
+        * @param string|array $condition "where" condition(s)
+        * @param array $expectedRows An array of arrays giving the expected rows.
         *
-        * @throws MWException if this test cases's needsDB() method doesn't return true.
+        * @throws MWException If this test cases's needsDB() method doesn't return true.
         *         Test cases can use "@group Database" to enable database test support,
         *         or list the tables under testing in $this->tablesUsed, or override the
         *         needsDB() method.
@@ -687,8 +764,8 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         *
         * @param array $expected
         * @param array $actual
-        * @param boolean $ordered If the order of the values should match
-        * @param boolean $named If the keys should match
+        * @param bool $ordered If the order of the values should match
+        * @param bool $named If the keys should match
         */
        protected function assertArrayEquals( array $expected, array $actual, $ordered = false, $named = false ) {
                if ( !$ordered ) {
@@ -715,9 +792,9 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         *
         * @since 1.20
         *
-        * @param String $expected HTML on oneline
-        * @param String $actual HTML on oneline
-        * @param String $msg Optional message
+        * @param string $expected HTML on oneline
+        * @param string $actual HTML on oneline
+        * @param string $msg Optional message
         */
        protected function assertHTMLEquals( $expected, $actual, $msg = '' ) {
                $expected = str_replace( '>', ">\n", $expected );
@@ -749,7 +826,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         *
         * @since 1.20
         *
-        * @param $r mixed the array to remove string keys from.
+        * @param mixed $r The array to remove string keys from.
         */
        protected static function stripStringKeys( &$r ) {
                if ( !is_array( $r ) ) {
@@ -824,9 +901,9 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
        /**
         * Returns the ID of a namespace that defaults to Wikitext.
-        * Throws an MWException if there is none.
         *
-        * @return int the ID of the wikitext Namespace
+        * @throws MWException If there is none.
+        * @return int The ID of the wikitext Namespace
         * @since 1.21
         */
        protected function getDefaultWikitextNS() {
@@ -973,8 +1050,10 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * then calls assertValidHtmlDocument().
         * The snippet is expected to be HTML 5.
         *
-        * @note: Will mark the test as skipped if the "tidy" module is not installed.
-        * @note: This ignores $wgUseTidy, so we can check for valid HTML even (and especially)
+        * @since 1.23
+        *
+        * @note Will mark the test as skipped if the "tidy" module is not installed.
+        * @note This ignores $wgUseTidy, so we can check for valid HTML even (and especially)
         *        when automatic tidying is disabled.
         *
         * @param string $html An HTML snippet (treated as the contents of the body tag).
@@ -987,8 +1066,10 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        /**
         * Asserts that the given string is valid HTML document.
         *
-        * @note: Will mark the test as skipped if the "tidy" module is not installed.
-        * @note: This ignores $wgUseTidy, so we can check for valid HTML even (and especially)
+        * @since 1.23
+        *
+        * @note Will mark the test as skipped if the "tidy" module is not installed.
+        * @note This ignores $wgUseTidy, so we can check for valid HTML even (and especially)
         *        when automatic tidying is disabled.
         *
         * @param string $html A complete HTML document
@@ -1017,4 +1098,5 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                $this->assertEmpty( $errors, implode( "\n", $errors ) );
        }
+
 }
diff --git a/tests/phpunit/ResourceLoaderTestCase.php b/tests/phpunit/ResourceLoaderTestCase.php
new file mode 100644 (file)
index 0000000..a03e9cc
--- /dev/null
@@ -0,0 +1,68 @@
+<?php
+
+abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
+
+       protected static function getResourceLoaderContext() {
+               $resourceLoader = new ResourceLoader();
+               $request = new FauxRequest( array(
+                               'debug' => 'true',
+                               'lang' => 'en',
+                               'modules' => 'startup',
+                               'only' => 'scripts',
+                               'skin' => 'vector',
+                               'target' => 'test',
+               ) );
+               return new ResourceLoaderContext( $resourceLoader, $request );
+       }
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( array(
+                       // For ResourceLoader::inDebugMode since it doesn't have context
+                       'wgResourceLoaderDebug' => true,
+
+                       // Avoid influence from wgInvalidateCacheOnLocalSettingsChange
+                       'wgCacheEpoch' => '20140101000000',
+
+                       // For ResourceLoader::__construct()
+                       'wgResourceLoaderSources' => array(),
+
+                       // For wfScript()
+                       'wgScriptPath' => '/w',
+                       'wgScriptExtension' => '.php',
+                       'wgScript' => '/w/index.php',
+                       'wgLoadScript' => '/w/load.php',
+               ) );
+       }
+}
+
+/* Stubs */
+
+class ResourceLoaderTestModule extends ResourceLoaderModule {
+
+       protected $dependencies = array();
+       protected $group = null;
+       protected $source = 'local';
+       protected $targets = array( 'test' );
+
+       public function __construct( $options = array() ) {
+               foreach ( $options as $key => $value ) {
+                       $this->$key = $value;
+               }
+       }
+
+       public function getDependencies() {
+               return $this->dependencies;
+       }
+
+       public function getGroup() {
+               return $this->group;
+       }
+
+       public function getSource() {
+               return $this->source;
+       }
+}
+
+class ResourceLoaderFileModuleTestModule extends ResourceLoaderFileModule {}
index b09487a..8288cae 100644 (file)
@@ -1,39 +1,31 @@
 <?php
+
 /**
- * Test for the demo xml
+ * Test making sure the demo export xml is valid.
+ * This is NOT a unit test
  *
  * @group Dump
+ * @group large
  */
 class ExportDemoTest extends DumpTestCase {
 
-       /**
-        * @group large
-        */
-       function testExportDemo() {
-               $this->validateXmlFileAgainstXsd( "../../docs/export-demo.xml" );
-       }
-
-       /**
-        * Validates a xml file against the xsd.
-        *
-        * The validation is slow, because php has to read the xsd on each call.
-        *
-        * @param $fname string: name of file to validate
-        */
-       protected function validateXmlFileAgainstXsd( $fname ) {
+       public function testExportDemo() {
+               $fname = "../../docs/export-demo.xml";
                $version = WikiExporter::schemaVersion();
-
                $dom = new DomDocument();
                $dom->load( $fname );
 
                // Ensure, the demo is for the current version
-               $this->assertEquals( $dom->documentElement->getAttribute( 'version' ), $version, 'export-demo.xml should have the current version' );
+               $this->assertEquals(
+                       $dom->documentElement->getAttribute( 'version' ),
+                       $version,
+                       'export-demo.xml should have the current version'
+               );
 
-               try {
-                       $this->assertTrue( $dom->schemaValidate( "../../docs/export-" . $version . ".xsd" ),
-                               "schemaValidate has found an error" );
-               } catch ( Exception $e ) {
-                       $this->fail( "xml not valid against xsd: " . $e->getMessage() );
-               }
+               $this->assertTrue(
+                       $dom->schemaValidate( "../../docs/export-" . $version . ".xsd" ),
+                       "schemaValidate has found an error"
+               );
        }
+
 }
index b37ff2e..33643ac 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 
 /**
- *
  * @group Database
  * ^--- make sure temporary tables are used.
  */
@@ -53,9 +52,10 @@ class LinksUpdateTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers LinksUpdate::addLink
+        * @covers ParserOutput::addLink
         */
        public function testUpdate_pagelinks() {
+               /** @var ParserOutput $po */
                list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
 
                $po->addLink( Title::newFromText( "Foo" ) );
@@ -90,9 +90,10 @@ class LinksUpdateTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers LinksUpdate::addExternalLink
+        * @covers ParserOutput::addExternalLink
         */
        public function testUpdate_externallinks() {
+               /** @var ParserOutput $po */
                list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
 
                $po->addExternalLink( "http://testing.com/wiki/Foo" );
@@ -103,9 +104,10 @@ class LinksUpdateTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers LinksUpdate::addCategory
+        * @covers ParserOutput::addCategory
         */
        public function testUpdate_categorylinks() {
+               /** @var ParserOutput $po */
                $this->setMwGlobals( 'wgCategoryCollation', 'uppercase' );
 
                list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
@@ -118,9 +120,10 @@ class LinksUpdateTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers LinksUpdate::addInterwikiLink
+        * @covers ParserOutput::addInterwikiLink
         */
        public function testUpdate_iwlinks() {
+               /** @var ParserOutput $po */
                list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
 
                $target = Title::makeTitleSafe( NS_MAIN, "Foo", '', 'linksupdatetest' );
@@ -132,9 +135,10 @@ class LinksUpdateTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers LinksUpdate::addTemplate
+        * @covers ParserOutput::addTemplate
         */
        public function testUpdate_templatelinks() {
+               /** @var ParserOutput $po */
                list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
 
                $po->addTemplate( Title::newFromText( "Template:Foo" ), 23, 42 );
@@ -145,9 +149,10 @@ class LinksUpdateTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers LinksUpdate::addImage
+        * @covers ParserOutput::addImage
         */
        public function testUpdate_imagelinks() {
+               /** @var ParserOutput $po */
                list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
 
                $po->addImage( "Foo.png" );
@@ -158,9 +163,10 @@ class LinksUpdateTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers LinksUpdate::addLanguageLink
+        * @covers ParserOutput::addLanguageLink
         */
        public function testUpdate_langlinks() {
+               /** @var ParserOutput $po */
                list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
 
                $po->addLanguageLink( Title::newFromText( "en:Foo" )->getFullText() );
@@ -171,9 +177,10 @@ class LinksUpdateTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers LinksUpdate::setProperty
+        * @covers ParserOutput::setProperty
         */
        public function testUpdate_page_props() {
+               /** @var ParserOutput $po */
                list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
 
                $po->setProperty( "foo", "bar" );
diff --git a/tests/phpunit/includes/MediaWikiVersionFetcherTest.php b/tests/phpunit/includes/MediaWikiVersionFetcherTest.php
new file mode 100644 (file)
index 0000000..bbb83da
--- /dev/null
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * Note: this is not a unit test, as it touches the file system and reads an actual file.
+ * If unit tests are added for MediaWikiVersionFetcher, this should be done in a distinct test case.
+ *
+ * @covers MediaWikiVersionFetcher
+ *
+ * @group ComposerHooks
+ *
+ * @licence GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+class MediaWikiVersionFetcherTest extends PHPUnit_Framework_TestCase {
+
+       public function testReturnsResult() {
+               $versionFetcher = new MediaWikiVersionFetcher();
+               $this->assertInternalType( 'string', $versionFetcher->fetchVersion() );
+       }
+
+}
\ No newline at end of file
index 71ebd6a..7c99352 100644 (file)
@@ -10,6 +10,33 @@ class MessageTest extends MediaWikiLangTestCase {
                ) );
        }
 
+       public function provideTestParams() {
+               return array(
+                       array( array() ),
+                       array( array( 'foo' ), 'foo' ),
+                       array( array( 'foo', 'bar' ), 'foo', 'bar' ),
+                       array( array( 'baz' ), array( 'baz' ) ),
+                       array( array( 'baz', 'foo' ), array( 'baz', 'foo' ) ),
+                       array( array( 'baz', 'foo' ), array( 'baz', 'foo' ), 'hhh' ),
+                       array( array( 'baz', 'foo' ), array( 'baz', 'foo' ), 'hhh', array( 'ahahahahha' ) ),
+                       array( array( 'baz', 'foo' ), array( 'baz', 'foo' ), array( 'ahahahahha' ) ),
+                       array( array( 'baz' ), array( 'baz' ), array( 'ahahahahha' ) ),
+               );
+       }
+
+       /**
+        * @covers Message::params
+        * @dataProvider provideTestParams
+        */
+       public function testParams( $expected ) {
+               $msg = new Message( 'imasomething' );
+
+               $returned = call_user_func_array( array( $msg, 'params' ),  array_slice( func_get_args(), 1 ) );
+
+               $this->assertSame( $msg, $returned );
+               $this->assertEquals( $expected, $msg->getParams() );
+       }
+
        /**
         * @covers Message::exists
         */
@@ -77,55 +104,84 @@ class MessageTest extends MediaWikiLangTestCase {
        }
 
        /**
-        * FIXME: This should not need database, but Language#formatExpiry does (bug 55912)
-        * @group Database
-        * @todo this should be split up into multiple test methods
         * @covers Message::numParams
-        * @covers Message::durationParams
-        * @covers Message::expiryParams
-        * @covers Message::timeperiodParams
-        * @covers Message::sizeParams
-        * @covers Message::bitrateParams
         */
-       public function testMessageParamTypes() {
+       public function testMessageNumParams() {
                $lang = Language::factory( 'en' );
-
                $msg = new RawMessage( '$1' );
+
                $this->assertEquals(
                        $lang->formatNum( 123456.789 ),
                        $msg->inLanguage( $lang )->numParams( 123456.789 )->plain(),
                        'numParams is handled correctly'
                );
+       }
 
+       /**
+        * @covers Message::durationParams
+        */
+       public function testMessageDurationParams() {
+               $lang = Language::factory( 'en' );
                $msg = new RawMessage( '$1' );
+
                $this->assertEquals(
                        $lang->formatDuration( 1234 ),
                        $msg->inLanguage( $lang )->durationParams( 1234 )->plain(),
                        'durationParams is handled correctly'
                );
+       }
 
+       /**
+        * FIXME: This should not need database, but Language#formatExpiry does (bug 55912)
+        * @group Database
+        * @covers Message::expiryParams
+        */
+       public function testMessageExpiryParams() {
+               $lang = Language::factory( 'en' );
                $msg = new RawMessage( '$1' );
+
                $this->assertEquals(
                        $lang->formatExpiry( wfTimestampNow() ),
                        $msg->inLanguage( $lang )->expiryParams( wfTimestampNow() )->plain(),
                        'expiryParams is handled correctly'
                );
+       }
 
+       /**
+        * @covers Message::timeperiodParams
+        */
+       public function testMessageTimeperiodParams() {
+               $lang = Language::factory( 'en' );
                $msg = new RawMessage( '$1' );
+
                $this->assertEquals(
                        $lang->formatTimePeriod( 1234 ),
                        $msg->inLanguage( $lang )->timeperiodParams( 1234 )->plain(),
                        'timeperiodParams is handled correctly'
                );
+       }
 
+       /**
+        * @covers Message::sizeParams
+        */
+       public function testMessageSizeParams() {
+               $lang = Language::factory( 'en' );
                $msg = new RawMessage( '$1' );
+
                $this->assertEquals(
                        $lang->formatSize( 123456 ),
                        $msg->inLanguage( $lang )->sizeParams( 123456 )->plain(),
                        'sizeParams is handled correctly'
                );
+       }
 
+       /**
+        * @covers Message::bitrateParams
+        */
+       public function testMessageBitrateParams() {
+               $lang = Language::factory( 'en' );
                $msg = new RawMessage( '$1' );
+
                $this->assertEquals(
                        $lang->formatBitrate( 123456 ),
                        $msg->inLanguage( $lang )->bitrateParams( 123456 )->plain(),
diff --git a/tests/phpunit/includes/ResourceLoaderModuleTest.php b/tests/phpunit/includes/ResourceLoaderModuleTest.php
deleted file mode 100644 (file)
index 4643319..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-<?php
-
-class ResourceLoaderModuleTest extends MediaWikiTestCase {
-
-       protected static function getResourceLoaderContext() {
-               $resourceLoader = new ResourceLoader();
-               $request = new FauxRequest( array(
-                               'debug' => 'false',
-                               'lang' => 'en',
-                               'modules' => 'startup',
-                               'only' => 'scripts',
-                               'skin' => 'vector',
-               ) );
-               return new ResourceLoaderContext( $resourceLoader, $request );
-       }
-
-       /**
-        * @covers ResourceLoaderModule::getDefinitionSummary
-        * @covers ResourceLoaderFileModule::getDefinitionSummary
-        */
-       public function testDefinitionSummary() {
-               $context = self::getResourceLoaderContext();
-
-               $baseParams = array(
-                       'scripts' => array( 'foo.js', 'bar.js' ),
-                       'dependencies' => array( 'jquery', 'mediawiki' ),
-                       'messages' => array( 'hello', 'world' ),
-               );
-
-               $module = new ResourceLoaderFileModule( $baseParams );
-
-               $jsonSummary = json_encode( $module->getDefinitionSummary( $context ) );
-
-               // Exactly the same
-               $module = new ResourceLoaderFileModule( $baseParams );
-
-               $this->assertEquals(
-                       $jsonSummary,
-                       json_encode( $module->getDefinitionSummary( $context ) ),
-                       'Instance is insignificant'
-               );
-
-               // Re-order dependencies
-               $module = new ResourceLoaderFileModule( array(
-                       'dependencies' => array( 'mediawiki', 'jquery' ),
-               ) + $baseParams );
-
-               $this->assertEquals(
-                       $jsonSummary,
-                       json_encode( $module->getDefinitionSummary( $context ) ),
-                       'Order of dependencies is insignificant'
-               );
-
-               // Re-order messages
-               $module = new ResourceLoaderFileModule( array(
-                       'messages' => array( 'world', 'hello' ),
-               ) + $baseParams );
-
-               $this->assertEquals(
-                       $jsonSummary,
-                       json_encode( $module->getDefinitionSummary( $context ) ),
-                       'Order of messages is insignificant'
-               );
-
-               // Re-order scripts
-               $module = new ResourceLoaderFileModule( array(
-                       'scripts' => array( 'bar.js', 'foo.js' ),
-               ) + $baseParams );
-
-               $this->assertNotEquals(
-                       $jsonSummary,
-                       json_encode( $module->getDefinitionSummary( $context ) ),
-                       'Order of scripts is significant'
-               );
-
-               // Subclass
-               $module = new ResourceLoaderFileModuleTestModule( $baseParams );
-
-               $this->assertNotEquals(
-                       $jsonSummary,
-                       json_encode( $module->getDefinitionSummary( $context ) ),
-                       'Class is significant'
-               );
-       }
-}
-
-class ResourceLoaderFileModuleTestModule extends ResourceLoaderFileModule {}
diff --git a/tests/phpunit/includes/ResourceLoaderTest.php b/tests/phpunit/includes/ResourceLoaderTest.php
deleted file mode 100644 (file)
index ca8b2b6..0000000
+++ /dev/null
@@ -1,149 +0,0 @@
-<?php
-
-class ResourceLoaderTest extends MediaWikiTestCase {
-
-       protected static $resourceLoaderRegisterModulesHook;
-
-       protected function setUp() {
-               parent::setUp();
-
-               // $wgResourceLoaderLESSFunctions, $wgResourceLoaderLESSImportPaths; $wgResourceLoaderLESSVars;
-
-               $this->setMwGlobals( array(
-                       'wgResourceLoaderLESSFunctions' => array(
-                               'test-sum' => function ( $frame, $less ) {
-                                       $sum = 0;
-                                       foreach ( $frame[2] as $arg ) {
-                                               $sum += (int)$arg[1];
-                                       }
-                                       return $sum;
-                               },
-                       ),
-                       'wgResourceLoaderLESSImportPaths' => array(
-                               dirname( __DIR__ ) . '/data/less/common',
-                       ),
-                       'wgResourceLoaderLESSVars' => array(
-                               'foo'  => '2px',
-                               'Foo' => '#eeeeee',
-                               'bar' => 5,
-                       ),
-               ) );
-       }
-
-       /* Hook Methods */
-
-       /**
-        * ResourceLoaderRegisterModules hook
-        */
-       public static function resourceLoaderRegisterModules( &$resourceLoader ) {
-               self::$resourceLoaderRegisterModulesHook = true;
-
-               return true;
-       }
-
-       /* Provider Methods */
-       public static function provideValidModules() {
-               return array(
-                       array( 'TEST.validModule1', new ResourceLoaderTestModule() ),
-               );
-       }
-
-       public static function provideResourceLoaderContext() {
-               $resourceLoader = new ResourceLoader();
-               $request = new FauxRequest();
-               return array(
-                       array( new ResourceLoaderContext( $resourceLoader, $request ) ),
-               );
-       }
-
-       /* Test Methods */
-
-       /**
-        * Ensures that the ResourceLoaderRegisterModules hook is called when a new ResourceLoader object is constructed
-        * @covers ResourceLoader::__construct
-        */
-       public function testCreatingNewResourceLoaderCallsRegistrationHook() {
-               self::$resourceLoaderRegisterModulesHook = false;
-               $resourceLoader = new ResourceLoader();
-               $this->assertTrue( self::$resourceLoaderRegisterModulesHook );
-
-               return $resourceLoader;
-       }
-
-       /**
-        * @dataProvider provideValidModules
-        * @depends testCreatingNewResourceLoaderCallsRegistrationHook
-        * @covers ResourceLoader::register
-        * @covers ResourceLoader::getModule
-        */
-       public function testRegisteredValidModulesAreAccessible(
-               $name, ResourceLoaderModule $module, ResourceLoader $resourceLoader
-       ) {
-               $resourceLoader->register( $name, $module );
-               $this->assertEquals( $module, $resourceLoader->getModule( $name ) );
-       }
-
-       /**
-        * @dataProvider provideResourceLoaderContext
-        * @covers ResourceLoaderFileModule::compileLessFile
-        */
-       public function testLessFileCompilation( $context ) {
-               $basePath = __DIR__ . '/../data/less/module';
-               $module = new ResourceLoaderFileModule( array(
-                       'localBasePath' => $basePath,
-                       'styles' => array( 'styles.less' ),
-               ) );
-               $styles = $module->getStyles( $context );
-               $this->assertStringEqualsFile( $basePath . '/styles.css', $styles['all'] );
-       }
-
-       /**
-        * @dataProvider providePackedModules
-        * @covers ResourceLoader::makePackedModulesString
-        */
-       public function testMakePackedModulesString( $desc, $modules, $packed ) {
-               $this->assertEquals( $packed, ResourceLoader::makePackedModulesString( $modules ), $desc );
-       }
-
-       /**
-        * @dataProvider providePackedModules
-        * @covers ResourceLoaderContext::expandModuleNames
-        */
-       public function testexpandModuleNames( $desc, $modules, $packed ) {
-               $this->assertEquals( $modules, ResourceLoaderContext::expandModuleNames( $packed ), $desc );
-       }
-
-       public static function providePackedModules() {
-               return array(
-                       array(
-                               'Example from makePackedModulesString doc comment',
-                               array( 'foo.bar', 'foo.baz', 'bar.baz', 'bar.quux' ),
-                               'foo.bar,baz|bar.baz,quux',
-                       ),
-                       array(
-                               'Example from expandModuleNames doc comment',
-                               array( 'jquery.foo', 'jquery.bar', 'jquery.ui.baz', 'jquery.ui.quux' ),
-                               'jquery.foo,bar|jquery.ui.baz,quux',
-                       ),
-                       array(
-                               'Regression fixed in r88706 with dotless names',
-                               array( 'foo', 'bar', 'baz' ),
-                               'foo,bar,baz',
-                       ),
-                       array(
-                               'Prefixless modules after a prefixed module',
-                               array( 'single.module', 'foobar', 'foobaz' ),
-                               'single.module|foobar,foobaz',
-                       ),
-               );
-       }
-}
-
-/* Stubs */
-
-class ResourceLoaderTestModule extends ResourceLoaderModule {
-}
-
-/* Hooks */
-global $wgHooks;
-$wgHooks['ResourceLoaderRegisterModules'][] = 'ResourceLoaderTest::resourceLoaderRegisterModules';
index f69fad4..e69660e 100644 (file)
@@ -206,10 +206,12 @@ class RevisionStorageTest extends MediaWikiTestCase {
         */
        public function testFetchRevision() {
                $page = $this->createPage( 'RevisionStorageTest_testFetchRevision', 'one', CONTENT_MODEL_WIKITEXT );
-               $id1 = $page->getRevision()->getId();
+
+               // Hidden process cache assertion below
+               $page->getRevision()->getId();
 
                $page->doEditContent( new WikitextContent( 'two' ), 'second rev' );
-               $id2 = $page->getRevision()->getId();
+               $id = $page->getRevision()->getId();
 
                $res = Revision::fetchRevision( $page->getTitle() );
 
@@ -219,9 +221,8 @@ class RevisionStorageTest extends MediaWikiTestCase {
                        $rows[$row->rev_id] = $row;
                }
 
-               $row = $res->fetchObject();
                $this->assertEquals( 1, count( $rows ), 'expected exactly one revision' );
-               $this->assertArrayHasKey( $id2, $rows, 'missing revision with id ' . $id2 );
+               $this->assertArrayHasKey( $id, $rows, 'missing revision with id ' . $id );
        }
 
        /**
index 8516a4c..7e81fab 100644 (file)
@@ -43,12 +43,10 @@ class TestSample extends MediaWikiLangTestCase {
        }
 
        /**
-        * If you want to run a the same test with a variety of data. use a data provider.
+        * If you want to run a the same test with a variety of data, use a data provider.
         * see: http://www.phpunit.de/manual/3.4/en/writing-tests-for-phpunit.html
-        *
-        * Note: Data providers are always called statically and outside setUp/tearDown!
         */
-       public static function provideTitles() {
+       public function provideTitles() {
                return array(
                        array( 'Text', NS_MEDIA, 'Media:Text' ),
                        array( 'Text', null, 'Text' ),
diff --git a/tests/phpunit/includes/SkinTemplateTest.php b/tests/phpunit/includes/SkinTemplateTest.php
new file mode 100644 (file)
index 0000000..8f54714
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * @covers SkinTemplate
+ *
+ * @group Output
+ *
+ * @licence GNU GPL v2+
+ * @author Bene* < benestar.wikimedia@gmail.com >
+ */
+
+class SkinTemplateTest extends MediaWikiTestCase {
+
+       /**
+        * @dataProvider makeListItemProvider
+        */
+       public function testMakeListItem( $expected, $key, $item, $options, $message ) {
+               $template = $this->getMockForAbstractClass( 'BaseTemplate' );
+
+               $this->assertEquals(
+                       $expected,
+                       $template->makeListItem( $key, $item, $options ),
+                       $message
+               );
+       }
+
+       public function makeListItemProvider() {
+               return array(
+                       array(
+                               '<li class="class" title="itemtitle"><a href="url" title="title">text</a></li>',
+                               '',
+                               array( 'class' => 'class', 'itemtitle' => 'itemtitle', 'href' => 'url', 'title' => 'title', 'text' => 'text' ),
+                               array(),
+                               'Test makteListItem with normal values'
+                       )
+               );
+       }
+}
index 078dfef..1305724 100644 (file)
@@ -41,7 +41,7 @@ class TitleTest extends MediaWikiTestCase {
         */
        public function testSecureAndSplit() {
                $this->setMwGlobals( array(
-                       'wgLocalInterwiki' => 'localtestiw',
+                       'wgLocalInterwikis' => array( 'localtestiw' ),
                        'wgHooks' => array(
                                'InterwikiLoadPrefix' => array(
                                        function ( $prefix, &$data ) {
index 6cf658f..9b41a9c 100644 (file)
@@ -593,8 +593,6 @@ class WikiPageTest extends MediaWikiLangTestCase {
                }
 
                $page = $this->createPage( $title, $text, $model );
-               $hasLinks = wfGetDB( DB_SLAVE )->selectField( 'pagelinks', 1,
-                       array( 'pl_from' => $page->getId() ), __METHOD__ );
 
                $editInfo = $page->prepareContentForEdit( $page->getContent() );
 
index 8205029..86b4c35 100644 (file)
@@ -144,10 +144,7 @@ class XmlTest extends MediaWikiTestCase {
                $prevYear = $curYear - 1;
 
                $curMonth = intval( gmdate( 'n' ) );
-               $prevMonth = $curMonth - 1;
-               if ( $prevMonth == 0 ) {
-                       $prevMonth = 12;
-               }
+
                $nextMonth = $curMonth + 1;
                if ( $nextMonth == 13 ) {
                        $nextMonth = 1;
index 0a6607e..ac3f1cd 100644 (file)
@@ -18,6 +18,13 @@ class ApiEditPageTest extends ApiTestCase {
 
                parent::setUp();
 
+               $this->setMwGlobals( array(
+                       'wgExtraNamespaces' => $wgExtraNamespaces,
+                       'wgNamespaceContentModels' => $wgNamespaceContentModels,
+                       'wgContentHandlers' => $wgContentHandlers,
+                       'wgContLang' => $wgContLang,
+               ) );
+
                $wgExtraNamespaces[12312] = 'Dummy';
                $wgExtraNamespaces[12313] = 'Dummy_talk';
 
@@ -31,17 +38,7 @@ class ApiEditPageTest extends ApiTestCase {
        }
 
        protected function tearDown() {
-               global $wgExtraNamespaces, $wgNamespaceContentModels, $wgContentHandlers, $wgContLang;
-
-               unset( $wgExtraNamespaces[12312] );
-               unset( $wgExtraNamespaces[12313] );
-
-               unset( $wgNamespaceContentModels[12312] );
-               unset( $wgContentHandlers["testing"] );
-
                MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
-               $wgContLang->resetNamespaces(); # reset namespace cache
-
                parent::tearDown();
        }
 
@@ -215,7 +212,9 @@ class ApiEditPageTest extends ApiTestCase {
                        'text' => "==section 1==\nnew content 1",
                ) );
                $this->assertEquals( 'Success', $re['edit']['result'] );
-               $newtext = WikiPage::factory( Title::newFromText( $name ) )->getContent( Revision::RAW )->getNativeData();
+               $newtext = WikiPage::factory( Title::newFromText( $name ) )
+                       ->getContent( Revision::RAW )
+                       ->getNativeData();
                $this->assertEquals( $newtext, "==section 1==\nnew content 1\n\n==section 2==\ncontent2" );
 
                // Test that we raise a 'nosuchsection' error
@@ -253,7 +252,9 @@ class ApiEditPageTest extends ApiTestCase {
 
                $this->assertEquals( 'Success', $re['edit']['result'] );
                // Check the page text is correct
-               $text = WikiPage::factory( Title::newFromText( $name ) )->getContent( Revision::RAW )->getNativeData();
+               $text = WikiPage::factory( Title::newFromText( $name ) )
+                       ->getContent( Revision::RAW )
+                       ->getNativeData();
                $this->assertEquals( $text, "== header ==\n\ntest" );
 
                // Now on one that does
@@ -267,7 +268,9 @@ class ApiEditPageTest extends ApiTestCase {
                ));
 
                $this->assertEquals( 'Success', $re2['edit']['result'] );
-               $text = WikiPage::factory( Title::newFromText( $name ) )->getContent( Revision::RAW )->getNativeData();
+               $text = WikiPage::factory( Title::newFromText( $name ) )
+                       ->getContent( Revision::RAW )
+                       ->getNativeData();
                $this->assertEquals( $text, "== header ==\n\ntest\n\n== header ==\n\ntest" );
        }
 
@@ -391,7 +394,6 @@ class ApiEditPageTest extends ApiTestCase {
                $rpage->doEditContent( new WikitextContent( "#REDIRECT [[$name]]" ),
                        "testing 1", EDIT_NEW, false, self::$users['sysop']->user );
                $this->forceRevisionDate( $rpage, '20120101000000' );
-               $baseTime = $rpage->getRevision()->getTimestamp();
 
                // new edit to content
                $page->doEditContent( new WikitextContent( "Foo bar" ),
diff --git a/tests/phpunit/includes/changes/RCCacheEntryFactoryTest.php b/tests/phpunit/includes/changes/RCCacheEntryFactoryTest.php
new file mode 100644 (file)
index 0000000..49feec1
--- /dev/null
@@ -0,0 +1,415 @@
+<?php
+
+/**
+ * @covers RCCacheEntryFactory
+ *
+ * @group Database
+ *
+ * @licence GNU GPL v2+
+ * @author Katie Filbert < aude.wiki@gmail.com >
+ */
+class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( array(
+                       'wgArticlePath' => '/wiki/$1'
+               ) );
+       }
+
+       /**
+        * @dataProvider editChangeProvider
+        */
+       public function testNewFromRecentChange( $expected, $context, $messages,
+               $recentChange, $watched
+       ) {
+               $cacheEntryFactory = new RCCacheEntryFactory( $context, $messages );
+               $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, $watched );
+
+               $this->assertInstanceOf( 'RCCacheEntry', $cacheEntry );
+
+               $this->assertEquals( $watched, $cacheEntry->watched, 'watched' );
+               $this->assertEquals( $expected['timestamp'], $cacheEntry->timestamp, 'timestamp' );
+               $this->assertEquals(
+                       $expected['numberofWatchingusers'], $cacheEntry->numberofWatchingusers,
+                       'watching users'
+               );
+               $this->assertEquals( $expected['unpatrolled'], $cacheEntry->unpatrolled, 'unpatrolled' );
+
+               $this->assertUserLinks( 'Mary', $cacheEntry );
+               $this->assertTitleLink( 'Xyz', $cacheEntry );
+
+               $this->assertQueryLink( 'cur', $expected['cur'], $cacheEntry->curlink, 'cur link' );
+               $this->assertQueryLink( 'prev', $expected['diff'], $cacheEntry->lastlink, 'prev link' );
+               $this->assertQueryLink( 'diff', $expected['diff'], $cacheEntry->difflink, 'diff link' );
+       }
+
+       public function editChangeProvider() {
+               return array(
+                       array(
+                               array(
+                                       'title' => 'Xyz',
+                                       'user' => 'Mary',
+                                       'diff' => array( 'curid' => 5, 'diff' => 191, 'oldid' => 190 ),
+                                       'cur' => array( 'curid' => 5, 'diff' => 0, 'oldid' => 191 ),
+                                       'timestamp' => '21:21',
+                                       'numberofWatchingusers' => 0,
+                                       'unpatrolled' => false
+                               ),
+                               $this->getContext(),
+                               $this->getMessages(),
+                               $this->makeEditRecentChange(
+                                       'Xyz',
+                                       $this->getTestUser(),
+                                       5, // curid
+                                       191, // thisid
+                                       190, // lastid
+                                       '20131103212153',
+                                       0, // counter
+                                       0 // number of watching users
+                               ),
+                               false,
+                               'edit'
+                       )
+               );
+       }
+
+       private function makeEditRecentChange( $title, $user, $curid, $thisid, $lastid,
+               $timestamp, $counter, $watchingUsers
+       ) {
+
+               $attribs = array_merge(
+                       $this->getDefaultAttributes( $title, $timestamp ),
+                       array(
+                               'rc_user' => $user->getId(),
+                               'rc_user_text' => $user->getName(),
+                               'rc_this_oldid' => $thisid,
+                               'rc_last_oldid' => $lastid,
+                               'rc_cur_id' => $curid
+                       )
+               );
+
+               return $this->makeRecentChange( $attribs, $counter, $watchingUsers );
+       }
+
+       /**
+        * @dataProvider deleteChangeProvider
+        */
+       public function testNewForDeleteChange( $expected, $context, $messages, $recentChange, $watched ) {
+               $cacheEntryFactory = new RCCacheEntryFactory( $context, $messages );
+               $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, $watched );
+
+               $this->assertInstanceOf( 'RCCacheEntry', $cacheEntry );
+
+               $this->assertEquals( $watched, $cacheEntry->watched, 'watched' );
+               $this->assertEquals( $expected['timestamp'], $cacheEntry->timestamp, 'timestamp' );
+               $this->assertEquals(
+                       $expected['numberofWatchingusers'],
+                       $cacheEntry->numberofWatchingusers, 'watching users'
+               );
+               $this->assertEquals( $expected['unpatrolled'], $cacheEntry->unpatrolled, 'unpatrolled' );
+
+               $this->assertDeleteLogLink( $cacheEntry );
+               $this->assertUserLinks( 'Mary', $cacheEntry );
+
+               $this->assertEquals( 'cur', $cacheEntry->curlink, 'cur link for delete log or rev' );
+               $this->assertEquals( 'diff', $cacheEntry->difflink, 'diff link for delete log or rev' );
+               $this->assertEquals( 'prev', $cacheEntry->lastlink, 'pref link for delete log or rev' );
+       }
+
+       public function deleteChangeProvider() {
+               return array(
+                       array(
+                               array(
+                                       'title' => 'Abc',
+                                       'user' => 'Mary',
+                                       'timestamp' => '21:21',
+                                       'numberofWatchingusers' => 0,
+                                       'unpatrolled' => false
+                               ),
+                               $this->getContext(),
+                               $this->getMessages(),
+                               $this->makeLogRecentChange(
+                                       'Abc',
+                                       $this->getTestUser(),
+                                       '20131103212153',
+                                       0, // counter
+                                       0 // number of watching users
+                               ),
+                               false,
+                               'delete'
+                       )
+               );
+       }
+
+       private function makeLogRecentChange( $title, $user, $timestamp, $counter, $watchingUsers ) {
+               $attribs = array_merge(
+                       $this->getDefaultAttributes( $title, $timestamp ),
+                       array(
+                               'rc_cur_id' => 0,
+                               'rc_user' => $user->getId(),
+                               'rc_user_text' => $user->getName(),
+                               'rc_this_oldid' => 0,
+                               'rc_last_oldid' => 0,
+                               'rc_old_len' => null,
+                               'rc_new_len' => null,
+                               'rc_type' => 3,
+                               'rc_logid' => 25,
+                               'rc_log_type' => 'delete',
+                               'rc_log_action' => 'delete'
+                       )
+               );
+
+               return $this->makeRecentChange( $attribs, $counter, $watchingUsers );
+       }
+
+       /**
+        * @dataProvider revUserDeleteProvider
+        */
+       public function testNewForRevUserDeleteChange( $expected, $context, $messages,
+               $recentChange, $watched
+       ) {
+               $cacheEntryFactory = new RCCacheEntryFactory( $context, $messages );
+               $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, $watched );
+
+               $this->assertInstanceOf( 'RCCacheEntry', $cacheEntry );
+
+               $this->assertEquals( $watched, $cacheEntry->watched, 'watched' );
+               $this->assertEquals( $expected['timestamp'], $cacheEntry->timestamp, 'timestamp' );
+               $this->assertEquals(
+                       $expected['numberofWatchingusers'],
+                       $cacheEntry->numberofWatchingusers, 'watching users'
+               );
+               $this->assertEquals( $expected['unpatrolled'], $cacheEntry->unpatrolled, 'unpatrolled' );
+
+               $this->assertRevDel( $cacheEntry );
+               $this->assertTitleLink( 'Zzz', $cacheEntry );
+
+               $this->assertEquals( 'cur', $cacheEntry->curlink, 'cur link for delete log or rev' );
+               $this->assertEquals( 'diff', $cacheEntry->difflink, 'diff link for delete log or rev' );
+               $this->assertEquals( 'prev', $cacheEntry->lastlink, 'pref link for delete log or rev' );
+       }
+
+       public function revUserDeleteProvider() {
+               return array(
+                       array(
+                               array(
+                                       'title' => 'Zzz',
+                                       'user' => 'Mary',
+                                       'diff' => '',
+                                       'cur' => '',
+                                       'timestamp' => '21:21',
+                                       'numberofWatchingusers' => 0,
+                                       'unpatrolled' => false
+                               ),
+                               $this->getContext(),
+                               $this->getMessages(),
+                               $this->makeDeletedEditRecentChange(
+                                       'Zzz',
+                                       $this->getTestUser(),
+                                       '20131103212153',
+                                       191, // thisid
+                                       190, // lastid
+                                       '20131103212153',
+                                       0, // counter
+                                       0 // number of watching users
+                               ),
+                               false,
+                               'deletedrevuser'
+                       )
+               );
+       }
+
+       private function makeDeletedEditRecentChange( $title, $user, $timestamp, $curid, $thisid,
+               $lastid, $counter, $watchingUsers
+       ) {
+               $attribs = array_merge(
+                       $this->getDefaultAttributes( $title, $timestamp ),
+                       array(
+                               'rc_user' => $user->getId(),
+                               'rc_user_text' => $user->getName(),
+                               'rc_deleted' => 5,
+                               'rc_cur_id' => $curid,
+                               'rc_this_oldid' => $thisid,
+                               'rc_last_oldid' => $lastid
+                       )
+               );
+
+               return $this->makeRecentChange( $attribs, $counter, $watchingUsers );
+       }
+
+       private function assertUserLinks( $user, $cacheEntry ) {
+               $this->assertTag(
+                       array(
+                               'tag' => 'a',
+                               'attributes' => array(
+                                       'class' => 'new mw-userlink'
+                               ),
+                               'content' => $user
+                       ),
+                       $cacheEntry->userlink,
+                       'verify user link'
+               );
+
+               $this->assertTag(
+                       array(
+                               'tag' => 'span',
+                               'attributes' => array(
+                                       'class' => 'mw-usertoollinks'
+                               ),
+                               'child' => array(
+                                       'tag' => 'a',
+                                       'content' => 'Talk',
+                               )
+                       ),
+                       $cacheEntry->usertalklink,
+                       'verify user talk link'
+               );
+
+               $this->assertTag(
+                       array(
+                               'tag' => 'span',
+                               'attributes' => array(
+                                       'class' => 'mw-usertoollinks'
+                               ),
+                               'child' => array(
+                                       'tag' => 'a',
+                                       'content' => 'contribs',
+                               )
+                       ),
+                       $cacheEntry->usertalklink,
+                       'verify user tool links'
+               );
+       }
+
+       private function assertDeleteLogLink( $cacheEntry ) {
+               $this->assertTag(
+                       array(
+                               'tag' => 'a',
+                               'attributes' => array(
+                                       'href' => '/wiki/Special:Log/delete',
+                                       'title' => 'Special:Log/delete'
+                               ),
+                               'content' => 'Deletion log'
+                       ),
+                       $cacheEntry->link,
+                       'verify deletion log link'
+               );
+       }
+
+       private function assertRevDel( $cacheEntry ) {
+               $this->assertTag(
+                       array(
+                               'tag' => 'span',
+                               'attributes' => array(
+                                       'class' => 'history-deleted'
+                               ),
+                               'content' => '(username removed)'
+                       ),
+                       $cacheEntry->userlink,
+                       'verify user link for change with deleted revision and user'
+               );
+       }
+
+       private function assertTitleLink( $title, $cacheEntry ) {
+               $this->assertTag(
+                       array(
+                               'tag' => 'a',
+                               'attributes' => array(
+                                       'href' => '/wiki/' . $title,
+                                       'title' => $title
+                               ),
+                               'content' => $title
+                       ),
+                       $cacheEntry->link,
+                       'verify title link'
+               );
+       }
+
+       private function assertQueryLink( $content, $params, $link ) {
+               $this->assertTag(
+                       array(
+                               'tag' => 'a',
+                               'content' => $content
+                       ),
+                       $link,
+                       'assert query link element'
+               );
+
+               foreach ( $params as $key => $value ) {
+                       $this->assertRegExp( '/' . $key . '=' . $value . '/', $link, "verify $key link params" );
+               }
+       }
+
+       private function makeRecentChange( $attribs, $counter, $watchingUsers ) {
+               $change = new RecentChange();
+               $change->setAttribs( $attribs );
+               $change->counter = $counter;
+               $change->numberofWatchingusers = $watchingUsers;
+
+               return $change;
+       }
+
+       private function getDefaultAttributes( $title, $timestamp ) {
+               return array(
+                       'rc_id' => 545,
+                       'rc_user' => 0,
+                       'rc_user_text' => '127.0.0.1',
+                       'rc_ip' => '127.0.0.1',
+                       'rc_title' => $title,
+                       'rc_namespace' => 0,
+                       'rc_timestamp' => $timestamp,
+                       'rc_cur_time' => $timestamp,
+                       'rc_old_len' => 212,
+                       'rc_new_len' => 188,
+                       'rc_comment' => '',
+                       'rc_minor' => 0,
+                       'rc_bot' => 0,
+                       'rc_type' => 0,
+                       'rc_patrolled' => 1,
+                       'rc_deleted' => 0,
+                       'rc_logid' => 0,
+                       'rc_log_type' => null,
+                       'rc_log_action' => '',
+                       'rc_params' => '',
+                       'rc_source' => 'mw.edit'
+               );
+       }
+
+       private function getTestUser() {
+               $user = User::newFromName( 'Mary' );
+
+               if ( !$user->getId() ) {
+                       $user->addToDatabase();
+               }
+
+               return $user;
+       }
+
+       private function getMessages() {
+               return array(
+                       'cur' => 'cur',
+                       'diff' => 'diff',
+                       'hist' => 'hist',
+                       'enhancedrc-history' => 'history',
+                       'last' => 'prev',
+                       'blocklink' => 'block',
+                       'history' => 'Page history',
+                       'semicolon-separator' => '; ',
+                       'pipe-separator' => ' | '
+               );
+       }
+
+       private function getContext() {
+               $title = Title::newFromText( 'RecentChanges', NS_SPECIAL );
+
+               $context = new RequestContext();
+               $context->setTitle( $title );
+               $context->setLanguage( Language::factory( 'en' ) );
+
+               $user = $this->getTestUser();
+               $context->setUser( $user );
+
+               return $context;
+       }
+}
index cfa3e77..c63675e 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 /**
  * @group Database
  */
@@ -136,7 +137,8 @@ class RecentChangeTest extends MediaWikiTestCase {
 
                # move/move
                $this->assertIRCComment(
-                       $this->context->msg( '1movedto2', 'SomeTitle', 'TestTarget' )->plain() . $sep . $this->user_comment,
+                       $this->context->msg( '1movedto2', 'SomeTitle', 'TestTarget' )
+                               ->plain() . $sep . $this->user_comment,
                        'move', 'move',
                        $move_params,
                        $this->user_comment
@@ -144,7 +146,8 @@ class RecentChangeTest extends MediaWikiTestCase {
 
                # move/move_redir
                $this->assertIRCComment(
-                       $this->context->msg( '1movedto2_redir', 'SomeTitle', 'TestTarget' )->plain() . $sep . $this->user_comment,
+                       $this->context->msg( '1movedto2_redir', 'SomeTitle', 'TestTarget' )
+                               ->plain() . $sep . $this->user_comment,
                        'move', 'move_redir',
                        $move_params,
                        $this->user_comment
@@ -178,7 +181,8 @@ class RecentChangeTest extends MediaWikiTestCase {
 
                # protect/protect
                $this->assertIRCComment(
-                       $this->context->msg( 'protectedarticle', 'SomeTitle ' . $protectParams[0] )->plain() . $sep . $this->user_comment,
+                       $this->context->msg( 'protectedarticle', 'SomeTitle ' . $protectParams[0] )
+                               ->plain() . $sep . $this->user_comment,
                        'protect', 'protect',
                        $protectParams,
                        $this->user_comment
@@ -194,7 +198,8 @@ class RecentChangeTest extends MediaWikiTestCase {
 
                # protect/modify
                $this->assertIRCComment(
-                       $this->context->msg( 'modifiedarticleprotection', 'SomeTitle ' . $protectParams[0] )->plain() . $sep . $this->user_comment,
+                       $this->context->msg( 'modifiedarticleprotection', 'SomeTitle ' . $protectParams[0] )
+                               ->plain() . $sep . $this->user_comment,
                        'protect', 'modify',
                        $protectParams,
                        $this->user_comment
@@ -255,8 +260,9 @@ class RecentChangeTest extends MediaWikiTestCase {
         * @param $comment String (optional) A comment for the log action
         * @param $msg String (optional) A message for PHPUnit :-)
         */
-       protected function assertIRCComment( $expected, $type, $action, $params, $comment = null, $msg = '' ) {
-
+       protected function assertIRCComment( $expected, $type, $action, $params,
+               $comment = null, $msg = ''
+       ) {
                $logEntry = new ManualLogEntry( $type, $action );
                $logEntry->setPerformer( $this->user );
                $logEntry->setTarget( $this->title );
diff --git a/tests/phpunit/includes/composer/ComposerVersionNormalizerTest.php b/tests/phpunit/includes/composer/ComposerVersionNormalizerTest.php
new file mode 100644 (file)
index 0000000..8de8be1
--- /dev/null
@@ -0,0 +1,156 @@
+<?php
+
+/**
+ * @covers ComposerVersionNormalizer
+ *
+ * @group ComposerHooks
+ *
+ * @licence GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+class ComposerVersionNormalizerTest extends PHPUnit_Framework_TestCase {
+
+       /**
+        * @dataProvider nonStringProvider
+        */
+       public function testGivenNonString_normalizeThrowsInvalidArgumentException( $nonString ) {
+               $normalizer = new ComposerVersionNormalizer();
+
+               $this->setExpectedException( 'InvalidArgumentException' );
+               $normalizer->normalizeSuffix( $nonString );
+       }
+
+       public function nonStringProvider() {
+               return array(
+                       array( null ),
+                       array( 42 ),
+                       array( array() ),
+                       array( new stdClass() ),
+                       array( true ),
+               );
+       }
+
+       /**
+        * @dataProvider simpleVersionProvider
+        */
+       public function testGivenSimpleVersion_normalizeSuffixReturnsAsIs( $simpleVersion ) {
+               $this->assertRemainsUnchanged( $simpleVersion );
+       }
+
+       protected function assertRemainsUnchanged( $version ) {
+               $normalizer = new ComposerVersionNormalizer();
+
+               $this->assertEquals(
+                       $version,
+                       $normalizer->normalizeSuffix( $version )
+               );
+       }
+
+       public function simpleVersionProvider() {
+               return array(
+                       array( '1.22.0' ),
+                       array( '1.19.2' ),
+                       array( '1.19.2.0' ),
+                       array( '1.9' ),
+                       array( '123.321.456.654' ),
+               );
+       }
+
+       /**
+        * @dataProvider complexVersionProvider
+        */
+       public function testGivenComplexVersionWithoutDash_normalizeSuffixAddsDash( $withoutDash, $withDash ) {
+               $normalizer = new ComposerVersionNormalizer();
+
+               $this->assertEquals(
+                       $withDash,
+                       $normalizer->normalizeSuffix( $withoutDash )
+               );
+       }
+
+       public function complexVersionProvider() {
+               return array(
+                       array( '1.22.0alpha', '1.22.0-alpha' ),
+                       array( '1.22.0RC', '1.22.0-RC' ),
+                       array( '1.19beta', '1.19-beta' ),
+                       array( '1.9RC4', '1.9-RC4' ),
+                       array( '1.9.1.2RC4', '1.9.1.2-RC4' ),
+                       array( '1.9.1.2RC', '1.9.1.2-RC' ),
+                       array( '123.321.456.654RC9001', '123.321.456.654-RC9001' ),
+               );
+       }
+
+       /**
+        * @dataProvider complexVersionProvider
+        */
+       public function testGivenComplexVersionWithDash_normalizeSuffixReturnsAsIs( $withoutDash, $withDash ) {
+               $this->assertRemainsUnchanged( $withDash );
+       }
+
+       /**
+        * @dataProvider fourLevelVersionsProvider
+        */
+       public function testGivenFourLevels_levelCountNormalizationDoesNothing( $version ) {
+               $normalizer = new ComposerVersionNormalizer();
+
+               $this->assertEquals(
+                       $version,
+                       $normalizer->normalizeLevelCount( $version )
+               );
+       }
+
+       public function fourLevelVersionsProvider() {
+               return array(
+                       array( '1.22.0.0' ),
+                       array( '1.19.2.4' ),
+                       array( '1.19.2.0' ),
+                       array( '1.9.0.1' ),
+                       array( '123.321.456.654' ),
+                       array( '123.321.456.654RC4' ),
+                       array( '123.321.456.654-RC4' ),
+               );
+       }
+
+       /**
+        * @dataProvider levelNormalizationProvider
+        */
+       public function testGivenFewerLevels_levelCountNormalizationEnsuresFourLevels( $expected, $version ) {
+               $normalizer = new ComposerVersionNormalizer();
+
+               $this->assertEquals(
+                       $expected,
+                       $normalizer->normalizeLevelCount( $version )
+               );
+       }
+
+       public function levelNormalizationProvider() {
+               return array(
+                       array( '1.22.0.0', '1.22' ),
+                       array( '1.22.0.0', '1.22.0' ),
+                       array( '1.19.2.0', '1.19.2' ),
+                       array( '12345.0.0.0', '12345' ),
+                       array( '12345.0.0.0-RC4', '12345-RC4' ),
+                       array( '12345.0.0.0-alpha', '12345-alpha' ),
+               );
+       }
+
+       /**
+        * @dataProvider invalidVersionProvider
+        */
+       public function testGivenInvalidVersion_normalizeSuffixReturnsAsIs( $invalidVersion ) {
+               $this->assertRemainsUnchanged( $invalidVersion );
+       }
+
+       public function invalidVersionProvider() {
+               return array(
+                       array( '1.221-a' ),
+                       array( '1.221-' ),
+                       array( '1.22rc4a' ),
+                       array( 'a1.22rc' ),
+                       array( '.1.22rc' ),
+                       array( 'a' ),
+                       array( 'alpha42' ),
+               );
+       }
+
+}
\ No newline at end of file
diff --git a/tests/phpunit/includes/diff/ArrayDiffFormatterTest.php b/tests/phpunit/includes/diff/ArrayDiffFormatterTest.php
new file mode 100644 (file)
index 0000000..50c5c57
--- /dev/null
@@ -0,0 +1,116 @@
+<?php
+
+/**
+ * @licence GNU GPL v2+
+ * @author Adam Shorland
+ *
+ * @group Diff
+ */
+class ArrayDiffFormatterTest extends MediaWikiTestCase {
+
+       /**
+        * @param Diff $input
+        * @param array $expectedOutput
+        * @dataProvider provideTestFormat
+        * @covers ArrayDiffFormatter::format
+        */
+       public function testFormat( $input, $expectedOutput ) {
+               $instance = new ArrayDiffFormatter();
+               $output = $instance->format( $input );
+               $this->assertEquals( $expectedOutput, $output );
+       }
+
+       private function getMockDiff( $edits ) {
+               $diff = $this->getMockBuilder( 'Diff' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $diff->expects( $this->any() )
+                       ->method( 'getEdits' )
+                       ->will( $this->returnValue( $edits ) );
+               return $diff;
+       }
+
+       private function getMockDiffOp( $type = null, $orig = array(), $closing = array() ) {
+               $diffOp = $this->getMockBuilder( 'DiffOp' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $diffOp->expects( $this->any() )
+                       ->method( 'getType' )
+                       ->will( $this->returnValue( $type ) );
+               $diffOp->expects( $this->any() )
+                       ->method( 'getOrig' )
+                       ->will( $this->returnValue( $orig ) );
+               if( $type === 'change' ) {
+                       $diffOp->expects( $this->any() )
+                               ->method( 'getClosing' )
+                               ->with( $this->isType( 'integer' ) )
+                               ->will( $this->returnCallback( function() {
+                                       return 'mockLine';
+                               } ) );
+               } else {
+                       $diffOp->expects( $this->any() )
+                               ->method( 'getClosing' )
+                               ->will( $this->returnValue( $closing ) );
+               }
+               return $diffOp;
+       }
+
+       public function provideTestFormat() {
+               $emptyArrayTestCases = array(
+                       $this->getMockDiff( array() ),
+                       $this->getMockDiff( array( $this->getMockDiffOp( 'add' ) ) ),
+                       $this->getMockDiff( array( $this->getMockDiffOp( 'delete' ) ) ),
+                       $this->getMockDiff( array( $this->getMockDiffOp( 'change' ) ) ),
+                       $this->getMockDiff( array( $this->getMockDiffOp( 'copy' ) ) ),
+                       $this->getMockDiff( array( $this->getMockDiffOp( 'FOOBARBAZ' ) ) ),
+                       $this->getMockDiff( array( $this->getMockDiffOp( 'add', 'line' ) ) ),
+                       $this->getMockDiff( array( $this->getMockDiffOp( 'delete', array(), array( 'line' ) ) ) ),
+                       $this->getMockDiff( array( $this->getMockDiffOp( 'copy', array(), array( 'line' ) ) ) ),
+               );
+
+               $otherTestCases = array();
+               $otherTestCases[] = array(
+                       $this->getMockDiff( array( $this->getMockDiffOp( 'add', array( ), array( 'a1' ) ) ) ),
+                       array( array( 'action' => 'add', 'new' => 'a1', 'newline' => 1 ) ),
+               );
+               $otherTestCases[] = array(
+                       $this->getMockDiff( array( $this->getMockDiffOp( 'add', array( ), array( 'a1', 'a2' ) ) ) ),
+                       array(
+                               array( 'action' => 'add', 'new' => 'a1', 'newline' => 1 ),
+                               array( 'action' => 'add', 'new' => 'a2', 'newline' => 2 ),
+                       ),
+               );
+               $otherTestCases[] = array(
+                       $this->getMockDiff( array( $this->getMockDiffOp( 'delete', array( 'd1' ) ) ) ),
+                       array( array( 'action' => 'delete', 'old' => 'd1', 'oldline' => 1 ) ),
+               );
+               $otherTestCases[] = array(
+                       $this->getMockDiff( array( $this->getMockDiffOp( 'delete', array( 'd1', 'd2' ) ) ) ),
+                       array(
+                               array( 'action' => 'delete', 'old' => 'd1', 'oldline' => 1 ),
+                               array( 'action' => 'delete', 'old' => 'd2', 'oldline' => 2 ),
+                       ),
+               );
+               $otherTestCases[] = array(
+                       $this->getMockDiff( array( $this->getMockDiffOp( 'change', array( 'd1' ), array( 'a1' ) ) ) ),
+                       array( array( 'action' => 'change', 'old' => 'd1', 'new' => 'mockLine', 'newline' => 1, 'oldline' => 1 ) ),
+               );
+               $otherTestCases[] = array(
+                       $this->getMockDiff( array( $this->getMockDiffOp( 'change', array( 'd1', 'd2' ), array( 'a1', 'a2' ) ) ) ),
+                       array(
+                               array( 'action' => 'change', 'old' => 'd1', 'new' => 'mockLine', 'newline' => 1, 'oldline' => 1 ),
+                               array( 'action' => 'change', 'old' => 'd2', 'new' => 'mockLine', 'newline' => 2, 'oldline' => 2 ),
+                       ),
+               );
+
+               $testCases = array();
+               foreach( $emptyArrayTestCases as $testCase ) {
+                       $testCases[] = array( $testCase, array() );
+               }
+               foreach( $otherTestCases as $testCase ) {
+                       $testCases[] = array( $testCase[0], $testCase[1] );
+               }
+               return $testCases;
+       }
+
+}
diff --git a/tests/phpunit/includes/diff/DiffOpTest.php b/tests/phpunit/includes/diff/DiffOpTest.php
new file mode 100644 (file)
index 0000000..fe2c566
--- /dev/null
@@ -0,0 +1,73 @@
+<?php
+
+//Load our FakeDiffOp
+require_once( __DIR__ . DIRECTORY_SEPARATOR . 'FakeDiffOp.php' );
+
+/**
+ * @licence GNU GPL v2+
+ * @author Adam Shorland
+ *
+ * @group Diff
+ */
+class DiffOpTest extends MediaWikiTestCase {
+
+       /**
+        * @covers DiffOp::getType
+        */
+       public function testGetType() {
+               $obj = new FakeDiffOp();
+               $obj->type = 'foo';
+               $this->assertEquals( 'foo', $obj->getType() );
+       }
+
+       /**
+        * @covers DiffOp::getOrig
+        */
+       public function testGetOrig() {
+               $obj = new FakeDiffOp();
+               $obj->orig = array( 'foo' );
+               $this->assertEquals( array( 'foo' ), $obj->getOrig() );
+       }
+
+       /**
+        * @covers DiffOp::getClosing
+        */
+       public function testGetClosing() {
+               $obj = new FakeDiffOp();
+               $obj->closing = array( 'foo' );
+               $this->assertEquals( array( 'foo' ), $obj->getClosing() );
+       }
+
+       /**
+        * @covers DiffOp::getClosing
+        */
+       public function testGetClosingWithParameter() {
+               $obj = new FakeDiffOp();
+               $obj->closing = array( 'foo', 'bar', 'baz' );
+               $this->assertEquals( 'foo' , $obj->getClosing( 0 ) );
+               $this->assertEquals( 'bar' , $obj->getClosing( 1 ) );
+               $this->assertEquals( 'baz' , $obj->getClosing( 2 ) );
+               $this->assertEquals( null , $obj->getClosing( 3 ) );
+       }
+
+       /**
+        * @covers DiffOp::norig
+        */
+       public function testNorig() {
+               $obj = new FakeDiffOp();
+               $this->assertEquals( 0, $obj->norig() );
+               $obj->orig = array( 'foo' );
+               $this->assertEquals( 1, $obj->norig() );
+       }
+
+       /**
+        * @covers DiffOp::nclosing
+        */
+       public function testNclosing() {
+               $obj = new FakeDiffOp();
+               $this->assertEquals( 0, $obj->nclosing() );
+               $obj->closing = array( 'foo' );
+               $this->assertEquals( 1, $obj->nclosing() );
+       }
+
+}
diff --git a/tests/phpunit/includes/diff/DiffTest.php b/tests/phpunit/includes/diff/DiffTest.php
new file mode 100644 (file)
index 0000000..1911c82
--- /dev/null
@@ -0,0 +1,20 @@
+<?php
+
+/**
+ * @licence GNU GPL v2+
+ * @author Adam Shorland
+ *
+ * @group Diff
+ */
+class DiffTest extends MediaWikiTestCase {
+
+       /**
+        * @covers Diff::getEdits
+        */
+       public function testGetEdits() {
+               $obj = new Diff( array(), array() );
+               $obj->edits = 'FooBarBaz';
+               $this->assertEquals( 'FooBarBaz', $obj->getEdits() );
+       }
+
+}
index f95eb5e..e1a69e3 100644 (file)
@@ -6,6 +6,7 @@
  * @todo tests for the rest of DifferenceEngine!
  *
  * @group Database
+ * @group Diff
  *
  * @licence GNU GPL v2+
  * @author Katie Filbert < aude.wiki@gmail.com >
diff --git a/tests/phpunit/includes/diff/FakeDiffOp.php b/tests/phpunit/includes/diff/FakeDiffOp.php
new file mode 100644 (file)
index 0000000..70c8f64
--- /dev/null
@@ -0,0 +1,11 @@
+<?php
+
+/**
+ * Class FakeDiffOp used to test abstract class DiffOp
+ */
+class FakeDiffOp extends DiffOp {
+
+       public function reverse() {
+               return null;
+       }
+}
diff --git a/tests/phpunit/includes/exception/ErrorPageErrorTest.php b/tests/phpunit/includes/exception/ErrorPageErrorTest.php
new file mode 100644 (file)
index 0000000..4cfcd83
--- /dev/null
@@ -0,0 +1,67 @@
+<?php
+
+/**
+ * @covers ErrorPageError
+ * @author Adam Shorland
+ */
+class ErrorPageErrorTest extends MediaWikiTestCase {
+
+       private $wgOut;
+
+       protected function setUp() {
+               parent::setUp();
+               global $wgOut;
+               $this->wgOut = clone $wgOut;
+       }
+
+       protected function tearDown() {
+               global $wgOut;
+               $wgOut = $this->wgOut;
+               parent::tearDown();
+       }
+
+       private function getMockMessage() {
+               $mockMessage = $this->getMockBuilder( 'Message' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $mockMessage->expects( $this->once() )
+                       ->method( 'inLanguage' )
+                       ->will( $this->returnValue( $mockMessage ) );
+               $mockMessage->expects(  $this->once() )
+                       ->method( 'useDatabase' )
+                       ->will( $this->returnValue( $mockMessage ) );
+               return $mockMessage;
+       }
+
+       public function testConstruction() {
+               $mockMessage = $this->getMockMessage();
+               $title = 'Foo';
+               $params = array( 'Baz' );
+               $e = new ErrorPageError( $title, $mockMessage, $params );
+               $this->assertEquals( $title, $e->title );
+               $this->assertEquals( $mockMessage, $e->msg );
+               $this->assertEquals( $params, $e->params );
+       }
+
+       public function testReport() {
+               $mockMessage = $this->getMockMessage();
+               $title = 'Foo';
+               $params = array( 'Baz' );
+
+               global $wgOut;
+               $wgOut = $this->getMockBuilder( 'OutputPage' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $wgOut->expects( $this->once() )
+                       ->method( 'showErrorPage' )
+                       ->with( $title, $mockMessage, $params );
+               $wgOut->expects( $this->once() )
+                       ->method( 'output' );
+
+               $e = new ErrorPageError( $title, $mockMessage, $params );
+               $e->report();
+       }
+
+
+
+}
index f1ddc17..2dc4850 100644 (file)
@@ -15,6 +15,132 @@ class MWExceptionTest extends MediaWikiTestCase {
                throw new MWException();
        }
 
+       /**
+        * @dataProvider provideTextUseOutputPage
+        * @covers MWException::useOutputPage
+        */
+       public function testUseOutputPage( $expected, $wgLang, $wgFullyInitialised, $wgOut ) {
+               $this->setMwGlobals( array(
+                       'wgLang' => $wgLang,
+                       'wgFullyInitialised' => $wgFullyInitialised,
+                       'wgOut' => $wgOut,
+               ) );
+
+               $e = new MWException();
+               $this->assertEquals( $expected, $e->useOutputPage() );
+       }
+
+       public function provideTextUseOutputPage() {
+               return array(
+                       // expected, wgLang, wgFullyInitialised, wgOut
+                       array( false, null, null, null ),
+                       array( false, $this->getMockLanguage(), null, null ),
+                       array( false, $this->getMockLanguage(), true, null ),
+                       array( false, null, true, null ),
+                       array( false, null, null, true ),
+                       array( true, $this->getMockLanguage(), true, true ),
+               );
+       }
+
+       private function getMockLanguage() {
+               return $this->getMockBuilder( 'Language' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+       }
+
+       /**
+        * @dataProvider provideUseMessageCache
+        * @covers MWException::useMessageCache
+        */
+       public function testUseMessageCache( $expected, $wgLang ) {
+               $this->setMwGlobals( array(
+                       'wgLang' => $wgLang,
+               ) );
+               $e = new MWException();
+               $this->assertEquals( $expected, $e->useMessageCache() );
+       }
+
+       public function provideUseMessageCache() {
+               return array(
+                       array( false, null ),
+                       array( true, $this->getMockLanguage() ),
+               );
+       }
+
+       /**
+        * @covers MWException::isLoggable
+        */
+       public function testIsLogable() {
+               $e = new MWException();
+               $this->assertTrue( $e->isLoggable() );
+       }
+
+       /**
+        * @dataProvider provideRunHooks
+        * @covers MWException::runHooks
+        */
+       public function testRunHooks( $wgExceptionHooks, $name, $args, $expectedReturn ) {
+               $this->setMwGlobals( array(
+                       'wgExceptionHooks' => $wgExceptionHooks,
+               ) );
+               $e = new MWException();
+               $this->assertEquals( $expectedReturn, $e->runHooks( $name, $args ) );
+       }
+
+       public function provideRunHooks() {
+               return array(
+                       array( null, null, null, null ),
+                       array( array(), 'name', array(), null ),
+                       array( array( 'name' => false ), 'name', array(), null ),
+                       array(
+                               array( 'mockHook' => array( 'MWExceptionTest::mockHook' ) ),
+                               'mockHook', array(), 'YAY.[]'
+                       ),
+                       array(
+                               array( 'mockHook' => array( 'MWExceptionTest::mockHook' ) ),
+                               'mockHook', array( 'a' ), 'YAY.{"1":"a"}'
+                       ),
+                       array(
+                               array( 'mockHook' => array( 'MWExceptionTest::mockHook' ) ),
+                               'mockHook', array( null ), null
+                       ),
+               );
+       }
+
+       /**
+        * Used in conjunction with provideRunHooks and testRunHooks as a mock callback for a hook
+        */
+       public static function mockHook() {
+               $args = func_get_args();
+               if( !$args[0] instanceof MWException ) {
+                       return '$caller not instance of MWException';
+               }
+               unset( $args[0] );
+               if( array_key_exists( 1, $args ) && $args[1] === null ) {
+                       return null;
+               }
+               return 'YAY.' . json_encode( $args );
+       }
+
+       /**
+        * @dataProvider provideIsCommandLine
+        * @covers MWException::isCommandLine
+        */
+       public function testisCommandLine( $expected, $wgCommandLineMode ) {
+               $this->setMwGlobals( array(
+                       'wgCommandLineMode' => $wgCommandLineMode,
+               ) );
+               $e = new MWException();
+               $this->assertEquals( $expected, $e->isCommandLine() );
+       }
+
+       public function provideIsCommandLine() {
+               return array(
+                       array( false, null ),
+                       array( true, true ),
+               );
+       }
+
        /**
         * Verify the exception classes are JSON serializabe.
         *
diff --git a/tests/phpunit/includes/exception/ReadOnlyErrorTest.php b/tests/phpunit/includes/exception/ReadOnlyErrorTest.php
new file mode 100644 (file)
index 0000000..352ec65
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * @covers ReadOnlyError
+ * @author Adam Shorland
+ */
+class ReadOnlyErrorTest extends MediaWikiTestCase {
+
+       public function testConstruction() {
+               $e = new ReadOnlyError();
+               $this->assertEquals( 'readonly', $e->title );
+               $this->assertEquals( 'readonlytext', $e->msg );
+               $this->assertEquals( wfReadOnlyReason()?: array(), $e->params );
+       }
+
+}
diff --git a/tests/phpunit/includes/exception/UserNotLoggedInTest.php b/tests/phpunit/includes/exception/UserNotLoggedInTest.php
new file mode 100644 (file)
index 0000000..591a0fa
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * @covers UserNotLoggedIn
+ * @author Adam Shorland
+ */
+class UserNotLoggedInTest extends MediaWikiTestCase {
+
+       public function testConstruction() {
+               $e = new UserNotLoggedIn();
+               $this->assertEquals( 'exception-nologin', $e->title );
+               $this->assertEquals( 'exception-nologin-text', $e->msg );
+               $this->assertEquals( array(), $e->params );
+       }
+
+}
index 0e5f267..8466684 100644 (file)
@@ -48,13 +48,13 @@ class InstallDocFormatterTest extends MediaWikiTestCase {
 
                        # Transform '$wgFooBar' links
                        array(
-                               '<span class="config-plainlink">[http://www.mediawiki.org/wiki/Manual:$wgFooBar $wgFooBar]</span>',
+                               '<span class="config-plainlink">[https://www.mediawiki.org/wiki/Manual:$wgFooBar $wgFooBar]</span>',
                                '$wgFooBar', 'Testing basic $wgFooBar' ),
                        array(
-                               '<span class="config-plainlink">[http://www.mediawiki.org/wiki/Manual:$wgFooBar45 $wgFooBar45]</span>',
+                               '<span class="config-plainlink">[https://www.mediawiki.org/wiki/Manual:$wgFooBar45 $wgFooBar45]</span>',
                                '$wgFooBar45', 'Testing $wgFooBar45 (with numbers)' ),
                        array(
-                               '<span class="config-plainlink">[http://www.mediawiki.org/wiki/Manual:$wgFoo_Bar $wgFoo_Bar]</span>',
+                               '<span class="config-plainlink">[https://www.mediawiki.org/wiki/Manual:$wgFoo_Bar $wgFoo_Bar]</span>',
                                '$wgFoo_Bar', 'Testing $wgFoo_Bar (with underscore)' ),
 
                        # Icky variables that shouldn't link
index e24c088..dc5db82 100644 (file)
@@ -32,8 +32,6 @@ class RunningStatTest extends MediaWikiTestCase {
                        return pow( $mean - $x, 2 );
                }, $this->points ) ) / ( count( $rstat ) - 1 );
                $stddev = sqrt( $variance );
-               $min = min( $this->points );
-               $max = max( $this->points );
 
                $this->assertEquals( count( $rstat ), count( $this->points ) );
                $this->assertEquals( $rstat->min, min( $this->points ) );
index aa78394..1670823 100644 (file)
@@ -74,8 +74,6 @@ class BagOStuffTest extends MediaWikiTestCase {
                $fork &= !$this->cache instanceof MultiWriteBagOStuff;
                if ( $fork ) {
                        // callback should take awhile now so that we can test concurrent merge attempts
-                       $usleep = 5000;
-
                        $pid = pcntl_fork();
                        if ( $pid == -1 ) {
                                // can't fork, ignore this test...
diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderModuleTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderModuleTest.php
new file mode 100644 (file)
index 0000000..b25e9b0
--- /dev/null
@@ -0,0 +1,73 @@
+<?php
+
+class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
+
+       /**
+        * @covers ResourceLoaderModule::getDefinitionSummary
+        * @covers ResourceLoaderFileModule::getDefinitionSummary
+        */
+       public function testDefinitionSummary() {
+               $context = self::getResourceLoaderContext();
+
+               $baseParams = array(
+                       'scripts' => array( 'foo.js', 'bar.js' ),
+                       'dependencies' => array( 'jquery', 'mediawiki' ),
+                       'messages' => array( 'hello', 'world' ),
+               );
+
+               $module = new ResourceLoaderFileModule( $baseParams );
+
+               $jsonSummary = json_encode( $module->getDefinitionSummary( $context ) );
+
+               // Exactly the same
+               $module = new ResourceLoaderFileModule( $baseParams );
+
+               $this->assertEquals(
+                       $jsonSummary,
+                       json_encode( $module->getDefinitionSummary( $context ) ),
+                       'Instance is insignificant'
+               );
+
+               // Re-order dependencies
+               $module = new ResourceLoaderFileModule( array(
+                       'dependencies' => array( 'mediawiki', 'jquery' ),
+               ) + $baseParams );
+
+               $this->assertEquals(
+                       $jsonSummary,
+                       json_encode( $module->getDefinitionSummary( $context ) ),
+                       'Order of dependencies is insignificant'
+               );
+
+               // Re-order messages
+               $module = new ResourceLoaderFileModule( array(
+                       'messages' => array( 'world', 'hello' ),
+               ) + $baseParams );
+
+               $this->assertEquals(
+                       $jsonSummary,
+                       json_encode( $module->getDefinitionSummary( $context ) ),
+                       'Order of messages is insignificant'
+               );
+
+               // Re-order scripts
+               $module = new ResourceLoaderFileModule( array(
+                       'scripts' => array( 'bar.js', 'foo.js' ),
+               ) + $baseParams );
+
+               $this->assertNotEquals(
+                       $jsonSummary,
+                       json_encode( $module->getDefinitionSummary( $context ) ),
+                       'Order of scripts is significant'
+               );
+
+               // Subclass
+               $module = new ResourceLoaderFileModuleTestModule( $baseParams );
+
+               $this->assertNotEquals(
+                       $jsonSummary,
+                       json_encode( $module->getDefinitionSummary( $context ) ),
+                       'Class is significant'
+               );
+       }
+}
diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderStartupModuleTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderStartupModuleTest.php
new file mode 100644 (file)
index 0000000..5b51ef8
--- /dev/null
@@ -0,0 +1,278 @@
+<?php
+
+class ResourceLoaderStartupModuleTest extends ResourceLoaderTestCase {
+
+       public static function provideGetModuleRegistrations() {
+               return array(
+                       array( array(
+                               'msg' => 'Empty registry',
+                               'modules' => array(),
+                               'out' => '
+mw.loader.addSource( {
+    "local": {
+        "loadScript": "/w/load.php",
+        "apiScript": "/w/api.php"
+    }
+} );mw.loader.register( [] );'
+                       ) ),
+                       array( array(
+                               'msg' => 'Basic registry',
+                               'modules' => array(
+                                       'test.blank' => new ResourceLoaderTestModule(),
+                               ),
+                               'out' => '
+mw.loader.addSource( {
+    "local": {
+        "loadScript": "/w/load.php",
+        "apiScript": "/w/api.php"
+    }
+} );mw.loader.register( [
+    [
+        "test.blank",
+        "1388534400"
+    ]
+] );',
+                       ) ),
+                       array( array(
+                               'msg' => 'Group signature',
+                               'modules' => array(
+                                       'test.blank' => new ResourceLoaderTestModule(),
+                                       'test.group.foo' => new ResourceLoaderTestModule( array( 'group' => 'x-foo' ) ),
+                                       'test.group.bar' => new ResourceLoaderTestModule( array( 'group' => 'x-bar' ) ),
+                               ),
+                               'out' => '
+mw.loader.addSource( {
+    "local": {
+        "loadScript": "/w/load.php",
+        "apiScript": "/w/api.php"
+    }
+} );mw.loader.register( [
+    [
+        "test.blank",
+        "1388534400"
+    ],
+    [
+        "test.group.foo",
+        "1388534400",
+        [],
+        "x-foo"
+    ],
+    [
+        "test.group.bar",
+        "1388534400",
+        [],
+        "x-bar"
+    ]
+] );'
+                       ) ),
+                       array( array(
+                               'msg' => 'Different target (non-test should not be registered)',
+                               'modules' => array(
+                                       'test.blank' => new ResourceLoaderTestModule(),
+                                       'test.target.foo' => new ResourceLoaderTestModule( array( 'targets' => array( 'x-foo' ) ) ),
+                               ),
+                               'out' => '
+mw.loader.addSource( {
+    "local": {
+        "loadScript": "/w/load.php",
+        "apiScript": "/w/api.php"
+    }
+} );mw.loader.register( [
+    [
+        "test.blank",
+        "1388534400"
+    ]
+] );'
+                       ) ),
+                       array( array(
+                               'msg' => 'Foreign source',
+                               'sources' => array(
+                                       'example' => array(
+                                               'loadScript' => 'http://example.org/w/load.php',
+                                               'apiScript' => 'http://example.org/w/api.php',
+                                       ),
+                               ),
+                               'modules' => array(
+                                       'test.blank' => new ResourceLoaderTestModule( array( 'source' => 'example' ) ),
+                               ),
+                               'out' => '
+mw.loader.addSource( {
+    "local": {
+        "loadScript": "/w/load.php",
+        "apiScript": "/w/api.php"
+    },
+    "example": {
+        "loadScript": "http://example.org/w/load.php",
+        "apiScript": "http://example.org/w/api.php"
+    }
+} );mw.loader.register( [
+    [
+        "test.blank",
+        "1388534400",
+        [],
+        null,
+        "example"
+    ]
+] );'
+                       ) ),
+                       array( array(
+                               // This may seem like an edge case, but a plain MediaWiki core install
+                               // with a few extensions installed is likely far more complex than this
+                               // even, not to mention an install like Wikipedia.
+                               // TODO: Make this even more realistic.
+                               'msg' => 'Advanced (everything combined)',
+                               'sources' => array(
+                                       'example' => array(
+                                               'loadScript' => 'http://example.org/w/load.php',
+                                               'apiScript' => 'http://example.org/w/api.php',
+                                       ),
+                               ),
+                               'modules' => array(
+                                       'test.blank' => new ResourceLoaderTestModule(),
+                                       'test.x.core' => new ResourceLoaderTestModule(),
+                                       'test.x.util' => new ResourceLoaderTestModule( array(
+                                               'dependencies' => array(
+                                                       'test.x.core',
+                                               ),
+                                       ) ),
+                                       'test.x.foo' => new ResourceLoaderTestModule( array(
+                                               'dependencies' => array(
+                                                       'test.x.core',
+                                               ),
+                                       ) ),
+                                       'test.x.bar' => new ResourceLoaderTestModule( array(
+                                               'dependencies' => array(
+                                                       'test.x.core',
+                                                       'test.x.util',
+                                               ),
+                                       ) ),
+                                       'test.x.quux' => new ResourceLoaderTestModule( array(
+                                               'dependencies' => array(
+                                                       'test.x.foo',
+                                                       'test.x.bar',
+                                                       'test.x.util',
+                                               ),
+                                       ) ),
+                                       'test.group.foo.1' => new ResourceLoaderTestModule( array(
+                                               'group' => 'x-foo',
+                                       ) ),
+                                       'test.group.foo.2' => new ResourceLoaderTestModule( array(
+                                               'group' => 'x-foo',
+                                       ) ),
+                                       'test.group.bar.1' => new ResourceLoaderTestModule( array(
+                                               'group' => 'x-bar',
+                                       ) ),
+                                       'test.group.bar.2' => new ResourceLoaderTestModule( array(
+                                               'group' => 'x-bar',
+                                               'source' => 'example',
+                                       ) ),
+                                       'test.target.foo' => new ResourceLoaderTestModule( array(
+                                               'targets' => array( 'x-foo' ),
+                                       ) ),
+                                       'test.target.bar' => new ResourceLoaderTestModule( array(
+                                               'source' => 'example',
+                                               'targets' => array( 'x-foo' ),
+                                       ) ),
+                               ),
+                               'out' => '
+mw.loader.addSource( {
+    "local": {
+        "loadScript": "/w/load.php",
+        "apiScript": "/w/api.php"
+    },
+    "example": {
+        "loadScript": "http://example.org/w/load.php",
+        "apiScript": "http://example.org/w/api.php"
+    }
+} );mw.loader.register( [
+    [
+        "test.blank",
+        "1388534400"
+    ],
+    [
+        "test.x.core",
+        "1388534400"
+    ],
+    [
+        "test.x.util",
+        "1388534400",
+        [
+            "test.x.core"
+        ]
+    ],
+    [
+        "test.x.foo",
+        "1388534400",
+        [
+            "test.x.core"
+        ]
+    ],
+    [
+        "test.x.bar",
+        "1388534400",
+        [
+            "test.x.core",
+            "test.x.util"
+        ]
+    ],
+    [
+        "test.x.quux",
+        "1388534400",
+        [
+            "test.x.foo",
+            "test.x.bar",
+            "test.x.util"
+        ]
+    ],
+    [
+        "test.group.foo.1",
+        "1388534400",
+        [],
+        "x-foo"
+    ],
+    [
+        "test.group.foo.2",
+        "1388534400",
+        [],
+        "x-foo"
+    ],
+    [
+        "test.group.bar.1",
+        "1388534400",
+        [],
+        "x-bar"
+    ],
+    [
+        "test.group.bar.2",
+        "1388534400",
+        [],
+        "x-bar",
+        "example"
+    ]
+] );'
+                       ) ),
+               );
+       }
+
+       /**
+        * @dataProvider provideGetModuleRegistrations
+        * @covers ResourceLoaderStartUpModule::getModuleRegistrations
+        */
+       public function testGetModuleRegistrations( $case ) {
+               if ( isset( $case['sources'] ) ) {
+                       $this->setMwGlobals( 'wgResourceLoaderSources', $case['sources'] );
+               }
+
+               $context = self::getResourceLoaderContext();
+               $rl = $context->getResourceLoader();
+
+               $rl->register( $case['modules'] );
+
+               $this->assertEquals(
+                       ltrim( $case['out'], "\n" ),
+                       ResourceLoaderStartUpModule::getModuleRegistrations( $context ),
+                       $case['msg']
+               );
+       }
+
+}
diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderTest.php
new file mode 100644 (file)
index 0000000..ab0c8d9
--- /dev/null
@@ -0,0 +1,136 @@
+<?php
+
+class ResourceLoaderTest extends ResourceLoaderTestCase {
+
+       protected static $resourceLoaderRegisterModulesHook;
+
+       protected function setUp() {
+               parent::setUp();
+
+               // $wgResourceLoaderLESSFunctions, $wgResourceLoaderLESSImportPaths; $wgResourceLoaderLESSVars;
+
+               $this->setMwGlobals( array(
+                       'wgResourceLoaderLESSFunctions' => array(
+                               'test-sum' => function ( $frame, $less ) {
+                                       $sum = 0;
+                                       foreach ( $frame[2] as $arg ) {
+                                               $sum += (int)$arg[1];
+                                       }
+                                       return $sum;
+                               },
+                       ),
+                       'wgResourceLoaderLESSImportPaths' => array(
+                               dirname( dirname( __DIR__  ) ) . '/data/less/common',
+                       ),
+                       'wgResourceLoaderLESSVars' => array(
+                               'foo'  => '2px',
+                               'Foo' => '#eeeeee',
+                               'bar' => 5,
+                       ),
+               ) );
+       }
+
+       /* Hook Methods */
+
+       /**
+        * ResourceLoaderRegisterModules hook
+        */
+       public static function resourceLoaderRegisterModules( &$resourceLoader ) {
+               self::$resourceLoaderRegisterModulesHook = true;
+
+               return true;
+       }
+
+       /* Provider Methods */
+       public static function provideValidModules() {
+               return array(
+                       array( 'TEST.validModule1', new ResourceLoaderTestModule() ),
+               );
+       }
+
+       /* Test Methods */
+
+       /**
+        * Ensures that the ResourceLoaderRegisterModules hook is called when a new ResourceLoader object is constructed
+        * @covers ResourceLoader::__construct
+        */
+       public function testCreatingNewResourceLoaderCallsRegistrationHook() {
+               self::$resourceLoaderRegisterModulesHook = false;
+               $resourceLoader = new ResourceLoader();
+               $this->assertTrue( self::$resourceLoaderRegisterModulesHook );
+
+               return $resourceLoader;
+       }
+
+       /**
+        * @dataProvider provideValidModules
+        * @depends testCreatingNewResourceLoaderCallsRegistrationHook
+        * @covers ResourceLoader::register
+        * @covers ResourceLoader::getModule
+        */
+       public function testRegisteredValidModulesAreAccessible(
+               $name, ResourceLoaderModule $module, ResourceLoader $resourceLoader
+       ) {
+               $resourceLoader->register( $name, $module );
+               $this->assertEquals( $module, $resourceLoader->getModule( $name ) );
+       }
+
+       /**
+        * @covers ResourceLoaderFileModule::compileLessFile
+        */
+       public function testLessFileCompilation() {
+               $context = self::getResourceLoaderContext();
+               $basePath = __DIR__ . '/../../data/less/module';
+               $module = new ResourceLoaderFileModule( array(
+                       'localBasePath' => $basePath,
+                       'styles' => array( 'styles.less' ),
+               ) );
+               $styles = $module->getStyles( $context );
+               $this->assertStringEqualsFile( $basePath . '/styles.css', $styles['all'] );
+       }
+
+       /**
+        * @dataProvider providePackedModules
+        * @covers ResourceLoader::makePackedModulesString
+        */
+       public function testMakePackedModulesString( $desc, $modules, $packed ) {
+               $this->assertEquals( $packed, ResourceLoader::makePackedModulesString( $modules ), $desc );
+       }
+
+       /**
+        * @dataProvider providePackedModules
+        * @covers ResourceLoaderContext::expandModuleNames
+        */
+       public function testexpandModuleNames( $desc, $modules, $packed ) {
+               $this->assertEquals( $modules, ResourceLoaderContext::expandModuleNames( $packed ), $desc );
+       }
+
+       public static function providePackedModules() {
+               return array(
+                       array(
+                               'Example from makePackedModulesString doc comment',
+                               array( 'foo.bar', 'foo.baz', 'bar.baz', 'bar.quux' ),
+                               'foo.bar,baz|bar.baz,quux',
+                       ),
+                       array(
+                               'Example from expandModuleNames doc comment',
+                               array( 'jquery.foo', 'jquery.bar', 'jquery.ui.baz', 'jquery.ui.quux' ),
+                               'jquery.foo,bar|jquery.ui.baz,quux',
+                       ),
+                       array(
+                               'Regression fixed in r88706 with dotless names',
+                               array( 'foo', 'bar', 'baz' ),
+                               'foo,bar,baz',
+                       ),
+                       array(
+                               'Prefixless modules after a prefixed module',
+                               array( 'single.module', 'foobar', 'foobaz' ),
+                               'single.module|foobar,foobaz',
+                       ),
+               );
+       }
+}
+
+/* Hooks */
+global $wgHooks;
+$wgHooks['ResourceLoaderRegisterModules'][] = 'ResourceLoaderTest::resourceLoaderRegisterModules';
index 8af2fc1..b41f647 100644 (file)
@@ -80,16 +80,14 @@ class SiteListTest extends MediaWikiTestCase {
         * @covers SiteList::getSite
         */
        public function testGetSiteByGlobalId( SiteList $sites ) {
-               if ( $sites->isEmpty() ) {
-                       $this->assertTrue( true );
-               } else {
-                       /**
-                        * @var Site $site
-                        */
-                       foreach ( $sites as $site ) {
-                               $this->assertEquals( $site, $sites->getSite( $site->getGlobalId() ) );
-                       }
+               /**
+                * @var Site $site
+                */
+               foreach ( $sites as $site ) {
+                       $this->assertEquals( $site, $sites->getSite( $site->getGlobalId() ) );
                }
+
+               $this->assertTrue( true );
        }
 
        /**
@@ -110,6 +108,25 @@ class SiteListTest extends MediaWikiTestCase {
                $this->assertTrue( true );
        }
 
+       /**
+        * @dataProvider siteListProvider
+        * @param SiteList $sites
+        * @covers SiteList::getSiteByNavigationId
+        */
+       public function testGetSiteByNavigationId( $sites ) {
+               /**
+                * @var Site $site
+                */
+               foreach ( $sites as $site ) {
+                       $ids = $site->getNavigationIds();
+                       foreach ( $ids as $navId ) {
+                               $this->assertEquals( $site, $sites->getSiteByNavigationId( $navId ) );
+                       }
+               }
+
+               $this->assertTrue( true );
+       }
+
        /**
         * @dataProvider siteListProvider
         * @param SiteList $sites
@@ -147,6 +164,25 @@ class SiteListTest extends MediaWikiTestCase {
                $this->assertFalse( $sites->hasInternalId( -1 ) );
        }
 
+       /**
+        * @dataProvider siteListProvider
+        * @param SiteList $sites
+        * @covers SiteList::hasNavigationId
+        */
+       public function testHasNavigationId( $sites ) {
+               /**
+                * @var Site $site
+                */
+               foreach ( $sites as $site ) {
+                       $ids = $site->getNavigationIds();
+                       foreach ( $ids as $navId ) {
+                               $this->assertTrue( $sites->hasNavigationId( $navId ) );
+                       }
+               }
+
+               $this->assertFalse( $sites->hasNavigationId( 'non-existing-navigation-id' ) );
+       }
+
        /**
         * @dataProvider siteListProvider
         * @param SiteList $sites
index 397c100..879d821 100644 (file)
@@ -224,9 +224,6 @@ class UploadFromUrlTest extends ApiTestCase {
 
                $this->deleteFile( 'UploadFromUrlTest.png' );
 
-               $talkRev = Revision::newFromTitle( $talk );
-               $talkSize = $talkRev->getSize();
-
                $exception = false;
                try {
                        $this->doApiRequest( array(
@@ -249,6 +246,9 @@ class UploadFromUrlTest extends ApiTestCase {
                return;
                /*
                // Broken until using leavemessage with ignorewarnings is supported
+               $talkRev = Revision::newFromTitle( $talk );
+               $talkSize = $talkRev->getSize();
+
                $job->run();
 
                $this->assertFalse( wfLocalFile( 'UploadFromUrlTest.png' )->exists() );
index 1a1bbaf..1eab5a3 100644 (file)
@@ -21,9 +21,6 @@ class UIDGeneratorTest extends MediaWikiTestCase {
                }
 
                $lastId = array_shift( $ids );
-               if ( $hostbits ) {
-                       $lastHost = substr( wfBaseConvert( $lastId, 10, 2, $bits ), -$hostbits );
-               }
 
                $this->assertArrayEquals( array_unique( $ids ), $ids, "All generated IDs are unique." );
 
diff --git a/tests/phpunit/languages/SpecialPageAliasTest.php b/tests/phpunit/languages/SpecialPageAliasTest.php
new file mode 100644 (file)
index 0000000..8865f68
--- /dev/null
@@ -0,0 +1,63 @@
+<?php
+
+/**
+ * Verifies that special page aliases are valid, with no slashes.
+ *
+ * @group Language
+ * @group SpecialPageAliases
+ * @group SystemTest
+ * @group medium
+ *
+ * @licence GNU GPL v2+
+ * @author Katie Filbert < aude.wiki@gmail.com >
+ */
+class SpecialPageAliasTest extends MediaWikiTestCase {
+
+       /**
+        * @dataProvider validSpecialPageAliasesProvider
+        */
+       public function testValidSpecialPageAliases( $code, $specialPageAliases ) {
+               foreach( $specialPageAliases as $specialPage => $aliases ) {
+                       foreach( $aliases as $alias ) {
+                               $msg = "$specialPage alias '$alias' in $code is valid with no slashes";
+                               $this->assertRegExp( '/^[^\/]*$/', $msg );
+                       }
+               }
+       }
+
+       public function validSpecialPageAliasesProvider() {
+               $codes = array_keys( Language::fetchLanguageNames( 'mwfile' ) );
+
+               $data = array();
+
+               foreach( $codes as $code ) {
+                       $specialPageAliases = $this->getSpecialPageAliases( $code );
+
+                       if ( $specialPageAliases !== array() ) {
+                               $data[] = array( $code, $specialPageAliases );
+                       }
+               }
+
+               return $data;
+       }
+
+       /**
+        * @param string $code
+        *
+        * @return array
+        */
+       protected function getSpecialPageAliases( $code ) {
+               $file = Language::getMessagesFileName( $code );
+
+               if ( is_readable( $file ) ) {
+                       include $file;
+
+                       if ( isset( $specialPageAliases ) && $specialPageAliases !== null ) {
+                               return $specialPageAliases;
+                       }
+               }
+
+               return array();
+       }
+
+}
index 039cabb..1aa2b4d 100755 (executable)
@@ -6,8 +6,6 @@
  * @file
  */
 
-/* Configuration */
-
 // Set a flag which can be used to detect when other scripts have been entered through this entry point or not
 define( 'MW_PHPUNIT_TEST', true );
 
@@ -16,7 +14,7 @@ require_once dirname( dirname( __DIR__ ) ) . "/maintenance/Maintenance.php";
 
 class PHPUnitMaintClass extends Maintenance {
 
-       function __construct() {
+       public function __construct() {
                parent::__construct();
                $this->addOption( 'with-phpunitdir',
                        'Directory to include PHPUnit from, for example when using a git fetchout from upstream. Path will be prepended to PHP `include_path`.',
@@ -72,7 +70,8 @@ class PHPUnitMaintClass extends Maintenance {
                }
 
                # --with-phpunitdir let us override the default PHPUnit version
-               if ( $phpunitDir = $this->getOption( 'with-phpunitdir' ) ) {
+               if ( $this->hasOption( 'with-phpunitdir' ) ) {
+                       $phpunitDir = $this->getOption( 'with-phpunitdir' );
                        # Sanity checks
                        if ( !is_dir( $phpunitDir ) ) {
                                $this->error( "--with-phpunitdir should be set to an existing directory", 1 );
@@ -83,8 +82,7 @@ class PHPUnitMaintClass extends Maintenance {
 
                        # Now prepends provided PHPUnit directory
                        $this->output( "Will attempt loading PHPUnit from `$phpunitDir`\n" );
-                       set_include_path( $phpunitDir
-                               . PATH_SEPARATOR . get_include_path() );
+                       set_include_path( $phpunitDir . PATH_SEPARATOR . get_include_path() );
 
                        # Cleanup $args array so the option and its value do not
                        # pollute PHPUnit
index df00d4d..2393299 100644 (file)
@@ -22,6 +22,7 @@ class StructureTest extends MediaWikiTestCase {
                        'ApiQueryContinueTestBase',
                        'MediaWikiLangTestCase',
                        'MediaWikiTestCase',
+                       'ResourceLoaderTestCase',
                        'PHPUnit_Framework_TestCase',
                        'DumpTestCase',
                ) );
diff --git a/tests/phpunit/tests/MediaWikiTestCaseTest.php b/tests/phpunit/tests/MediaWikiTestCaseTest.php
new file mode 100644 (file)
index 0000000..2846fde
--- /dev/null
@@ -0,0 +1,77 @@
+<?php
+
+/**
+ * @covers MediaWikiTestCase
+ * @author Adam Shorland
+ */
+class MediaWikiTestCaseTest extends MediaWikiTestCase {
+
+       const GLOBAL_KEY_EXISTING = 'MediaWikiTestCaseTestGLOBAL-Existing';
+       const GLOBAL_KEY_NONEXISTING = 'MediaWikiTestCaseTestGLOBAL-NONExisting';
+
+       public static function setUpBeforeClass() {
+               parent::setUpBeforeClass();
+               $GLOBALS[self::GLOBAL_KEY_EXISTING] = 'foo';
+       }
+
+       public static function tearDownAfterClass() {
+               parent::tearDownAfterClass();
+               unset( $GLOBALS[self::GLOBAL_KEY_EXISTING] );
+       }
+
+       /**
+        * @covers MediaWikiTestCase::setMwGlobals
+        * @covers MediaWikiTestCase::tearDown
+        */
+       public function testSetGlobalsAreRestoredOnTearDown() {
+               $this->setMwGlobals( self::GLOBAL_KEY_EXISTING, 'bar' );
+               $this->assertEquals(
+                       'bar',
+                       $GLOBALS[self::GLOBAL_KEY_EXISTING],
+                       'Global failed to correctly set'
+               );
+
+               $this->tearDown();
+
+               $this->assertEquals(
+                       'foo',
+                       $GLOBALS[self::GLOBAL_KEY_EXISTING],
+                       'Global failed to be restored on tearDown'
+               );
+       }
+
+       /**
+        * @covers MediaWikiTestCase::stashMwGlobals
+        * @covers MediaWikiTestCase::tearDown
+        */
+       public function testStashedGlobalsAreRestoredOnTearDown() {
+               $this->stashMwGlobals( self::GLOBAL_KEY_EXISTING );
+               $GLOBALS[self::GLOBAL_KEY_EXISTING] = 'bar';
+               $this->assertEquals(
+                       'bar',
+                       $GLOBALS[self::GLOBAL_KEY_EXISTING],
+                       'Global failed to correctly set'
+               );
+
+               $this->tearDown();
+
+               $this->assertEquals(
+                       'foo',
+                       $GLOBALS[self::GLOBAL_KEY_EXISTING],
+                       'Global failed to be restored on tearDown'
+               );
+       }
+
+       /**
+        * @covers MediaWikiTestCase::stashMwGlobals
+        */
+       public function testExceptionThrownWhenStashingNonExistentGlobals() {
+               $this->setExpectedException(
+                       'Exception',
+                       'Global with key ' . self::GLOBAL_KEY_NONEXISTING . ' doesn\'t exist and cant be stashed'
+               );
+
+               $this->stashMwGlobals( self::GLOBAL_KEY_NONEXISTING );
+       }
+
+}
index 63f610f..31470e8 100644 (file)
@@ -8,8 +8,14 @@ return array(
 
        'test.sinonjs' => array(
                'scripts' => array(
-                       'resources/sinonjs/sinon-1.8.1.js',
-                       'resources/sinonjs/sinon-ie-1.8.1.js',
+                       'resources/sinonjs/sinon-1.9.0.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/sinonjs/sinon-ie-1.9.0.js',
                ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
@@ -42,8 +48,8 @@ return array(
                        'tests/qunit/suites/resources/jquery/jquery.byteLength.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.client.test.js',
+                       'tests/qunit/suites/resources/jquery/jquery.color.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.colorUtil.test.js',
-                       'tests/qunit/suites/resources/jquery/jquery.delayedBind.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.getAttrs.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.hidpi.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.highlightText.test.js',
@@ -65,6 +71,7 @@ return array(
                        'tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.parse.test.js',
+                       'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.watch.test.js',
                        'tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js',
@@ -74,6 +81,7 @@ return array(
                        'jquery.byteLength',
                        'jquery.byteLimit',
                        'jquery.client',
+                       'jquery.color',
                        'jquery.colorUtil',
                        'jquery.delayedBind',
                        'jquery.getAttrs',
@@ -89,6 +97,7 @@ return array(
                        'mediawiki',
                        'mediawiki.api',
                        'mediawiki.api.parse',
+                       'mediawiki.api.watch',
                        'mediawiki.jqueryMsg',
                        'mediawiki.Title',
                        'mediawiki.Uri',
index ba00ff9..73ae0e6 100644 (file)
@@ -82,7 +82,7 @@
        sinon.config = {
                injectIntoThis: true,
                injectInto: null,
-               properties: ['spy', 'stub', 'mock', 'clock', 'sandbox'],
+               properties: ['spy', 'stub', 'mock', 'sandbox'],
                // Don't fake timers by default
                useFakeTimers: false,
                useFakeServer: false
diff --git a/tests/qunit/suites/resources/jquery/jquery.color.test.js b/tests/qunit/suites/resources/jquery/jquery.color.test.js
new file mode 100644 (file)
index 0000000..b644a3c
--- /dev/null
@@ -0,0 +1,15 @@
+( function ( $ ) {
+       QUnit.module( 'jquery.color', QUnit.newMwEnvironment() );
+
+       QUnit.asyncTest( 'animate', 3, function ( assert ) {
+               var $canvas = $( '<div>' ).css( 'background-color', '#fff' );
+
+               $canvas.animate( { backgroundColor: '#000' }, 4 ).promise().then( function() {
+                       var endColors = $.colorUtil.getRGB( $canvas.css( 'background-color' ) );
+                       assert.strictEqual( endColors[0], 0 );
+                       assert.strictEqual( endColors[1], 0 );
+                       assert.strictEqual( endColors[2], 0 );
+                       QUnit.start();
+               } );
+       } );
+}( jQuery ) );
diff --git a/tests/qunit/suites/resources/jquery/jquery.delayedBind.test.js b/tests/qunit/suites/resources/jquery/jquery.delayedBind.test.js
deleted file mode 100644 (file)
index 234b19c..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-( function ( $ ) {
-       QUnit.asyncTest( 'jquery.delayedBind with data option', 2, function ( assert ) {
-               var $fixture = $( '<div>' ).appendTo( '#qunit-fixture' ),
-                       data = {
-                               magic: 'beeswax'
-                       },
-                       delay = 50;
-
-               $fixture.delayedBind( delay, 'testevent', data, function ( e ) {
-                       assert.ok( true, 'testevent fired' );
-                       assert.ok( e.data === data, 'data is passed through delayedBind' );
-                       QUnit.start();
-               } );
-
-               // We'll trigger it thrice, but it should only happen once.
-               $fixture.trigger( 'testevent', {} );
-               $fixture.trigger( 'testevent', {} );
-               $fixture.trigger( 'testevent', {} );
-               $fixture.trigger( 'testevent', {} );
-       } );
-
-       QUnit.asyncTest( 'jquery.delayedBind without data option', 1, function ( assert ) {
-               var $fixture = $( '<div>' ).appendTo( '#qunit-fixture' ),
-                       delay = 50;
-
-               $fixture.delayedBind( delay, 'testevent', function () {
-                       assert.ok( true, 'testevent fired' );
-                       QUnit.start();
-               } );
-
-               // We'll trigger it thrice, but it should only happen once.
-               $fixture.trigger( 'testevent', {} );
-               $fixture.trigger( 'testevent', {} );
-               $fixture.trigger( 'testevent', {} );
-               $fixture.trigger( 'testevent', {} );
-       } );
-}( jQuery ) );
index 3c508d4..bfb857d 100644 (file)
 
        // This test is first because if it fails, then almost all of the latter tests are meaningless.
        QUnit.asyncTest( 'testing hooks/triggers', 4, function ( assert ) {
-               var $collapsible, $content, $toggle;
-               $collapsible = prepareCollapsible(
-                       '<div class="mw-collapsible">' + loremIpsum + '</div>'
-               );
-               $content = $collapsible.find( '.mw-collapsible-content' );
-               $toggle = $collapsible.find( '.mw-collapsible-toggle' );
+               var $collapsible = prepareCollapsible(
+                               '<div class="mw-collapsible">' + loremIpsum + '</div>'
+                       ),
+                       $content = $collapsible.find( '.mw-collapsible-content' ),
+                       $toggle = $collapsible.find( '.mw-collapsible-toggle' );
 
                // In one full collapse-expand cycle, each event will be fired once
 
@@ -34,7 +33,6 @@
                        } );
                        $collapsible.on( 'afterExpand.mw-collapsible', function () {
                                assert.assertTrue( $content.is( ':visible' ), 'second afterCollapseExpand: content is visible' );
-
                                QUnit.start();
                        } );
 
        } );
 
        QUnit.asyncTest( 'basic operation (<div>)', 5, function ( assert ) {
-               var $collapsible, $content, $toggle;
-               $collapsible = prepareCollapsible(
-                       '<div class="mw-collapsible">' + loremIpsum + '</div>'
-               );
-               $content = $collapsible.find( '.mw-collapsible-content' );
-               $toggle = $collapsible.find( '.mw-collapsible-toggle' );
+               var $collapsible = prepareCollapsible(
+                               '<div class="mw-collapsible">' + loremIpsum + '</div>'
+                       ),
+                       $content = $collapsible.find( '.mw-collapsible-content' ),
+                       $toggle = $collapsible.find( '.mw-collapsible-toggle' );
 
                assert.equal( $content.length, 1, 'content is present' );
                assert.equal( $content.find( $toggle ).length, 0, 'toggle is not a descendant of content' );
        } );
 
        QUnit.asyncTest( 'basic operation (<table>)', 7, function ( assert ) {
-               var $collapsible, $headerRow, $contentRow, $toggle;
-               $collapsible = prepareCollapsible(
-                       '<table class="mw-collapsible">' +
-                               '<tr><td>' + loremIpsum + '</td><td>' + loremIpsum + '</td></tr>' +
-                               '<tr><td>' + loremIpsum + '</td><td>' + loremIpsum + '</td></tr>' +
-                               '<tr><td>' + loremIpsum + '</td><td>' + loremIpsum + '</td></tr>' +
-                       '</table>'
-               );
-               $headerRow = $collapsible.find( 'tr:first' );
-               $contentRow = $collapsible.find( 'tr:last' );
+               var $collapsible = prepareCollapsible(
+                               '<table class="mw-collapsible">' +
+                                       '<tr><td>' + loremIpsum + '</td><td>' + loremIpsum + '</td></tr>' +
+                                       '<tr><td>' + loremIpsum + '</td><td>' + loremIpsum + '</td></tr>' +
+                                       '<tr><td>' + loremIpsum + '</td><td>' + loremIpsum + '</td></tr>' +
+                               '</table>'
+                       ),
+                       $headerRow = $collapsible.find( 'tr:first' ),
+                       $contentRow = $collapsible.find( 'tr:last' ),
+                       $toggle = $headerRow.find( 'td:last .mw-collapsible-toggle' );
 
-               $toggle = $headerRow.find( 'td:last .mw-collapsible-toggle' );
                assert.equal( $toggle.length, 1, 'toggle is added to last cell of first row' );
 
                assert.assertTrue( $headerRow.is( ':visible' ), 'headerRow is visible' );
        } );
 
        function tableWithCaptionTest( $collapsible, assert ) {
-               var $caption, $headerRow, $contentRow, $toggle;
+               var $caption = $collapsible.find( 'caption' ),
+                       $headerRow = $collapsible.find( 'tr:first' ),
+                       $contentRow = $collapsible.find( 'tr:last' ),
+                       $toggle = $caption.find( '.mw-collapsible-toggle' );
 
-               $caption = $collapsible.find( 'caption' );
-               $headerRow = $collapsible.find( 'tr:first' );
-               $contentRow = $collapsible.find( 'tr:last' );
-
-               $toggle = $caption.find( '.mw-collapsible-toggle' );
                assert.equal( $toggle.length, 1, 'toggle is added to the end of the caption' );
 
                assert.assertTrue( $caption.is( ':visible' ), 'caption is visible' );
        } );
 
        function listTest( listType, assert ) {
-               var $collapsible, $toggleItem, $contentItem, $toggle;
-               $collapsible = prepareCollapsible(
-                       '<' + listType + ' class="mw-collapsible">' +
-                               '<li>' + loremIpsum + '</li>' +
-                               '<li>' + loremIpsum + '</li>' +
-                       '</' + listType + '>'
-               );
-               $toggleItem = $collapsible.find( 'li.mw-collapsible-toggle-li:first-child' );
-               $contentItem = $collapsible.find( 'li:last' );
-
-               $toggle = $toggleItem.find( '.mw-collapsible-toggle' );
+               var $collapsible = prepareCollapsible(
+                               '<' + listType + ' class="mw-collapsible">' +
+                                       '<li>' + loremIpsum + '</li>' +
+                                       '<li>' + loremIpsum + '</li>' +
+                               '</' + listType + '>'
+                       ),
+                       $toggleItem = $collapsible.find( 'li.mw-collapsible-toggle-li:first-child' ),
+                       $contentItem = $collapsible.find( 'li:last' ),
+                       $toggle = $toggleItem.find( '.mw-collapsible-toggle' );
+
                assert.equal( $toggle.length, 1, 'toggle is present, added inside new zeroth list item' );
 
                assert.assertTrue( $toggleItem.is( ':visible' ), 'toggleItem is visible' );
        } );
 
        QUnit.test( 'basic operation when synchronous (options.instantHide)', 2, function ( assert ) {
-               var $collapsible, $content;
-               $collapsible = prepareCollapsible(
-                       '<div class="mw-collapsible">' + loremIpsum + '</div>',
-                       { instantHide: true }
-               );
-               $content = $collapsible.find( '.mw-collapsible-content' );
+               var $collapsible = prepareCollapsible(
+                               '<div class="mw-collapsible">' + loremIpsum + '</div>',
+                               { instantHide: true }
+                       ),
+                       $content = $collapsible.find( '.mw-collapsible-content' );
 
                assert.assertTrue( $content.is( ':visible' ), 'content is visible' );
 
        } );
 
        QUnit.test( 'mw-made-collapsible data added', 1, function ( assert ) {
-               var $collapsible;
-               $collapsible = prepareCollapsible(
-                       '<div>' + loremIpsum + '</div>'
-               );
+               var $collapsible = prepareCollapsible(
+                               '<div>' + loremIpsum + '</div>'
+                       );
+
                assert.equal( $collapsible.data( 'mw-made-collapsible' ), true, 'mw-made-collapsible data present' );
        } );
 
        QUnit.test( 'mw-collapsible added when missing', 1, function ( assert ) {
-               var $collapsible;
-               $collapsible = prepareCollapsible(
-                       '<div>' + loremIpsum + '</div>'
-               );
+               var $collapsible = prepareCollapsible(
+                               '<div>' + loremIpsum + '</div>'
+                       );
+
                assert.assertTrue( $collapsible.hasClass( 'mw-collapsible' ), 'mw-collapsible class present' );
        } );
 
        QUnit.test( 'mw-collapsed added when missing', 1, function ( assert ) {
-               var $collapsible;
-               $collapsible = prepareCollapsible(
+               var $collapsible = prepareCollapsible(
                        '<div>' + loremIpsum + '</div>',
-                       { collapsed: true }
-               );
+                               { collapsed: true }
+                       );
+
                assert.assertTrue( $collapsible.hasClass( 'mw-collapsed' ), 'mw-collapsed class present' );
        } );
 
        QUnit.asyncTest( 'initial collapse (mw-collapsed class)', 2, function ( assert ) {
-               var $collapsible, $content;
-               $collapsible = prepareCollapsible(
-                       '<div class="mw-collapsible mw-collapsed">' + loremIpsum + '</div>'
-               );
-               $content = $collapsible.find( '.mw-collapsible-content' );
+               var $collapsible = prepareCollapsible(
+                               '<div class="mw-collapsible mw-collapsed">' + loremIpsum + '</div>'
+                       ),
+                       $content = $collapsible.find( '.mw-collapsible-content' );
 
                // Synchronous - mw-collapsed should cause instantHide: true to be used on initial collapsing
                assert.assertTrue( $content.is( ':hidden' ), 'content is hidden' );
        } );
 
        QUnit.asyncTest( 'initial collapse (options.collapsed)', 2, function ( assert ) {
-               var $collapsible, $content;
-               $collapsible = prepareCollapsible(
-                       '<div class="mw-collapsible">' + loremIpsum + '</div>',
-                       { collapsed: true }
-               );
-               $content = $collapsible.find( '.mw-collapsible-content' );
+               var $collapsible = prepareCollapsible(
+                               '<div class="mw-collapsible">' + loremIpsum + '</div>',
+                               { collapsed: true }
+                       ),
+                       $content = $collapsible.find( '.mw-collapsible-content' );
 
                // Synchronous - collapsed: true should cause instantHide: true to be used on initial collapsing
                assert.assertTrue( $content.is( ':hidden' ), 'content is hidden' );
        } );
 
        QUnit.test( 'clicks on links inside toggler pass through (options.linksPassthru)' , 2, function ( assert ) {
-               var $collapsible, $content;
-
-               $collapsible = prepareCollapsible(
-                       '<div class="mw-collapsible">' +
-                               '<div class="mw-collapsible-toggle">' +
-                                       'Toggle <a href="#top">toggle</a> toggle <b>toggle</b>' +
-                               '</div>' +
-                               '<div class="mw-collapsible-content">' + loremIpsum + '</div>' +
-                       '</div>',
-                       // Can't do asynchronous because we're testing that the event *doesn't* happen
-                       { instantHide: true }
-               );
-               $content = $collapsible.find( '.mw-collapsible-content' );
+               var $collapsible = prepareCollapsible(
+                               '<div class="mw-collapsible">' +
+                                       '<div class="mw-collapsible-toggle">' +
+                                               'Toggle <a href="#top">toggle</a> toggle <b>toggle</b>' +
+                                       '</div>' +
+                                       '<div class="mw-collapsible-content">' + loremIpsum + '</div>' +
+                               '</div>',
+                               // Can't do asynchronous because we're testing that the event *doesn't* happen
+                               { instantHide: true }
+                       ),
+                       $content = $collapsible.find( '.mw-collapsible-content' );
 
                $collapsible.find( '.mw-collapsible-toggle a' ).trigger( 'click' );
                assert.assertTrue( $content.is( ':visible' ), 'click event on link inside toggle passes through (content not toggled)' );
        } );
 
        QUnit.asyncTest( 'collapse/expand text (data-collapsetext, data-expandtext)', 2, function ( assert ) {
-               var $collapsible, $toggleLink;
-               $collapsible = prepareCollapsible(
-                       '<div class="mw-collapsible" data-collapsetext="Collapse me!" data-expandtext="Expand me!">' +
-                               loremIpsum +
-                       '</div>'
-               );
-               $toggleLink = $collapsible.find( '.mw-collapsible-toggle a' );
+               var $collapsible = prepareCollapsible(
+                               '<div class="mw-collapsible" data-collapsetext="Collapse me!" data-expandtext="Expand me!">' +
+                                       loremIpsum +
+                               '</div>'
+                       ),
+                       $toggleLink = $collapsible.find( '.mw-collapsible-toggle a' );
 
                assert.equal( $toggleLink.text(), 'Collapse me!', 'data-collapsetext is respected' );
 
        } );
 
        QUnit.asyncTest( 'collapse/expand text (options.collapseText, options.expandText)', 2, function ( assert ) {
-               var $collapsible, $toggleLink;
-               $collapsible = prepareCollapsible(
-                       '<div class="mw-collapsible">' + loremIpsum + '</div>',
-                       { collapseText: 'Collapse me!', expandText: 'Expand me!' }
-               );
-               $toggleLink = $collapsible.find( '.mw-collapsible-toggle a' );
+               var $collapsible = prepareCollapsible(
+                               '<div class="mw-collapsible">' + loremIpsum + '</div>',
+                               { collapseText: 'Collapse me!', expandText: 'Expand me!' }
+                       ),
+                       $toggleLink = $collapsible.find( '.mw-collapsible-toggle a' );
 
                assert.equal( $toggleLink.text(), 'Collapse me!', 'options.collapseText is respected' );
 
index f73fd7b..d9801d9 100644 (file)
@@ -1,7 +1,161 @@
 ( function ( $, mw ) {
-       /*jshint onevar: false */
+       var config, header,
 
-       var config = {
+               // Data set "simple"
+               a1 = [ 'A', '1' ],
+               a2 = [ 'A', '2' ],
+               a3 = [ 'A', '3' ],
+               b1 = [ 'B', '1' ],
+               b2 = [ 'B', '2' ],
+               b3 = [ 'B', '3' ],
+               simple = [a2, b3, a1, a3, b2, b1],
+               simpleAsc = [a1, a2, a3, b1, b2, b3],
+               simpleDescasc = [b1, b2, b3, a1, a2, a3],
+
+               // Data set "colspan"
+               aaa1 = [ 'A', 'A', 'A', '1' ],
+               aab5 = [ 'A', 'A', 'B', '5' ],
+               abc3 = [ 'A', 'B', 'C', '3' ],
+               bbc2 = [ 'B', 'B', 'C', '2' ],
+               caa4 = [ 'C', 'A', 'A', '4' ],
+               colspanInitial = [ aab5, aaa1, abc3, bbc2, caa4 ],
+
+               // Data set "planets"
+               mercury = [ 'Mercury', '2439.7' ],
+               venus = [ 'Venus', '6051.8' ],
+               earth = [ 'Earth', '6371.0' ],
+               mars = [ 'Mars', '3390.0' ],
+               jupiter = [ 'Jupiter', '69911' ],
+               saturn = [ 'Saturn', '58232' ],
+               planets = [mercury, venus, earth, mars, jupiter, saturn],
+               planetsAscName = [earth, jupiter, mars, mercury, saturn, venus],
+               planetsAscRadius = [mercury, mars, venus, earth, saturn, jupiter],
+               planetsRowspan,
+               planetsRowspanII,
+               planetsAscNameLegacy,
+
+               // Data set "ipv4"
+               ipv4 = [
+                       // Some randomly generated fake IPs
+                       ['45.238.27.109'],
+                       ['44.172.9.22'],
+                       ['247.240.82.209'],
+                       ['204.204.132.158'],
+                       ['170.38.91.162'],
+                       ['197.219.164.9'],
+                       ['45.68.154.72'],
+                       ['182.195.149.80']
+               ],
+               ipv4Sorted = [
+                       // Sort order should go octet by octet
+                       ['44.172.9.22'],
+                       ['45.68.154.72'],
+                       ['45.238.27.109'],
+                       ['170.38.91.162'],
+                       ['182.195.149.80'],
+                       ['197.219.164.9'],
+                       ['204.204.132.158'],
+                       ['247.240.82.209']
+               ],
+
+               // Data set "umlaut"
+               umlautWords = [
+                       ['Günther'],
+                       ['Peter'],
+                       ['Björn'],
+                       ['Bjorn'],
+                       ['Apfel'],
+                       ['Äpfel'],
+                       ['Strasse'],
+                       ['Sträßschen']
+               ],
+               umlautWordsSorted = [
+                       ['Äpfel'],
+                       ['Apfel'],
+                       ['Björn'],
+                       ['Bjorn'],
+                       ['Günther'],
+                       ['Peter'],
+                       ['Sträßschen'],
+                       ['Strasse']
+               ],
+
+               complexMDYDates = [
+                       ['January, 19 2010'],
+                       ['April 21 1991'],
+                       ['04 22 1991'],
+                       ['5.12.1990'],
+                       ['December 12 \'10']
+               ],
+               complexMDYSorted = [
+                       ['5.12.1990'],
+                       ['April 21 1991'],
+                       ['04 22 1991'],
+                       ['January, 19 2010'],
+                       ['December 12 \'10']
+               ],
+
+               currencyUnsorted = [
+                       ['1.02 $'],
+                       ['$ 3.00'],
+                       ['€ 2,99'],
+                       ['$ 1.00'],
+                       ['$3.50'],
+                       ['$ 1.50'],
+                       ['€ 0.99']
+               ],
+               currencySorted = [
+                       ['€ 0.99'],
+                       ['$ 1.00'],
+                       ['1.02 $'],
+                       ['$ 1.50'],
+                       ['$ 3.00'],
+                       ['$3.50'],
+                       // Comma's sort after dots
+                       // Not intentional but test to detect changes
+                       ['€ 2,99']
+               ],
+
+               numbers = [
+                       [ '12'    ],
+                       [  '7'    ],
+                       [ '13,000'],
+                       [  '9'    ],
+                       [ '14'    ],
+                       [  '8.0'  ]
+               ],
+               numbersAsc = [
+                       [  '7'    ],
+                       [  '8.0'  ],
+                       [  '9'    ],
+                       [ '12'    ],
+                       [ '14'    ],
+                       [ '13,000']
+               ],
+
+               correctDateSorting1 = [
+                       ['01 January 2010'],
+                       ['05 February 2010'],
+                       ['16 January 2010']
+               ],
+               correctDateSortingSorted1 = [
+                       ['01 January 2010'],
+                       ['16 January 2010'],
+                       ['05 February 2010']
+               ],
+
+               correctDateSorting2 = [
+                       ['January 01 2010'],
+                       ['February 05 2010'],
+                       ['January 16 2010']
+               ],
+               correctDateSortingSorted2 = [
+                       ['January 01 2010'],
+                       ['January 16 2010'],
+                       ['February 05 2010']
+               ];
+
+       config = {
                wgMonthNames: ['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
                wgMonthNamesShort: ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
                wgDefaultDateFormat: 'dmy',
         */
        function tableTest( msg, header, data, expected, callback ) {
                QUnit.test( msg, 1, function ( assert ) {
-                       var $table = tableCreate( header, data );
+                       var extracted,
+                               $table = tableCreate( header, data );
 
                        // Give caller a chance to set up sorting and manipulate the table.
                        callback( $table );
 
                        // Table sorting is done synchronously; if it ever needs to change back
                        // to asynchronous, we'll need a timeout or a callback here.
-                       var extracted = tableExtract( $table );
+                       extracted = tableExtract( $table );
                        assert.deepEqual( extracted, expected, msg );
                } );
        }
         */
        function tableTestHTML( msg, html, expected, callback ) {
                QUnit.test( msg, 1, function ( assert ) {
-                       var $table = $( html );
+                       var extracted,
+                               $table = $( html );
 
                        // Give caller a chance to set up sorting and manipulate the table.
                        if ( callback ) {
 
                        // Table sorting is done synchronously; if it ever needs to change back
                        // to asynchronous, we'll need a timeout or a callback here.
-                       var extracted = tableExtract( $table );
+                       extracted = tableExtract( $table );
                        assert.deepEqual( extracted, expected, msg );
                } );
        }
        }
 
        // Sample data set using planets named and their radius
-       var header = [ 'Planet' , 'Radius (km)'],
-               mercury = [ 'Mercury', '2439.7' ],
-               venus = [ 'Venus'  , '6051.8' ],
-               earth = [ 'Earth'  , '6371.0' ],
-               mars = [ 'Mars'   , '3390.0' ],
-               jupiter = [ 'Jupiter', '69911' ],
-               saturn = [ 'Saturn' , '58232' ];
-
-       // Initial data set
-       var planets = [mercury, venus, earth, mars, jupiter, saturn];
-       var ascendingName = [earth, jupiter, mars, mercury, saturn, venus];
-       var ascendingRadius = [mercury, mars, venus, earth, saturn, jupiter];
+       header = [ 'Planet', 'Radius (km)'];
 
        tableTest(
                'Basic planet table: sorting initially - ascending by name',
                header,
                planets,
-               ascendingName,
+               planetsAscName,
                function ( $table ) {
                        $table.tablesorter( { sortList: [
                                { 0: 'asc' }
                'Basic planet table: sorting initially - descending by radius',
                header,
                planets,
-               reversed( ascendingRadius ),
+               reversed( planetsAscRadius ),
                function ( $table ) {
                        $table.tablesorter( { sortList: [
                                { 1: 'desc' }
                'Basic planet table: ascending by name',
                header,
                planets,
-               ascendingName,
+               planetsAscName,
                function ( $table ) {
                        $table.tablesorter();
                        $table.find( '.headerSort:eq(0)' ).click();
                'Basic planet table: ascending by name a second time',
                header,
                planets,
-               ascendingName,
+               planetsAscName,
                function ( $table ) {
                        $table.tablesorter();
                        $table.find( '.headerSort:eq(0)' ).click();
                'Basic planet table: ascending by name (multiple clicks)',
                header,
                planets,
-               ascendingName,
+               planetsAscName,
                function ( $table ) {
                        $table.tablesorter();
                        $table.find( '.headerSort:eq(0)' ).click();
                'Basic planet table: descending by name',
                header,
                planets,
-               reversed( ascendingName ),
+               reversed( planetsAscName ),
                function ( $table ) {
                        $table.tablesorter();
                        $table.find( '.headerSort:eq(0)' ).click().click();
                'Basic planet table: ascending radius',
                header,
                planets,
-               ascendingRadius,
+               planetsAscRadius,
                function ( $table ) {
                        $table.tablesorter();
                        $table.find( '.headerSort:eq(1)' ).click();
                'Basic planet table: descending radius',
                header,
                planets,
-               reversed( ascendingRadius ),
+               reversed( planetsAscRadius ),
                function ( $table ) {
                        $table.tablesorter();
                        $table.find( '.headerSort:eq(1)' ).click().click();
                }
        );
 
-       // Sample data set to test multiple column sorting
-       header = [ 'column1' , 'column2'];
-       var
-               a1 = [ 'A', '1' ],
-               a2 = [ 'A', '2' ],
-               a3 = [ 'A', '3' ],
-               b1 = [ 'B', '1' ],
-               b2 = [ 'B', '2' ],
-               b3 = [ 'B', '3' ];
-       var initial = [a2, b3, a1, a3, b2, b1];
-       var asc = [a1, a2, a3, b1, b2, b3];
-       var descasc = [b1, b2, b3, a1, a2, a3];
+       header = [ 'column1', 'column2' ];
 
        tableTest(
                'Sorting multiple columns by passing sort list',
                header,
-               initial,
-               asc,
+               simple,
+               simpleAsc,
                function ( $table ) {
                        $table.tablesorter(
                                { sortList: [
        tableTest(
                'Sorting multiple columns by programmatically triggering sort()',
                header,
-               initial,
-               descasc,
+               simple,
+               simpleDescasc,
                function ( $table ) {
                        $table.tablesorter();
                        $table.data( 'tablesorter' ).sort(
        tableTest(
                'Reset to initial sorting by triggering sort() without any parameters',
                header,
-               initial,
-               asc,
+               simple,
+               simpleAsc,
                function ( $table ) {
                        $table.tablesorter(
                                { sortList: [
        tableTest(
                'Sort via click event after having initialized the tablesorter with initial sorting',
                header,
-               initial,
-               descasc,
+               simple,
+               simpleDescasc,
                function ( $table ) {
                        $table.tablesorter(
                                { sortList: [ { 0: 'asc' }, { 1: 'asc' } ] }
        tableTest(
                'Multi-sort via click event after having initialized the tablesorter with initial sorting',
                header,
-               initial,
-               asc,
+               simple,
+               simpleAsc,
                function ( $table ) {
                        $table.tablesorter(
                                { sortList: [ { 0: 'desc' }, { 1: 'desc' } ] }
                }
        );
        QUnit.test( 'Reset sorting making table appear unsorted', 3, function ( assert ) {
-               var $table = tableCreate( header, initial );
+               var $table = tableCreate( header, simple );
                $table.tablesorter(
                        { sortList: [
                                { 0: 'desc' },
        } );
 
        // Sorting with colspans
-       header = [ 'column1a' , 'column1b', 'column1c', 'column2' ];
-       var
-               aaa1 = [ 'A', 'A', 'A', '1' ],
-               aab5 = [ 'A', 'A', 'B', '5' ],
-               abc3 = [ 'A', 'B', 'C', '3' ],
-               bbc2 = [ 'B', 'B', 'C', '2' ],
-               caa4 = [ 'C', 'A', 'A', '4' ];
-       // initial is already declared above
-       initial = [ aab5, aaa1, abc3, bbc2, caa4 ];
+       header = [ 'column1a', 'column1b', 'column1c', 'column2' ];
+
        tableTest( 'Sorting with colspanned headers: spanned column',
                header,
-               initial,
+               colspanInitial,
                [ aaa1, aab5, abc3, bbc2, caa4 ],
                function ( $table ) {
                        // Make colspanned header for test
        );
        tableTest( 'Sorting with colspanned headers: sort spanned column twice',
                header,
-               initial,
+               colspanInitial,
                [ caa4, bbc2, abc3, aab5, aaa1 ],
                function ( $table ) {
                        // Make colspanned header for test
        );
        tableTest( 'Sorting with colspanned headers: subsequent column',
                header,
-               initial,
+               colspanInitial,
                [ aaa1, bbc2, abc3, caa4, aab5 ],
                function ( $table ) {
                        // Make colspanned header for test
        );
        tableTest( 'Sorting with colspanned headers: sort subsequent column twice',
                header,
-               initial,
+               colspanInitial,
                [ aab5, caa4, abc3, bbc2, aaa1 ],
                function ( $table ) {
                        // Make colspanned header for test
                }
        );
 
-
        tableTest(
                'Basic planet table: one unsortable column',
                header,
                }
        );
 
-       var ipv4 = [
-               // Some randomly generated fake IPs
-               ['45.238.27.109'],
-               ['44.172.9.22'],
-               ['247.240.82.209'],
-               ['204.204.132.158'],
-               ['170.38.91.162'],
-               ['197.219.164.9'],
-               ['45.68.154.72'],
-               ['182.195.149.80']
-       ];
-       var ipv4Sorted = [
-               // Sort order should go octet by octet
-               ['44.172.9.22'],
-               ['45.68.154.72'],
-               ['45.238.27.109'],
-               ['170.38.91.162'],
-               ['182.195.149.80'],
-               ['197.219.164.9'],
-               ['204.204.132.158'],
-               ['247.240.82.209']
-       ];
-
        tableTest(
                'Bug 17141: IPv4 address sorting',
                ['IP'],
                }
        );
 
-       var umlautWords = [
-               // Some words with Umlauts
-               ['Günther'],
-               ['Peter'],
-               ['Björn'],
-               ['Bjorn'],
-               ['Apfel'],
-               ['Äpfel'],
-               ['Strasse'],
-               ['Sträßschen']
-       ];
-
-       var umlautWordsSorted = [
-               // Some words with Umlauts
-               ['Äpfel'],
-               ['Apfel'],
-               ['Björn'],
-               ['Bjorn'],
-               ['Günther'],
-               ['Peter'],
-               ['Sträßschen'],
-               ['Strasse']
-       ];
-
        tableTest(
                'Accented Characters with custom collation',
                ['Name'],
                );
        } );
 
-       var planetsRowspan = [
+       planetsRowspan = [
                [ 'Earth', '6051.8' ],
                jupiter,
                [ 'Mars', '6051.8' ],
                saturn,
                venus
        ];
-       var planetsRowspanII = [ jupiter, mercury, saturn, venus, [ 'Venus', '6371.0' ], [ 'Venus', '3390.0' ] ];
+       planetsRowspanII = [ jupiter, mercury, saturn, venus, [ 'Venus', '6371.0' ], [ 'Venus', '3390.0' ] ];
 
        tableTest(
                'Basic planet table: same value for multiple rows via rowspan',
                }
        );
 
-       var complexMDYDates = [
-               // Some words with Umlauts
-               ['January, 19 2010'],
-               ['April 21 1991'],
-               ['04 22 1991'],
-               ['5.12.1990'],
-               ['December 12 \'10']
-       ];
-
-       var complexMDYSorted = [
-               ['5.12.1990'],
-               ['April 21 1991'],
-               ['04 22 1991'],
-               ['January, 19 2010'],
-               ['December 12 \'10']
-       ];
-
        tableTest(
                'Complex date parsing I',
                ['date'],
                }
        );
 
-       var currencyUnsorted = [
-               ['1.02 $'],
-               ['$ 3.00'],
-               ['€ 2,99'],
-               ['$ 1.00'],
-               ['$3.50'],
-               ['$ 1.50'],
-               ['€ 0.99']
-       ];
-
-       var currencySorted = [
-               ['€ 0.99'],
-               ['$ 1.00'],
-               ['1.02 $'],
-               ['$ 1.50'],
-               ['$ 3.00'],
-               ['$3.50'],
-               // Comma's sort after dots
-               // Not intentional but test to detect changes
-               ['€ 2,99']
-       ];
-
        tableTest(
                'Currency parsing I',
                ['currency'],
                }
        );
 
-       var ascendingNameLegacy = ascendingName.slice( 0 );
-       ascendingNameLegacy[4] = ascendingNameLegacy[5];
-       ascendingNameLegacy.pop();
+       planetsAscNameLegacy = planetsAscName.slice( 0 );
+       planetsAscNameLegacy[4] = planetsAscNameLegacy[5];
+       planetsAscNameLegacy.pop();
 
        tableTest(
                'Legacy compat with .sortbottom',
                header,
                planets,
-               ascendingNameLegacy,
+               planetsAscNameLegacy,
                function ( $table ) {
                        $table.find( 'tr:last' ).addClass( 'sortbottom' );
                        $table.tablesorter();
 
        } );
 
-       var numbers = [
-               [ '12'    ],
-               [  '7'    ],
-               [ '13,000'],
-               [  '9'    ],
-               [ '14'    ],
-               [  '8.0'  ]
-       ];
-       var numbersAsc = [
-               [  '7'    ],
-               [  '8.0'  ],
-               [  '9'    ],
-               [ '12'    ],
-               [ '14'    ],
-               [ '13,000']
-       ];
-
        tableTest( 'bug 8115: sort numbers with commas (ascending)',
                ['Numbers'], numbers, numbersAsc,
                function ( $table ) {
                );
        } );
 
-
-       var correctDateSorting1 = [
-               ['01 January 2010'],
-               ['05 February 2010'],
-               ['16 January 2010']
-       ];
-
-       var correctDateSortingSorted1 = [
-               ['01 January 2010'],
-               ['16 January 2010'],
-               ['05 February 2010']
-       ];
-
        tableTest(
                'Correct date sorting I',
                ['date'],
                }
        );
 
-       var correctDateSorting2 = [
-               ['January 01 2010'],
-               ['February 05 2010'],
-               ['January 16 2010']
-       ];
-
-       var correctDateSortingSorted2 = [
-               ['January 01 2010'],
-               ['January 16 2010'],
-               ['February 05 2010']
-       ];
-
        tableTest(
                'Correct date sorting II',
                ['date'],
                );
        } );
 
+       QUnit.test( 'holes in the table headers should not throw JS errors', 2, function ( assert ) {
+               var $table = $(
+                       '<table class="sortable">' +
+                               '<thead>' +
+                               '<tr><th id="A1">A1</th><th>B1</th><th id="C1" rowspan="2">C1</th></tr>' +
+                               '<tr><th id="A2">A2</th></tr>' +
+                               '</thead>' +
+                               '<tr><td>A</td><td>Aa</td><td>Aaa</td></tr>' +
+                               '<tr><td>B</td><td>Ba</td><td>Bbb</td></tr>' +
+                               '</table>'
+               );
+               $table.tablesorter();
+               assert.equal( 0,
+                       $table.find( '#A2' ).prop( 'headerIndex' ),
+                       'A2 should be a sort header'
+               );
+               assert.equal( 1, // should be 2
+                       $table.find( '#C1' ).prop( 'headerIndex' ),
+                       'C1 should be a sort header, but will sort the wrong column'
+               );
+       } );
+
        // bug 41889 - exploding rowspans in more complex cases
        tableTestHTML(
                'Rowspan exploding with row headers',
                ]
        );
 
+       // bug 53211 - exploding rowspans in more complex cases
+       QUnit.test(
+               'Rowspan exploding with row headers and colspans', 1, function ( assert ) {
+               var $table = $( '<table class="sortable">' +
+                       '<thead><tr><th rowspan="2">n</th><th colspan="2">foo</th><th rowspan="2">baz</th></tr>' +
+                       '<tr><th>foo</th><th>bar</th></tr></thead>' +
+                       '<tbody>' +
+                       '<tr><td>1</td><td>foo</td><td>bar</td><td>baz</td></tr>' +
+                       '<tr><td>2</td><td>foo</td><td>bar</td><td>baz</td></tr>' +
+                       '</tbody></table>' );
+
+                       $table.tablesorter();
+                       assert.equal( 2, $table.find( 'tr:eq(1) th:eq(1)').prop('headerIndex'), 'Incorrect index of sort header' );
+               }
+       );
+
        tableTestHTML(
                'Rowspan exploding with colspanned cells',
                '<table class="sortable">' +
index 2bed9b9..70bcaf9 100644 (file)
@@ -1,28 +1,29 @@
-( function ( mw, $ ) {
-       QUnit.module( 'mediawiki.api.parse', QUnit.newMwEnvironment() );
+( function ( mw ) {
+       QUnit.module( 'mediawiki.api.parse', QUnit.newMwEnvironment( {
+               setup: function () {
+                       this.clock = this.sandbox.useFakeTimers();
+                       this.server = this.sandbox.useFakeServer();
+               },
+               teardown: function () {
+                       this.clock.tick( 1 );
+               }
+       } ) );
 
-       QUnit.asyncTest( 'Hello world', function ( assert ) {
-               var api;
-               QUnit.expect( 6 );
+       QUnit.test( 'Hello world', function ( assert ) {
+               QUnit.expect( 1 );
 
-               api = new mw.Api();
+               var api = new mw.Api();
 
-               api.parse( '\'\'\'Hello world\'\'\'' )
-                       .done( function ( html ) {
-                               // Parse into a document fragment instead of comparing HTML, due to
-                               // presence of Tidy influencing whitespace.
-                               // Html also contains "NewPP report" comment.
-                               var $res = $( '<div>' ).html( html ).children(),
-                                       res = $res.get( 0 );
-                               assert.equal( $res.length, 1, 'Response contains 1 element' );
-                               assert.equal( res.nodeName.toLowerCase(), 'p', 'Response is a paragraph' );
-                               assert.equal( $res.children().length, 1, 'Response has 1 child element' );
-                               assert.equal( $res.children().get( 0 ).nodeName.toLowerCase(), 'b', 'Child element is a bold tag' );
-                               // Trim since Tidy may or may not mess with the spacing here
-                               assert.equal( $.trim( $res.text() ), 'Hello world', 'Response contains given text' );
-                               assert.equal( $res.find( 'b' ).text(), 'Hello world', 'Bold tag wraps the entire, same, text' );
+               api.parse( '\'\'\'Hello world\'\'\'' ).done( function ( html ) {
+                       assert.equal( html, '<p><b>Hello world</b></p>' );
+               } );
 
-                               QUnit.start();
-                       } );
+               this.server.respondWith( /action=parse.*&text='''Hello\+world'''/, function ( request ) {
+                       request.respond( 200, { 'Content-Type': 'application/json' },
+                               '{ "parse": { "text": { "*": "<p><b>Hello world</b></p>" } } }'
+                       );
+               } );
+
+               this.server.respond();
        } );
-}( mediaWiki, jQuery ) );
+}( mediaWiki ) );
index c903193..2ad7622 100644 (file)
@@ -7,7 +7,7 @@
                teardown: function () {
                        this.clock.tick( 1 );
                }
-       }) );
+       } ) );
 
        QUnit.test( 'Basic functionality', function ( assert ) {
                QUnit.expect( 2 );
diff --git a/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.watch.test.js b/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.watch.test.js
new file mode 100644 (file)
index 0000000..e178090
--- /dev/null
@@ -0,0 +1,50 @@
+( function ( mw ) {
+       QUnit.module( 'mediawiki.api.watch', QUnit.newMwEnvironment( {
+               setup: function () {
+                       this.clock = this.sandbox.useFakeTimers();
+                       this.server = this.sandbox.useFakeServer();
+               },
+               teardown: function () {
+                       this.clock.tick( 1 );
+               }
+       } ) );
+
+       QUnit.test( '.watch()', function ( assert ) {
+               QUnit.expect( 4 );
+
+               var api = new mw.Api();
+
+               // Ensure we don't mistake a single item array for a single item and vice versa.
+               // The query parameter in request is the same either way (separated by pipe).
+               api.watch( 'Foo' ).done( function ( item ) {
+                       assert.equal( item.title, 'Foo' );
+               } );
+
+               api.watch( [ 'Foo' ] ).done( function ( items ) {
+                       assert.equal( items[0].title, 'Foo' );
+               } );
+
+               api.watch( [ 'Foo', 'Bar' ] ).done( function ( items ) {
+                       assert.equal( items[0].title, 'Foo' );
+                       assert.equal( items[1].title, 'Bar' );
+               } );
+
+               // Requests are POST, match requestBody instead of url
+               this.server.respond( function ( req ) {
+                       if ( /action=watch.*&titles=Foo(&|$)/.test( req.requestBody ) ) {
+                               req.respond( 200, { 'Content-Type': 'application/json' },
+                                       '{ "watch": [ { "title": "Foo", "watched": true, "message": "<b>Added</b>" } ] }'
+                               );
+                       }
+
+                       if ( /action=watch.*&titles=Foo%7CBar/.test( req.requestBody ) ) {
+                               req.respond( 200, { 'Content-Type': 'application/json' },
+                                       '{ "watch": [ ' +
+                                               '{ "title": "Foo", "watched": true, "message": "<b>Added</b>" },' +
+                                               '{ "title": "Bar", "watched": true, "message": "<b>Added</b>" }' +
+                                               '] }'
+                               );
+                       }
+               } );
+       } );
+}( mediaWiki ) );
index f4433f4..1d9cf30 100644 (file)
@@ -419,7 +419,7 @@ class TestFileIterator implements Iterator {
                        $this->lineNum++;
                        $matches = array();
 
-                       if ( preg_match( '/^!!\s*(\w+)/', $line, $matches ) ) {
+                       if ( preg_match( '/^!!\s*(\S+)/', $line, $matches ) ) {
                                $this->section = strtolower( $matches[1] );
 
                                if ( $this->section == 'endarticle' ) {
@@ -467,8 +467,10 @@ class TestFileIterator implements Iterator {
 
                                if ( $this->section == 'end' ) {
                                        $this->checkSection( 'test' );
-                                       $this->checkSection( 'input' );
-                                       $this->checkSection( 'result' );
+                                       // "input" and "result" are old section names allowed
+                                       // for backwards-compatibility.
+                                       $input = $this->checkSection( array( 'wikitext', 'input' ), false );
+                                       $result = $this->checkSection( array( 'html/php', 'html/*', 'html', 'result' ), false );
 
                                        if ( !isset( $this->sectionData['options'] ) ) {
                                                $this->sectionData['options'] = '';
@@ -478,8 +480,9 @@ class TestFileIterator implements Iterator {
                                                $this->sectionData['config'] = '';
                                        }
 
-                                       if ( ( ( preg_match( '/\\bdisabled\\b/i', $this->sectionData['options'] ) && !$this->parserTest->runDisabled )
-                                               || ( preg_match( '/\\bparsoid\\b/i', $this->sectionData['options'] ) && !$this->parserTest->runParsoid )
+                                       if ( $input == false || $result == false ||
+                                                ( ( preg_match( '/\\bdisabled\\b/i', $this->sectionData['options'] ) && !$this->parserTest->runDisabled )
+                                               || ( preg_match( '/\\bparsoid\\b/i', $this->sectionData['options'] ) && $result != 'html/php' && !$this->parserTest->runParsoid )
                                                || !preg_match( "/" . $this->parserTest->regex . "/i", $this->sectionData['test'] ) )
                                        ) {
                                                # disabled test
@@ -501,8 +504,8 @@ class TestFileIterator implements Iterator {
 
                                        $this->test = array(
                                                'test' => ParserTest::chomp( $this->sectionData['test'] ),
-                                               'input' => ParserTest::chomp( $this->sectionData['input'] ),
-                                               'result' => ParserTest::chomp( $this->sectionData['result'] ),
+                                               'input' => ParserTest::chomp( $this->sectionData[ $input ] ),
+                                               'result' => ParserTest::chomp( $this->sectionData[ $result ] ),
                                                'options' => ParserTest::chomp( $this->sectionData['options'] ),
                                                'config' => ParserTest::chomp( $this->sectionData['config'] ),
                                        );
@@ -538,27 +541,55 @@ class TestFileIterator implements Iterator {
 
        /**
         * Verify the current section data has some value for the given token
-        * name (first parameter).
+        * name(s) (first parameter).
         * Throw an exception if it is not set, referencing current section
         * and adding the current file name and line number
         *
-        * @param $token String: expected token that should have been mentionned before closing this section
+        * @param $token String|Array: expected token(s) that should have been
+        * mentioned before closing this section
+        * @param $fatal Boolean: true iff an exception should be thrown if
+        * the section is not found.
         */
-       private function checkSection( $token ) {
+       private function checkSection( $tokens, $fatal = true ) {
                if ( is_null( $this->section ) ) {
                        throw new MWException( __METHOD__ . " can not verify a null section!\n" );
                }
+               if ( !is_array( $tokens ) ) {
+                       $tokens = array( $tokens );
+               }
+               if ( count( $tokens ) == 0 ) {
+                       throw new MWException( __METHOD__ . " can not verify zero sections!\n" );
+               }
 
-               if ( !isset( $this->sectionData[$token] ) ) {
+               $data = $this->sectionData;
+               $tokens = array_filter( $tokens, function ( $token ) use ( $data ) {
+                       return isset( $data[ $token ] );
+               } );
+
+               if ( count( $tokens ) == 0 ) {
+                       if ( !$fatal ) {
+                               return false;
+                       }
                        throw new MWException( sprintf(
                                "'%s' without '%s' at line %s of %s\n",
                                $this->section,
-                               $token,
+                               implode( ',', $tokens ),
                                $this->lineNum,
                                $this->file
                        ) );
                }
-               return true;
+               if ( count( $tokens ) > 1 ) {
+                       throw new MWException( sprintf(
+                               "'%s' with unexpected tokens '%s' at line %s of %s\n",
+                               $this->section,
+                               implode( ',', $tokens ),
+                               $this->lineNum,
+                               $this->file
+                       ) );
+               }
+
+               $tokens = array_values( $tokens );
+               return $tokens[ 0 ];
        }
 }